15 分钟用 FastMCP 搭建你的第一个 MCP Server(附完整代码)

简介: Model Context Protocol(MCP)是一个轻量开放标准,让LLM能统一、可靠地调用外部工具。无需手写解析逻辑或维护胶水代码。核心仅三概念:Server(暴露工具)、Tool(带装饰器的函数)、Client(调用方)。FastMCP框架15分钟即可上手,支持stdio快速测试、HTTP生产部署,真正实现“写一次,随处调用”。

Model Context Protocol 是一个开放标准,它的目标是给 LLM 一种干净、统一的方式去发现和调用外部工具。不用再写自定义解析、不用再维护脆弱的胶水代码,就是一个好用的协议。

大多数 MCP 教程上来就讲 JSON-RPC 规范、传输层协议,搞得很复杂。其实用 MCP 不需要理解协议内部构造就像写 Web 应用不需要去读 HTTP 规范一样。

真正需要掌握的东西就三个概念,花 15 分钟就够了。

三个核心概念

MCP 的核心就三样东西:

Server:对外暴露工具的服务端,本质上是一个 Python 脚本,声明"这些函数可以被 LLM 调用",跑起来之后就在监听请求。

Tool:希望 LLM 使用的函数,可以是任何东西:查天气、查数据库、发邮件。这跟写普通 Python 函数没什么区别,加个装饰器剩下的交给 MCP。

Client:连接 Server 并调用工具的客户端。生产环境里一般就是 LLM 应用本身。测试阶段可以用 FastMCP 自带的客户端,开箱即用。

Server 暴露工具,Client 调用工具。就这么简单。

传输方式、JSON-RPC、能力协商这些都是实现细节,上生产之前不用管。

步骤 1:安装 FastMCP

FastMCP 是让 MCP 用起来简单的 Python 框架。装一下就行,不需要任何配置。

 pip install fastmcp

本教程不需要虚拟环境,生产环境建议还是用一个。

步骤 2:创建 Server

新建一个

my_server.py

文件:

 from fastmcp import FastMCP  

# Initialize the server with a name  
mcp = FastMCP("my-first-server")  

# Define a tool using the @mcp.tool decorator  
@mcp.tool  
def get_weather(city: str) -> dict:  
    """Get the current weather for a city."""  
    # In production, you'd call a real weather API  
    # For now, we'll return mock data  
    weather_data = {  
        "new york": {"temp": 72, "condition": "sunny"},  
        "london": {"temp": 59, "condition": "cloudy"},  
        "tokyo": {"temp": 68, "condition": "rainy"},  
    }  

    city_lower = city.lower()  
    if city_lower in weather_data:  
        return {"city": city, **weather_data[city_lower]}  
    else:  
        return {"city": city, "temp": 70, "condition": "unknown"}  

# Run the server  
if __name__ == "__main__":  
     mcp.run(transport="stdio")
FastMCP("my-first-server")

创建一个带名称的服务器实例。

@mcp.tool

装饰器把普通函数注册为 MCP 工具。函数的 docstring 会变成工具描述——LLM 靠这个来判断什么时候该调用它。类型提示(

city: str

-> dict

)告诉 MCP 输入输出的类型。

transport="stdio"

表示通过标准输入输出通信,本地测试够用了。

整个 Server 就这些,实际代码 15 行。

步骤 3:写个 Client 测试一下

新建

test_client.py

 import asyncio  
from fastmcp import Client  

async def main():  
    # Point the client at your server file  
    client = Client("my_server.py")  

    # Connect to the server  
    async with client:  
        # List available tools  
        tools = await client.list_tools()  
        print("Available tools:")  
        for tool in tools:  
            print(f"  - {tool.name}: {tool.description}")  

        print("\n" + "="*50 + "\n")  

        # Call the weather tool  
        result = await client.call_tool(  
            "get_weather",   
            {"city": "Tokyo"}  
        )  
        print(f"Weather result: {result}")  

if __name__ == "__main__":  
     asyncio.run(main())
Client("my_server.py")

指定要连接的 Server 文件;

async with client:

自动管理连接生命周期;

list_tools()

负责动态发现可用工具,这是 MCP 的核心能力之一;

call_tool("get_weather", {"city": "Tokyo"})

带参数调用具体工具。

步骤 4:跑起来

终端里执行:

 python test_client.py

输出应该是这样的:

 Available tools:  
   - get_weather: Get the current weather for a city.
 ==================================================Weather result: {'city': 'Tokyo', 'temp': 68, 'condition': 'rainy'}

到这里就完成了。一个 MCP Server 搭好了Client 也成功调用了它。

步骤 5:增加更多工具

MCP 真正好用的地方在于扩展成本极低,再往 Server 里再加两个工具:

 from fastmcp import FastMCP  
from datetime import datetime  

mcp = FastMCP("my-first-server")  

@mcp.tool  
def get_weather(city: str) -> dict:  
    """Get the current weather for a city."""  
    weather_data = {  
        "new york": {"temp": 72, "condition": "sunny"},  
        "london": {"temp": 59, "condition": "cloudy"},  
        "tokyo": {"temp": 68, "condition": "rainy"},  
    }  
    city_lower = city.lower()  
    if city_lower in weather_data:  
        return {"city": city, **weather_data[city_lower]}  
    return {"city": city, "temp": 70, "condition": "unknown"}  

@mcp.tool  
def get_time(timezone: str = "UTC") -> str:  
    """Get the current time in a specified timezone."""  
    # Simplified - in production use pytz or zoneinfo  
    return f"Current time ({timezone}): {datetime.now().strftime('%H:%M:%S')}"  

@mcp.tool  
def calculate(expression: str) -> dict:  
    """Safely evaluate a mathematical expression."""  
    try:  
        # Only allow safe math operations  
        allowed_chars = set("0123456789+-*/.() ")  
        if not all(c in allowed_chars for c in expression):  
            return {"error": "Invalid characters in expression"}  

        result = eval(expression)  # Safe because we validated input  
        return {"expression": expression, "result": result}  
    except Exception as e:  
        return {"error": str(e)}  
if __name__ == "__main__":  
     mcp.run(transport="stdio")

再跑一次测试客户端,三个工具全部自动发现:

 Available tools:  
   - get_weather: Get the current weather for a city.  
   - get_time: Get the current time in a specified timezone.  
   - calculate: Safely evaluate a mathematical expression.

不需要改配置,不需要写路由。加了工具就直接可用。

最后:接入 LLM

前面写的 Client 是测试用的。生产环境里,LLM 框架本身充当 Client 角色。概念上大概是这样:

How MCP connects your LLM to external tools: the framework calls the client, which discovers and invokes tools from your server.

Server 端的代码完全不用动,这正是 MCP 的价值所在——工具写一次,任何兼容 MCP 的客户端都能用。

生产部署时需要把传输方式从

stdio

换成

http

 if__name__=="__main__":  
     mcp.run(transport="http", host="0.0.0.0", port=8000)

这样 MCP Server 就以 HTTP 端点的形式对外暴露,远程客户端可以直接连接。

总结

现在你手头已经有一个能跑的 MCP Server 了,前后也就 15 分钟。下一步就是把它接到实际的 LLM 上,做点真正有用的东西出来。

https://avoid.overfit.cn/post/c9314c34543a4ed1a1bb15b92d1c6ca2

by Paolo Perrone

目录
相关文章
|
5月前
|
人工智能 安全 API
FastMCP 入门:用 Python 快速搭建 MCP 服务器接入 LLM
MCP协议为大语言模型连接外部工具与数据提供标准化方案,FastMCP是其Python最佳实践框架。本文详解MCP核心概念,演示如何用FastMCP快速搭建支持工具调用、资源访问与身份认证的MCP服务器,并集成至LLM应用,实现AI智能体与真实世界的高效交互。
2239 2
FastMCP 入门:用 Python 快速搭建 MCP 服务器接入 LLM
|
人工智能 机器人 测试技术
使用LM Studio在本地运行LLM完整教程
GPT-4被普遍认为是最好的生成式AI聊天机器人,但开源模型一直在变得越来越好,并且通过微调在某些特定领域是可以超过GPT4的。
7663 1
|
5天前
|
测试技术 API 内存技术
LangChain 还是 LangGraph?一个是编排一个是工具包
本文对比LangChain与LangGraph在真实代码审查流水线中的实践:二者API、Agent逻辑与Gemini 2.5 Flash调用完全一致。LangChain适合线性流程,简洁高效;LangGraph则以状态机支持条件分支、循环重试与人工干预,是复杂编排的唯一解。二者非替代关系,而是抽象层级互补——LangChain v1.0的Agent已构建于LangGraph之上。
149 3
LangChain 还是 LangGraph?一个是编排一个是工具包
|
1月前
|
人工智能 机器人 项目管理
保姆级教程:OpenClaw(Clawdbot)阿里云/本地多Agent部署+飞书机器人协同,搭建专属 AI 打工团队
2026年,AI智能体的核心进化方向从“单一功能执行”转向“多角色协同”——OpenClaw(昵称“龙虾”)凭借成熟的MultiAgent架构,打破了传统AI工具“单打独斗”的局限,让多个智能体分工协作,像真人团队一样拆解任务、并行执行、汇总结果。这种能力在内容创作、项目管理、业务协作等复杂场景中价值凸显:主Agent负责任务拆分与分配,子Agent各司其职(如公众号文案、小红书创作、数据整理),搭配飞书机器人实现实时交互与成果同步,真正实现“一句话启动复杂项目”。
5938 2
|
1月前
|
人工智能 API 开发者
OpenClaw低成本云上及本地部署喂饭级指南:阿里云百炼Coding Plan API多模型配置实操(Qwen3.5-Plus、Kimi-K2.5、GLM-5)
在AI编程与自动化场景中,API成本过高是开发者普遍面临的痛点——高频次使用下,按token计费的模型服务往往带来不可预期的开支。2026年阿里云百炼Coding Plan的升级,为这一问题提供了高效解决方案:以固定包月模式聚合Qwen3.5-Plus、Kimi-K2.5、GLM-5等8款主流模型,一个API Key即可自由切换,大幅降低使用成本。
2109 7
|
1月前
|
人工智能 自然语言处理 数据安全/隐私保护
保姆级教程:OpenClaw阿里云/本地部署+集成iMessage 打造专属移动AI助手
对于Apple生态用户而言,iMessage不仅是日常通讯工具,更是高频交互入口。而OpenClaw(原Clawdbot)作为开源AI代理框架,能通过iMessage实现“手机发指令,电脑/云端执行任务”的无缝体验——无需打开专用App,只需发送一条短信,即可触发文件处理、日程管理、信息查询等自动化操作。本文基于2026年最新版本,详细拆解OpenClaw的阿里云与本地双部署流程,重点分享iMessage通道的完整接入步骤,所有代码命令可直接复制执行,全程无营销词汇,助力Apple用户打造专属移动AI助手。
2421 1
|
人工智能 网络协议 Linux
MCP 协议: Streamable HTTP 是最佳选择
随着AI应用变得越来越复杂并被广泛部署,原有的通信机制面临着一系列挑战。近期MCP仓库的PR #206引入了一个全新的Streamable HTTP传输层替代原有的HTTP+SSE传输层。本文将详细分析该协议的技术细节和实际优势。
7110 102
|
2月前
|
人工智能 安全 搜索推荐
智能体来了:从0到1教你三步构建属于你的 AI 数字分身
本文带你从零构建专属AI智能体:解析其自主性本质,详解“骨架—性格—应用”三步搭建法,涵盖决策中枢、记忆系统与行动接口,并强调隐私保护与伦理边界。门槛降低,人人可启程。
1589 1
|
3月前
|
人工智能 安全 前端开发
老金发现个4277星的Claude Code企业神器,看完我直接跪了
老金拆解GitHub高星项目,教你用Claude Code打造自动化开发系统:Skills规范代码、Agents智能审查、Commands一键操作、Hooks自动触发、GitHub Actions定时巡检、MCP集成外部工具。4277星实战验证,企业级AI编程提效方案,文末附免费开源知识库。
1959 12