MCP认识和示例
什么是MCP?
MCP(Model Context Protocol,模型上下文协议) 是由 Anthropic 推出的一种开放标准,旨在统一大型语言模型(LLM)与外部数据源和工具之间的通信协议。MCP 的主要目的在于解决当前 AI 模型因数据孤岛限制而无法充分发挥潜力的难题,MCP 使得 AI 应用能够安全地访问和操作本地及远程数据,为 AI 应用提供了连接万物的接口。
探讨MCP的作用
首先我们都知道mcp是来解决LLM数据孤岛的问题,就是LLM没有你本地的数据也不知道如何获取你本地的数据,mcp就是要来获取你本地数据或者是你想提供的数据来给到LLM从而进行更深和对于你做的东西更准确的行为。
下面我举一个例子来说明MCP这一层做了什么:
想让Agent根据我的技术方案来帮我实现代码
- 提供一个MCP工具让LLM能做到
- 获取技术方案内容(可以试各种方式 通过调用接口或者指向本地文件等等)
- 查看项目结构
- 读取/检索已有的代码
- 还可以提供一些小工具比如一些固定写好的代码片段
以上的内容是在MCP服务里面实现的。
LLM这层做了什么
- 由「提示词/系统指令/工具描述」来告诉LLM
- 比如碰到说通过技术方案来生成代码的情况就要调用上面的mcp服务
- 如何阅读技术方案
- 调用什么来查阅本地代码
- 最后输出新代码或者agent模式自助生成
那MCP这一层要不要写规则或说明
有两种层次:
-
必须写的:工具/资源的描述(给 LLM 看的接口文档)
-
比如:getDesignDoc 的 description 里写:
-
用来获取需求/技术方案文档,输入是 docId,输出是 Markdown 文本等。
-
这些描述会被 LLM 看到,用来决定什么时候调用这个工具、怎么调。
-
不建议写太复杂的“如何写代码”的业务逻辑进 MCP
-
除非你想在 MCP 里做一层自动化,比如:
-
generateCodeFromSpec:MCP 里再调用另一个模型/服务,直接返回代码。
-
但这种就变成“服务端二次封装 LLM”,不是 MCP 的必选项。
更推荐的结构是:
-
MCP:提供数据 & 操作能力(读取技术方案、项目结构、已有代码、运行信息等)
-
LLM + Prompt:做“分析方案→设计→写代码”的智能决策
总结:
- 如何分析技术方案、如何写代码主要是LLM的职责(通过prompt & few-shot等说明) 不是MCP server里面写死的逻辑。
- MCP的职责更多的是把技术方案、项目代码、运行环境信息等提供给模型使用。
用 npm 新建一个 MCP 服务,本质是在本地/公司环境里配置一组“模型可以调用的工具和数据通道”,而“如何利用技术方案生成代码”的思考过程,主要应由 LLM 通过提示词来完成,而不是完全写死在 MCP 服务里。
实现一个本地的MCP服务
- 首先创建文件夹
mkdir my-mcp
cd my-mcp
npm init -y
npm install @modelcontextprotocol/sdk
2. 创建server.js
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { z } from "zod";
// 1. 创建 MCP 服务器实例
const server = new McpServer({
name: "local-mcp-demo",
version: "0.0.1",
description: "本地示例 MCP 服务:提供时间 & 读取本地技术方案文件",
});
// 2. 注册一个简单工具:返回当前时间
server.registerTool("getCurrentTime", {
description: "返回当前服务器时间",
outputSchema: z.object({
currentTime: z.string().describe("ISO 8601 格式的当前时间"),
}),
}, async () => {
const currentTime = new Date().toISOString();
return {
content: [
{
type: "text",
text: JSON.stringify({ currentTime }, null, 2),
},
],
structuredContent: { currentTime },
};
});
// 4. 使用 stdio 作为传输(本地工具常用)
const transport = new StdioServerTransport();
await server.connect(transport);
3. 启动并添加mcp工具
// 启动服务
node server.js
// 添加mcp工具
{
"mcpServers": {
"local-mcp-demo": {
"command": "node",
"args": [
"/absolute/path/to/my-mcp-server/server.mjs"
]
}
}
}
4. 在对话中使用getCurrentTime来问当前时间