用途:本技能针对用 Python 编写、走 stdio 传输的 MCP 服务器代码,规定其与其他普通 Python 脚本不同的行为约定。这些差异不是风格问题,其中多数属于协议正确性。它不涉及发布流程,入口点、uv tool install、claude mcp add 与 scope 选择由 mcp-server-shipping 负责。
主要能力与约定:
- 日志纪律。服务器包代码中不得出现裸 print(),所有日志经标准库 logging 模块输出,并在启动时显式配置写入 stderr,或交给 FastMCP 自带的 configure_logging()(默认即写 stderr)。原因是 MCP stdio 规范要求服务器不得向 stdout 写入任何非合法 MCP 消息,一处多余 print 或依赖库中指向 stdout 的日志处理器都会破坏 JSON-RPC 流。注意仅靠代码检查不足以发现依赖自行写 stdout 的情况,应端到端跑通真实 stdio 传输。
- 工具边界错误处理。内部异常返回客户端前,需有意决定暴露什么:用 fastmcp.exceptions.ToolError 附带手写消息重新抛出,或直接抛普通异常(FastMCP 默认即原样透传给客户端)。不要默认认为任意捕获异常的 str(exc) 是安全的,批量调用中逐项 except Exception 时尤其如此。也不建议全局开启 mask_error_details=True,那会压掉对调用智能体有用的参数校验细节,优先逐条消息用 ToolError。
- 工具 docstring。凡被 @mcp.tool() 装饰的函数,docstring 应按面向 LLM 的工具定义标准撰写,而非 PEP 257:说明做什么、与最近似同名工具的区别、何时用与不用、各非显然参数取值来源、响应结构与大小限制,至少 3–4 句,复杂工具更长。参数描述可升级为 Annotated[x, Field(description=...)],有副作用的工具应加 annotations(如 readOnlyHint/destructiveHint)。
使用方式:安装时该文件复制到 ~/.agents/skills/mcp-python-conventions,不做软链,故直接编辑部署副本会造成本地漂移。应改源仓库、推送后重新运行 skills add <source> --global --skill mcp-python-conventions 刷新各项目副本。
适用与限制:仅适用于自身带 stdio 传输 MCP 服务器的仓库,不适用无 MCP 服务器的项目。附带可运行示例 references/snippets/mcp-tool-boundary.py 展示工具边界错误处理,完整论证见 references/rationale.md。其他细节暂未提供。