Skip to content

FastMCP server with SSE transport fails to shut down on a signal #514

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
growler opened this issue Apr 14, 2025 · 7 comments
Open

FastMCP server with SSE transport fails to shut down on a signal #514

growler opened this issue Apr 14, 2025 · 7 comments

Comments

@growler
Copy link

growler commented Apr 14, 2025

A very simple server fails to shut down on a signal if it processed at least one request:

❯ python test-server.py --port=8085
INFO:     Started server process [216035]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
INFO:     Uvicorn running on http://0.0.0.0:8085 (Press CTRL+C to quit)
INFO:     127.0.0.1:55188 - "GET /sse HTTP/1.1" 200 OK
INFO:     127.0.0.1:55192 - "POST /messages/?session_id=e690de9733914d09aebf2b0e8c78191c HTTP/1.1" 202 Accepted
INFO:     127.0.0.1:55192 - "POST /messages/?session_id=e690de9733914d09aebf2b0e8c78191c HTTP/1.1" 202 Accepted
INFO:     127.0.0.1:55192 - "POST /messages/?session_id=e690de9733914d09aebf2b0e8c78191c HTTP/1.1" 202 Accepted
Processing request of type CallToolRequest
^CINFO:     Shutting down
INFO:     Waiting for background tasks to complete. (CTRL+C to force quit)

The expected behaviour would be:

❯ python test-server.py --port=8085
INFO:     Started server process [216006]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
INFO:     Uvicorn running on http://0.0.0.0:8085 (Press CTRL+C to quit)
^CINFO:     Shutting down
INFO:     Waiting for application shutdown.
INFO:     Application shutdown complete.
INFO:     Finished server process [216006]

Here is the code for both the server and the client.

What do I miss?

the server

import click
import sys
from pydantic import Field
from mcp.server.fastmcp import FastMCP

@click.command()
@click.option("--port", default=8085, help="Port to listen", type=int)
def main(port: int):
    mcp = FastMCP(
        "mcp-echo-tool",
        debug=True,
        log_level="INFO",
        port=port,
    )

    @mcp.tool(name="echo")
    async def echo_tool(string: str = Field(description="A string to echo back")) -> str:
        """Echoes back the input string"""
        return string

    mcp.run(transport='sse')
    return 0

if __name__ == "__main__":
    sys.exit(main())

and the client

import asyncio
import click
import sys
from mcp.client.session import ClientSession
from mcp.client.sse import sse_client

async def client(url, string):
    async with sse_client(url) as (read, write):
        async with ClientSession(read, write) as session:
            await session.initialize()
            result = await session.call_tool("echo", {"string": string})
            print(result.content)

@click.command()
@click.option('--url', default='http://localhost:8085', help='MCP Server URL', type=str)
@click.argument('string', type=str)
def main(url: str, string: str):
    asyncio.run(client(url, string))

if __name__ == "__main__":
    sys.exit(main())
@withwind8
Copy link

I think uvicorn is waiting for close opened sse connection.
But I've no idea how to do it with fastmcp.

Can anyone help?

@nadeemcite
Copy link

It’s unclear if there’s a manual way to disconnect from the session. The session gets created when you attempt to connect using an MCP client, and even the MCP Inspector doesn’t terminate the session when "Disconnect" is clicked.

@evalstate
Copy link
Contributor

deleted previous message as thought it was raised on my project! - i have been scratching my head on this one...! would be good to get fixed.

@growler
Copy link
Author

growler commented Apr 16, 2025

... I would also like to add that if the MCP server has at least one real established connection, it fails to shut down even with forced Ctrl-C. The only way is to kill the process.

@sealpp
Copy link

sealpp commented Apr 23, 2025

I'm experiencing the same issue. Initially, I suspected it might be caused by the Auto Forward Ports feature of the VS Code Remote plugin. However, after disabling automatic port forwarding, the problem persists.

@420516460
Copy link

so this issue has been resolved?

@PWZER
Copy link

PWZER commented Apr 25, 2025

Fixed in #586

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

7 participants