网易首页 > 网易号 > 正文 申请入驻

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

0
分享至

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

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
左小青的女儿,眉毛也太浓了

左小青的女儿,眉毛也太浓了

小椰的奶奶
2026-02-15 05:58:07
西蒙尼嘲讽巴萨没有C罗,亚马尔表示已观看了C罗的全部集锦

西蒙尼嘲讽巴萨没有C罗,亚马尔表示已观看了C罗的全部集锦

K唐伯虎
2026-02-16 08:35:15
A股:周一晚间传来3个史诗级消息!A股或将会迎来更大级别大行情?

A股:周一晚间传来3个史诗级消息!A股或将会迎来更大级别大行情?

股市皆大事
2026-02-16 18:27:39
就在今天!2月16日,斯诺克传来赵心童、肖国栋、丁俊晖消息

就在今天!2月16日,斯诺克传来赵心童、肖国栋、丁俊晖消息

皮皮观天下
2026-02-16 14:25:42
阳气不足百病生,1个简单方法,帮你把阳气补回来!

阳气不足百病生,1个简单方法,帮你把阳气补回来!

神奇故事
2026-01-25 22:42:34
在七千多的养老院住了一年才明白:再贵的养老院,也买不来这3样

在七千多的养老院住了一年才明白:再贵的养老院,也买不来这3样

小马达情感故事
2026-02-10 11:50:09
“资助不起装什么孙子!”2006年,贫困大学生向海清向媒体怒斥

“资助不起装什么孙子!”2006年,贫困大学生向海清向媒体怒斥

百态人间
2026-02-05 15:42:49
俄媒:一旦开战,中方只靠解放军难以取胜,必须调动另一股力量!

俄媒:一旦开战,中方只靠解放军难以取胜,必须调动另一股力量!

勇士军武闲谈
2026-02-13 11:54:35
王菲将六登春晚,还未开唱歌曲已经火了!原唱系“学霸乐队”,其讲述被选中过程:接到导演组电话称“有重量级歌手选中了你们的歌”

王菲将六登春晚,还未开唱歌曲已经火了!原唱系“学霸乐队”,其讲述被选中过程:接到导演组电话称“有重量级歌手选中了你们的歌”

每日经济新闻
2026-02-15 23:58:25
法国猫徒步5个月从西班牙回家!只为再蹭蹭主人的手

法国猫徒步5个月从西班牙回家!只为再蹭蹭主人的手

新欧洲
2026-01-28 21:37:40
李玮锋:踢日本恨不得把鞋钉换成刀!我们比赛没赢过 场上没怂过

李玮锋:踢日本恨不得把鞋钉换成刀!我们比赛没赢过 场上没怂过

念洲
2026-02-15 17:07:32
2100枚核弹24小时待命,张召忠曾发出警告:一旦开战,将无处可逃

2100枚核弹24小时待命,张召忠曾发出警告:一旦开战,将无处可逃

近史博览
2026-01-22 12:52:47
湘潭钢铁爆炸大火持续12小时:画面流出,伤亡情况披露,原因曝光

湘潭钢铁爆炸大火持续12小时:画面流出,伤亡情况披露,原因曝光

博士观察
2026-02-15 11:07:28
斯大林死在地上10小时,满身屎尿没人管:那个让世界害怕的人。

斯大林死在地上10小时,满身屎尿没人管:那个让世界害怕的人。

房产衫哥
2026-02-13 17:22:30
美专家一致认为:想打败中国只有一条路,但这条红线美国不敢跨越

美专家一致认为:想打败中国只有一条路,但这条红线美国不敢跨越

夏末moent
2026-02-16 20:14:14
腾讯除夕官宣:追加100张万元小马卡,来领福利了(附赠邀请码)

腾讯除夕官宣:追加100张万元小马卡,来领福利了(附赠邀请码)

雷科技
2026-02-16 12:30:50
2026马年寄语100句,愿你马年行大运,马到成功,万事顺遂!

2026马年寄语100句,愿你马年行大运,马到成功,万事顺遂!

趴窗看雨的小龟
2026-02-15 00:15:03
23岁懒死家中,“中国第一懒人”杨锁到底有多懒,守着肉菜被饿死

23岁懒死家中,“中国第一懒人”杨锁到底有多懒,守着肉菜被饿死

荷兰豆爱健康
2026-02-15 23:40:22
身家过亿的财经女侠叶檀,抗癌3年悔悟:丁克是这辈子最错的决定

身家过亿的财经女侠叶檀,抗癌3年悔悟:丁克是这辈子最错的决定

青眼财经
2026-02-11 19:36:31
欧洲小偷,都传疯了,达成了一个行业共识,中国人的钱包,随便拿

欧洲小偷,都传疯了,达成了一个行业共识,中国人的钱包,随便拿

西楼知趣杂谈
2026-02-14 18:35:51
2026-02-16 21:08:49
deephub incentive-icons
deephub
CV NLP和数据挖掘知识
1922文章数 1448关注度
往期回顾 全部

科技要闻

OpenAI拿下OpenClaw之父 承诺开源绝不动摇

头条要闻

女孩从杭州借道俄罗斯回东北:耗时5天 比直飞省500多

头条要闻

女孩从杭州借道俄罗斯回东北:耗时5天 比直飞省500多

体育要闻

遭针对?谷爱凌炮轰国际雪联安排

娱乐要闻

好甜蜜!郭富城随方媛回安徽过年

财经要闻

2025,中国商业十大意外,黄金只排第九

汽车要闻

叫停纯屏操作 工信部拟推车内实体操作件强制国标

态度原创

健康
时尚
旅游
艺术
游戏

转头就晕的耳石症,能开车上班吗?

记录最近收获很大的一次深度链接

旅游要闻

欢乐祥和迎新春 神州大地暖意浓

艺术要闻

孙过庭又一草书真迹被发现,完完整整5000多字,至今只公开展出过一回!

PS6恐推迟至2029年!Switch 2也难逃涨价潮?

无障碍浏览 进入关怀版