
mcp-continuous-auditor
by malkreide
MCP Continuous Auditor
A persistent, multi-agent auditor that continuously tests and hardens MCP servers — with promptfoo + CI as the deterministic source of truth, never an LLM's opinion.
Overview
This project runs a continuous auditor for MCP servers, starting with zurich-opendata-mcp. An OpenClaw gateway exposes the auditor on Telegram as a control plane. Unlike a "vibecoding" agent, verification is a versioned artifact (pytest + promptfoo running in GitHub Actions), and a human is always the merge gate.
Features
- Read-only first — the agent reports before it ever writes.
- Deterministic ground truth — promptfoo YAML asserts + JSON-schema drift checks, run in CI.
- Recall floors, not just schema — a collapsed result set keeps its JSON shape, so a structural diff cannot see it. Probes carry
min_countfloors, and a second weekly probe calls the server's own tools live: the raw-URL probe verifies the endpoint, the canary verifies the whole chain. - Identity probe — does the server report the version it actually is? A hand-maintained version in the User-Agent drifts silently: nothing breaks, no test fails.
scripts/identity_probe.pyreads the source and, with--installed, the shipped artifact. A portfolio sweep found 12 of 30 servers sending a wrong version, 4 of them a wrong major — docs/probes/identity.md. - Shipped probe — is the release users install current, and does it run? CI tests the branch, not the artifact:
meteoswiss-mcpshipped an import error to every fresh install for three days withmainalready correct.scripts/shipped_probe.pyruns at two depths —--metadata-onlyis two HTTP requests against the Simple API (the surface pip installs from); the default depth installs into a fresh venv and speaks real MCP to it.NO_TAGS,STALE_ARTIFACTandUNCONFIRMEDkeep "could not measure" apart from "in sync" — docs/probes/shipped.md. - Yank probe — the inverse question, across the whole catalogue: does a known-broken, not-yanked release still exist, with a healthy successor beside it?
scripts/yank_probe.pywalks every version'sRequires-Distover PEP 658 core metadata and raisesUNYANKED_BROKEN_RELEASEonly when four conditions hold together. It recommends a yank and never performs one — every request is a GET. All six predecessors ofzurich-opendata-mcp0.5.1 carried the uncapped range; a probe reading onlylatest-1would have called the catalogue clean — docs/probes/yank.md. - Published probe — what does the installed artifact do on the wire?
swiss-efv-mcppassed identity and shipped while the package every user installs announced itself asMozilla/5.0 … Chrome/124.0.scripts/published_probe.pyinstalls into a throwaway venv and measures the User-Agent, the imports, the console script's start event, and the upper bounds on what it imports. Where it cannot resolve a value it reportsUNVERIFIED, never clean — docs/probes/published.md. - Lockfile probe —
pyproject.tomlstates the bound; does the lockfile the deployment installs from state it too? The bounds PR merged green withuv.lockunregenerated: the fix was in the file everybody reads and absent from the file that installs.scripts/lockfile_probe.pycompares the recordedrequires-distand the pinned versions, and asksuv lock --check/poetry check --lockwhere they exist.--checkis hard-coded:uv lockwithout it rewrites the evidence.
Related servers

n8n
Updated todayby n8n-io
Fair-code workflow automation platform with native AI capabilities. Combine visual building with custom code, self-host or cloud, 400+ integrations.

mcp-server-git
OfficialUpdated todayA Model Context Protocol server providing tools to read, search, and manipulate Git repositories programmatically via LLMs

mcp-server-fetch
OfficialUpdated todayA Model Context Protocol server providing tools to fetch and convert web content for usage by LLMs