如何构建自己的MCP Server?——使用 VSCode 的 Copilot 集成 MCP
角色
- MCP Server:轻量级程序,通过标准的 Model Context Protocol 提供特定能力
- 是执行具体操作的工具。
- 例如:天气爬虫、数据库查询工具、文件读写工具、计算器等等。
- 它不知道也不关心大模型的存在,它只负责接收标准的 MCP 请求并返回结果。
- MCP Client:维护与服务器一对一连接的协议客户端
- 管理 Server:在启动时,连接到配置好的 Server,并获取它们提供的所有“工具”列表及其描述。
- 告知模型:将这些工具列表(包括名称、描述、参数格式)作为“上下文”提供给大模型。这就是为什么模型知道它能调用什么。
- 桥接通信:当模型决定使用某个工具时,MCP Client 负责将模型的指令“翻译”成 MCP Server 能理解的标准请求,发送给对应的 Server,并将 Server 返回的结果再“递交”回模型。
- MCP Host:IDE 或 AI 工具(VSCode + Copilot, Cursor IDE, Claude Desktop)
- 承载模型:负责加载云端/本地模型,与模型的对话都发生在 Host 中
- 启动并管理 MCP Client:启动 MCP Client,启动/连接 MCP Server,收集所有的工具列表
- 将所有工具注入模型上下文:将 MCP Client 收集到的 MCP Server 工具的信息提供给模型,Host 能够决定模型看到什么工具
在理解 MCP 的三个角色时,我一开始产生了很大的困惑。主要原因是,在传统的 C/S 架构中,“Server” 总是指为用户提供服务的远端程序,因此我最初误把 MCP Server 理解成了集成 AI 能力的应用,比如 IDE 或 AI 工具。但实际上这部分职责应该属于 MCP Host 和 MCP Client。
在 MCP 中,Server 指的是我们自己编写或从外部获取的、用于执行某种特定功能的独立程序。MCP Server 启动后,会与 MCP Client 建立一对一的连接关系,并由 MCP Client 进行管理。这里的 “Client” 与 “Server” 是站在 MCP 工具生态内部定义的,不是站在用户视角下的传统网络 Client/Server。
换句话说,MCP Server 不是面向用户的服务,而是面向 MCP Client 的功能提供者;而 MCP Host/Client 才是负责与用户侧应用(如 IDE、ChatGPT 等)整合,使得这些应用能够通过 MCP Server 调用特定能力。
编写一个简单的 MCP Server
对于普通开发者来说,MCP 中最需要关注和实际操作的是 MCP Server ——也就是自己编写的、提供具体功能的工具。
而 MCP Client 和 MCP Host 属于 MCP 生态系统的基础设施,主要是由构建 IDE、编辑器或 AI 工具的开发者负责实现的。普通开发者一般无需关心其内部机制,只需要将自己的 MCP Server 注册给这些 Host 即可。
本小节将实现一个非常简单的计算器,大模型将使用这个计算器进行数学计算。
搭建 MCP 开发环境——创建 conda 虚拟环境
MCP 官方文档中推荐使用
uv进行python虚拟环境管理,但是我不太习惯用这个工具,所以下面的流程依然使用conda进行虚拟环境管理。
conda create -n mcp python==3.10
conda activate mcp
pip install fastmcp
编写 MCP 程序
这里简单的编写一个 MCP 程序,该程序能够计算 a+b 并返回值。
# 导入 FastMCP,这个库可以帮我们很快地搭建一个 MCP 服务器
from fastmcp import FastMCP
# 创建一个 MCP 服务器,并给它取名字叫 "acculator"
# 以后客户端(比如 VSCode 或 ChatGPT)就会用这个名字来识别它
mcp = FastMCP("acculator")
# 下面这个装饰器的意思是:
# “把这个函数交给 MCP,让客户端能够远程调用它”
# 不用太纠结装饰器怎么工作,只要知道它能把函数变成一个可调用的工具就行了
@mcp.tool()
def add(a, b):
# 这是服务器提供给客户端的一个小功能:做加法
return a + b
# 程序入口
if __name__ == "__main__":
# 运行 MCP 服务器
# transport="http" 表示用 HTTP 来通信
# port=1234 表示让服务器监听 1234 端口
mcp.run(transport="http", port=1234)
对于 MCP Server 来说,有很多种提供服务的方式,上面的代码使用 HTTP 协议为 MCP Client 提供服务,也可使用其他方式向 MCP Client 提供服务,比如:
if __name__ == "__main__":
# 运行 MCP 服务器
# 使用标准输入输出向 MCP Client 提供服务
mcp.run(transport="stdio")
上面两种启动方式(
stdio与http)在后续配置 VSCode 中 Copilot 使用 MCP Server(也就是上面注册的add工具)时略有不同,我会在后面配置过程中详细说明。
在 VSCode 的中配置 MCP Server
我们通过 Copilot 插件来作为 MCP Host,它会管理 MCP Client,并与 MCP Server 建立连接。这样,VSCode 就能使用你写的工具(比如 add 函数)了。
第一步: 打开命令面板


第二步: 选择添加 http 类型的 MCP 服务器

第三步: 填写服务地址,这里的 1234 为服务端口号,也就是之前编写程序时规定的端口号

第四步: 给新添加的 MCP 服务起个名字,规定工作范围,这里就不贴图了
第五步: 在终端中输入以下命令启动 MCP 服务
python add.py
之后就可以在 copilot 中使用 MCP 工具了

如果使用 stdio 作为启动方式:
if __name__ == "__main__":
# 运行 MCP 服务器
# 使用标准输入输出向 MCP Client 提供服务
mcp.run(transport="stdio")
需要在添加 MCP 服务器的时候选择:命令(stdio)

之后将完整的执行命令输入进去,这里需要注意的是,因为我使用的是 conda 虚拟环境,所以这里输入的 python 地址为 miniconda3/envs/mcp/bin/python,你需要根据自己的环境选择自己的 python 地址:


浙公网安备 33010602011771号