前言
前篇已经介绍了MCP+n8n构建工作流,
MCP + n8n构建高效AI工作流
在里面可以体现出MCP服务的重要性,以及能看到MCP的可能性,在我们真正的实战过程中可能会有各种各样的需求,开放的MCP服务有极大可能实现不了我们的需求,这个时候如果你懂如何开发一个自己的MCP服务,如虎添翼,助力业务。 完事开头难,我详细大部分人所有的行动都止于开头,不知道如何开发?不知道从哪里入手?不知道怎么使用? 看文章百遍,不如自己专心走一遍🚀🚀🚀
什么是MCP服务端
MCP Server(MCP服务端),在前面文章介绍MCP的时候说过,MCP其实是一个CS(Client Server)架构,本文提到的MCP Server就是这个CS架构中的S。 MCP协议在交互过程中如下图所示

在途中可以看出MCP Server扮演着很重要的角色,核心逻辑都在这个Server中。
那Server能干什么呢? 显而易见,能实现很多很多功能比如:从远程的服务获取数据、从本地的文件系统获取数据甚至可以操作我们的网盘、硬件等; 这些所有的操作都由LLM(大模型)驱动,由大模型来决定我们到底要使用MCP Server的哪个动作、哪个功能。
如何开发?
现在MCP协议其实比较成熟了,对于开发一个新的MCP Server官方已经提供了各种语言的SDK供我们使用,我们不需要从0开始写MCP协议,直接用轮子,我们不需要关心它的传输、交互协议,直接实现SDK提供的API即可。

在发过程中,对于MCP Server有几个比较重要的概念,它能提供的标准能力:Resources、Tools、Prompts,知道这些标准能力你就知道SDK里面的API到底是什么意思
- Resources:资源,类似于文件数据读取,可以是文件资源或是API响应返回的内容。
- Tools:工具,第三方服务、功能函数,通过此可控制LLM可调用哪些函数。
- Prompts 提示词(们):是指一类用户可控的、可重用的提示模板或工作流,用于标准化和简化与大型语言模型(LLM)的交互。简单来说,Prompts 是预定义的指令或消息结构,允许用户通过提供特定参数来触发与 AI 的某种一致性交互,而无需每次都手动编写完整的提示内容
铺垫了这么多该进入正题了ʕ•͡-•ʔ
Let’s do it
在官方提供的众多SDK中,笔者学识浅薄选择了最擅长的Python SDK 作为demo的开发。如果对Python不了解的、或者想学习Python的可以私信我,我来给你规划下Python学习计划,一起成长 (●’◡’●)ノ MCP Server的Python SDK地址:https://github.com/modelcontextprotocol/python-sdk?tab=readme-ov-file
我们按照文档依葫芦画瓢开始一步一步操作 在实践之前希望你准备下Python环境,其中包括
- Python 3.10 +
- uv – Python的包管理工具(传送门:https://github.com/astral-sh/uv)
敌方还有5秒到达战场
创建项目
uv init mcp-server-demo
cd mcp-server-demo

添加依赖
uv add "mcp[cli]"
写代码
你打开项目会看到如下目录 xxx 其中main.py就是我们的开发目标文件,将它编辑成如下:
from mcp.server.fastmcp import FastMCP
mcp = FastMCP("mcp-server-demo", "MCP Server Example")
@mcp.tool()
def add(a: int, b: int) -> int:
"""
Adds two numbers.
"""
return a + b
@mcp.resource("greeting://{name}")
def get_greeting(name: str) -> str:
"""
Returns a greeting message.
"""
return f"Hello, {name}!"
if __name__ == "__main__":
mcp.run(transport='stdio')
逐行解释代码
from mcp.server.fastmcp import FastMCP
从 mcp.server.fastmcp 模块中导入 FastMCP 类。这是 MCP(Model Context Protocol)服务器实现的一部分,FastMCP 是一个用于快速构建 MCP 服务器的类。
mcp = FastMCP("mcp-server-demo", "MCP Server Example")
创建一个 FastMCP 类的实例 mcp。
- “mcp-server-demo”: 第一个参数是服务器的标识符或名称,用于区分不同的 MCP 服务器。
- “MCP Server Example”: 第二个参数是服务器的描述,可能用于日志、文档或客户端显示。
- 这行初始化了一个 MCP 服务器对象,后续的功能将基于这个对象注册和运行。
@mcp.tool()
def add(a: int, b: int) -> int:
使用装饰器 @mcp.tool() 定义一个工具函数 add。
- @mcp.tool(): 表示将 add 函数注册为 MCP 服务器的一个“工具”(Tool)。工具是模型可以调用的功能,由服务器暴露给客户端或语言模型。
- def add(a: int, b: int): 定义函数 add,接受两个整数参数 a 和 b。
- a: int 和 b: int: 类型注解,表明参数应该是整数。 -> int: 返回值类型注解,表示函数返回一个整数。
"""
Adds two numbers.
"""
这是一个文档字符串(docstring),用三引号括起来。 描述了 add 函数的作用:“将两个数字相加”。 在 MCP 上下文中,这个描述可能会被客户端或模型用来理解工具的功能。
@mcp.resource("greeting://{name}")
def get_greeting(name: str) -> str:
"""
Returns a greeting message.
"""
return f"Hello, {name}!"
- 使用装饰器 @mcp.resource() 定义一个资源函数 get_greeting。
- @mcp.resource(“greeting://{name}”): 将 get_greeting 注册为 MCP 服务器的一个“资源”(Resource)。
- “greeting://{name}”: 资源标识符,类似于 URL 模式,{name} 是一个占位符,表示需要传入一个参数 name。
- 资源通常提供数据,而不是执行动作,与工具不同。
- def getgreeting(name: str): 定义函数 getgreeting,接受一个字符串参数 name。
- name: str: 类型注解,表明 name 是一个字符串。
- -> str: 返回值类型注解,表示函数返回一个字符串。
if __name__ == "__main__":
mcp.run(transport='stdio')
启动 MCP 服务器。
- mcp.run(): 调用 FastMCP 实例的 run 方法,开始运行服务器。
- transport=’stdio’: 指定通信方式为标准输入输出(stdio)。
- 这意味着服务器通过命令行(终端)的输入和输出与客户端通信,而不是通过网络(如 HTTP 或 WebSocket)。 运行后,服务器会监听请求,处理注册的工具(如 add)和资源(如 get_greeting)。
MCP客户端配置
通过上面代码编写你的第一个MCP服务器已经完成,它的主要功能是计算a+b,功能很简单,笔者只是想通过这个简单的例子讲明白到底要怎么开发?如果你有其他复杂需求,可以私信笔者进行交流。 笔者这里用的客户端是Claude,当然你也可以用Cline ChatMCP等工具进行使用。 打开Caulde开发者配置
将配置改为如下
{
"mcpServers": {
"mcp-server-demo": {
"command": "你的项目地址/mcp-server-demo/.venv/bin/python",
"args": [
"你的项目地址/mcp-server-demo/main.py"
]
}
}
}
重启Claude即可生效,效果如下

测试:

从Claude的调用来看已经能成功调用到我们定义的add工具,您在实践的时候也可以尝试改成其他内容,看Claude如何反应?欢迎评论区交流
其它的内容
其实在调用之前你也可以先在本地调试你的MCP服务,可以用如下命令启动开发模式
mcp dev main.py
效果如下:

除了上面开发的在本地部署,你也可以将这个MCP服务部署到远端,供更多人使用。如果感兴趣请留言,我在后续的文章中更新。
总结
(文:PyTorch研习社)