Feature: ADD streamable http mcp support

This commit is contained in:
AniviaTn
2025-05-15 14:24:40 +08:00
parent 579dcbac54
commit 560ac08de3
2 changed files with 28 additions and 27 deletions

View File

@@ -2,6 +2,7 @@
# -*- coding:utf-8 -*-
import functools
import inspect
from typing import Literal
from mcp.server.fastmcp import FastMCP
@@ -101,39 +102,36 @@ class MCPServerManager:
self.server_tool_map[server_name]['toolkit'].append(configer_instance.name)
def start_server(self,
server_name: str = DEFAULT_SERVER_NAME,
host: str = '0.0.0.0',
port: int = 8890):
if server_name not in self.server_tool_map:
raise Exception(f'No mcp server named {server_name}')
port: int = 8890,
transport: Literal["sse", "streamable_http"] = "sse"):
# TODO: support streamable http server in next version.
import uvicorn
from mcp.server.fastmcp import FastMCP
from starlette.applications import Starlette
from starlette.routing import Mount
routes_list = []
server_tool_map = self.server_tool_map[server_name]
mcp_server = FastMCP(server_name)
for _tool in server_tool_map['tool']:
tool_instance = ToolManager().get_instance_obj(_tool)
mcp_server.add_tool(
fn=create_exposed_tool_method_wrapper(_tool),
name=tool_instance.name,
description=tool_instance.description
)
for server_name, tool_dict in self.server_tool_map.items():
mcp_server = FastMCP(server_name)
for _tool in server_tool_map['tool']:
tool_instance = ToolManager().get_instance_obj(_tool)
mcp_server.add_tool(
fn=create_exposed_tool_method_wrapper(_tool),
name=tool_instance.name,
description=tool_instance.description
)
for _toolkit in server_tool_map['toolkit']:
toolkit_instance = ToolkitManager().get_instance_obj(_toolkit)
for _tool in toolkit_instance.tool_names:
for _tool in tool_dict['tool']:
tool_instance = ToolManager().get_instance_obj(_tool)
mcp_server.add_tool(
fn=create_exposed_tool_method_wrapper(_tool),
name=tool_instance.name,
description=tool_instance.description
)
uvicorn.run(mcp_server.sse_app(), host=host, port=port)
for _toolkit in tool_dict['toolkit']:
toolkit_instance = ToolkitManager().get_instance_obj(_toolkit)
for _tool in toolkit_instance.tool_names:
tool_instance = ToolManager().get_instance_obj(_tool)
mcp_server.add_tool(
fn=create_exposed_tool_method_wrapper(_tool),
name=tool_instance.name,
description=tool_instance.description
)
routes_list.append(Mount(f"/{server_name}", app=mcp_server.sse_app(f"/{server_name}")),)
app = Starlette(routes=routes_list)
uvicorn.run(app, host=host, port=port)

View File

@@ -42,5 +42,8 @@ if __name__ == "__main__":
ServerApplication.start()
```
MCPServerManager的start_server接受两个参数
- server_name: 接受一个string。如果不填写则使用默认的MCP Server对应第一节中无server_name参数的情况
- port: 接受一个int表示MCP Server的uvicorn app的启动端口。默认使用8890端口。
- host: 表示MCP Server的host默认值为0.0.0.0
- port: 接受一个int表示MCP Server的uvicorn app的启动端口。默认使用8890端口。
调用的时候,访问路径为`http://${host}:${port}/${server_name}/sse`
以上面默认值为例则访问mcp_search_server的路径为`http://0.0.0.0:8890/mcp_search_server/sse`