MCP认识和示例

67 阅读3分钟

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服务

  1. 首先创建文件夹
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来问当前时间

image.png