MCP 开发 / 场景指南
把 Python 函数接入 Agent:第一个 MCP 工具怎么做?
从一个无外部副作用的小函数开始,用 FastMCP 定义工具,再用 MCP Inspector 验证连接、参数与错误处理。
约 7 分钟阅读整理于 2026-10-18选型建议 · 非实测排名
先看任务,再看工具
小屏幕可左右滑动,查看完整对照表。
| 环节 | 先验证什么 | 可参考的项目 |
|---|---|---|
| 定义能力 | 工具名、说明、输入类型和返回结果 | FastMCP |
| 协议调试 | 连接、工具发现和一次最小调用 | MCP Inspector |
| 接入 Agent | 客户端配置、认证和工具权限 | 客户端与目标服务器说明 |
| 打包分发 | 清单、安装方式和依赖 | Claude Code Plugins Directory |
先让一个小函数被发现
不要第一次就连接生产数据库。先用只接收参数并返回结果的函数,确认框架如何生成工具说明和参数结构。在已有的独立 Python 项目里按上游说明安装 fastmcp,保存下方示例。
函数名和说明会影响 Agent 何时选择这个工具。用准确、有限的描述表达能力,不要把它命名成能完成一切的万能接口。
把协议问题和业务问题分开
在 Inspector 中按当前版本文档配置 stdio 启动命令与参数。例如已有 uv 项目时,以 uv 为命令、run 和 server.py 为参数,先列出工具,再调用 add。用 2 与 3 检查是否返回 5,并尝试缺少参数或错误类型的输入。
如果工具列表都取不到,先排查可执行路径、环境、进程输出和传输配置。工具能发现但结果不正确时,再检查业务代码。stdio 模式不要把调试文字随意写到协议使用的标准输出。
接业务接口前先定义权限与失败结果
下一步才把只读查询接入函数,并清楚限定可访问的对象和字段。不要让模型任意拼接底层命令或 SQL;把业务允许的操作转换成结构化参数。
远程使用时,传输、认证、授权、超时与审计都需要单独设计。把能读和能写的工具分开,明确失败与重试行为,再考虑打包成插件分发。
server.py:只计算两个整数的和
from fastmcp import FastMCP
mcp = FastMCP("Integer demo")
@mcp.tool
def add(a: int, b: int) -> int:
"""Return the sum of two integers."""
return a + b
if __name__ == "__main__":
mcp.run()
根据 FastMCP README 的最小结构整理。先在独立 Python 项目安装 fastmcp,再把文件保存为 server.py;示例只用于说明工具声明方式,不代表已完成远程服务的认证与部署。
开始前检查
- 最小工具不依赖真实账号与生产数据
- 测试了正常、缺参数和错误类型输入
- 协议输出与调试日志分开
- 远程认证、授权与业务权限分别验证
参考来源
根据下列项目 README 与资料整理。选型和验收步骤为本站编辑建议,未宣称对工具进行基准测试。项目可能更新,实际使用前请核对官方说明。
- 项目原始资料
https://github.com/PrefectHQ/fastmcp/blob/7e107c9cfb7a3cf56d74fcfa936e59b4c3b7cf01/README.md - 项目原始资料
https://github.com/modelcontextprotocol/inspector/blob/074b8108f340590268f2900741403755e923a11c/README.md - 项目原始资料
https://github.com/github/github-mcp-server/blob/e3809fe91c7546633241006bf0b91f23b2595e28/README.md - 项目原始资料
https://github.com/anthropics/claude-plugins-official/blob/ea10b213686c90bb1984b2016937310e05336cf3/README.md