SuperAPI AI 工具集

building-python-mcp-servers

智能体与模型

查看项目

更新于 10-16 02:31

技能介绍

用途:该技能面向使用 FastMCP 构建 Python MCP(Model Context Protocol)服务器的场景。MCP 服务器向 LLM 客户端(如 Claude Desktop、Claude Code)暴露工具,调用方是 LLM,因此失败模式与普通库不同:错误需机器可读、所有输入不可信、测试通过并不代表工具可用。

主要能力:

  1. 错误契约:不要抛出未捕获异常(对 LLM 是不透明协议错误),改为返回固定结构(常用含 error 键的 dict);批量工具必须返回逐项 skipped/errors 列表,不能静默 continue。注意 YAML 会把未加引号的 ISO 日期解析为 datetime.date。
  2. 封装子进程/CLI:非零退出码不一定代表失败,必须同时返回 stdout 与 stderr;按实际封装工具的版本固定并核对子命令;参数用 shlex.split,向 subprocess.run 传 argv 列表(不用 shell=True),验证目标路径。
  3. 避免模块级全局状态:不要在导入时解析 CLI 参数并存入全局,改用配置对象或工厂函数构建服务器,并确保工具只注册一次。
  4. 阻塞工作移出协议事件循环:不要假设框架会把同步工具放到工作线程;将工具设为 async 并用 asyncio.to_thread 包裹阻塞边界,注意连接归属(如 SQLite 连接应在线程内开关)。测试要验证轻量请求在慢工具阻塞时仍能完成。
  5. 采样(ctx.sample)是可选客户端能力:在工具内捕获采样边界异常并转为标准错误结构,try 块要窄,分别测试客户端不支持与处理函数抛错两种情况。
  6. 分发:避免 server.py 与 server/ 包同名冲突;构建配置要包含整个包与数据文件;PEP 723 单文件服务器需在脚本头固定版本并与 pyproject.toml 同步。
  7. 测试:保留至少一个调用真实封装工具的集成测试;测试错误契约与批量 skipped;裸 import 冒烟测试在重名冲突下无意义。
  8. 安全:把所有工具输入、文件内容、其他工具描述视为不可信,防范提示注入,限制文件系统/网络权限,验证路径,工具输出不得当作可信指令。

使用方式:以 FastMCP 为例,导入 from mcp.server.fastmcp import FastMCP,创建实例并注册 @mcp.tool(),最后调用 mcp.run()。资料还提供了带校验的 read_config、批量 validate_dir、run_tool、异步 find_dependents 与 sample_or_error 等示例模式。

适用场景:开发、审查或调试 Python MCP 服务器,尤其是封装外部 CLI、涉及批量操作、阻塞 I/O 与采样调用时。

限制:资料未提供具体收费、价格、支持平台或性能数据;技能内容基于 Will McGinnis 的《Guide to Developing High-Quality Python Libraries》。部分实现细节(如框架是否内联调用同步工具)需按实际运行时确认。