- paper_writer_service(8097):FastAPI + MCP streamable-http 单端点,9 工具
(propose_paper_outline/write_paper_section/get_paper_progress/search_refs/
revise_paper_section/revise_paper/get_paper/complete_paper/cancel_paper),
SQLite 三表(papers/paper_sections/citations,WAL),GB/T 7714 引用协议
- BFF:services/paper/{mcp_client,agent}.py(裸 JSON-RPC 客户端 + 规则状态机)、
routers/paper.py、schemas.py 4 个 Paper*Block + ArtifactBlock 加 paper_id/citation_count、
config.py 开关、main.py 条件注册、docgen.py 抽 insert_artifact 公共 helper
- 前端:intent.js paperIntent 纯函数、Composer docgen 分支 sub-route、sendPaper/轮询、
PaperBriefCard/PaperOutlineCard/PaperProgressCard、DocPane cite-chip
- deploy/paper_restart.sh + toggle_paper.sh;compile_sdk.sh 白名单追加 paper 文件
- tests/paper 26 条(工具逻辑 + MCP 协议 + BFF 状态机 + 块 schema + 前端 intent 单测)
49 lines
2.5 KiB
Python
49 lines
2.5 KiB
Python
"""app/mcp.py —— paper_writer_service MCP server(单 streamable-http 端点 /mcp)。
|
||
|
||
9 个工具:propose_paper_outline / write_paper_section / get_paper_progress / search_refs /
|
||
revise_paper_section / revise_paper / get_paper / complete_paper / cancel_paper。
|
||
|
||
mcp 2.x 注意:MCPServer(非 FastMCP,来自 mcp.server.mcpserver);工具返回 dict,由 MCP
|
||
序列化为 CallToolResult(structuredContent + content:[{type:"text",text:"<json>"}])。
|
||
本文件位于 app/ 层(非 services/),可用 pydantic(mcp 自身依赖 pydantic 构造 schema)。
|
||
"""
|
||
from __future__ import annotations
|
||
|
||
from typing import Any
|
||
|
||
from .services.paper import complete, outline, search, write
|
||
|
||
|
||
def build_paper_mcp() -> Any:
|
||
from mcp.server.mcpserver import MCPServer
|
||
|
||
mcp = MCPServer(
|
||
"paper-writer",
|
||
title="PlantAI 论文撰写",
|
||
description="论文撰写能力单元:大纲生成/逐节撰写/文献引用/全文合并重排/修订。",
|
||
)
|
||
|
||
mcp.tool(name="propose_paper_outline",
|
||
description="根据论文主题与写作要求生成大纲并建论文(内部检索知识库注入选题线索)。")(outline.propose_paper_outline)
|
||
mcp.tool(name="write_paper_section",
|
||
description="撰写论文某一章节(同步长调用,90-180s)。按全局引用编号表生成正文与引用。")(write.write_paper_section)
|
||
mcp.tool(name="get_paper_progress",
|
||
description="查询论文与各章节撰写进度/字数/引用数。")(complete.get_paper_progress)
|
||
mcp.tool(name="search_refs",
|
||
description="在知识库(vstore)中检索与查询相关的文献片段。")(search.search_refs)
|
||
mcp.tool(name="revise_paper_section",
|
||
description="按用户意见重写论文某一章节,新引用追加到引用表末尾。")(write.revise_paper_section)
|
||
mcp.tool(name="revise_paper",
|
||
description="按用户意见判定需要修改哪些章节,返回受影响节清单与修订计划。")(write.revise_paper)
|
||
mcp.tool(name="get_paper",
|
||
description="拉取论文全文 markdown、参考文献列表与免责声明。")(complete.get_paper)
|
||
mcp.tool(name="complete_paper",
|
||
description="合并全文、按首次出现顺序重排引用编号、渲染 GB/T 7714 文献列表。")(complete.complete_paper)
|
||
mcp.tool(name="cancel_paper",
|
||
description="取消论文(置 cancelled)。")(complete.cancel_paper)
|
||
|
||
return mcp
|
||
|
||
|
||
paper_mcp = build_paper_mcp()
|