Bug 2485863 - FTBFS, F45FailsToInstall: python3-fastmcp+openai, python3-fastmcp [NEEDINFO]
Summary: FTBFS, F45FailsToInstall: python3-fastmcp+openai, python3-fastmcp
Keywords:
Status: NEW
Alias: None
Product: Fedora
Classification: Fedora
Component: python-fastmcp
Version: rawhide
Hardware: Unspecified
OS: Unspecified
unspecified
unspecified
Target Milestone: ---
Assignee: Rodolfo Olivieri
QA Contact:
URL:
Whiteboard:
Depends On: 2423878 2485862 2485894 2485926 2485928
Blocks: PYTHON3.15 F45FailsToInstall, RAWHIDEFailsToInstall
TreeView+ depends on / blocked
 
Reported: 2026-06-06 17:51 UTC by Fedora Fails To Install
Modified: 2026-06-23 14:02 UTC (History)
2 users (show)

Fixed In Version:
Clone Of:
Environment:
Last Closed:
Type: ---
Embargoed:
fti-bugs: needinfo? (rodolfo.olivieri3)


Attachments (Terms of Use)

Description Fedora Fails To Install 2026-06-06 17:51:23 UTC
Hello,

Please note that this comment was generated automatically by https://forge.fedoraproject.org/releng/tooling/src/branch/main/release-process/bug-filing/follow-policy/follow_policy.py
If you feel that this output has mistakes, please open an issue at https://forge.fedoraproject.org/releng/tickets/issues

Your package (python-fastmcp) Fails To Install in Fedora 45:

can't install python3-fastmcp+openai:
  - nothing provides python(abi) = 3.14 needed by python3-fastmcp+openai-2.14.7-2.fc45.noarch
  - nothing provides python3.14dist(openai) >= 1.102 needed by python3-fastmcp+openai-2.14.7-2.fc45.noarch
  
can't install python3-fastmcp:
  - nothing provides python(abi) = 3.14 needed by python3-fastmcp-2.14.7-2.fc45.noarch
  - nothing provides python3.14dist(packaging) >= 20 needed by python3-fastmcp-2.14.7-2.fc45.noarch
  - nothing provides python3.14dist(httpx) >= 0.28.1 needed by python3-fastmcp-2.14.7-2.fc45.noarch
  - nothing provides python3.14dist(rich) >= 13.9.4 needed by python3-fastmcp-2.14.7-2.fc45.noarch
  - nothing provides (python3.14dist(authlib) < 1.6.5~~ with python3.14dist(authlib) >= 1.4) needed by python3-fastmcp-2.14.7-2.fc45.noarch
  - nothing provides (python3.14dist(mcp) < 2~~ with python3.14dist(mcp) >= 1.24) needed by python3-fastmcp-2.14.7-2.fc45.noarch
  - nothing provides (python3.14dist(pyperclip) < 1.9~~ with python3.14dist(pyperclip) >= 1.8.2) needed by python3-fastmcp-2.14.7-2.fc45.noarch
  - nothing provides python3.14dist(cyclopts) >= 4 needed by python3-fastmcp-2.14.7-2.fc45.noarch
  - nothing provides python3.14dist(jsonref) >= 1.1 needed by python3-fastmcp-2.14.7-2.fc45.noarch
  - nothing provides python3.14dist(jsonschema-path) >= 0.3.4 needed by python3-fastmcp-2.14.7-2.fc45.noarch
  - nothing provides python3.14dist(openapi-pydantic) >= 0.5.1 needed by python3-fastmcp-2.14.7-2.fc45.noarch
  - nothing provides python3.14dist(platformdirs) >= 4 needed by python3-fastmcp-2.14.7-2.fc45.noarch
  - nothing provides python3.14dist(pydantic) >= 2.11.7 needed by python3-fastmcp-2.14.7-2.fc45.noarch
  - nothing provides python3.14dist(pydantic[email]) >= 2.11.7 needed by python3-fastmcp-2.14.7-2.fc45.noarch
  - nothing provides python3.14dist(python-dotenv) >= 1.1 needed by python3-fastmcp-2.14.7-2.fc45.noarch
  - nothing provides python3.14dist(uvicorn) >= 0.35 needed by python3-fastmcp-2.14.7-2.fc45.noarch
  - nothing provides python3.14dist(websockets) >= 15.0.1 needed by python3-fastmcp-2.14.7-2.fc45.noarch
  
If you know about this problem and are planning on fixing it, please acknowledge so by setting the bug status to ASSIGNED. If you don't have time to maintain this package, consider orphaning it, so maintainers of dependent packages realize the problem.


If you don't react accordingly to the policy for FTBFS/FTI bugs (https://docs.fedoraproject.org/en-US/fesco/Fails_to_build_from_source_Fails_to_install/), your package may be orphaned in 8+ weeks.


P.S. The data was generated solely from koji buildroot, so it might be newer than the latest compose or the content on mirrors. To reproduce, use the koji/local repo only, e.g. in mock:

    $ mock -r fedora-45-x86_64 --config-opts mirrored=False install python3-fastmcp+openai python3-fastmcp


P.P.S. If this bug has been reported in the middle of upgrading multiple dependent packages, please consider using side tags: https://docs.fedoraproject.org/en-US/fesco/Updates_Policy/#updating-inter-dependent-packages

Thanks!

Comment 1 Fedora Fails To Install 2026-06-14 09:05:06 UTC
Hello,

Please note that this comment was generated automatically by https://forge.fedoraproject.org/releng/tooling/src/branch/main/release-process/bug-filing/follow-policy/follow_policy.py
If you feel that this output has mistakes, please open an issue at https://forge.fedoraproject.org/releng/tickets/issues

This package fails to install and maintainers are advised to take one of the following actions:

 - Fix this bug and close this bugzilla once the update makes it to the repository.
   (The same script that posted this comment will eventually close this bugzilla
   when the fixed package reaches the repository, so you don't have to worry about it.)

or

 - Move this bug to ASSIGNED if you plan on fixing this, but simply haven't done so yet.

or

 - Orphan the package if you no longer plan to maintain it.


If you do not take one of these actions, the process at https://docs.fedoraproject.org/en-US/fesco/Fails_to_build_from_source_Fails_to_install/#_package_removal_for_long_standing_ftbfs_and_fti_bugs will continue.
This package may be orphaned in 7+ weeks.
This is the first reminder (step 3) from the policy.

Don't hesitate to ask for help on https://lists.fedoraproject.org/archives/list/devel@lists.fedoraproject.org/ if you are unsure how to fix this bug.

Comment 2 Miro Hrončok 2026-06-23 14:02:02 UTC
=================================== FAILURES ===================================
________ TestStatefulProxyClient.test_concurrent_log_requests_no_mixing ________
self = <tests.server.proxy.test_stateful_proxy_client.TestStatefulProxyClient object at 0xffffa9b62c10>
stateful_proxy_server = FastMCPProxy('FastMCPProxy-3e04')
    async def test_concurrent_log_requests_no_mixing(
        self, stateful_proxy_server: FastMCP
    ):
        """Test that concurrent log requests don't mix handlers (fixes #1068)."""
        results: dict[str, LogMessage] = {}
    
        async def log_handler_a(message: LogMessage) -> None:
            results["logger_a"] = message
    
        async def log_handler_b(message: LogMessage) -> None:
            results["logger_b"] = message
    
        async with (
>           Client(stateful_proxy_server, log_handler=log_handler_a) as client_a,
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
            Client(stateful_proxy_server, log_handler=log_handler_b) as client_b,
        ):
tests/server/proxy/test_stateful_proxy_client.py:84: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
../BUILDROOT/usr/lib/python3.15/site-packages/fastmcp/client/client.py:503: in __aexit__
    await self._disconnect()
../BUILDROOT/usr/lib/python3.15/site-packages/fastmcp/client/client.py:630: in _disconnect
    await self._session_state.session_task
../BUILDROOT/usr/lib/python3.15/site-packages/fastmcp/client/client.py:648: in _session_runner
    async with AsyncExitStack() as stack:
               ^^^^^^^^^^^^^^^^
/usr/lib64/python3.15/contextlib.py:813: in __aexit__
    raise exc
/usr/lib64/python3.15/contextlib.py:796: in __aexit__
    cb_suppress = await cb(*exc_details)
                  ^^^^^^^^^^^^^^^^^^^^^^
/usr/lib64/python3.15/contextlib.py:283: in __aexit__
    await anext(self.gen)
../BUILDROOT/usr/lib/python3.15/site-packages/fastmcp/client/client.py:425: in _context_manager
    with catch(get_catch_handlers()):
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.15/site-packages/exceptiongroup/_catch.py:39: in __exit__
    raise unhandled from exc.__cause__
/usr/lib/python3.15/site-packages/exceptiongroup/_catch.py:65: in handle_exception
    result = handler(matched)
             ^^^^^^^^^^^^^^^^
../BUILDROOT/usr/lib/python3.15/site-packages/fastmcp/utilities/exceptions.py:29: in _exception_handler
    raise leaf
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
self = <anyio._backends._asyncio.CancelScope object at 0xffffa54dd4f0>
exc_type = <class 'asyncio.exceptions.CancelledError'>
exc_val = CancelledError("Cancelled via cancel scope ffffa54def30 by <Task pending name='Task-9347' coro=<Client._session_runner...astmcp-2.14.7-build/BUILDROOT/usr/lib/python3.15/site-packages/fastmcp/client/client.py:648> cb=[Task.task_wakeup()]>")
    def __exit__(
        self,
        exc_type: type[BaseException] | None,
        exc_val: BaseException | None,
        exc_tb: TracebackType | None,
    ) -> bool:
        del exc_tb
    
        if not self._active:
            raise RuntimeError("This cancel scope is not active")
        if current_task() is not self._host_task:
            raise RuntimeError(
                "Attempted to exit cancel scope in a different task than it was "
                "entered in"
            )
    
        assert self._host_task is not None
        host_task_state = _task_states.get(self._host_task)
        if host_task_state is None or host_task_state.cancel_scope is not self:
>           raise RuntimeError(
                "Attempted to exit a cancel scope that isn't the current tasks's "
                "current cancel scope"
            )
E           RuntimeError: Attempted to exit a cancel scope that isn't the current tasks's current cancel scope
/usr/lib/python3.15/site-packages/anyio/_backends/_asyncio.py:472: RuntimeError
----------------------------- Captured stderr call -----------------------------
[06/23/26 13:59:41] DEBUG    Sending INFO to client (b): Hello,  context.py:1044
                             world!                                             
                    DEBUG    Sending INFO to client (a): Hello,  context.py:1044
                             world!                                             
                    DEBUG    Sending INFO to client (b): Hello,  context.py:1044
                             world!                                             
                    DEBUG    Sending INFO to client (a): Hello,  context.py:1044
                             world!                                             
_________________ TestStatefulProxyClient.test_stateful_proxy __________________
self = <tests.server.proxy.test_stateful_proxy_client.TestStatefulProxyClient object at 0xffffa9b62d50>
stateful_proxy_server = FastMCPProxy('FastMCPProxy-1ccb')
    async def test_stateful_proxy(self, stateful_proxy_server: FastMCP):
        """Test that the state shared across multiple calls for the same client (fixes #959)."""
>       async with Client(stateful_proxy_server) as client:
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
tests/server/proxy/test_stateful_proxy_client.py:104: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
../BUILDROOT/usr/lib/python3.15/site-packages/fastmcp/client/client.py:503: in __aexit__
    await self._disconnect()
../BUILDROOT/usr/lib/python3.15/site-packages/fastmcp/client/client.py:630: in _disconnect
    await self._session_state.session_task
../BUILDROOT/usr/lib/python3.15/site-packages/fastmcp/client/client.py:648: in _session_runner
    async with AsyncExitStack() as stack:
               ^^^^^^^^^^^^^^^^
/usr/lib64/python3.15/contextlib.py:813: in __aexit__
    raise exc
/usr/lib64/python3.15/contextlib.py:796: in __aexit__
    cb_suppress = await cb(*exc_details)
                  ^^^^^^^^^^^^^^^^^^^^^^
/usr/lib64/python3.15/contextlib.py:283: in __aexit__
    await anext(self.gen)
../BUILDROOT/usr/lib/python3.15/site-packages/fastmcp/client/client.py:425: in _context_manager
    with catch(get_catch_handlers()):
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.15/site-packages/exceptiongroup/_catch.py:39: in __exit__
    raise unhandled from exc.__cause__
/usr/lib/python3.15/site-packages/exceptiongroup/_catch.py:65: in handle_exception
    result = handler(matched)
             ^^^^^^^^^^^^^^^^
../BUILDROOT/usr/lib/python3.15/site-packages/fastmcp/utilities/exceptions.py:29: in _exception_handler
    raise leaf
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
self = <anyio._backends._asyncio.CancelScope object at 0xffffa552d590>
exc_type = <class 'asyncio.exceptions.CancelledError'>
exc_val = CancelledError("Cancelled via cancel scope ffffa552c910 by <Task pending name='Task-9379' coro=<Client._session_runner...astmcp-2.14.7-build/BUILDROOT/usr/lib/python3.15/site-packages/fastmcp/client/client.py:648> cb=[Task.task_wakeup()]>")
    def __exit__(
        self,
        exc_type: type[BaseException] | None,
        exc_val: BaseException | None,
        exc_tb: TracebackType | None,
    ) -> bool:
        del exc_tb
    
        if not self._active:
            raise RuntimeError("This cancel scope is not active")
        if current_task() is not self._host_task:
            raise RuntimeError(
                "Attempted to exit cancel scope in a different task than it was "
                "entered in"
            )
    
        assert self._host_task is not None
        host_task_state = _task_states.get(self._host_task)
        if host_task_state is None or host_task_state.cancel_scope is not self:
>           raise RuntimeError(
                "Attempted to exit a cancel scope that isn't the current tasks's "
                "current cancel scope"
            )
E           RuntimeError: Attempted to exit a cancel scope that isn't the current tasks's current cancel scope
/usr/lib/python3.15/site-packages/anyio/_backends/_asyncio.py:472: RuntimeError
_____________ TestStatefulProxyClient.test_multi_proxies_no_mixing _____________
self = <tests.server.proxy.test_stateful_proxy_client.TestStatefulProxyClient object at 0xffffa9330180>
    async def test_multi_proxies_no_mixing(self):
        """Test that the stateful proxy client won't be mixed in multi-proxies sessions."""
        mcp_a, mcp_b = FastMCP(), FastMCP()
    
        @mcp_a.tool
        def tool_a() -> str:
            return "a"
    
        @mcp_b.tool
        def tool_b() -> str:
            return "b"
    
        proxy_mcp_a = FastMCPProxy(
            client_factory=StatefulProxyClient(mcp_a).new_stateful
        )
        proxy_mcp_b = FastMCPProxy(
            client_factory=StatefulProxyClient(mcp_b).new_stateful
        )
        multi_proxy_mcp = FastMCP()
        multi_proxy_mcp.mount(proxy_mcp_a, prefix="a")
        multi_proxy_mcp.mount(proxy_mcp_b, prefix="b")
    
>       async with Client(multi_proxy_mcp) as client:
                   ^^^^^^^^^^^^^^^^^^^^^^^
tests/server/proxy/test_stateful_proxy_client.py:143: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
../BUILDROOT/usr/lib/python3.15/site-packages/fastmcp/client/client.py:503: in __aexit__
    await self._disconnect()
../BUILDROOT/usr/lib/python3.15/site-packages/fastmcp/client/client.py:630: in _disconnect
    await self._session_state.session_task
../BUILDROOT/usr/lib/python3.15/site-packages/fastmcp/client/client.py:648: in _session_runner
    async with AsyncExitStack() as stack:
               ^^^^^^^^^^^^^^^^
/usr/lib64/python3.15/contextlib.py:813: in __aexit__
    raise exc
/usr/lib64/python3.15/contextlib.py:796: in __aexit__
    cb_suppress = await cb(*exc_details)
                  ^^^^^^^^^^^^^^^^^^^^^^
/usr/lib64/python3.15/contextlib.py:283: in __aexit__
    await anext(self.gen)
../BUILDROOT/usr/lib/python3.15/site-packages/fastmcp/client/client.py:425: in _context_manager
    with catch(get_catch_handlers()):
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.15/site-packages/exceptiongroup/_catch.py:39: in __exit__
    raise unhandled from exc.__cause__
/usr/lib/python3.15/site-packages/exceptiongroup/_catch.py:65: in handle_exception
    result = handler(matched)
             ^^^^^^^^^^^^^^^^
../BUILDROOT/usr/lib/python3.15/site-packages/fastmcp/utilities/exceptions.py:29: in _exception_handler
    raise leaf
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
self = <anyio._backends._asyncio.CancelScope object at 0xffffa54df2f0>
exc_type = <class 'asyncio.exceptions.CancelledError'>
exc_val = CancelledError("Cancelled via cancel scope ffffa54dead0 by <Task pending name='Task-9482' coro=<Client._session_runner...astmcp-2.14.7-build/BUILDROOT/usr/lib/python3.15/site-packages/fastmcp/client/client.py:648> cb=[Task.task_wakeup()]>")
    def __exit__(
        self,
        exc_type: type[BaseException] | None,
        exc_val: BaseException | None,
        exc_tb: TracebackType | None,
    ) -> bool:
        del exc_tb
    
        if not self._active:
            raise RuntimeError("This cancel scope is not active")
        if current_task() is not self._host_task:
            raise RuntimeError(
                "Attempted to exit cancel scope in a different task than it was "
                "entered in"
            )
    
        assert self._host_task is not None
        host_task_state = _task_states.get(self._host_task)
        if host_task_state is None or host_task_state.cancel_scope is not self:
>           raise RuntimeError(
                "Attempted to exit a cancel scope that isn't the current tasks's "
                "current cancel scope"
            )
E           RuntimeError: Attempted to exit a cancel scope that isn't the current tasks's current cancel scope
/usr/lib/python3.15/site-packages/anyio/_backends/_asyncio.py:472: RuntimeError


Note You need to log in before you can comment on or make changes to this bug.