Knot

Version 1.0.0. Markdown ยท Check IDs

Knot Verified methodology v1.0.0

Knot Verified publishes what a probe measured about an MCP server. Anyone can re-run the probe and get the same facts.

What a listing shows

What Verified does not measure

Verdicts

A verdict follows mechanically from the check results below. No human edits it.

VerdictRule
AliveL0 passes. Every L1 check passes. Every L2 check that ran passes.
DegradedL0 passes and at least one L1 check or one L2 check that ran fails.
DeadL0 fails on three attempts in one run, 60 seconds apart, while the probe's own control check passes.
UnverifiableThe probe cannot check past L0, or cannot check at all, for a reason that is not the server's fault. See below.

Unverifiable is a different status from a failure. An unverifiable server never gets a low or negative mark.

A server is unverifiable when any of these is true:

Check layers

Each check is a yes or no. Each has a stable ID that appears in the raw results.

L0 Liveness

It tells you the server exists and speaks MCP, and nothing more.

IDPasses when
L0.reachableDNS resolves and the connection opens (remote), or the process starts (stdio).
L0.tlsThe TLS handshake succeeds with a valid certificate (remote only).
L0.initializeinitialize returns a result within 10 seconds.
L0.protocol_versionThe result names a protocol version published in the MCP spec.
L0.capabilitiesThe result includes a capabilities object.

L1 Contract

It catches servers that handshake and then return garbage.

IDPasses when
L1.server_infoserverInfo has a non-empty name and version.
L1.envelopeEvery response is valid JSON-RPC 2.0 with a matching id.
L1.tools_listtools/list returns, if the server declares tools.
L1.tool_schemasEvery tool has a name and an inputSchema that is valid JSON Schema.
L1.resources_listresources/list returns valid entries, if the server declares resources.
L1.prompts_listprompts/list returns valid entries, if the server declares prompts.
L1.unknown_methodAn unknown method returns a JSON-RPC error with code -32601.

L2 Behavior

It checks that the server does the right thing, using only safe calls.

IDPasses when
L2.call_okA safe call returns a well-formed tool result. A result flagged as an error, or a -32602 refusal, still passes, because a harmless sandbox value can be rightly refused. A crash, a malformed reply or any other protocol error fails, unless the call used a made-up value such as a file path or an id. A server refusing a made-up value says nothing about it, so that call counts as untested.
L2.output_schemaIf the tool declares an outputSchema, the structured result validates against it.
L2.bad_inputArguments that break the tool's own schema return a clean error, not a crash or a success.
L2.timeoutA call that does not finish within 30 seconds ends with a clean error or a closed request, not a hung connection.

A tool with no safe call is marked behavior untested. It is never guessed at, and it does not fail the server.

L3 Reliability over time

L3 is published as numbers and is not part of the verdict in v1.

Verdict thresholds for L3 will be set from the distribution measured in the first sweep. They will be published with a methodology version bump before they affect any verdict.

L4 Security posture

L4 states facts and is never part of the verdict. A server that needs write access is not worse than one that does not.

Which calls are safe

The probe calls a tool only when all of these are true:

  1. The tool is annotated readOnlyHint: true and not destructiveHint: true, or it is on the public reviewed allowlist.
  2. Its name does not contain a word from the public mutation list (create, delete, update, write, send, post, execute, run, deploy and similar), and its description does not open with one.
  3. Every required argument can be built from the tool's own schema: a default, an enum value, a constant or a minimal example. Free-text arguments get a fixed harmless value.

At most five tools are called per run, in alphabetical order. Tools that fail any rule, or fall past the limit, are never called. The allowlist, the mutation list and the argument rules are public and versioned with the methodology.

Freshness

Records and disputes

Reproducing a check

Same rules for everyone

The same methodology checks every listing, including Knot's own server.

Changes to this methodology

Known limits