fastmcp学习入门------踩坑与经验
1、什么是MCP
MCP 的全称是 Model Context Protocol,你可以把它想象成 AI 的“万能充电器”接口。
以前,不同的 AI 模型(比如 ChatGPT、Claude 等)要连接不同的工具(比如查天气、读文件、访问数据库),每个工具都得单独为它做一个“插头”,非常麻烦。
MCP 就像一个统一的 USB-C 接口,只要 AI 和工具都支持这个接口,就能直接插上就用。这样一来,AI 可以更方便地调用外部工具,获取实时信息或执行任务,而开发者也不用为每个组合重复造轮子了。
2、什么是FastMCP
FastMCP 是一个 帮你快速制作“万能充电器”的简易工具包。
如果你想开发一个支持 MCP 接口的服务(比如让 AI 能查你家温度),用 FastMCP 就能像搭积木一样,几行代码就搞定,省时省力。它简化了开发流程,让你不用操心底层细节,专注于写功能本身。
3、安装fastmcp
pip install fastmcp
或者可以用uv来安装MCP,管理mcp的效率要远高于pip
uv add fastmcp
4、简单示例
首先我们先写个HelloWorld服务器(stdio传输版本)
from fastmcp import FastMCP
mcp = FastMCP("My MCP Server")
@mcp.tool
def greet(name: str) -> str:
return f"Hello, {name}!"
if __name__ == "__main__":
mcp.run()
该方法使用了stdio传输,更加的简单,不需要HTTP服务器,并且直接通过子过程通信,避免了网络连接问题
STDIO 传输非常适合本地开发和桌面应用。但想要释放 MCP 的全部潜力——集中式服务、多客户端访问以及网络可达性——就需要远程 HTTP 部署。
编写客户端文件
import asyncio
from fastmcp import Client
#注释掉,当使用HTTP传输时方便修改
#client = Client("http://localhost:8000/mcp")
async def main():
async with Client("此处放入你的服务器文件") as client:
tools = await client.list_tools()
print("Available tools:", tools)
result = await client.call_tool("greet", {"name": "World"})
print(result)
asyncio.run(main())
启动服务器后在终端可以看到

启动客户端文件调用方法后可以看到终端输出

在我使用http传输方式时,经常会出现502问题,当服务器运行时,使用客户端调用方法,会报错
服务器代码(http版本)
from fastmcp import FastMCP
mcp = FastMCP("My MCP Server")
@mcp.tool
def greet(name: str) -> str:
return f"Hello, {name}!"
if __name__ == "__main__":
mcp.run(transport="http", port=8000)
报错
httpx.HTTPStatusError: Server error '502 Bad Gateway' for url 'http://localhost:8080/mcp'
For more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/502
在我更换端点后,仍旧出现以上问题,说明服务器端点路径没有问题,检查服务器是否运行包括是否正确实现了MCP协议并检查端口监听
curl http://localhost:8000/mcp
netstat -an | findstr :8000
终端返回
TCP 127.0.0.1:8000 0.0.0.0:0 LISTENING
表明服务器正在8000端口上监听,且服务器响应正常虽然报错,但这实际上说明服务器正在运行并接受连接,并且服务器正确实现了MCP协议,错误是因为curl没有发送正确的Accept:text/event-stream头,但fastmcp。Client会自动设置正确的HTTP头,那么只有可能是网络/防火墙问题
于是将客户端文件中的网络地址
async with Client("http://localhost:8000/mcp") as client
改为
async with Client("http://127.0.0.1:8000/mcp") as client
再次运行客户端代码,发现输出正常,该问题解决

5、简单示例2
在解决上述问题后,我们编写一个简单的加减法工具用于客户端调用
FastMCP工具编写极其简单,只需要在工具前增加一个解释器即可
@mcp.tool
这样的工具我们想加多少加多少,例如我添加一个加法工具
from fastmcp import FastMCP
mcp = FastMCP("My fastmcp serve")
@mcp.tool
def add(a: int, b: int) -> int:
"""Add two numbers and return the result"""
return a + b
if __name__ == "__main__":
mcp.run()
然后重启服务器,客户端就可以直接调用该加法工具
6、更深入了解一些FastMCP功能
FastMCP能做的远不止是工具调用。它还能定义“资源”和“提示”,让你的AI应用更加强大。我们来看一个更贴近真实场景的例子:一个简单的任务管理器。
from fastmcp import FastMCP
from datetime import datetime
# 创建服务器实例
mcp = FastMCP("任务管理器")
# 一个简单的内存“数据库”
tasks = []
task_id_counter = 1
# --- 1. 工具(Tools):AI可以执行的操作 ---
@mcp.tool()
def add_task(title: str, description: str = "") -> dict:
"""添加一个新任务。"""
global task_id_counter
task = {
"id": task_id_counter,
"title": title,
"desc": description,
"status": "pending",
"created_at": datetime.now().isoformat()
}
tasks.append(task)
task_id_counter += 1
return task
@mcp.tool()
def complete_task(task_id: int) -> dict:
"""将一个任务标记为已完成。"""
for task in tasks:
if task["id"] == task_id:
task["status"] = "completed"
task["completed_at"] = datetime.now().isoformat()
return task
return {"error": f"找不到ID为 {task_id} 的任务"}
# --- 2. 资源(Resources):AI可以读取的数据 ---
@mcp.resource("tasks://pending")
def get_pending_tasks() -> str:
"""获取所有待办任务列表。"""
pending = [t for t in tasks if t["status"] == "pending"]
if not pending:
return "恭喜!目前没有待办任务。"
result = "📋 待办任务清单:\n"
for task in pending:
result += f" - [{task['id']}] {task['title']}\n"
return result
# --- 3. 提示(Prompts):指导AI如何更好地与用户交互 ---
@mcp.prompt()
def task_analysis_prompt() -> str:
"""生成一个分析任务清单的提示模板。"""
return """
请分析当前的任务清单,并告诉我:
1. 总共有多少任务?
2. 有多少是待办的?
3. 根据任务标题,你觉得下一步最应该做什么?
请使用 `tasks://pending` 资源来获取最新的待办任务信息。
"""
if __name__ == "__main__":
mcp.run()
在这个例子里,我们可以看到FastMCP的三个核心能力 :
-
工具 (
@mcp.tool):add_task和complete_task是AI的“手”,用来执行操作(增、改)。 -
资源 (
@mcp.resource):tasks://pending是AI的“眼睛”,用来读取数据(查)。它像一个只读的API端点。 -
提示 (
@mcp.prompt):task_analysis_prompt是AI的“脑子”里的“思考框架”,它为AI如何完成特定任务(如分析任务)提供了结构化的指导。
有了这些,一个AI助手就能理解用户的指令,比如“帮我加一个‘买牛奶’的任务”,或者“看看我还有什么没做?”,然后通过调用你定义的工具和资源来完成它。
7、身份认证配置
生产环境肯定要考虑安全问题。FastMCP 内置支持 Google、GitHub、Azure、Auth0、WorkOS 这些企业级认证服务商。启用 OAuth 认证只需要几行配置:
from fastmcp.server.auth.providers.google import GoogleProvider
from fastmcp import FastMCP
auth = GoogleProvider(client_id="...", client_secret="...", base_url="https://myserver.com")
mcp = FastMCP("Secure Server", auth=auth)
这样就只有通过认证的用户能访问服务了。客户端侧用 OAuth 流程连接:
async with Client("https://secure-server.com/mcp", auth="oauth") as client:
result = await client.call_tool("protected_tool")
Token 管理、刷新、错误处理这些 FastMCP 都自动搞定了,我们不用写复杂的代码,只考虑实现我们的工具功能就可以了
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)