MCP contract diff examples
See the compatibility verdict before you connect a server.
These four illustrative contracts run through the same deterministic diff engine as the console. No account or installation is needed. Open the tool definitions to inspect exactly what changed, or download the snapshots and findings.
Read as Markdown or fetch the example index as JSON.
Make an optional argument required
An existing call with only query stops validating when limit becomes required. Keep the previous default during migration.
Engine verdict
- search.limittool.input.required.added
limit changed from optional to required.
Accept calls that omit it for at least one release, applying the previous default, then require it.
Inspect the before and after tool definitions
Before
{
"name": "search",
"description": "Search the issue tracker.",
"inputSchema": {
"type": "object",
"properties": {
"query": {
"type": "string"
},
"limit": {
"type": "integer"
}
},
"required": [
"query"
]
}
}After
{
"name": "search",
"description": "Search the issue tracker.",
"inputSchema": {
"type": "object",
"properties": {
"query": {
"type": "string"
},
"limit": {
"type": "integer"
}
},
"required": [
"query",
"limit"
]
}
}Accept another input enum value
Adding archived to the accepted input values preserves existing calls. This is the input direction; returning a new value has a different verdict.
Engine verdict
- search.statustool.input.enum.widened
status now also accepts "archived".
Inspect the before and after tool definitions
Before
{
"name": "search",
"description": "Search the issue tracker.",
"inputSchema": {
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"open",
"closed"
]
}
},
"required": [
"status"
]
}
}After
{
"name": "search",
"description": "Search the issue tracker.",
"inputSchema": {
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"open",
"closed",
"archived"
]
}
},
"required": [
"status"
]
}
}Return another output enum value
A caller handling only open and closed may fail when the server returns archived. The same enum expansion is breaking in the output direction.
Engine verdict
- search.statustool.output.enum.widened
status now also accepts "archived".
Consumers switching exhaustively on this enum will not handle the new values.
Inspect the before and after tool definitions
Before
{
"name": "search",
"description": "Search the issue tracker.",
"inputSchema": {
"type": "object",
"properties": {
"query": {
"type": "string"
},
"limit": {
"type": "integer"
}
},
"required": [
"query"
]
},
"outputSchema": {
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"open",
"closed"
]
}
},
"required": [
"status"
]
}
}After
{
"name": "search",
"description": "Search the issue tracker.",
"inputSchema": {
"type": "object",
"properties": {
"query": {
"type": "string"
},
"limit": {
"type": "integer"
}
},
"required": [
"query"
]
},
"outputSchema": {
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"open",
"closed",
"archived"
]
}
},
"required": [
"status"
]
}
}Rewrite a tool description
The input schema is unchanged, but the model-visible purpose changes. The finding is a deterministic review heuristic; test tool selection with your own evaluations.
Engine verdict
- search.descriptiontool.description.changed
search description changed. Description changed substantially. Agents may alter tool-selection behavior.
The description is the primary tool-selection signal. Re-run your evaluations: a model may now pick this tool where it did not, or stop picking it where it did.
Search the issue tracker.Find tickets across every connected workspace.Rewritten. Struck text is the old wording, tinted text is the new.
Inspect the before and after tool definitions
Before
{
"name": "search",
"description": "Search the issue tracker.",
"inputSchema": {
"type": "object",
"properties": {
"query": {
"type": "string"
},
"limit": {
"type": "integer"
}
},
"required": [
"query"
]
}
}After
{
"name": "search",
"description": "Find tickets across every connected workspace.",
"inputSchema": {
"type": "object",
"properties": {
"query": {
"type": "string"
},
"limit": {
"type": "integer"
}
},
"required": [
"query"
]
}
}Compare your own MCP contract
Add a public HTTP MCP URL, capture a baseline, then capture again to see what changed. Discovery does not invoke tools. Contract checks do not test handler behavior or prove an agent completed its task.
Continue with input and output compatibility, description changes, or the generated rule reference.