MCP Everything Server 实战:一个覆盖全部协议能力的 MCP 测试服务器
MCP Everything Server(包名 @modelcontextprotocol/server-everything)是一个刻意"什么都会做"的 Model Context Protocol 参考服务器:它同时实现了 tools、prompts、resources、sampling、elicitation、logging、订阅通知乃至 MCP Tasks 等协议特性,目标是让 MCP 客户端开发者在一个服务器里就能验证全部交互路径。读完本文,你将掌握它在 Claude Desktop、VS Code 中的完整配置方式、三种传输(stdio / SSE / Streamable HTTP)的启动命令,以及其工具注册、按会话隔离与条件注册等源码级实现细节。
定位:不是实用工具,而是协议"全功能靶场"
项目 README 的开宗明义是:
This MCP server attempts to exercise all the features of the MCP protocol. It is not intended to be a useful server, but rather a test server for builders of MCP clients.
也就是说,它的核心价值在于协议覆盖度而非业务功能。根据 package.json,当前仓库中该包版本为 2.0.0,mcpName 为 io.github.modelcontextprotocol/server-everything,核心依赖为 @modelcontextprotocol/sdk ^1.30.0、express(用于 HTTP 类传输)、zod(输入校验)、jszip 与 cors。所有注册的 MCP 原语与协议特性清单见官方特性文档 Server Features。
三种传输与启动入口
Everything Server 支持三种 MCP 传输,均通过同一个 CLI 入口 index.js(package.json 中 bin 字段映射为 mcp-server-everything → dist/index.js)启动。查看 入口文件 可以看到其调度逻辑:
const args = process.argv.slice(2);
const scriptName = args[0] || "stdio"; // 默认 stdio
switch (scriptName) {
case "stdio":
await import("./transports/stdio.js");
break;
case "sse":
await import("./transports/sse.js");
break;
case "streamableHttp":
await import("./transports/streamableHttp.js");
break;
// 未知参数时打印帮助并 exit(1)
}
设计要点是动态 import 按需加载——只初始化请求的那个传输模块,避免无关模块在启动时执行副作用。各传输的差异(来自 启动流程文档):
| 传输 | 连接模型 | 端点 | 会话管理 |
|---|---|---|---|
| stdio | 单进程绑定连接 | 进程 stdin/stdout | 连接时调用 clientConnect(),SIGINT 时清理 |
| SSE(自 2025-03-26 规范起已废弃) | 多客户端 | GET /sse(SSE 流)+ POST /message(JSON-RPC) |
按 sessionId 映射,onclose 钩子清理会话 |
| Streamable HTTP | 多客户端 | /mcp 的 POST/GET/DELETE |
使用事件存储(event store)支持断点续传,DELETE 时调用 cleanup(sessionId) |
需要说明的适用前提:README 中明确标注 SSE 传输自 2025-03-26 版规范起已标记为 deprecated,新客户端应优先使用 Streamable HTTP 或 stdio。
以安装包方式运行(推荐日常使用)
最省事的运行方式是直接使用 npm 包:
# 1. 全局安装
npm install -g @modelcontextprotocol/server-everything@latest
# 2. 运行默认的 stdio 服务器
npx @modelcontextprotocol/server-everything
# 3. 或显式指定 stdio
npx @modelcontextprotocol/server-everything stdio
# 4. 运行 SSE 服务器
npx @modelcontextprotocol/server-everything sse
# 5. 运行 Streamable HTTP 服务器
npx @modelcontextprotocol/server-everything streamableHttp
npx 方式可以不预安装,临时拉取包并运行,这也是 Claude Desktop 与 VS Code 配置里直接写 npx -y ... 的原因。
从源码运行 HTTP 类传输
如果你需要调试 HTTP 传输或修改源码,README 给出的流程如下:
SSE 传输(已废弃,仅作兼容):
cd src/everything
npm install
npm run start:sse
Streamable HTTP 传输:
cd src/everything
npm install
npm run start:streamableHttp
对照 package.json 的 scripts 字段,这三个命令的本质都是运行编译产物:
"start:stdio": "node dist/index.js stdio",
"start:sse": "node dist/index.js sse",
"start:streamableHttp": "node dist/index.js streamableHttp"
构建脚本 build 执行 tsc 编译,并通过 shx cp -r docs dist/ 把 docs/ 目录一并拷贝进发布产物——这正是服务器 instructions 的加载机制,下面会展开。
在 Claude Desktop 中接入(stdio 传输)
将以下配置写入 claude_desktop_config.json:
{
"mcpServers": {
"everything": {
"command": "npx",
"args": [
"-y",
"@modelcontextprotocol/server-everything"
]
}
}
}
Windows 下由于 npx 是批处理脚本,需要经 cmd /c 转发启动:
{
"mcpServers": {
"everything": {
"command": "cmd",
"args": [
"/c",
"npx",
"-y",
"@modelcontextprotocol/server-everything"
]
}
}
}
两种配置的差异仅在进程启动方式,服务器本身始终以 stdio 传输运行。
在 VS Code 中接入
VS Code 提供一键安装按钮(NPX 或 Docker 两种方式,Docker 镜像为 mcp/everything,对应 Dockerfile 构建)。手动配置则有两种位置:
- 用户级配置(推荐):命令面板(
Ctrl + Shift + P)执行MCP: Open User Configuration,打开用户级mcp.json添加服务器配置; - 工作区级配置:写入工作区的
.vscode/mcp.json,便于随仓库共享。
NPX 方式的配置内容(注意 VS Code 使用 servers 键而非 Claude Desktop 的 mcpServers 键):
{
"servers": {
"everything": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-everything"]
}
}
}
Windows 下的等价写法:
{
"servers": {
"everything": {
"command": "cmd",
"args": ["/c", "npx", "-y", "@modelcontextprotocol/server-everything"]
}
}
}
能力总览:Tools、Prompts、Resources 与协议特性
完整清单在 features.md,这里按类别归纳,方便按需验证特定协议能力。
Tools(工具),覆盖输入校验、内容类型、反向请求、长任务等场景:
echo/get-sum:最简工具,用 Zod 校验输入(实现见 tools/echo.ts);get-annotated-message:返回带priority/audience注解的文本,可选附带注解图片;get-env:以格式化 JSON 返回进程环境变量;get-resource-links/get-resource-reference:分别演示resource_link列表与内联resource内容块;get-roots-list:返回客户端最近一次发送的 roots 列表(依赖客户端 roots 能力);gzip-file-as-resource:抓取 URL/数据 URI、压缩后注册为会话资源demo://resource/session/<name>(mimeType: application/gzip),按outputType返回resource_link或内联resource;get-structured-content:同时返回兼容旧版的content(JSON 文本)和经outputSchema校验的structuredContent(temperature / conditions / humidity);get-tiny-image:返回一张小型 PNG 图片内容项;trigger-long-running-operation:按duration/steps模拟多步操作,客户端提供progressToken时通过notifications/progress汇报进度;toggle-simulated-logging/toggle-subscriber-updates:分别开关模拟日志与订阅资源更新通知;trigger-elicitation-request:发起表单模式的elicitation/create请求(字符串、数字、布尔、枚举与格式校验字段);trigger-url-elicitation:URL 模式的 elicitation,含errorPath错误路径演示(抛出-32042错误码),需要客户端elicitation.url能力;trigger-sampling-request:向客户端/LLM 发起sampling/createMessage请求并回传 LLM 响应;simulate-research-query:演示 MCP Tasks(SEP-1686)的多阶段研究任务,ambiguous: true时先发起 elicitation 澄清;trigger-sampling-request-async/trigger-elicitation-request-async:演示双向任务——服务器把请求作为后台任务发给客户端执行,服务器轮询状态直至完成。
Prompts(提示模板):simple-prompt(无参数静态消息)、args-prompt(city 必填 + state 可选)、completable-prompt(用 SDK 的 completable 助手演示参数自动补全,department 补全驱动 name 的上下文建议)、resource-prompt(返回内嵌动态资源的消息)。
Resources(资源 URI 空间):
| 模式 | URI 形态 | 说明 |
|---|---|---|
| 动态文本 | demo://resource/dynamic/text/{index} |
内容即时生成 |
| 动态二进制 | demo://resource/dynamic/blob/{index} |
base64 载荷即时生成 |
| 静态文档 | demo://resource/static/document/<filename> |
把 src/everything/docs/ 目录作为静态文件资源对外提供 |
| 会话级 | demo://resource/session/<name> |
工具运行期动态注册,仅存活于当前会话 |
其他协议特性:
- 资源订阅与通知:模拟更新默认关闭(opt-in),客户端用标准
resources/subscribe/resources/unsubscribe订阅 URI;toggle-subscriber-updates工具按会话开启/关闭定时器,只对已订阅 URI 发送notifications/resources/updated,多客户端并发时各会话独立投递; - 模拟日志:默认关闭,
toggle-simulated-logging按会话开启 8 个级别(debug ~ emergency)的随机日志,客户端可用标准logging/setLevel控制最低接收级别; - MCP Tasks(SEP-1686):服务器声明
tasks.list、tasks.cancel、tasks.requests.tools.call能力;任务生命周期为tools/call(带task: true)→ 返回CreateTaskResult(含taskId)→ 客户端轮询tasks/get获取状态与statusMessage→completed后调用tasks/result取结果;状态枚举为working/input_required/completed/failed/cancelled。Tasks 是双向的:tools/call由服务器执行,而sampling/createMessage、elicitation/create可以由客户端作为后台任务执行(对应trigger-*-async工具)。
源码级机制:服务器工厂与条件注册
理解 Everything Server 最值得参考的是它的"服务器工厂"模式,核心在 server/index.ts:
- instructions 从 docs 目录加载:
createServer()通过readInstructions()读取docs/instructions.md作为服务器指令——这解释了构建脚本为何要把docs/拷进dist/; - 能力声明:实例化
McpServer时声明tools、prompts、resources(含subscribe: true)、logging以及tasks能力,并注入 SDK experimental 提供的InMemoryTaskStore与InMemoryTaskMessageQueue; - 注册顺序:
registerTools(server)→registerResources(server)→registerPrompts(server)→setSubscriptionHandlers(server),分别对应 tools/index.ts、resources/与 prompts/index.ts。
一个关键的细节是条件工具注册。由于客户端能力要在初始化握手完成后才可知,依赖特定客户端能力的工具不能一开始就注册。tools/index.ts 将注册拆成两半:
// 连接前注册的常规工具
export const registerTools = (server: McpServer) => { /* echo、get-sum 等 14 个 */ };
// 依赖客户端能力、须初始化后注册
export const registerConditionalTools = (server: McpServer) => {
registerGetRootsListTool(server);
registerTriggerElicitationRequestTool(server);
registerTriggerUrlElicitationTool(server);
registerTriggerSamplingRequestTool(server);
registerSimulateResearchQueryTool(server);
registerTriggerSamplingRequestAsyncTool(server);
registerTriggerElicitationRequestAsyncTool(server);
};
而 server/index.ts 中把 registerConditionalTools 挂到 oninitialized 钩子上——握手完成后才补注册 get-roots-list、sampling、elicitation 与 tasks 系列工具;随后延迟 350ms 调用 syncRoots 同步客户端 roots(延迟是为了避开 notifications/initialized 处理期间请求丢失的时序问题)。这一"工厂返回 { server, cleanup } 二元组"的模式(cleanup(sessionId?) 负责停止模拟日志/资源更新定时器、清理任务存储与超时句柄)是多客户端会话隔离的基础,值得在自己的 MCP 服务器实现中借鉴。
验证与测试
该服务器自带完整测试套件(Vitest),覆盖注册关系、资源、提示词与服务器行为,测试文件位于 src/everything/tests/(如 registrations.test.ts)。在 src/everything 目录执行 npm test 即可运行(等价于 vitest run --coverage),这也是核对"文档所列工具与源码实际注册是否一致"的直接手段。
License
Everything Server 采用 MIT License 发布,可自由使用、修改与分发;具体条款以仓库 LICENSE 文件为准。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0627
Hy4-previewHy4 preview 是由腾讯混元团队研发的新一代混合专家(MoE)旗舰模型。模型总参数量 770B,每个 token 激活 49B,主干共包含78层,第一层采用标准 FFN,其余 77 层均为 MoE 结构,每层包含 256 个路由专家与 1 个共享专家,每个 token 激活 top-8 路由专家及共享专家。主干之外原生内置 1 层 MTP(总参数量 10B,激活 0.7B)以支持投机解码。Python00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
GLM-5.3-FlashGLM-5.3-Flash (320B-A18B),是GLM-5系列的首个原生多模态模型。320B总参数,能力超过GLM-5.2Jinja00
Spark-X2.5-4BSpark-X2.5-4B 旨在让强大的 AI 更实用、更高效、更易获得。在广泛日常任务中表现强劲,涵盖对话、写作、翻译、推理、编码、工具调用以及智能体工作流,并在同等规模的开源模型中取得领先成绩。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00