MCP实战篇-构建一个MCP服务

前言

前篇已经介绍了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秒到达战场

创建项目

  1. uv init mcp-server-demo
  2. cd mcp-server-demo


添加依赖

  1. uv add "mcp[cli]"

写代码

你打开项目会看到如下目录 xxx 其中main.py就是我们的开发目标文件,将它编辑成如下:

  1. from mcp.server.fastmcp import FastMCP
  2. mcp = FastMCP("mcp-server-demo", "MCP Server Example")
  3. @mcp.tool()
  4. def add(a: int, b: int) -> int:
  5.     """
  6.     Adds two numbers.
  7.     """
  8.     return a + b
  9. @mcp.resource("greeting://{name}")
  10. def get_greeting(name: str) -> str:
  11.     """
  12.     Returns a greeting message.
  13.     """
  14.     return f"Hello, {name}!"
  15. if __name__ == "__main__":
  16.     mcp.run(transport='stdio')

逐行解释代码

  1. from mcp.server.fastmcp import FastMCP

从 mcp.server.fastmcp 模块中导入 FastMCP 类。这是 MCP(Model Context Protocol)服务器实现的一部分,FastMCP 是一个用于快速构建 MCP 服务器的类。

  1. mcp = FastMCP("mcp-server-demo", "MCP Server Example")

创建一个 FastMCP 类的实例 mcp。

  • “mcp-server-demo”: 第一个参数是服务器的标识符或名称,用于区分不同的 MCP 服务器。
  • “MCP Server Example”: 第二个参数是服务器的描述,可能用于日志、文档或客户端显示。
  • 这行初始化了一个 MCP 服务器对象,后续的功能将基于这个对象注册和运行。
  1. @mcp.tool()
  2. 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: 返回值类型注解,表示函数返回一个整数。
  1.     """
  2.     Adds two numbers.
  3.     """

这是一个文档字符串(docstring),用三引号括起来。 描述了 add 函数的作用:“将两个数字相加”。 在 MCP 上下文中,这个描述可能会被客户端或模型用来理解工具的功能。

  1. @mcp.resource("greeting://{name}")
  2. def get_greeting(name: str) -> str:
  3.     """
  4.     Returns a greeting message.
  5.     """
  6.     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: 返回值类型注解,表示函数返回一个字符串。
  1. if __name__ == "__main__":
  2.     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开发者配置

将配置改为如下

  1. {
  2.   "mcpServers": {
  3.     "mcp-server-demo": {
  4.       "command": "你的项目地址/mcp-server-demo/.venv/bin/python",
  5.       "args": [
  6.         "你的项目地址/mcp-server-demo/main.py"
  7.       ]
  8.     }
  9.   }
  10. }

重启Claude即可生效,效果如下


测试:


从Claude的调用来看已经能成功调用到我们定义的add工具,您在实践的时候也可以尝试改成其他内容,看Claude如何反应?欢迎评论区交流

其它的内容

其实在调用之前你也可以先在本地调试你的MCP服务,可以用如下命令启动开发模式

  1. mcp dev main.py

效果如下:


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


总结

MCP(Model Context Protocol)是一种灵活的协议,用于构建与大型语言模型交互的服务。通过 FastMCP,开发者可以快速搭建服务器,定义工具(如 add 函数实现加法)和资源(如 get_greeting 返回问候语)。本文通过代码示例展示了如何使用 Python 实现一个简单的 MCP 服务:从导入 FastMCP、初始化服务器,到注册工具和资源,最后通过 stdio 运行服务。工具适合执行操作,资源则提供数据,两者结合为模型和客户端提供了强大的功能扩展能力。MCP 的设计强调模块化和可控性,开发者只需几行代码即可实现复杂交互,适用于 AI 驱动的命令行工具、自动化脚本等场景。无论是初学者还是资深开发者,MCP 都提供了一个高效的起点,让 AI 集成变得更简单。
最后的最后,不要光看,一定要动手练习,在学习过程中有问题欢迎留言交流,一起成长!!!🚀

(文:PyTorch研习社)

欢迎分享

发表评论