15 分钟用 FastMCP 搭建你的第一个 MCP Server(附完整代码)
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安装 FastMCPFastMCP 是让 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, youd call a real weather API # For now, well 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(transportstdio)FastMCP(my-first-server)创建一个带名称的服务器实例。mcp.tool装饰器把普通函数注册为 MCP 工具。函数的 docstring 会变成工具描述——LLM 靠这个来判断什么时候该调用它。类型提示city: str、- dict告诉 MCP 输入输出的类型。transportstdio表示通过标准输入输出通信本地测试够用了。整个 Server 就这些实际代码 15 行。步骤 3写个 Client 测试一下新建test_client.pyimport 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(fWeather 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 fCurrent 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(transportstdio)再跑一次测试客户端三个工具全部自动发现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换成httpif__name____main__: mcp.run(transporthttp, host0.0.0.0, port8000)这样 MCP Server 就以 HTTP 端点的形式对外暴露远程客户端可以直接连接。总结现在你手头已经有一个能跑的 MCP Server 了前后也就 15 分钟。下一步就是把它接到实际的 LLM 上做点真正有用的东西出来。https://avoid.overfit.cn/post/c9314c34543a4ed1a1bb15b92d1c6ca2by Paolo Perrone

相关新闻

数据仓库建设中的聚合事实表设计

数据仓库建设中的聚合事实表设计

数据仓库建设中的聚合事实表设计:用"预加工食材"让数据分析更高效关键词:数据仓库、聚合事实表、明细事实表、维度聚合、查询优化、指标汇总、ETL设计摘要:在数据仓库的实际应用中,我们常遇到"数据越多跑得越慢&qu…

2026/5/17 4:58:19 阅读更多 →
Python SMTP:全面指南

Python SMTP:全面指南

Python SMTP:全面指南 引言 SMTP(Simple Mail Transfer Protocol)是一种用于发送电子邮件的协议。Python作为一种广泛使用的编程语言,提供了丰富的库来处理SMTP相关的任务。本文将全面介绍Python中的SMTP,包括其基本概念、使用方法以及一些高级技巧。 SMTP基本概念 SM…

2026/7/4 23:29:09 阅读更多 →
Spark大数据处理:技术、应用与性能优化【2.1】

Spark大数据处理:技术、应用与性能优化【2.1】

4.6 Shuffle机制Shuffle的本义是洗牌、混洗,即把⼀组有⼀定规则的数据打散重新组合转换成⼀组⽆规则随机数据分区。Spark中的Shuffle更像是洗牌的逆过程,把⼀组⽆规则的数据尽量转换成⼀组具有⼀定规则的数据,Spark中的Shuffle和MapReduce中…

2026/5/17 4:58:17 阅读更多 →

最新新闻

Ketcher架构深度解析:基于Web的化学结构编辑器技术实现与工程实践

Ketcher架构深度解析:基于Web的化学结构编辑器技术实现与工程实践

Ketcher架构深度解析:基于Web的化学结构编辑器技术实现与工程实践 【免费下载链接】ketcher Web-based molecule sketcher 项目地址: https://gitcode.com/gh_mirrors/ke/ketcher Ketcher作为一款现代化的Web化学结构编辑器,其技术架构体现了对复…

2026/7/5 4:33:16 阅读更多 →
抖店AI标题优化怎么用标题违规和低质标题怎么改

抖店AI标题优化怎么用标题违规和低质标题怎么改

抖店AI标题优化怎么用?标题违规和低质标题怎么改 抖店商品标题写不好,会影响审核、搜索理解和买家点击。很多商家从 1688 搬标题时,原标题里带批发词、品牌词、极限词、无关热词,直接上架容易违规,也不一定适合抖店买家…

2026/7/5 4:29:15 阅读更多 →
如何3分钟完成通达信缠论插件部署:终极自动化分析指南

如何3分钟完成通达信缠论插件部署:终极自动化分析指南

如何3分钟完成通达信缠论插件部署:终极自动化分析指南 【免费下载链接】ChanlunX 缠中说禅炒股缠论可视化插件 项目地址: https://gitcode.com/gh_mirrors/ch/ChanlunX 还在为复杂的缠论分析而烦恼吗?面对繁琐的笔段划分和中枢识别,传…

2026/7/5 4:27:15 阅读更多 →
接口自动化测试项目框架详解

接口自动化测试项目框架详解

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 在选择接口测试自动化框架时,需要根据团队的技术栈和项目需求来综合考虑。对于测试团队来说,使用Python相关的测试框架更为便捷。无论选…

2026/7/5 4:25:15 阅读更多 →
单片机IWIP 原子云实验

单片机IWIP 原子云实验

单片机 :STM32F407 开发板:DMF407电机开发板 平台:keil V5.31HSE 为8MHZ HSI为16MHZ主函数int main(void) {HAL_Init(); /* 初始化HAL库 */sys_stm32_clock_init(336, 8, 2, 7); /* 设置时钟,168Mhz */delay_init…

2026/7/5 4:25:15 阅读更多 →
Nano Banana部署Gemini 2.5 Flash:ARM+NPU边缘多模态推理实战指南

Nano Banana部署Gemini 2.5 Flash:ARM+NPU边缘多模态推理实战指南

1. 项目概述:这不是一个“升级包”,而是一套可落地的嵌入式AI推理工作流 你手头有一块 Nano Banana 开发板——它不是树莓派,也不是 Jetson Nano,而是基于全志 H616 芯片、带双千兆网口、4GB LPDDR4、支持 PCIe 2.0 x1 的国产小钢…

2026/7/5 4:23:15 阅读更多 →

日新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻