mcp-tester
Instrumented MCP server for testing client conformance to list_changed notifications, enabling verification of dynamic tool, resource, and prompt surfacing.
README
mcp-tester
Instrumented MCP server for testing client conformance to */list_changed notifications and other protocol features.
Why
PR mcaps-microsoft/msx-mcp#321 proposed dynamic tool surfacing via notifications/tools/list_changed. The PR was closed with the claim that "Copilot CLI caches tools/list at session start and ignores notifications/tools/list_changed" -- but no instrumented experiment was ever run to prove or disprove this.
This repo provides the apparatus to test that claim -- and any MCP client's conformance to list_changed -- with real evidence.
What It Does
-
Probe MCP Server (
src/server.ts) -- A self-instrumenting MCP server that logs every JSON-RPC message on its stdio pipe. It exposes alpha-state tools, resources, and prompts, plus trigger tools that swap them to beta-state and send the corresponding*/list_changednotification. -
Automated Client Driver (
src/driver.ts) -- An SDK-based MCPClientthat drives the server through the full mutation cycle. This is the control: it proves the protocol works when both endpoints honor the spec. Any client that diverges from this behavior is provably non-conformant. -
Log Analyzer (
src/analyze.ts) -- Reads the JSONL log and emits a markdown evidence table answering specific questions: Did the client receive the notification? Did it re-fetch? Can it call the new item? Can it still call the removed item? -
Human Protocol (
PROTOCOL.md) -- Step-by-step instructions for running the same test against Copilot CLI or any other MCP client.
Quick Start
git clone https://github.com/ericchansen/mcp-tester.git
cd mcp-tester
npm install
npm run build
Run the automated control (SDK client)
npm run driver -- --domain all
This spawns the probe server, runs the full mutation protocol for tools, resources, and prompts, and reports results. You should see all three domains pass with full conformance.
Analyze a log
npm run analyze -- path/to/log.jsonl --domain tools
Testing Your Own MCP Client
See PROTOCOL.md for step-by-step instructions on testing Copilot CLI or any other MCP client against this probe.
Repo Layout
mcp-tester/
|-- README.md # This file
|-- PROTOCOL.md # Human-driven test procedure
|-- LICENSE # MIT
|-- package.json
|-- tsconfig.json
|-- src/
| |-- server.ts # Probe MCP server (stdio)
| |-- logger.ts # JSONL stdio tap + log writer
| |-- analyze.ts # CLI: parses log -> markdown evidence table
| +-- driver.ts # CLI: spawns server, drives it via SDK Client
+-- results/
+-- copilot-cli/
+-- .gitkeep # Committed experiment results go here
How the Probe Works
Initial State (Alpha)
| Domain | Alpha Item |
|---|---|
| Tools | mcptester_probe_alpha |
| Resources | probe://alpha |
| Prompts | mcptester_alpha_prompt |
Plus five permanent tools: mcptester_mutate_tools, mcptester_mutate_resources, mcptester_mutate_prompts, mcptester_status.
After Mutation (Beta)
When a mcptester_mutate_* tool is called:
- The alpha item is removed (via SDK
handle.remove()) - The beta item is registered
- The SDK auto-sends the corresponding
notifications/*/list_changed debouncedNotificationMethodscoalesces remove + register into a single notification
| Domain | Beta Item |
|---|---|
| Tools | mcptester_probe_beta |
| Resources | probe://beta |
| Prompts | mcptester_beta_prompt |
Logging
Every JSON-RPC message (inbound and outbound) is logged to a JSONL file. The logger taps process.stdin and process.stdout via Transform streams installed before the SDK transport, so it sees every byte without interfering with the protocol.
Limitations
- stdio transport only -- no HTTP/SSE testing yet
- Three
list_changedflows only -- future tests planned for sampling, elicitation, roots, progress, completions - Single-server testing -- tests one MCP server connection at a time
License
MIT
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。