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 都自动搞定了,我们不用写复杂的代码,只考虑实现我们的工具功能就可以了

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐