You pin your npm dependencies. What pins your MCP servers?

Your agent calls tools/list and trusts everything it gets back. Tool descriptions aren't documentation, they're the instructions the model reads to decide what a tool does. There's no version pin, no integrity check, no diff to review.

So when a server ships an update and rewrites a description, adds a required parameter, or flips readOnlyHint from true to false, your agent's behaviour changes and nothing in your pipeline registers it.

I built mcpward to close that gap: snapshot an MCP server's contract into a lockfile, then diff it in CI and fail the build when it drifts. Each change is classified breaking or non-breaking.

Alongside drift it checks protocol compliance, validates the two-layer error contract most servers get wrong, runs behavioral test suites and latency budgets, and applies tool-poisoning heuristics with JUnit and SARIF output so findings land in GitHub's Security tab.

Credit where due: Invariant Labs' mcp-scan pioneered this space and is the right tool for auditing servers installed on your own machine. mcpward

answers a different question - "did this dependency's contract change since my last release?" and runs entirely offline, which matters when the servers are internal.

Black-box, works against any MCP server in any language, MIT licensed.

npx mcpward init

I'd genuinely like to be told if I've drawn the breaking/non-breaking line in the wrong place that's the judgment call I'm least sure about.

Posted Jul 26, 2026, 11:51 PM UTC

10
Loading comments…