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

breaking
  • 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.

Download findings (JSON)

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"
    ]
  }
}

Reproduce with approved preview CLI access: before snapshot, after snapshot, then mcp-inspect diff before.json after.json --format json.

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

non-breaking
  • search.statustool.input.enum.widened

    status now also accepts "archived".

Download findings (JSON)

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"
    ]
  }
}

Reproduce with approved preview CLI access: before snapshot, after snapshot, then mcp-inspect diff before.json after.json --format json.

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

breaking
  • search.statustool.output.enum.widened

    status now also accepts "archived".

    Consumers switching exhaustively on this enum will not handle the new values.

Download findings (JSON)

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"
    ]
  }
}

Reproduce with approved preview CLI access: before snapshot, after snapshot, then mcp-inspect diff before.json after.json --format json.

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

potentially breaking
  • 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.

Download findings (JSON)

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"
    ]
  }
}

Reproduce with approved preview CLI access: before snapshot, after snapshot, then mcp-inspect diff before.json after.json --format json.

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.