mcp-drill
Fault injection and reliability testing for MCP servers and AI agents. Wrap any Model Context Protocol server in one command; inject timeouts, malformed JSON-RPC, truncated and corrupted-but-valid tool outputs; measure whether the server degrades cleanly — and whether your agent notices or silently acts on the garbage.
uvx mcp-drill wrap --faults timeout,corrupt -- npx -y @modelcontextprotocol/server-filesystem /tmp
MCP is JSON-RPC over stdio/SSE with bidirectional notifications, so ordinary HTTP fault-injectors
and chaos tools don't fit. mcp-drill speaks MCP: it sits transparently between an MCP client and
a backend server and perturbs the traffic, so you can test failure paths in CI without a live LLM.
Why
Real MCP deployments fail in ways integration tests never cover: a tool times out, a server
returns a well-formed-but-wrong payload, a response is truncated mid-stream. Most agents were
never exercised against these paths. mcp-drill makes them reproducible:
- 🧪 Fault injection — deterministically inject timeouts, malformed/oversized/truncated responses, corrupted-but-schema-valid payloads, dropped tools, and latency.
- 🎬 CI-first — a CLI and a GitHub Action; no live model or API keys required in the loop.
- 📊 Reliability scorecard — a model-free scan that grades how a server responds to bad input and how machine-checkable its tool output contracts are.
Install
Until the first PyPI release, install from source:
pip install "mcp-drill[scan] @ git+https://github.com/TimurRakhmatullin86/mcp-drill"
Quickstart
# wrap a server and inject faults into its responses
mcp-drill wrap --faults timeout,truncate -- npx -y @modelcontextprotocol/server-everything
# score a server's fault handling and output-schema hygiene (no LLM involved)
mcp-drill scan -- npx -y @modelcontextprotocol/server-filesystem /tmp
What it measures (model-free)
The scan command is deterministic and involves no language model, so its numbers are properties
of the server and the protocol — not of whichever agent happens to call it:
- Error conformance — on invalid requests (unknown method, unknown tool, missing required arguments), does the server return a spec-compliant JSON-RPC error, a proper tool error, or does it hang / crash / answer as if nothing was wrong?
- Output-contract coverage — what fraction of a server's tools declare a machine-checkable
outputSchemaat all? Tools without one give downstream validators nothing to check. - Output-contract enforceability — of the tools that declare an
outputSchema, how many would actually reject a corrupted (well-typed but wrong) response? Many declared schemas validate shape only, so a corrupted payload still passes the server's own contract.
Status
Early development. The proxy/injector core is pure-stdlib; schema scoring uses jsonschema
(the scan extra). Install from source until the first PyPI release. Telemetry is off —
the tool never phones home.
License
Apache-2.0 (see LICENSE).
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file mcp_drill-0.0.1.tar.gz.
File metadata
- Download URL: mcp_drill-0.0.1.tar.gz
- Upload date:
- Size: 21.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.14.6
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9ecfe85b561d8eed540a281028c126c90076326d7f2570e884d6245661b27a53
|
|
| MD5 |
a009a07bb217a8b33d230a62af401ecf
|
|
| BLAKE2b-256 |
97c363ace49a4d2425e012c02ed49f92fe0c81607bc4d85eab10dee052e79aef
|
File details
Details for the file mcp_drill-0.0.1-py3-none-any.whl.
File metadata
- Download URL: mcp_drill-0.0.1-py3-none-any.whl
- Upload date:
- Size: 20.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.14.6
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5fed478e5ecd6d4090573d9bcee6f9f7088e94fdf161a0a5aeb5811b93b27631
|
|
| MD5 |
0bf4e699d58ff0a7aebbae8a182b575d
|
|
| BLAKE2b-256 |
b583acef902b463383e0b7339e8a1fbf0847d98d862b0eab6a779c41f3c6cfd2
|