技术速递|构建你的第一个 MCP 服务器:如何使用自定义功能扩展 AI 工具
MCP 标准化了AI 工具在不同平台和应用(如 VS Code 中的 Copilot)上的可扩展性首先复用已有的 MCP 服务器,调查现有资源:你能认出发布者吗?能访问代码吗?自建服务器时,从简单入手,聚焦于解决特定问题,而不是一次性建全功能三大构建模块(工具、资源、提示)为设计 MCP 服务器能力提供了清晰框架MCP 不仅仅是关于和人工智能一起玩游戏(虽然那确实很有趣)。它的意义在于打破你的人工
作者:Chris Reddington
排版:Alan Wang
通过构建一个回合制游戏服务器来学习模型上下文协议(Model Context Protocol),展示如何使用自定义工具、资源和提示扩展 GitHub Copilot。
你是否曾经使用 AI 工具时,希望它们能够访问一些额外的上下文信息?或者希望它们能代表你执行某些操作?想象一下你在使用 GitHub Copilot 时,需要它检查一个 GitHub Issue、运行 Playwright 测试,或者与某个 API 交互。默认情况下,这些 AI 工具无法访问这些外部系统。但这正是模型上下文协议(Model Context Protocol, MCP)发挥作用的地方。它提供了一种标准化方式,让 AI 工具能够扩展自定义功能。
我想通过构建一些可视化和交互式的项目来更深入地了解它。因此,我创建了一个回合制游戏服务器,可以使用 MCP 与 Copilot 对战玩 井字棋(Tic-Tac-Toe) 和 剪刀石头布(Rock Paper Scissors)。
在我最近的 Rubber Duck Thursdays 直播中,我演示了这个项目,它由几个组件组成,全部使用 TypeScript 编写:
一个 Next.JS Web 应用和 API,用于本地演示和学习
一个使用 MCP TypeScript SDK 的 MCP 服务器
一个 共享库,用于定义通用类型和组件,被 Web 应用、API 和 MCP 服务器共用
你可以在 github-samples/turn-based-game-mcp 查看代码。以下是我从中学到的内容。
为什么 MCP 对开发者很重要
即便有强大的 AI 代理,我们仍然会遇到一些限制:
-
AI 工具无法原生访问私有数据来进行增强生成检索(RAG),比如来自我们 GitHub 仓库的信息。
-
它们无法访问最新文档或实时数据。
-
AI 代理无法执行操作,比如创建 Pull Request、在本地运行的应用中探索 UI,或与你的 API 交互。
为了访问外部上下文并执行操作,我们需要扩展这些 AI 工具的能力。但在 MCP 出现之前,并没有标准的方法来与第三方工具和服务集成。你可能需要针对不同的 AI 工具使用不同的插件和集成模式。MCP 改变了这一点,它提供了一种标准方式,将工具和功能插入到任何支持模型上下文协议(Model Context Protocol)的工具中。
MCP 的架构对开发者很熟悉:客户端-服务器模式
-
Host(主机):你使用的 AI 工具,例如 VS Code 中的 GitHub Copilot(在 MCP 功能支持矩阵中,VS Code 的 Copilot 支持良好)。主机通过客户端发起与 MCP 服务器的连接。
-
Clients(客户端):客户端存在于主机应用中(例如 VS Code 中的 GitHub Copilot),每个客户端与服务器是一对一关系。当 VS Code 连接到一个新的 MCP 服务器(例如 GitHub、Playwright 或本文示例中的回合制游戏 MCP 服务器)时,会创建一个新的客户端来维持连接。
-
Server(服务器):你的自定义 MCP 服务器,提供工具、资源和提示。在我们的例子中,MCP 服务器提供用于回合制游戏的功能!
构建回合制游戏 MCP 服务器
在我的学习项目中,我希望有一个可视化的例子,展示整体的 MCP 交互,并且在讲解时可以重复使用。所以我构建了一个包含 井字棋(Tic-Tac-Toe) 和 剪刀石头布(Rock Paper Scissors) 的 Web 应用。不同于游戏由两个人在本地或在线对战,甚至由后台 CPU 控制,对手的动作是由 MCP 服务器 协调的。
架构组成:
-
Next.js 前端:游戏界面,用于进行操作
-
API 路由(Next.js 实现的一部分):用于游戏状态管理的后端逻辑,由前端和 MCP 服务器调用
-
MCP 服务器:使用 TypeScript 编写,处理 AI 游戏动作
-
共享库:跨组件使用的通用游戏逻辑
实际工作流程:
-
我们在 VS Code 中注册 MCP 服务器,使 Copilot 知道新增的能力和工具。
-
我在 VS Code 中与 GitHub Copilot 互动,可以显式调用工具,也可以让 Copilot 自动发现工具。
-
Copilot 调用大语言模型(LLM),根据提示上下文和可用工具,它可能会调用 MCP 服务器。
-
MCP 服务器执行请求的工具(比如在游戏中走一步),并返回结果。
-
Copilot 使用这些结果继续对话。
关键一步是当你在 MCP 应用主机(例如 VS Code 中的 GitHub Copilot)中注册 MCP 服务器时,你的 AI 代理就获得了服务器中内置功能的访问权限。
在 VS Code 中设置 MCP 服务器
你可以通过创建 .vscode/mcp.json
文件来配置 MCP 服务器。更多细节可以参考 Visual Studio Code 官方文档。
{
"servers": {
"playwright": {
"command": "npx",
"args": [
"@playwright/mcp@latest"
]
},
"turn-based-games": {
"command": "node",
"args": ["dist/index.js"],
"cwd": "./mcp-server"
}
}
}
上述配置告诉 VS Code 中的 GitHub Copilot,我们想要使用两个 MCP 服务器:
-
Playwright MCP 服务器 —— 作为本地 NPM 包执行
-
回合制游戏 MCP 服务器 —— 基于我们工作目录中编译后的 TypeScript 代码在本地运行
在这个实现中,我保持回合制游戏 MCP 服务器的架构和逻辑相对简单,所有组件都在一个仓库中。这个 monorepo(单仓库)方式将 Web 应用、API 和 MCP 服务器打包在一起,使得克隆并在本地运行整个系统非常方便,无需复杂的依赖管理或跨仓库设置。但对于更稳健的部署,你可能会将 MCP 服务器分发为一个独立包(例如 npm 包或 Docker 镜像),并建立明确的发布和版本管理流程。
MCP 的三个核心构建模块
通过构建这个项目,我熟悉了 MCP 服务器的三个基本概念:
工具(Tools):AI 可以执行的操作
工具定义了 MCP 服务器可以执行的动作。在我的游戏服务器中,我指定了如下工具:
-
Analyze_game:获取任何游戏的当前状态
-
create_rock_paper_scissors_game:开始新一局剪刀石头布
-
create_tic_tac_toe_game:开始新一局井字棋
-
play_rock_paper_scissors:在剪刀石头布中由 AI 做出选择
-
play_tic_tac_toe:在井字棋中由 AI 下棋
-
wait_for_player_move:轮询接口,直到玩家完成操作
每个工具都有清晰的描述和输入 Schema,用来告诉 AI 需要提供哪些参数:
{
name: 'play_tic_tac_toe',
description: 'Make an AI move in Tic-Tac-Toe game. IMPORTANT: After calling this tool when the game is still playing, you MUST call wait_for_player_move to continue the game flow.',
inputSchema: {
type: 'object',
properties: {
gameId: {
type: 'string',
description: 'The ID of the Tic-Tac-Toe game to play',
},
},
required: ['gameId'],
},
},
GitHub Copilot 和大语言模型(LLM)并不会计算实际的游戏动作。当 Copilot 调用 play_tic_tac_toe
工具时,MCP 服务器会执行该工具的处理程序,运行 CPU 端的游戏逻辑,例如:
-
“简单”难度下随机下棋
-
“困难”难度下使用更优的算法计算下一步
换句话说,工具是可复用的软件组件,可以被 AI 调用,通常用于执行某种动作(比如在回合制游戏中下棋!)。
资源(Resources):AI 可以访问的上下文
资源为 AI 提供了一种获取上下文的方式,通常使用基于 URI 的标识符。例如,我实现了一些自定义 URI 方案:
-
game://tic-tac-toe
:列出所有井字棋游戏 -
game://tic-tac-toe/{Game-ID}
:获取指定井字棋游戏的状态 -
game://rock-paper-scissors
:列出所有剪刀石头布游戏 -
game://rock-paper-scissors/{Game-ID}
:获取指定剪刀石头布游戏的状态
正如 MCP 资源文档中所解释的,你可以选择这些资源的传递方式。在我们的回合制游戏 MCP 服务器中,有一个方法会将资源 URI 转换为对本地 API 服务器的调用,并传递原始响应,以便在工具调用中(例如进行游戏操作时)作为上下文使用。
async function readGameResource(uri) {
const gameSession = await callBackendAPI(gameType, gameId);
if (!gameSession) {
throw new Error("Game not found");
}
return gameSession;
}
提示(Prompts):可复用的用户指导
第三个概念是提示(Prompts)。你对提示和提示设计一定很熟悉,因为这是你与 AI 工具(如 GitHub Copilot)交互的方式。你的用户也可以自己编写提示来使用你的工具,例如:
-
“玩一局井字棋”
-
“为我们刚规划好的工作创建一个 GitHub Issue”
但你可能希望在发布 MCP 服务器时,附带一些预定义提示,帮助用户充分利用你的工具。例如,回合制游戏 MCP 附带了几个提示:
-
针对不同难度等级的策略指南
-
游戏规则和最佳玩法说明
-
常见问题的故障排查帮助
用户可以通过 VS Code 中的斜杠命令(slash commands)访问这些提示。例如,当我输入 /strategy
时,就可以访问提示,获取关于给定游戏或难度等级的最佳策略建议。
实际应用与注意事项
虽然我的游戏演示故意保持简单,以帮助你学习这些基础概念,但这些模式同样适用于其他 MCP 服务器:
-
GitHub MCP 服务器:获取现有 GitHub Issues 或 Pull Requests 信息、列出 Dependabot 警报,或基于你提供的访问权限(通过远程 MCP 服务器的 OAuth 或个人访问 token)创建和管理 Issue 与 Pull Request。
-
Playwright MCP 服务器:自动导航到浏览器中的特定页面,点击和与页面交互,捕获截图,检查渲染内容。
-
自定义 API 服务器:连接你的内部服务、数据库或业务逻辑。
MCP 规范的额外功能
工具、资源和提示是 MCP 规范中最常用的能力。最近,规范中还新增了一些功能,包括采样(sampling)和引导(elicitation)。我还没有机会添加这些功能,但未来的分享中可能会涉及。
认证与安全
根据具体场景,生产环境中的 MCP 服务器可能需要处理认证和授权。例如,GitHub MCP 服务器支持远程 MCP 服务器的 OAuth 流程,以及本地和远程的个人访问 Token。本次回合制游戏 MCP 服务器为简单示例,不涉及任何认证要求。但如果你要构建自己的 MCP 服务器,安全性应是关键考虑因素。
信任第三方 MCP 服务器
你不一定总是需要自己创建 MCP 服务器。例如,GitHub 自身就提供 MCP 服务器。与其自己开发,不如为上游开源项目贡献代码,改善大家的使用体验。
💡 思考:在安装 MCP 服务器前,请像对待项目供应链中的其他依赖一样做好尽职调查。你认得发布者吗?你能查看(并贡献)开源仓库中的代码吗?
语言和 SDK 选项
MCP 提供多种语言的 SDK,你可以用适合自己技术栈的语言构建服务器,从 TypeScript 到 Python、Go 到 Rust 等等。我选择了 TypeScript,因为希望整个演示(前端、后端和 MCP 服务器)在同一个仓库中,使用共享代码和统一语言。
你可以在 Model Context Protocol 文档上关注 MCP 规范的最新进展。
收获总结
通过这个探索,你可以学到:
-
MCP 标准化了 AI 工具在不同平台和应用(如 VS Code 中的 Copilot)上的可扩展性
-
首先复用已有的 MCP 服务器,调查现有资源:你能认出发布者吗?能访问代码吗?
-
自建服务器时,从简单入手,聚焦于解决特定问题,而不是一次性建全功能
-
三大构建模块(工具、资源、提示)为设计 MCP 服务器能力提供了清晰框架
MCP 不仅仅是关于和人工智能一起玩游戏(虽然那确实很有趣)。它的意义在于打破你的人工智能助手与那些它们帮助你高效工作所必需的系统之间的壁垒。
无论你是在构建内部开发工具、集成外部 API,还是创建自定义工作流,MCP 都为你提供了扩展 AI 工具的一致而强大的基础。
下一步
想进一步探索 MCP 吗?这里有一些起点:
-
查看 GitHub MCP 服务器,在自己的工作流中使用或了解真实 MCP 服务器实现
-
尝试 Playwright MCP 服务器,用于 UI 测试工作流
-
为内部 API 或开发工具构建一个简单服务器,可参考 turn-based-game-mcp 示例
-
试验自定义提示,将团队最佳实践编码进去
MCP 的目标是让 AI 助手在你的特定开发环境中真正发挥作用。那么,你会使用哪个工具?你打算构建什么?
想看更详细的操作指南?请查看我们的 GitHub MCP 服务器实用指南 >

为武汉地区的开发者提供学习、交流和合作的平台。社区聚集了众多技术爱好者和专业人士,涵盖了多个领域,包括人工智能、大数据、云计算、区块链等。社区定期举办技术分享、培训和活动,为开发者提供更多的学习和交流机会。
更多推荐
所有评论(0)