mcp_app.py 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. import contextlib
  2. import logging
  3. from collections.abc import AsyncIterator
  4. import click
  5. from mcp.server.streamable_http_manager import StreamableHTTPSessionManager
  6. from starlette.applications import Starlette
  7. from starlette.routing import Mount
  8. from starlette.types import Receive, Scope, Send
  9. from applications.config import ES_HOSTS, ELASTIC_SEARCH_INDEX, ES_PASSWORD, MILVUS_CONFIG
  10. from applications.resource import init_resource_manager
  11. from mcp_server.server import create_mcp_server
  12. # 配置日志
  13. logging.basicConfig(
  14. level=logging.INFO,
  15. format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
  16. )
  17. logger = logging.getLogger(__name__)
  18. # 初始化资源管理器
  19. resource_manager = init_resource_manager(
  20. es_hosts=ES_HOSTS,
  21. es_index=ELASTIC_SEARCH_INDEX,
  22. es_password=ES_PASSWORD,
  23. milvus_config=MILVUS_CONFIG,
  24. )
  25. @click.command()
  26. @click.option("--port", default=8002, help="服务器监听端口")
  27. @click.option("--host", default="0.0.0.0", help="服务器监听地址")
  28. @click.option("--json-response", is_flag=True, help="使用JSON响应而不是SSE流")
  29. def main(port: int, host: str, json_response: bool) -> int:
  30. """启动MCP"""
  31. # 创建MCP服务器
  32. app = create_mcp_server()
  33. # 创建会话管理器
  34. session_manager = StreamableHTTPSessionManager(
  35. app=app,
  36. event_store=None,
  37. json_response=json_response,
  38. stateless=True,
  39. )
  40. # 处理Streamable HTTP请求
  41. async def handle_streamable_http(scope: Scope, receive: Receive, send: Send) -> None:
  42. await session_manager.handle_request(scope, receive, send)
  43. # 定义生命周期管理
  44. @contextlib.asynccontextmanager
  45. async def lifespan(app: Starlette) -> AsyncIterator[None]:
  46. await resource_manager.startup()
  47. async with session_manager.run():
  48. yield
  49. # 创建ASGI应用
  50. starlette_app = Starlette(
  51. debug=True,
  52. routes=[Mount("/mcp", app=handle_streamable_http)],
  53. lifespan=lifespan,
  54. )
  55. # 启动服务器
  56. import uvicorn
  57. uvicorn.run(starlette_app, host=host, port=port)
  58. return 0
  59. if __name__ == "__main__":
  60. main()