Bug 2485863

Summary: FTBFS, F45FailsToInstall: python3-fastmcp+openai, python3-fastmcp
Product: [Fedora] Fedora Reporter: Fedora Fails To Install <fti-bugs>
Component: python-fastmcpAssignee: Rodolfo Olivieri <rodolfo.olivieri3>
Status: NEW --- QA Contact:
Severity: unspecified Docs Contact:
Priority: unspecified    
Version: rawhideCC: mhroncok, rodolfo.olivieri3
Target Milestone: ---Flags: fti-bugs: needinfo? (rodolfo.olivieri3)
Target Release: ---   
Hardware: Unspecified   
OS: Unspecified   
Whiteboard:
Fixed In Version: Doc Type: ---
Doc Text:
Story Points: ---
Clone Of: Environment:
Last Closed: Type: ---
Regression: --- Mount Type: ---
Documentation: --- CRM:
Verified Versions: Category: ---
oVirt Team: --- RHEL 7.3 requirements from Atomic Host:
Cloudforms Team: --- Target Upstream Version:
Embargoed:
Bug Depends On: 2423878, 2485862, 2485894, 2485926, 2485928    
Bug Blocks: 2412434, 2433836    

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