1. 什么是 MCP

MCP(Model Context Protocol,模型上下文协议)是 Anthropic 于 2024 年底开源的一种开放协议,用于统一大语言模型与外部数据源、工具之间的通信方式。它解决的核心问题是:当模型需要访问数据库、文件系统、API 或企业内部系统时,不再需要为每个数据源单独编写适配代码,而是通过一套标准化的协议进行连接。

相关服务:日本CN2服务器租用

可以把 MCP 理解为 AI 世界的「USB-C 接口」:无论外接设备是什么,只要遵循同一协议,就能即插即用。对开发者而言,MCP 让「模型 + 工具 + 数据」的组合变得更加模块化和可复用。

2. MCP 的核心架构

MCP 采用客户端-服务器架构,主要由以下三个角色组成:

  • MCP Host:运行大语言模型的宿主程序,例如 Claude Desktop、IDE 插件或自定义应用,负责发起请求并展示结果。
  • MCP Client:与 Host 同侧运行,负责与 MCP Server 建立连接、发送请求、接收响应。
  • MCP Server:暴露工具、资源和提示词能力的服务端,封装具体的数据源或业务逻辑。

一次典型的调用流程如下:Host 向 Client 发起工具调用请求,Client 通过 JSON-RPC 与 Server 通信,Server 执行具体操作后返回结构化结果,最终由 Host 呈现给模型或用户。

3. 环境准备

在开始开发之前,需要准备以下环境:

  • Node.js 18 及以上版本(或 Python 3.10 及以上版本,取决于你选择的 SDK)。
  • 一个 MCP Host 用于测试,例如 Claude Desktop 或支持 MCP 的 IDE。
  • 安装官方 SDK:TypeScript 使用 @modelcontextprotocol/sdk,Python 使用 mcp 包。

下面以 TypeScript 为例,创建一个新的项目并安装依赖:

mkdir my-mcp-server
cd my-mcp-server
npm init -y
npm install @modelcontextprotocol/sdk

4. 编写第一个 MCP Server

下面实现一个最简单的 MCP Server,它暴露一个「获取当前时间」的工具。创建 server.ts 文件:

import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";

const server = new McpServer({
  name: "time-server",
  version: "1.0.0"
});

server.tool(
  "get_current_time",
  { timezone: { type: "string", description: "时区,例如 Asia/Shanghai" } },
  async ({ timezone }) => {
    const now = new Date().toLocaleString("zh-CN", { timeZone: timezone });
    return { content: [{ type: "text", text: `当前时间:${now}` }] };
  }
);

const transport = new StdioServerTransport();
await server.connect(transport);

代码说明:

  • McpServer 是 SDK 提供的高层封装,简化了工具注册流程。
  • server.tool 用于注册工具,第一个参数是工具名,第二个参数是入参 schema,第三个参数是执行函数。
  • StdioServerTransport 通过标准输入输出与 Host 通信,是本地开发最常用的传输方式。

5. 在 Host 中配置并测试

以 Claude Desktop 为例,在配置文件 claude_desktop_config.json 中添加如下配置:

{
  "mcpServers": {
    "time-server": {
      "command": "node",
      "args": ["dist/server.js"]
    }
  }
}

配置完成后重启 Host,即可在对话中调用 get_current_time 工具。你可以这样提问:「请告诉我现在东京的时间」,模型会自动调用该工具并返回结果。

6. 进阶:连接真实数据源

实际开发中,MCP Server 更多用于连接数据库、文件系统或第三方 API。下面以读取本地文件为例,演示如何暴露一个文件读取工具:

import { readFile } from "fs/promises";

server.tool(
  "read_file",
  { path: { type: "string", description: "文件绝对路径" } },
  async ({ path }) => {
    try {
      const content = await readFile(path, "utf-8");
      return { content: [{ type: "text", text: content }] };
    } catch (err) {
      return { content: [{ type: "text", text: `读取失败:${err.message}` }] };
    }
  }
);

通过这种方式,模型就能安全地访问你授权的本地文件,而无需直接暴露整个文件系统。

7. 安全与最佳实践

开发 MCP Server 时,需要注意以下几点:

  • 最小权限原则:只暴露必要的工具,避免将敏感操作直接开放给模型。
  • 输入校验:对工具入参做严格校验,防止路径穿越、注入等风险。
  • 错误处理:所有工具都应捕获异常并返回结构化错误信息,避免进程崩溃。
  • 超时控制:为耗时操作设置超时,防止模型长时间等待。
  • 日志记录:记录工具调用日志,便于排查问题和审计。

8. 总结

MCP 为 AI 应用与外部世界的连接提供了一套标准化方案。本文从架构、环境准备、代码实现到安全实践,带你走通了 MCP Server 开发的全流程。下一步可以尝试:接入数据库、封装企业内部 API,或为你的应用开发自定义 MCP 工具集。

MCP开发入门教程:从零理解模型上下文协议