{"version":"2.1.224","anchor":"mcp-servers-checked-for-the-issuer-they-echo-back","canonical_anchor":"mcp-servers-checked-for-the-issuer-they-echo-back","heading":"MCP servers checked for the issuer they echo back","tier":"notice","area":"MCP","scope":null,"heads_up":null,"url":"https:\/\/changelogs.core-directive.com\/v\/2.1.224\/e\/mcp-servers-checked-for-the-issuer-they-echo-back","release_url":"https:\/\/changelogs.core-directive.com\/v\/2.1.224","markdown":"### MCP servers checked for the issuer they echo back\n\nClaude checks whether an MCP server points authentication elsewhere, logging mismatches without blocking.\n\n**What**\n\nWhen connecting to an MCP server over OAuth, Claude now compares the authorization-server address it asked about against the `issuer` value the server returns in its discovery metadata, catching a server that points authentication somewhere else. In this build the check only records telemetry: the gate `tengu_mcp_issuer_strict_echo` decides the mode and its in-source fallback is false, so absent a remote value the result is observe-only.\n\n**Details**\n\n- In `observe` mode a mismatch is logged with outcome `proceeded` and the connection continues.\n- In `enforce` mode the connection raises an issuer echo cross-origin error and authentication fails with reason `issuer_echo_denied`.\n- Mismatches are classified before reporting, including `same_origin` and `unparseable` plus a reason per differing part of the URL.\n- None of this exists in 2.1.223; the whole check is new.\n\n**Evidence**\n\n`tengu_mcp_oauth_issuer_echo_mismatch`\n\n- Flag `tengu_mcp_issuer_strict_echo`: Not enough to say (read for one account on one subscription tier against v2.1.224; this account: no value returned, anonymous baseline: no value returned, compiled default: off) These values were read against a different version of Claude Code, so treat them as the nearest reading available instead of one taken on this release.\n- Area: MCP\n- Tier: You'll notice\n- Useful: 3\/5\n- Signal: 3\/5"}