mcp_app.py 2.1 KB

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