如何构建自己的MCP Server?——使用 VSCode 的 Copilot 集成 MCP

角色

  1. MCP Server:轻量级程序,通过标准的 Model Context Protocol 提供特定能力
    • 执行具体操作的工具
    • 例如:天气爬虫、数据库查询工具、文件读写工具、计算器等等。
    • 不知道也不关心大模型的存在,它只负责接收标准的 MCP 请求并返回结果。
  2. MCP Client:维护与服务器一对一连接的协议客户端
    • 管理 Server:在启动时,连接到配置好的 Server,并获取它们提供的所有“工具”列表及其描述。
    • 告知模型:将这些工具列表(包括名称、描述、参数格式)作为“上下文”提供给大模型。这就是为什么模型知道它能调用什么。
    • 桥接通信:当模型决定使用某个工具时,MCP Client 负责将模型的指令“翻译”成 MCP Server 能理解的标准请求,发送给对应的 Server,并将 Server 返回的结果再“递交”回模型。
  3. MCP Host:IDE 或 AI 工具(VSCode + Copilot, Cursor IDE, Claude Desktop)
    1. 承载模型:负责加载云端/本地模型,与模型的对话都发生在 Host 中
    2. 启动并管理 MCP Client:启动 MCP Client,启动/连接 MCP Server,收集所有的工具列表
    3. 将所有工具注入模型上下文:将 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")

上面两种启动方式(stdiohttp)在后续配置 VSCode 中 Copilot 使用 MCP Server(也就是上面注册的 add 工具)时略有不同,我会在后面配置过程中详细说明。

在 VSCode 的中配置 MCP Server

我们通过 Copilot 插件来作为 MCP Host,它会管理 MCP Client,并与 MCP Server 建立连接。这样,VSCode 就能使用你写的工具(比如 add 函数)了。
第一步: 打开命令面板
Pasted image 20251124112412

Pasted image 20251124112446

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

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

第四步: 给新添加的 MCP 服务起个名字,规定工作范围,这里就不贴图了
第五步: 在终端中输入以下命令启动 MCP 服务

python add.py

之后就可以在 copilot 中使用 MCP 工具了
Pasted image 20251124113512

如果使用 stdio 作为启动方式:

if __name__ == "__main__":
	# 运行 MCP 服务器
	# 使用标准输入输出向 MCP Client 提供服务
	mcp.run(transport="stdio")

需要在添加 MCP 服务器的时候选择:命令(stdio)
Pasted image 20251124113710

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

posted @ 2025-11-25 15:46  Groot_Liu  阅读(0)  评论(0)    收藏  举报