Files
news/scripts/run_mcp_server.py
2026-07-18 15:51:01 +08:00

89 lines
2.2 KiB
Python

"""M8 MCP 服务入口。
Cherry Studio / Claude Code 通过 stdio 协议调用。
用法:
uv run python -m scripts.run_mcp_server # stdio 模式(默认)
uv run python -m scripts.run_mcp_server --sse 8765 # HTTP SSE 模式(调试用)
Cherry Studio 配置:
{
"mcpServers": {
"a-share-research": {
"command": "uv",
"args": ["run", "python", "-m", "scripts.run_mcp_server"],
"cwd": "/home/pi/news"
}
}
}
"""
from __future__ import annotations
import argparse
from pathlib import Path
from loguru import logger
def _setup_logger() -> None:
logger.remove()
log_path = Path("logs") / "mcp_server.log"
log_path.parent.mkdir(parents=True, exist_ok=True)
# MCP stdio 模式下 stderr 会被协议占用,只写文件日志
logger.add(
log_path,
level="DEBUG",
rotation="10 MB",
retention=5,
encoding="utf-8",
enqueue=True,
)
def main() -> int:
parser = argparse.ArgumentParser(description="A 股 Deep Research MCP 服务")
parser.add_argument("--sse", type=int, default=None,
help="启动 HTTP SSE 模式在指定端口(调试用)")
parser.add_argument("--host", default="0.0.0.0", help="SSE 监听地址")
args = parser.parse_args()
_setup_logger()
logger.info("MCP 服务启动 mode={}", "sse" if args.sse else "stdio")
if args.sse:
_run_sse(args.host, args.sse)
else:
_run_stdio()
return 0
def _run_stdio() -> None:
from mcp_server.tools import mcp # noqa: E402
mcp.run()
def _run_sse(host: str, port: int) -> None:
from mcp.server.fastmcp import FastMCP # noqa: E402
from mcp_server.tools import ( # noqa: E402
search_company_news,
search_industry_news,
search_news,
search_sentiment_trend,
search_stock_events,
)
sse_mcp = FastMCP(name="A股DeepResearch", host=host, port=port)
sse_mcp.tool()(search_news)
sse_mcp.tool()(search_company_news)
sse_mcp.tool()(search_industry_news)
sse_mcp.tool()(search_stock_events)
sse_mcp.tool()(search_sentiment_trend)
sse_mcp.run(transport="sse")
if __name__ == "__main__":
raise SystemExit(main())