模型上下文协议 (MCP) 快速入门

阅读原文

作者:Frank Fiegel,发表于2024年11月25日。

标签:anthropic, mpc, typescript

当大型语言模型首次出现时,用户必须将代码复制粘贴到文本界面中与它们交互。这种方式很快被证明不够用,导致开发了定制化集成以获得更好的上下文加载。然而,这些集成是分散的,需要单独开发。模型上下文协议(MCP)通过提供一个通用协议来解决这个问题,使AI能够高效地与本地和远程资源交互。

有关MCP的问题?加入模型上下文协议Discord并在#general频道提问。

协议

协议的高级概述:

  • 主机是启动连接的LLM应用程序(如Claude Desktop或IDE)
  • 客户端在主机应用程序内部与服务器保持1:1连接
  • 服务器向客户端提供上下文、工具和提示

服务器

如果你已经熟悉工具使用,那么MCP会让你感到熟悉。

让我们快速看一下其中一个示例服务器实现:Brave搜索服务器。

在内部,服务器实现定义了它可以访问的工具,并将它们的可用性传达给客户端。

javascript 复制代码
server.setRequestHandler(ListToolsRequestSchema, async () => ({
  tools: [WEB_SEARCH_TOOL, LOCAL_SEARCH_TOOL],
}));

这里,WEB_SEARCH_TOOL是描述可用工具的对象,例如:

css 复制代码
{
  name: "brave_web_search",
  description:
    "Performs a web search using the Brave Search API, ideal for general queries, news, articles, and online content. " +
    "Use this for broad information gathering, recent events, or when you need diverse web sources. " +
    "Supports pagination, content filtering, and freshness controls. " +
    "Maximum 20 results per request, with offset for pagination. ",
  inputSchema: {
    type: "object",
    properties: {
      query: {
        type: "string",
        description: "Search query (max 400 chars, 50 words)"
      },
      count: {
        type: "number",
        description: "Number of results (1-20, default 10)",
        default: 10
      },
      offset: {
        type: "number",
        description: "Pagination offset (max 9, default 0)",
        default: 0
      },
    },
    required: ["query"],
  },
}

据我所知,这与Anthropic Claude工具使用APIOpenAI函数调用完全相同。

然后它暴露一个请求处理器。

dart 复制代码
server.setRequestHandler(CallToolRequestSchema, async (request) => {
  // ...
});

请求处理器将传入请求与工具匹配,然后调用与该工具相关联的函数。

vbnet 复制代码
case "brave_web_search": {
  if (!isBraveWebSearchArgs(args)) {
    throw new Error("Invalid arguments for brave_web_search");
  }
  const { query, count = 10 } = args;
  const results = await performWebSearch(query, count);
  return {
    content: [{ type: "text", text: results }],
    isError: false,
  };
}

每个MPC服务器都有一个URI(例如,tool://brave_web_search/brave_web_search),作为单独的进程运行,并通过JSON-RPC与客户端通信。例如,你可以通过以下命令启动Brave搜索服务器:

你可以通过注册Brave账号获取免费的Brave搜索API密钥。

shell 复制代码
$ export BRAVE_API_KEY=your-api-key
$ npx -y @modelcontextprotocol/server-brave-search

客户端

客户端需要知道它可以连接到哪个服务器。

arduino 复制代码
const transport = new StdioClientTransport({
  command: "tool://brave_web_search/brave_web_search"
});

然后,它需要连接到服务器:

csharp 复制代码
await client.connect(transport);

连接的目的是通过协议协商功能。在连接期间:

  • 客户端发送带有协议版本和功能的初始化请求
  • 服务器响应其协议版本和功能
  • 客户端发送初始化通知作为确认
  • 开始正常的消息交换

最后,客户端可以向服务器发送消息。

csharp 复制代码
const resources = await client.request(
  { method: "brave_web_search" },
  BraveWebSearchResultSchema
);

协议定义了4种消息类型:

  • 请求:期望响应的消息
  • 通知:不期望响应的消息
  • 结果:对请求的成功响应
  • 错误:对请求的失败响应

传输

MCP支持多种传输机制:

  • 标准输入输出传输

    • 使用标准输入/输出进行通信
    • 适合本地进程
  • 带SSE的HTTP传输

    • 使用服务器发送事件进行服务器到客户端的消息
    • 使用HTTP POST进行客户端到服务器的消息

所有传输都使用JSON-RPC 2.0交换消息。

主机

主机是启动与服务器连接的应用程序(例如Claude Desktop)。

主机负责发现服务器的功能,并计划如何利用它们来解决最终用户问题。

协议的这部分相当模糊。然而,据我理解,预期是主机实现自定义路由逻辑。你可以在我早期的文章在对话式AI中实现工具功能中看到此类实现的示例。

开源组件

框架

这些是高级框架,使构建MCP服务器变得更容易。

SDK

生态系统

服务器

  • Filesystem - 具有可配置访问控制的安全文件操作
  • GitHub - 存储库管理、文件操作和GitHub API集成
  • Google Drive - Google Drive的文件访问和搜索功能
  • PostgreSQL - 具有模式检查的只读数据库访问
  • Slack - 频道管理和消息功能
  • Memory - 基于知识图谱的持久记忆系统
  • Puppeteer - 浏览器自动化和网页抓取
  • Brave Search - 使用Brave的搜索API进行网络和本地搜索
  • Google Maps - 位置服务、方向和地点详情
  • Fetch - 网络内容获取和转换,以高效使用LLM

社区服务器

  • MCP YouTube -- 使用yt-dlp从YouTube下载字幕。
  • mcp-security-scanner -- 一个用MCP插件构建的安全漏洞扫描器,用于分析JavaScript代码。
  • Cloudflare MCP Server -- 这是一个用于与Cloudflare服务交互的模型上下文协议(MCP)服务器。它为管理Cloudflare KV Store、R2 Storage、D1 Database、Workers和Analytics提供了统一的接口。
  • mcp-get -- 一个用于安装和管理模型上下文协议(MCP)服务器的命令行工具。

我们现在有一个基于网络的MCP服务器目录:glama.ai/mcp/servers
未来的更新将发布到github.com/punkpeye/aw...

早期采用和使用案例

几个组织和工具已经采用了MCP:

Sourcegraph Cody

来自Cody博客文章

这是Cody连接到Postgres数据库的示例,在查看数据库模式后编写Prisma查询:

Zed编辑器

来自Zed编辑器博客文章

这是使用Zed扩展程序来访问PostgreSQL的示例,以便立即向模型提供关于我们整个数据库模式的信息,这样当我们要求它为我们编写查询时,它确切地知道存在哪些表和列,以及它们的类型是什么。

Sourcegraph的博客文章中还有一个使用TypeScript和MCP构建Linear集成的示例

使用Claude Desktop测试MCP

Claude Desktop应用是测试MCP的最简单方法。

在文本编辑器中打开Claude Desktop应用配置文件:~/Library/Application Support/Claude/claude_desktop_config.json

~/Library/Application Support/Claude/claude_desktop_config.json在你的机器上可能不存在。你需要创建它。
~/Library/Application Support/Claude/config.json是一个不同的、不相关的文件。不要编辑它。

添加此配置:

perl 复制代码
{
  "mcpServers": {
    "brave_search": {
      "command": "npx",
      "args": ["@modelcontextprotocol/server-brave-search"],
      "env": {
        "BRAVE_API_KEY": "your-api-key"
      }
    }
  }
}

这告诉Claude Desktop:

  • 有一个名为brave_search的MCP服务器
  • 使用npx @modelcontextprotocol/server-brave-search启动它

保存文件,并重启Claude Desktop。

现在,你可以要求Claude Desktop"搜索网络"获取某些内容。

例如,尝试让Claude Desktop"搜索网络查找glama.ai"。

你首先会被提示允许Claude Desktop使用MCP:

![权限对话框](图片:要求Claude Desktop使用MCP)

点击"允许此次聊天"以允许Claude Desktop使用MCP。

之后,你将看到Claude Desktop使用Brave搜索MCP服务器来搜索网络查找"glama.ai"并获取结果。

替代方案

有几个解决与MCP相同问题的开源项目。

  • Web Applets -- 一个开放规范和SDK,用于创建代理可以使用的应用程序。

接下来是什么?

我预计MCP在获得HTTP传输支持之前不会得到广泛采用。

然而,我确实想象未来像Glama或Claude Desktop这样的通用LLM客户端将拥有MCP服务器市场,用户将能够将这些服务插入到他们的工作流程中。

局限性

目前使用MCP的实际应用很少。但随着时间推移,这种情况会改变。

至于Claude Desktop:

  • Claude Desktop应用中MCP服务器的设置过程目前是手动的。
  • 每次重新打开应用时,你都必须授予Claude Desktop使用MCP的权限。查看这个解决方法
  • MCP仅在本地支持(服务器必须在你自己的机器上运行)。
  • 大多数说明针对macOS。然而,这里有人成功在Windows上使用MCP

早期想法

我认为这是Anthropic的一个受欢迎的举措。然而,需要一些时间来看它是否会获得牵引力。

同时,我看好计算机使用成为AI驱动自动化的标准,包括MCP试图解决的所有问题。

有关MCP的问题?加入模型上下文协议Discord并在#general频道提问。

相关推荐
风筝超冷4 小时前
MCP项目实例 - client sever交互
mcp
带刺的坐椅4 小时前
Java Solon-MCP 实现 MCP 实践全解析:SSE 与 STDIO 通信模式详解
java·solon·mcp·mcp-server·mcp-client
yi念zhi间3 天前
如何把ASP.NET Core WebApi打造成Mcp Server
后端·ai·mcp
杨浦老苏3 天前
MCPHub:一站式MCP服务器聚合平台
人工智能·docker·ai·群晖·mcp
伊织code3 天前
AWS MCP Servers
服务器·python·ai·云计算·aws·mcp
Generalzy3 天前
Model Context Protocol (MCP)笔记
笔记·ai·mcp
极小狐4 天前
如何创建并使用极狐GitLab 项目访问令牌?
数据库·ci/cd·gitlab·devops·mcp
gs801406 天前
MCP智能体多Agent协作系统设计(Multi-Agent Cooperation)
人工智能·mcp
斯普信专业组8 天前
AI Agent新范式:FastGPT+MCP协议实现工具增强型智能体构建
人工智能·智能体·mcp
老马啸西风8 天前
敏感词 v0.25.0 新特性之 wordCheck 策略支持用户自定义
人工智能·ai·nlp·中文分词·openai·deepseek·mcp