返回市场
MCP客户端功能

MCP客户端功能

作者:apify49 星标更新:2025-11-04

项目介绍

MCP 客户端功能

本包力求成为最及时的 模型上下文协议 (MCP) 客户端及其功能数据库,以使 MCP 服务器了解客户端支持哪些特性以及如何响应这些特性,从而提供最佳的用户和代理体验。不幸的是,初始握手期间的 MCP 协议能力协商不足以实现这一点——详情请参见下文的背景部分。

换句话说,本包是社区 MCP 客户端表的程序化版本。 社区 MCP 客户端

工作原理

本包提供了一个名为 mcp-clients.json 的 JSON 文件,列出了所有已知的 MCP 客户端、它们的元数据和功能。这是一个单一的 JSON 文件,便于多种编程语言访问数据,同时为 NPM 包启用 TypeScript 类型安全。

JSON 文件包含一个对象,其中键为客户名称,值为客户信息的对象:

{
  // 客户端名称对应于 MCP 客户端 `initialize` 请求中的 `params.clientInfo.name`,例如 "ExampleClient"
  "<client-name>": {

    // MCP 客户端的显示名称,例如 "Example Client"
    title: string,
    
    // 客户端主页的 URL
    url: string,
    
    // 对应于 MCP 客户端 `initialize` 请求中的 `params.protocolVersion`,例如 "2.0.0"
    protocolVersion: string,

    // 如果客户端支持访问服务器资源,则存在,包括是否可以处理其动态变化,以及是否可以订阅资源更新
    resources?: { listChanged?: boolean, subscribe?: boolean },

    // 如果客户端支持访问服务器提示,则存在,包括是否可以处理其动态变化
    prompts?: { listChanged?: boolean },

    // 如果客户端支持访问服务器工具,则存在,包括是否可以处理其动态变化
    tools?: { listChanged?: boolean },

    // 如果客户端支持从服务器获取信息,则存在
    elicitation?: object,
    
    // 如果客户端支持从大型语言模型 (LLM) 中采样,则存在
    sampling?: object,

    // 如果客户端支持列出其根目录,则存在,包括是否可以通知服务器其动态变化
    roots?: { listChanged?: boolean },

    // 如果客户端支持处理服务器的参数自动补全建议,则存在
    completions?: object,
    
    // 如果客户端支持读取服务器的日志消息,则存在
    logging?: object,
  },
  "<client-name-2>": { ... },
  ...
}

请注意,客户端对象受到 MCP 的 ClientCapabilitiesServerCapabilities 对象的启发,并且相应的字段类型兼容。未来可能会添加额外的字段。

重要:MCP 服务器必须始终优先考虑从 MCP 客户端的 initialize 请求中通过 params.capabilities 字段(类型为 ClientCapabilities)接收到的信息,而不是本包提供的能力信息,因为前者总是更准确!

客户端版本管理

对于每个唯一的客户端名称,JSON 文件仅包含一个记录,代表最新已知公开发布的版本信息。这一假设基于大多数用户将使用 MCP 客户端的最新版本。

protocolVersion 仅作为粗略检查:如果从 MCP 客户端接收到的版本与 JSON 文件中提供的版本不匹配,MCP 服务器应忽略 JSON 文件提供的任何信息,因为它显然已过时。

如果新发布的 MCP 客户端相比之前的版本引入了对新服务器功能的支持,我们强烈建议 MCP 客户端使用新的客户端名称,以避免混淆服务器并提供最佳的用户体验。

支持的客户端

<!-- MCP_CLIENTS_TABLE_START -->
显示名称客户端名称资源提示工具发现采样根目录激发
Amazon Q 开发者 CLIQ CLI
Apify MCP 客户端apify-mcp-client
Claude AIclaude-ai
Claude Codeclaude-code
Cursor 编辑器cursor-vscode
LibreChat@librechat/api-client
Opencodeopencode
Visual Studio CodeVisual Studio Code
Windsurf 编辑器windsurf-client
<!-- MCP_CLIENTS_TABLE_END -->

列解释

  • <a name="resources"></a>资源:客户端是否支持访问服务器资源。资源允许客户端浏览和与文件、数据库或其他由 MCP 服务器提供的数据进行交互。
  • <a name="prompts"></a>提示:客户端是否支持访问服务器提示。提示是可重用的提示模板,客户端可以调用这些模板以从服务器获得结构化的响应。
  • <a name="tools"></a>工具:客户端是否支持访问服务器工具。工具是客户端可以调用以在服务器端执行操作的功能。
  • <a name="discovery"></a>发现:客户端是否支持通过 notifications/tools/list_changed 通知动态发现工具。这允许在连接活动期间添加或移除工具。
  • <a name="sampling"></a>采样:客户端是否支持从大型语言模型 (LLM) 中采样。这允许服务器请求客户端使用其语言模型生成文本。
  • <a name="roots"></a>根目录:客户端是否支持管理根目录。根目录定义了客户端希望服务器访问的工作区或目录。
  • <a name="elicitation"></a>激发:客户端是否支持从服务器激发。这允许服务器在交互过程中请求客户端提供更多信息或澄清。

使用方法

Node.js

通过运行以下命令安装 NPM 包

npm install mcp-client-capabilities

TypeScript 示例

import { mcpClients } from 'mcp-client-capabilities';

const claudeClient = mcpClients['claude-ai'];
console.log('Claude AI 元数据和功能:', claudeClient);
console.log('显示名称:', claudeClient.title);

// 列出所有可用客户端
console.log('可用客户端:', Object.keys(mcpClients));

JavaScript 示例

const { mcpClients } = require('mcp-client-capabilities');

const claudeClient = mcpClients['claude-ai'];
console.log('Claude AI 元数据和功能:', claudeClient);
console.log('显示名称:', claudeClient.title);

// 列出所有可用客户端
console.log('可用客户端:', Object.keys(mcpClients));

Python

通过运行以下命令安装 PyPI 包

pip install mcp-client-capabilities

Python 示例

from mcp_client_capabilities import mcp_clients

claude_client = mcp_clients['claude-ai']
print('Claude AI 元数据和功能:', claude_client)
print('显示名称:', claude_client['title'])

# 列出所有可用客户端
print('可用客户端:', mcp_clients.keys())

其他语言

你可以从以下 URL 获取原始的 mcp-clients.json 文件:

https://raw.githubusercontent.com/apify/mcp-client-capabilities/refs/heads/master/src/mcp_client_capabilities/mcp-clients.json

背景

当 MCP 客户端 连接 到 MCP 服务器时,它必须发送一个 initialize 请求,如:

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "initialize",
  "params": {
    "protocolVersion": "2024-11-05",
    "capabilities": {
      "roots": { "listChanged": true },
      "sampling": {},
      "elicitation": {}
    },
    "clientInfo": {
      "name": "ExampleClient",
      "title": "Example Client Display Name",
      "version": "1.0.0"
    }
  }
}

然后,MCP 服务器必须回复如下消息:

{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "protocolVersion": "2024-11-05",
    "capabilities": {
      "logging": {},
      "prompts": { "listChanged": true },
      "resources": { "subscribe": true, "listChanged": true },
      "tools": { "listChanged": true }
    },
    "serverInfo": {
      "name": "ExampleServer",
      "title": "Example Server Display Name",
      "version": "1.0.0"
    },
    "instructions": "给客户端的可选指令"
  }
}

不幸的是,这种 能力协商 不足以让 MCP 服务器完全理解客户端支持哪些特性。例如,服务器无法知道客户端是否支持通过 notifications/tools/list_changed 通知动态发现工具,或者是否应用了初始服务器 instructions 到模型上下文中。但这些信息对于服务器来说至关重要,以便了解它可以向客户端提供什么样的接口,例如是否应该提供用于动态发现和调用的替代工具,或将指令放入工具描述中。

MCP 的这一限制导致了“最低共同标准”方法,即服务器只采用基本的 MCP 特性,这些特性它们可以确定大多数客户端都支持。最终,这导致了 MCP 协议的停滞,服务器和客户端都没有动力采用最新的协议特性。

虽然有 MCP 标准提案,如 SEP-1381,旨在从协议层面解决这个问题,但这些提案需要时间才能被批准并广泛采用。因此,我们发布了这个包,希望能加速 MCP 生态系统的发展。

贡献者

我们非常感谢社区贡献,使 MCP 客户端及其功能列表完整且及时。要添加新客户端或更新现有客户端,只需编辑 src/mcp-clients.json 文件并提交拉取请求:

  • 拉取请求应包含一些证据来支持 MCP 客户端功能的存在,例如使用截图、源代码链接或官方文档。
  • 最好每次拉取请求只添加或更新一个 MCP 客户端,以便更好地管理。
  • 按照客户端名称的字母顺序排列客户端。

开发

构建过程包括验证以确保 JSON 结构符合 TypeScript 接口。

# 验证 JSON 文件结构
npm run test

# 构建项目(包括验证)
npm run build

# 运行示例
npm run example

获取客户端信息

为了方便地从 MCP 初始化请求中获取客户端名称和版本,以便添加或更新客户端功能,可以使用简单的 netcat 和 ngrok 设置:

  1. 启动 netcat 监听器:nc -lvp 3001
  2. 通过 ngrok 将其暴露到互联网:ngrok http 3001
  3. 运行 MCP 客户端并连接到你的 ngrok URL

在 netcat 终端中,你会看到包含客户端信息的 initialize 请求,例如:

{
  "jsonrpc": "2.0",
  "id": 0,
  "method": "initialize",
  "params": {
    "protocolVersion": "2025-06-18",
    "capabilities": {
      "sampling": {},
      "elicitation": {},
      "roots": { "listChanged": true }
    },
    "clientInfo": {
      "name": "mcp-inspector",
      "version": "0.16.5"
    }
  }
}

API

类型

  • McpClientRecord - 完整的 MCP 客户端能力集,带有强制性的 titleurl 字段
  • ClientsIndex - 客户端对象结构的类型

导出

  • mcpClients - 按客户端名称索引的所有客户端能力的对象
  • types.ts 中的所有 TypeScript 接口

未来工作