From 2dfef7ef2f254e45d722e4d9e7602bc90e9d8209 Mon Sep 17 00:00:00 2001 From: Alex Castillo Date: Fri, 30 Oct 2026 12:30:43 -0400 Subject: [PATCH 1/4] fix(mcp): replace retired claude-sonnet-4-5 as the default Anthropic model Anthropic retires claude-sonnet-4-5 on 2026-11-30, after which the embedded agents fail with a model-not-found error unless ANTHROPIC_MODEL is set. Use claude-sonnet-5-5 as the default and update the CLI usage text. No sampling parameters are sent, so the new model needs no other change. Co-Authored-By: Claude Sonnet 5.5 Signed-off-by: Alex Castillo --- .../agents/anthropic-provider.test.ts | 54 +++++++++++++++++++ .../src/internal/agents/anthropic-provider.ts | 4 +- packages/mcp-server/src/cli/usage.ts | 4 +- 3 files changed, 58 insertions(+), 4 deletions(-) create mode 100644 packages/mcp-core/src/internal/agents/anthropic-provider.test.ts diff --git a/packages/mcp-core/src/internal/agents/anthropic-provider.test.ts b/packages/mcp-core/src/internal/agents/anthropic-provider.test.ts new file mode 100644 index 000000000..b63d16397 --- /dev/null +++ b/packages/mcp-core/src/internal/agents/anthropic-provider.test.ts @@ -0,0 +1,54 @@ +import type { LanguageModelV3 } from "@ai-sdk/provider"; +import { afterEach, beforeEach, describe, expect, it } from "vitest"; +import { + getAnthropicModel, + setAnthropicBaseUrl, +} from "./anthropic-provider.js"; + +describe("anthropic-provider", () => { + const originalModel = process.env.ANTHROPIC_MODEL; + const originalApiKey = process.env.ANTHROPIC_API_KEY; + + beforeEach(() => { + setAnthropicBaseUrl(undefined); + delete process.env.ANTHROPIC_MODEL; + process.env.ANTHROPIC_API_KEY = "test-key"; + }); + + afterEach(() => { + if (originalModel === undefined) { + delete process.env.ANTHROPIC_MODEL; + } else { + process.env.ANTHROPIC_MODEL = originalModel; + } + + if (originalApiKey === undefined) { + delete process.env.ANTHROPIC_API_KEY; + } else { + process.env.ANTHROPIC_API_KEY = originalApiKey; + } + }); + + it("defaults to a model that is not scheduled for retirement", () => { + const model = getAnthropicModel() as LanguageModelV3; + + // Anthropic retires claude-sonnet-4-5 on 2026-11-30. + expect(model.modelId).toBe("claude-sonnet-4-6"); + }); + + it("uses ANTHROPIC_MODEL when set", () => { + process.env.ANTHROPIC_MODEL = "claude-haiku-5-5"; + + const model = getAnthropicModel() as LanguageModelV3; + + expect(model.modelId).toBe("claude-haiku-5-5"); + }); + + it("prefers an explicit model over ANTHROPIC_MODEL", () => { + process.env.ANTHROPIC_MODEL = "claude-haiku-5-5"; + + const model = getAnthropicModel("claude-opus-5-5") as LanguageModelV3; + + expect(model.modelId).toBe("claude-opus-5-5"); + }); +}); diff --git a/packages/mcp-core/src/internal/agents/anthropic-provider.ts b/packages/mcp-core/src/internal/agents/anthropic-provider.ts index f2627381d..43f6bc3a3 100644 --- a/packages/mcp-core/src/internal/agents/anthropic-provider.ts +++ b/packages/mcp-core/src/internal/agents/anthropic-provider.ts @@ -3,7 +3,7 @@ import type { LanguageModel } from "ai"; import { USER_AGENT } from "../../version"; // Default configuration constants -const DEFAULT_ANTHROPIC_MODEL = "claude-sonnet-4-5"; +const DEFAULT_ANTHROPIC_MODEL = "claude-sonnet-4-6"; // Module-level state for baseURL (set only via explicit configuration, not env vars) let configuredBaseUrl: string | undefined; @@ -21,7 +21,7 @@ export function setAnthropicBaseUrl(baseUrl: string | undefined): void { * * Configuration: * - ANTHROPIC_API_KEY: API key for authentication (required) - * - ANTHROPIC_MODEL: Model to use (default: "claude-sonnet-4-5") - env var OK + * - ANTHROPIC_MODEL: Model to use (default: "claude-sonnet-4-6") - env var OK * - Base URL: Must be set via setAnthropicBaseUrl() - NOT from env vars (security risk) */ export function getAnthropicModel(model?: string): LanguageModel { diff --git a/packages/mcp-server/src/cli/usage.ts b/packages/mcp-server/src/cli/usage.ts index c49fa4e6d..2a19e802d 100644 --- a/packages/mcp-server/src/cli/usage.ts +++ b/packages/mcp-server/src/cli/usage.ts @@ -26,7 +26,7 @@ Embedded agent configuration: --openai-base-url Override OpenAI API base URL --openai-model Override OpenAI model (default: gpt-5) --anthropic-base-url Override Anthropic API base URL - --anthropic-model Override Anthropic model (default: claude-sonnet-4-5) + --anthropic-model Override Anthropic model (default: claude-sonnet-4-6) Session constraints: --organization-slug Force all calls to an organization @@ -83,7 +83,7 @@ Embedded agent configuration: --openai-base-url Override OpenAI API base URL --openai-model Override OpenAI model (default: gpt-5) --anthropic-base-url Override Anthropic API base URL - --anthropic-model Override Anthropic model (default: claude-sonnet-4-5) + --anthropic-model Override Anthropic model (default: claude-sonnet-4-6) Session constraints: --organization-slug Force all calls to an organization From 37641eb24d0cd60587fe5fd0e2d4b390e0de1152 Mon Sep 17 00:00:00 2001 From: Alex Castillo Date: Fri, 30 Oct 2026 16:19:07 -0400 Subject: [PATCH 2/4] fix(mcp): default the Anthropic model to claude-sonnet-5-5 Review feedback: use the newest Sonnet instead of 4-6, and keep only the default-model test (the ANTHROPIC_MODEL cases exercise the SDK, not this code). Co-Authored-By: Claude Sonnet 5.5 Signed-off-by: Alex Castillo --- .../internal/agents/anthropic-provider.test.ts | 18 +----------------- .../src/internal/agents/anthropic-provider.ts | 4 ++-- packages/mcp-server/src/cli/usage.ts | 4 ++-- 3 files changed, 5 insertions(+), 21 deletions(-) diff --git a/packages/mcp-core/src/internal/agents/anthropic-provider.test.ts b/packages/mcp-core/src/internal/agents/anthropic-provider.test.ts index b63d16397..b577d1133 100644 --- a/packages/mcp-core/src/internal/agents/anthropic-provider.test.ts +++ b/packages/mcp-core/src/internal/agents/anthropic-provider.test.ts @@ -33,22 +33,6 @@ describe("anthropic-provider", () => { const model = getAnthropicModel() as LanguageModelV3; // Anthropic retires claude-sonnet-4-5 on 2026-11-30. - expect(model.modelId).toBe("claude-sonnet-4-6"); - }); - - it("uses ANTHROPIC_MODEL when set", () => { - process.env.ANTHROPIC_MODEL = "claude-haiku-5-5"; - - const model = getAnthropicModel() as LanguageModelV3; - - expect(model.modelId).toBe("claude-haiku-5-5"); - }); - - it("prefers an explicit model over ANTHROPIC_MODEL", () => { - process.env.ANTHROPIC_MODEL = "claude-haiku-5-5"; - - const model = getAnthropicModel("claude-opus-5-5") as LanguageModelV3; - - expect(model.modelId).toBe("claude-opus-5-5"); + expect(model.modelId).toBe("claude-sonnet-5-5"); }); }); diff --git a/packages/mcp-core/src/internal/agents/anthropic-provider.ts b/packages/mcp-core/src/internal/agents/anthropic-provider.ts index 43f6bc3a3..58093261c 100644 --- a/packages/mcp-core/src/internal/agents/anthropic-provider.ts +++ b/packages/mcp-core/src/internal/agents/anthropic-provider.ts @@ -3,7 +3,7 @@ import type { LanguageModel } from "ai"; import { USER_AGENT } from "../../version"; // Default configuration constants -const DEFAULT_ANTHROPIC_MODEL = "claude-sonnet-4-6"; +const DEFAULT_ANTHROPIC_MODEL = "claude-sonnet-5-5"; // Module-level state for baseURL (set only via explicit configuration, not env vars) let configuredBaseUrl: string | undefined; @@ -21,7 +21,7 @@ export function setAnthropicBaseUrl(baseUrl: string | undefined): void { * * Configuration: * - ANTHROPIC_API_KEY: API key for authentication (required) - * - ANTHROPIC_MODEL: Model to use (default: "claude-sonnet-4-6") - env var OK + * - ANTHROPIC_MODEL: Model to use (default: "claude-sonnet-5-5") - env var OK * - Base URL: Must be set via setAnthropicBaseUrl() - NOT from env vars (security risk) */ export function getAnthropicModel(model?: string): LanguageModel { diff --git a/packages/mcp-server/src/cli/usage.ts b/packages/mcp-server/src/cli/usage.ts index 2a19e802d..03e290ed6 100644 --- a/packages/mcp-server/src/cli/usage.ts +++ b/packages/mcp-server/src/cli/usage.ts @@ -26,7 +26,7 @@ Embedded agent configuration: --openai-base-url Override OpenAI API base URL --openai-model Override OpenAI model (default: gpt-5) --anthropic-base-url Override Anthropic API base URL - --anthropic-model Override Anthropic model (default: claude-sonnet-4-6) + --anthropic-model Override Anthropic model (default: claude-sonnet-5-5) Session constraints: --organization-slug Force all calls to an organization @@ -83,7 +83,7 @@ Embedded agent configuration: --openai-base-url Override OpenAI API base URL --openai-model Override OpenAI model (default: gpt-5) --anthropic-base-url Override Anthropic API base URL - --anthropic-model Override Anthropic model (default: claude-sonnet-4-6) + --anthropic-model Override Anthropic model (default: claude-sonnet-5-5) Session constraints: --organization-slug Force all calls to an organization From 2710f1e2ec44230ae9d894b22740e700dd6d9f64 Mon Sep 17 00:00:00 2001 From: Alex Castillo Date: Fri, 30 Oct 2026 16:20:31 -0400 Subject: [PATCH 3/4] test(mcp): drop the default-model test It only pinned the constant. Co-Authored-By: Claude Sonnet 5.5 Signed-off-by: Alex Castillo --- .../agents/anthropic-provider.test.ts | 38 ------------------- 1 file changed, 38 deletions(-) delete mode 100644 packages/mcp-core/src/internal/agents/anthropic-provider.test.ts diff --git a/packages/mcp-core/src/internal/agents/anthropic-provider.test.ts b/packages/mcp-core/src/internal/agents/anthropic-provider.test.ts deleted file mode 100644 index b577d1133..000000000 --- a/packages/mcp-core/src/internal/agents/anthropic-provider.test.ts +++ /dev/null @@ -1,38 +0,0 @@ -import type { LanguageModelV3 } from "@ai-sdk/provider"; -import { afterEach, beforeEach, describe, expect, it } from "vitest"; -import { - getAnthropicModel, - setAnthropicBaseUrl, -} from "./anthropic-provider.js"; - -describe("anthropic-provider", () => { - const originalModel = process.env.ANTHROPIC_MODEL; - const originalApiKey = process.env.ANTHROPIC_API_KEY; - - beforeEach(() => { - setAnthropicBaseUrl(undefined); - delete process.env.ANTHROPIC_MODEL; - process.env.ANTHROPIC_API_KEY = "test-key"; - }); - - afterEach(() => { - if (originalModel === undefined) { - delete process.env.ANTHROPIC_MODEL; - } else { - process.env.ANTHROPIC_MODEL = originalModel; - } - - if (originalApiKey === undefined) { - delete process.env.ANTHROPIC_API_KEY; - } else { - process.env.ANTHROPIC_API_KEY = originalApiKey; - } - }); - - it("defaults to a model that is not scheduled for retirement", () => { - const model = getAnthropicModel() as LanguageModelV3; - - // Anthropic retires claude-sonnet-4-5 on 2026-11-30. - expect(model.modelId).toBe("claude-sonnet-5-5"); - }); -}); From 7008e8dd38dc927ea5708c850ec8b11221813f1c Mon Sep 17 00:00:00 2001 From: "sentry-junior[bot]" <264270552+sentry-junior[bot]@users.noreply.github.com> Date: Mon, 2 Nov 2026 14:21:31 +0000 Subject: [PATCH 4/4] fix(mcp): bump @ai-sdk/anthropic so claude-sonnet-5-5 requests are valid @ai-sdk/anthropic 3.0.33 does not know claude-sonnet-5-5. It treats it as an unknown model, so structured output falls back to a hidden json tool with tool_choice {type: "any"} on every step and max_tokens 4096. Sonnet 5.5 rejects forced tool choice with a 400, so every Anthropic-backed embedded agent call would fail. 3.0.137 (latest ai-v6) knows the model: it sends native output_config.format, tool_choice auto, no sampling params, and a 128k max_tokens. Also fix the stale Anthropic default in embedded-agents.md. Co-Authored-By: BYK <126780+BYK@users.noreply.github.com> --- docs/operations/embedded-agents.md | 4 ++-- pnpm-lock.yaml | 38 +++++++++++++++++++++++------- pnpm-workspace.yaml | 2 +- 3 files changed, 33 insertions(+), 11 deletions(-) diff --git a/docs/operations/embedded-agents.md b/docs/operations/embedded-agents.md index 8ec828206..0f4458bb6 100644 --- a/docs/operations/embedded-agents.md +++ b/docs/operations/embedded-agents.md @@ -220,8 +220,8 @@ Override the default model for each provider: # OpenAI (default: gpt-5) export OPENAI_MODEL=gpt-4 -# Anthropic (default: claude-opus-4-5-20251101) -export ANTHROPIC_MODEL=claude-sonnet-4-5-20250929 +# Anthropic (default: claude-sonnet-5-5) +export ANTHROPIC_MODEL=claude-opus-5-5 # OpenRouter (default: openai/gpt-5.6-luna @ high) export OPENROUTER_MODEL=anthropic/claude-sonnet-4 diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fd538b576..6f31593fc 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7,8 +7,8 @@ settings: catalogs: default: '@ai-sdk/anthropic': - specifier: ^3.0.33 - version: 3.0.33 + specifier: ^3.0.137 + version: 3.0.137 '@ai-sdk/mcp': specifier: ^1.0.16 version: 1.0.16 @@ -819,7 +819,7 @@ importers: dependencies: '@ai-sdk/anthropic': specifier: 'catalog:' - version: 3.0.33(zod@4.6.7) + version: 3.0.137(zod@4.6.7) '@ai-sdk/mcp': specifier: 'catalog:' version: 1.0.16(zod@4.6.7) @@ -1093,8 +1093,8 @@ packages: '@acemir/cssom@0.9.32': resolution: {integrity: sha512-OijrAUu7rrJhSIoHNg6LMPS5e344nwUHA+1EFYYjrh64D+GmytUsfBQjci45TjT+rd5Spsp8B5xsZDT+TgyXXQ==} - '@ai-sdk/anthropic@3.0.33': - resolution: {integrity: sha512-MvQzipOAK99Ct3nX6d8oz2AJ9c8kbiU2uSpGYK3F5oBBa8Gy04+LbYBoB9oH8bbZJxFafkgwBq1+k8xpU7vVxQ==} + '@ai-sdk/anthropic@3.0.137': + resolution: {integrity: sha512-ROzkSDAl43OisGK7cWFySZ1jYQ8kjjE5Q0shDU5zPk5/8GatpQ5QEZ3TmSzJ2sCWzMxb1V1XdAvOslsSEhp2nQ==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 @@ -1153,6 +1153,12 @@ packages: peerDependencies: zod: ^3.25.76 || ^4.1.8 + '@ai-sdk/provider-utils@4.0.63': + resolution: {integrity: sha512-QSrfUn7pnb+2EZLLtpkcY6208ZZVi15QEJFyp/1jAYEH2UecthgAsyYWOJbpMSLtraviCByd6ii2meISIhkTZA==} + engines: {node: '>=18.17'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + '@ai-sdk/provider-utils@5.0.13': resolution: {integrity: sha512-fScDJMDnTbx32kLDQqp0MvPjvwkgiwvlBxlmIg7XW5PbS91LG6JjH3PQG+34oMFglqfpQA355e24OdGj5PPoDw==} engines: {node: '>=22'} @@ -1171,6 +1177,10 @@ packages: resolution: {integrity: sha512-5X1k57JBJ4H7H1QjX7CnJYAB1I19r/trVZTMcSms7/kLNZ8RaU4Nt2agcwZzv82Hfx6Q7/TOLU7agAKeFfc8cA==} engines: {node: '>=18'} + '@ai-sdk/provider@3.0.19': + resolution: {integrity: sha512-5lWq7zSfRaU5ylDESn3sDQjgGl2AI1vjZKO/6JY3aFW70ct4zcP1kN+ZUYOuTXr28fVsYbyu2YFhddLdIgQFZQ==} + engines: {node: '>=18'} + '@ai-sdk/provider@3.0.6': resolution: {integrity: sha512-hSfoJtLtpMd7YxKM+iTqlJ0ZB+kJ83WESMiWuWrNVey3X8gg97x0OdAAaeAeclZByCX3UdPOTqhvJdK8qYA3ww==} engines: {node: '>=18'} @@ -9645,10 +9655,10 @@ snapshots: '@acemir/cssom@0.9.32': {} - '@ai-sdk/anthropic@3.0.33(zod@4.6.7)': + '@ai-sdk/anthropic@3.0.137(zod@4.6.7)': dependencies: - '@ai-sdk/provider': 3.0.6 - '@ai-sdk/provider-utils': 4.0.11(zod@4.6.7) + '@ai-sdk/provider': 3.0.19 + '@ai-sdk/provider-utils': 4.0.63(zod@4.6.7) zod: 4.6.7 '@ai-sdk/gateway@2.0.115(zod@4.6.7)': @@ -9713,6 +9723,14 @@ snapshots: eventsource-parser: 3.1.1 zod: 4.6.7 + '@ai-sdk/provider-utils@4.0.63(zod@4.6.7)': + dependencies: + '@ai-sdk/provider': 3.0.19 + '@standard-schema/spec': 1.1.0 + eventsource-parser: 3.1.1 + undici: 7.30.1 + zod: 4.6.7 + '@ai-sdk/provider-utils@5.0.13(zod@4.6.7)': dependencies: '@ai-sdk/provider': 4.0.4 @@ -9733,6 +9751,10 @@ snapshots: dependencies: json-schema: 0.4.0 + '@ai-sdk/provider@3.0.19': + dependencies: + json-schema: 0.4.0 + '@ai-sdk/provider@3.0.6': dependencies: json-schema: 0.4.0 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index c4e8d2eea..509b96a43 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -39,7 +39,7 @@ overrides: catalog: "@ast-grep/cli": ^0.43.0 - "@ai-sdk/anthropic": ^3.0.33 + "@ai-sdk/anthropic": ^3.0.137 "@ai-sdk/mcp": ^1.0.16 "@ai-sdk/openai": ^3.0.23 "@ai-sdk/react": ^3.0.232