fix: 修正 .mcp.json 为本项目 MCP 配置 + 补充多源展示测试

- .mcp.json 原为 Mac 上另一项目(serena)残留配置,按文档 8.2 重写为 a-share-research
- 补充 test_fmt_results_multi_source_tag(验证 [多源] 展示)
- MCP 服务核心(5 工具/stdio/SSE/依赖/测试)此前已实现并经端到端验证
This commit is contained in:
2026-09-01 17:35:08 +08:00
parent 7b33182f67
commit 4fa48ff030
3 changed files with 43 additions and 11 deletions
+3 -10
View File
@@ -1,16 +1,9 @@
{
"mcpServers": {
"serena-djapi": {
"a-share-research": {
"command": "uv",
"args": [
"run",
"--directory",
"/Users/summer/Downloads/cc-cursor/mcp-servers/serena",
"serena",
"start-mcp-server",
"--project",
"/Users/summer/Downloads/cc-projects/news"
]
"args": ["run", "python", "-m", "scripts.run_mcp_server"],
"cwd": "/home/pi/news"
}
}
}
+29
View File
@@ -4,6 +4,35 @@
---
## 本次完成 (2026-08-23) — MCP 新闻查询服务确认与修复
**用户需求**:实现新闻查询 MCP 服务(阅读文档步骤,确认是否已实现)。
**确认结论:核心实现完整且可用(此前已实现,本次验证 + 修复一处配置错误)**:
| 文档要求 | 现状 | 验证 |
|----------|------|------|
| `scripts/run_mcp_server.py`(stdio/SSE 入口) | ✅ 存在 | stdio 端到端调用通过 |
| `mcp_server/tools.py` 5 个工具 | ✅ 齐全 | `tools/list` 返回 5 工具,`tools/call` 真实检索成功 |
| pyproject 依赖 `mcp>=1.0` | ✅ 已声明 | 已安装 |
| `tests/test_mcp.py` | ✅ 10 个测试 | 全过 |
| `.mcp.json`(Claude Code 配置) | ❌ **配置错误** | 见下 |
**发现并修复的差距**:
- `.mcp.json` 被跟踪的内容是 **Mac 上另一项目(serena)的残留配置**(路径指向 `/Users/summer/...`),与本项目无关 → 按 `docs/user-guide.md` 8.2 重写为 `a-share-research` 配置
- 补充 1 个测试(`test_fmt_results_multi_source_tag`,验证 A2 多源展示)
**端到端验证**(真实调用,非 mock):
1. 5 个工具函数直接调用:全部返回检索结果 ✓
2. SSE 模式 `--sse 8765`:`GET /sse` 返回 `event: endpoint` 握手 ✓
3. **MCP 协议层**(stdio 客户端 → `scripts.run_mcp_server`):`tools/list` 返回 5 个工具与文档一致;`tools/call search_news("国务院常务会议")` 命中《李强主持召开国务院常务会议》等 ✓
**全量测试**:283 passed(新增 1 个多源展示),3 个 crawler 基线失败与本次无关;ruff 干净
**遗留**:无(仅既有 reporter 5 个 ruff 问题、Qdrant 本地模式性能警告)
---
## 本次完成 (2026-08-23) — P1-2/P1-3 补跑步骤与时区一致性修复
**P1-2(守护进程补跑误含 cninfo 三步)**:
+11 -1
View File
@@ -41,9 +41,11 @@ def _hit(title: str = "测试标题", source: str = "cls", score: float = 0.9,
sentiment: str = "positive", stock_codes: list[str] | None = None,
company_names: list[str] | None = None, summary: str = "摘要",
publish_time: str = "2026-06-16T10:00:00",
url: str = "https://example.com/1") -> dict:
url: str = "https://example.com/1",
sources: list[str] | None = None) -> dict:
return {
"title": title, "url": url, "source": source, "score": score,
"sources": sources or [source],
"publish_time": publish_time,
"event": {
"sentiment": sentiment, "importance": 4, "event_type": "重大合同",
@@ -61,6 +63,14 @@ def test_fmt_results_contains_title_and_source() -> None:
assert "0.9" in out
def test_fmt_results_multi_source_tag() -> None:
"""多源新闻显示「来源A / 来源B [多源]」。"""
hits = [_hit("多源新闻", sources=["cls", "sina"])]
out = _fmt_results(hits, "查询")
assert "cls / sina" in out
assert "[多源]" in out
def test_fmt_results_includes_event_fields() -> None:
hits = [_hit(
company_names=["宁德时代"], stock_codes=["300750"],