From 2dfef7ef2f254e45d722e4d9e7602bc90e9d8209 Mon Sep 17 00:00:00 2001 From: Alex Castillo Date: Fri, 30 Oct 2026 12:30:43 -0400 Subject: [PATCH 1/3] 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/3] 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/3] 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"); - }); -});