Skip to content

Commit 72cd2af

Browse files
dcramerclaude
andcommitted
chore: Upgrade AI SDK from 4.x to 6.x
Upgrade to AI SDK 6.x to support MCP protocol version 2025-11-25. Package changes: - ai: ^4.3.16 → ^6.0.64 - agents: ^0.2.23 → ^0.3.6 - @ai-sdk/anthropic: ^1.2.12 → ^3.0.33 - @ai-sdk/openai: ^1.3.22 → ^3.0.23 - @ai-sdk/react: ^1.2.12 → ^3.0.66 - @ai-sdk/mcp: (new) ^1.0.16 - @modelcontextprotocol/sdk: ^1.21.0 → ^1.25.3 API migrations: - MCP client imports: "ai" → "@ai-sdk/mcp" - Type rename: LanguageModelV1 → LanguageModel - generateText/streamText: maxSteps → stopWhen(stepCountIs(N)) - tool() API: parameters → inputSchema, execute(params) → execute(input) - Tool call capture: toolCall.args → toolCall.input Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
1 parent da30d41 commit 72cd2af

23 files changed

Lines changed: 330 additions & 266 deletions

‎packages/mcp-cloudflare/package.json‎

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,7 @@
44
"private": true,
55
"type": "module",
66
"license": "FSL-1.1-ALv2",
7-
"files": [
8-
"./dist/*"
9-
],
7+
"files": ["./dist/*"],
108
"exports": {
119
".": {
1210
"types": "./dist/index.ts",
@@ -45,6 +43,7 @@
4543
"wrangler": "^4.45.0"
4644
},
4745
"dependencies": {
46+
"@ai-sdk/mcp": "catalog:",
4847
"@ai-sdk/openai": "catalog:",
4948
"@ai-sdk/react": "catalog:",
5049
"@cloudflare/workers-oauth-provider": "catalog:",

‎packages/mcp-cloudflare/src/server/routes/chat.ts‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { Hono, type Context } from "hono";
22
import { openai } from "@ai-sdk/openai";
3-
import { streamText, type ToolSet } from "ai";
4-
import { experimental_createMCPClient } from "ai";
3+
import { streamText, type ToolSet, stepCountIs } from "ai";
4+
import { experimental_createMCPClient } from "@ai-sdk/mcp";
55
import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
66
import type { Env } from "../types";
77
import { logInfo, logIssue, logWarn } from "@sentry/mcp-core/telem/logging";
@@ -326,7 +326,7 @@ Start conversations by exploring what's available in their account. Use tools li
326326
327327
Remember: You're a test assistant, not a general-purpose helper. Stay focused on testing the MCP integration with their real data.`,
328328
maxTokens: 2000,
329-
maxSteps: 10,
329+
stopWhen: stepCountIs(10),
330330
experimental_telemetry: {
331331
isEnabled: true,
332332
},

‎packages/mcp-cloudflare/src/server/routes/metadata.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
* without requiring a chat stream to be initialized.
66
*/
77
import { Hono } from "hono";
8-
import { experimental_createMCPClient } from "ai";
8+
import { experimental_createMCPClient } from "@ai-sdk/mcp";
99
import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
1010
import type { Env } from "../types";
1111
import { logIssue, logWarn } from "@sentry/mcp-core/telem/logging";

‎packages/mcp-core/package.json‎

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,19 +11,15 @@
1111
"author": "Sentry",
1212
"description": "Sentry MCP Core - Shared code for MCP transports",
1313
"homepage": "https://github.com/getsentry/sentry-mcp",
14-
"keywords": [
15-
"sentry"
16-
],
14+
"keywords": ["sentry"],
1715
"bugs": {
1816
"url": "https://github.com/getsentry/sentry-mcp/issues"
1917
},
2018
"repository": {
2119
"type": "git",
2220
"url": "git@github.com:getsentry/sentry-mcp.git"
2321
},
24-
"files": [
25-
"./dist/*"
26-
],
22+
"files": ["./dist/*"],
2723
"exports": {
2824
"./api-client": {
2925
"types": "./dist/api-client/index.ts",
@@ -144,6 +140,8 @@
144140
"validate-skills": "tsx scripts/validate-skills-mapping.ts"
145141
},
146142
"devDependencies": {
143+
"@ai-sdk/provider": "^3.0.6",
144+
"@ai-sdk/provider-utils": "^4.0.11",
147145
"@sentry/mcp-server-mocks": "workspace:*",
148146
"@sentry/mcp-server-tsconfig": "workspace:*",
149147
"msw": "catalog:",
@@ -153,6 +151,7 @@
153151
},
154152
"dependencies": {
155153
"@ai-sdk/anthropic": "catalog:",
154+
"@ai-sdk/mcp": "catalog:",
156155
"@ai-sdk/openai": "catalog:",
157156
"@logtape/logtape": "^1.1.1",
158157
"@logtape/sentry": "^1.1.1",

‎packages/mcp-core/src/internal/agents/anthropic-provider.ts‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { createAnthropic } from "@ai-sdk/anthropic";
2-
import type { LanguageModelV1 } from "ai";
2+
import type { LanguageModel } from "ai";
33
import { USER_AGENT } from "../../version";
44

55
// Default configuration constants
@@ -24,7 +24,7 @@ export function setAnthropicBaseUrl(baseUrl: string | undefined): void {
2424
* - ANTHROPIC_MODEL: Model to use (default: "claude-sonnet-4-5") - env var OK
2525
* - Base URL: Must be set via setAnthropicBaseUrl() - NOT from env vars (security risk)
2626
*/
27-
export function getAnthropicModel(model?: string): LanguageModelV1 {
27+
export function getAnthropicModel(model?: string): LanguageModel {
2828
const defaultModel = process.env.ANTHROPIC_MODEL || DEFAULT_ANTHROPIC_MODEL;
2929

3030
const factory = createAnthropic({

‎packages/mcp-core/src/internal/agents/callEmbeddedAgent.ts‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { generateText, Output, type Tool, APICallError } from "ai";
1+
import { generateText, Output, type Tool, APICallError, stepCountIs } from "ai";
22
import { getAgentProvider } from "./provider-factory";
33
import { UserInputError, LLMProviderError } from "../../errors";
44
import type { z } from "zod";
@@ -45,7 +45,7 @@ export async function callEmbeddedAgent<
4545
system,
4646
prompt,
4747
tools,
48-
maxSteps: 5,
48+
stopWhen: stepCountIs(5),
4949
// Only include temperature if provider specifies one (e.g., GPT-5 requires temperature=1)
5050
...(provider.getTemperature() !== undefined && {
5151
temperature: provider.getTemperature(),
@@ -63,7 +63,7 @@ export async function callEmbeddedAgent<
6363
for (const toolCall of event.toolCalls) {
6464
capturedToolCalls.push({
6565
toolName: toolCall.toolName,
66-
args: toolCall.args,
66+
args: toolCall.input,
6767
});
6868
}
6969
}

‎packages/mcp-core/src/internal/agents/openai-provider.test.ts‎

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { describe, it, expect, beforeEach, afterEach } from "vitest";
2+
import type { LanguageModelV3 } from "@ai-sdk/provider";
23
import { getOpenAIModel, setOpenAIBaseUrl } from "./openai-provider.js";
34

45
describe("openai-provider", () => {
@@ -21,7 +22,7 @@ describe("openai-provider", () => {
2122

2223
describe("base URL configuration", () => {
2324
it("uses default base URL when not configured", () => {
24-
const model = getOpenAIModel();
25+
const model = getOpenAIModel() as LanguageModelV3;
2526

2627
expect(model).toBeDefined();
2728
expect(model.modelId).toBe("gpt-5");
@@ -30,7 +31,7 @@ describe("openai-provider", () => {
3031
it("uses configured base URL", () => {
3132
setOpenAIBaseUrl("https://custom-openai.example.com");
3233

33-
const model = getOpenAIModel();
34+
const model = getOpenAIModel() as LanguageModelV3;
3435

3536
expect(model).toBeDefined();
3637
expect(model.modelId).toBe("gpt-5");
@@ -39,21 +40,21 @@ describe("openai-provider", () => {
3940

4041
describe("model override", () => {
4142
it("uses default model when not specified", () => {
42-
const model = getOpenAIModel();
43+
const model = getOpenAIModel() as LanguageModelV3;
4344

4445
expect(model.modelId).toBe("gpt-5");
4546
});
4647

4748
it("uses specified model when provided", () => {
48-
const model = getOpenAIModel("gpt-4");
49+
const model = getOpenAIModel("gpt-4") as LanguageModelV3;
4950

5051
expect(model.modelId).toBe("gpt-4");
5152
});
5253

5354
it("uses OPENAI_MODEL env var when set", () => {
5455
process.env.OPENAI_MODEL = "gpt-4-turbo";
5556

56-
const model = getOpenAIModel();
57+
const model = getOpenAIModel() as LanguageModelV3;
5758

5859
expect(model.modelId).toBe("gpt-4-turbo");
5960
});

‎packages/mcp-core/src/internal/agents/openai-provider.ts‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { createOpenAI } from "@ai-sdk/openai";
2-
import type { LanguageModelV1 } from "ai";
2+
import type { LanguageModel } from "ai";
33
import { USER_AGENT } from "../../version";
44

55
// Default configuration constants
@@ -33,7 +33,7 @@ export function setOpenAIBaseUrl(baseUrl: string | undefined): void {
3333
* - Vercel AI Gateway: "openai/gpt-4o", "anthropic/claude-sonnet-4.5", etc.
3434
* - Other providers: Check their documentation
3535
*/
36-
export function getOpenAIModel(model?: string): LanguageModelV1 {
36+
export function getOpenAIModel(model?: string): LanguageModel {
3737
const defaultModel = process.env.OPENAI_MODEL || DEFAULT_OPENAI_MODEL;
3838

3939
const factory = createOpenAI({

‎packages/mcp-core/src/internal/agents/tools/utils.ts‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -126,12 +126,12 @@ export function agentTool<TParameters, TResult>(config: {
126126

127127
return tool({
128128
description: config.description,
129-
parameters: config.parameters,
129+
inputSchema: config.parameters,
130130
execute: async (
131-
params: TParameters,
131+
input: TParameters,
132132
): Promise<AgentToolResponse<InferredResult>> => {
133133
try {
134-
const result = await config.execute(params);
134+
const result = await config.execute(input);
135135
return { result };
136136
} catch (error) {
137137
return handleAgentToolError<InferredResult>(error);

‎packages/mcp-core/src/internal/agents/types.ts‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import type { LanguageModelV1, JSONValue } from "ai";
1+
import type { LanguageModel, JSONValue } from "ai";
22

33
/**
44
* Provider options type matching AI SDK's ProviderOptions (LanguageModelV1ProviderMetadata)
@@ -19,7 +19,7 @@ export interface EmbeddedAgentProvider {
1919
readonly type: AgentProviderType;
2020

2121
/** Get a language model instance, optionally with a model override */
22-
getModel(modelOverride?: string): LanguageModelV1;
22+
getModel(modelOverride?: string): LanguageModel;
2323

2424
/** Get provider-specific options for generateText calls */
2525
getProviderOptions(): ProviderOptions;

0 commit comments

Comments
 (0)