integrate-sdk 0.7.36 → 0.7.39

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -339,7 +339,7 @@ const result = await generateText({
339
339
  });
340
340
  ```
341
341
 
342
- [→ View Vercel AI SDK integration guide](https://integrate.dev/docs/ai/vercel-ai)
342
+ [→ View Vercel AI SDK integration guide](https://integrate.dev/docs/artificial-intelligence/vercel-ai-sdk)
343
343
 
344
344
  ## Documentation
345
345
 
@@ -348,7 +348,7 @@ For detailed guides, API reference, and examples, visit the [complete documentat
348
348
  - **[Getting Started](https://integrate.dev/docs/getting-started/installation)** - Installation and quick start
349
349
  - **[OAuth Flow](https://integrate.dev/docs/guides/oauth-flow)** - OAuth 2.0 authorization guide
350
350
  - **[Integrations](https://integrate.dev/docs/integrations)** - Built-in integrations and configuration
351
- - **[Vercel AI SDK](https://integrate.dev/docs/ai/vercel-ai)** - AI model integration
351
+ - **[Vercel AI SDK](https://integrate.dev/docs/artificial-intelligence/vercel-ai-sdk)** - AI model integration
352
352
  - **[Advanced Usage](https://integrate.dev/docs/guides/advanced-usage)** - Error handling, retries, and more
353
353
  - **[API Reference](https://integrate.dev/docs/reference/api-reference)** - Complete API documentation
354
354
  - **[Architecture](https://integrate.dev/docs/reference/architecture)** - How the SDK works
@@ -6,6 +6,7 @@
6
6
  import type { MCPClient } from "../client.js";
7
7
  import type { MCPTool } from "../protocol/messages.js";
8
8
  import { type AIToolsOptions } from "./utils.js";
9
+ import type Anthropic from "@anthropic-ai/sdk";
9
10
  /**
10
11
  * Anthropic tool definition
11
12
  * Compatible with Anthropic's Claude API
@@ -179,4 +180,70 @@ export declare function handleAnthropicToolCalls(client: MCPClient<any>, message
179
180
  * ```
180
181
  */
181
182
  export declare function getAnthropicTools(client: MCPClient<any>, options?: AnthropicToolsOptions): Promise<AnthropicTool[]>;
183
+ /**
184
+ * Handle an entire Anthropic Message object
185
+ *
186
+ * This is a convenience function that extracts tool calls from a Message
187
+ * object, executes them, and returns the results formatted as MessageParam
188
+ * ready to be passed directly to the next API call.
189
+ *
190
+ * **Auto-extraction**: Provider tokens are automatically extracted from request headers
191
+ * or environment variables if not provided in options.
192
+ *
193
+ * @param client - The MCP client instance
194
+ * @param message - The complete Message object from Anthropic
195
+ * @param options - Optional configuration including provider tokens
196
+ * @returns Array with a single user message containing tool results, or empty array if no tool calls
197
+ *
198
+ * @example
199
+ * ```typescript
200
+ * import { serverClient } from '@/lib/integrate-server';
201
+ * import { getAnthropicTools, handleAnthropicMessage } from 'integrate-sdk/server';
202
+ * import Anthropic from '@anthropic-ai/sdk';
203
+ *
204
+ * const anthropic = new Anthropic({ apiKey: process.env.ANTHROPIC_API_KEY });
205
+ *
206
+ * export async function POST(req: Request) {
207
+ * const { messages } = await req.json();
208
+ *
209
+ * // Initial request with tools
210
+ * const message = await anthropic.messages.create({
211
+ * model: 'claude-3-5-sonnet-20241022',
212
+ * max_tokens: 1024,
213
+ * tools: await getAnthropicTools(serverClient),
214
+ * messages,
215
+ * });
216
+ *
217
+ * // If there are tool calls, handle them automatically
218
+ * if (message.stop_reason === 'tool_use') {
219
+ * const toolMessages = await handleAnthropicMessage(serverClient, message);
220
+ *
221
+ * // Continue conversation with tool results
222
+ * const finalMessage = await anthropic.messages.create({
223
+ * model: 'claude-3-5-sonnet-20241022',
224
+ * max_tokens: 1024,
225
+ * tools: await getAnthropicTools(serverClient),
226
+ * messages: [
227
+ * ...messages,
228
+ * { role: 'assistant', content: message.content },
229
+ * ...toolMessages,
230
+ * ],
231
+ * });
232
+ *
233
+ * return Response.json(finalMessage);
234
+ * }
235
+ *
236
+ * return Response.json(message);
237
+ * }
238
+ * ```
239
+ *
240
+ * @example
241
+ * ```typescript
242
+ * // Manual token override
243
+ * const toolMessages = await handleAnthropicMessage(serverClient, message, {
244
+ * providerTokens: { github: 'ghp_...', gmail: 'ya29...' }
245
+ * });
246
+ * ```
247
+ */
248
+ export declare function handleAnthropicMessage(client: MCPClient<any>, message: Anthropic.Messages.Message, options?: AnthropicToolsOptions): Promise<Anthropic.Messages.MessageParam[]>;
182
249
  //# sourceMappingURL=anthropic.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../../src/ai/anthropic.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAkE,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjH;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE;QACZ,IAAI,EAAE,QAAQ,CAAC;QACf,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACrC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;QACpB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;KACxB,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,qBAAsB,SAAQ,cAAc;CAAI;AAEjE;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,UAAU,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC;AAED;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,aAAa,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,SAAS,CAAC,GAAG,CAAC,EACvB,QAAQ,CAAC,EAAE,qBAAqB,GAC/B,aAAa,CAUf;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,EACtB,OAAO,CAAC,EAAE,qBAAqB,GAC9B,aAAa,EAAE,CAGjB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,wBAAwB,CAC5C,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,EACtB,OAAO,EAAE,qBAAqB,EAC9B,OAAO,CAAC,EAAE,qBAAqB,GAC9B,OAAO,CAAC,MAAM,CAAC,CAGjB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,wBAAsB,wBAAwB,CAC5C,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,EACtB,cAAc,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAA,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CAAE,CAAC,EAC1D,OAAO,CAAC,EAAE,qBAAqB,GAC9B,OAAO,CAAC,wBAAwB,EAAE,CAAC,CAkCrC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,EACtB,OAAO,CAAC,EAAE,qBAAqB,GAC9B,OAAO,CAAC,aAAa,EAAE,CAAC,CAe1B"}
1
+ {"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../../src/ai/anthropic.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAkE,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC;AACjH,OAAO,KAAK,SAAS,MAAM,mBAAmB,CAAC;AAE/C;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE;QACZ,IAAI,EAAE,QAAQ,CAAC;QACf,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACrC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;QACpB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;KACxB,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,qBAAsB,SAAQ,cAAc;CAAI;AAEjE;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,UAAU,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC;AAED;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,aAAa,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,SAAS,CAAC,GAAG,CAAC,EACvB,QAAQ,CAAC,EAAE,qBAAqB,GAC/B,aAAa,CAUf;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,EACtB,OAAO,CAAC,EAAE,qBAAqB,GAC9B,aAAa,EAAE,CAGjB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,wBAAwB,CAC5C,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,EACtB,OAAO,EAAE,qBAAqB,EAC9B,OAAO,CAAC,EAAE,qBAAqB,GAC9B,OAAO,CAAC,MAAM,CAAC,CAGjB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,wBAAsB,wBAAwB,CAC5C,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,EACtB,cAAc,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAA,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CAAE,CAAC,EAC1D,OAAO,CAAC,EAAE,qBAAqB,GAC9B,OAAO,CAAC,wBAAwB,EAAE,CAAC,CAkCrC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,EACtB,OAAO,CAAC,EAAE,qBAAqB,GAC9B,OAAO,CAAC,aAAa,EAAE,CAAC,CAe1B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgEG;AACH,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,EACtB,OAAO,EAAE,SAAS,CAAC,QAAQ,CAAC,OAAO,EACnC,OAAO,CAAC,EAAE,qBAAqB,GAC9B,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC,CA4B5C"}
@@ -4256,8 +4256,28 @@ async function getAnthropicTools(client, options) {
4256
4256
  const finalOptions = providerTokens ? { ...options, providerTokens } : options;
4257
4257
  return convertMCPToolsToAnthropic(client, finalOptions);
4258
4258
  }
4259
+ async function handleAnthropicMessage(client, message, options) {
4260
+ let providerTokens = options?.providerTokens;
4261
+ if (!providerTokens) {
4262
+ try {
4263
+ providerTokens = await getProviderTokens();
4264
+ } catch {}
4265
+ }
4266
+ const finalOptions = providerTokens ? { ...options, providerTokens } : options;
4267
+ const toolResults = await handleAnthropicToolCalls(client, message.content, finalOptions);
4268
+ if (toolResults.length === 0) {
4269
+ return [];
4270
+ }
4271
+ return [
4272
+ {
4273
+ role: "user",
4274
+ content: toolResults
4275
+ }
4276
+ ];
4277
+ }
4259
4278
  export {
4260
4279
  handleAnthropicToolCalls,
4280
+ handleAnthropicMessage,
4261
4281
  getAnthropicTools,
4262
4282
  executeAnthropicToolCall,
4263
4283
  convertMCPToolsToAnthropic,
package/dist/ai/index.js CHANGED
@@ -4256,6 +4256,25 @@ async function getAnthropicTools(client, options) {
4256
4256
  const finalOptions = providerTokens ? { ...options, providerTokens } : options;
4257
4257
  return convertMCPToolsToAnthropic(client, finalOptions);
4258
4258
  }
4259
+ async function handleAnthropicMessage(client, message, options) {
4260
+ let providerTokens = options?.providerTokens;
4261
+ if (!providerTokens) {
4262
+ try {
4263
+ providerTokens = await getProviderTokens();
4264
+ } catch {}
4265
+ }
4266
+ const finalOptions = providerTokens ? { ...options, providerTokens } : options;
4267
+ const toolResults = await handleAnthropicToolCalls(client, message.content, finalOptions);
4268
+ if (toolResults.length === 0) {
4269
+ return [];
4270
+ }
4271
+ return [
4272
+ {
4273
+ role: "user",
4274
+ content: toolResults
4275
+ }
4276
+ ];
4277
+ }
4259
4278
 
4260
4279
  // cloudflare.ts
4261
4280
  function convertMCPToolToCloudflare(mcpTool, _client, _options) {
@@ -4366,13 +4385,9 @@ function convertMCPToolToOpenAI(mcpTool, _client, options) {
4366
4385
  return {
4367
4386
  type: "function",
4368
4387
  name: mcpTool.name,
4369
- description: mcpTool.description || `Execute ${mcpTool.name}`,
4370
- parameters: inputParams || {
4371
- type: "object",
4372
- properties: {},
4373
- required: []
4374
- },
4375
- strict: options?.strict ?? false
4388
+ parameters: inputParams || null,
4389
+ strict: options?.strict ?? null,
4390
+ description: mcpTool.description || null
4376
4391
  };
4377
4392
  }
4378
4393
  function convertMCPToolsToOpenAI(client, options) {
@@ -4395,6 +4410,46 @@ async function getOpenAITools(client, options) {
4395
4410
  const finalOptions = providerTokens ? { ...options, providerTokens } : options;
4396
4411
  return convertMCPToolsToOpenAI(client, finalOptions);
4397
4412
  }
4413
+ async function handleOpenAIToolCalls(client, toolCalls, options) {
4414
+ const toolOutputs = [];
4415
+ for (const output of toolCalls) {
4416
+ if (output.type === "function_call") {
4417
+ const toolCall = {
4418
+ id: output.id ?? "",
4419
+ name: output.name,
4420
+ arguments: output.arguments
4421
+ };
4422
+ try {
4423
+ const result = await executeOpenAIToolCall(client, toolCall, options);
4424
+ toolOutputs.push({
4425
+ call_id: output.call_id ?? output.id ?? "",
4426
+ type: "function_call_output",
4427
+ output: result,
4428
+ status: "completed"
4429
+ });
4430
+ } catch (error) {
4431
+ toolOutputs.push({
4432
+ call_id: output.call_id ?? output.id ?? "",
4433
+ type: "function_call_output",
4434
+ output: error instanceof Error ? error.message : "Unknown error",
4435
+ status: "incomplete"
4436
+ });
4437
+ }
4438
+ }
4439
+ }
4440
+ return toolOutputs;
4441
+ }
4442
+ async function handleOpenAIResponse(client, response, options) {
4443
+ let providerTokens = options?.providerTokens;
4444
+ if (!providerTokens) {
4445
+ try {
4446
+ providerTokens = await getProviderTokens();
4447
+ } catch {}
4448
+ }
4449
+ const finalOptions = providerTokens ? { ...options, providerTokens } : options;
4450
+ const functionCalls = response.output.filter((output) => output.type === "function_call");
4451
+ return handleOpenAIToolCalls(client, functionCalls, finalOptions);
4452
+ }
4398
4453
 
4399
4454
  // openai-agents.ts
4400
4455
  function convertMCPToolToOpenAIAgents(mcpTool, client, options) {
@@ -4540,7 +4595,10 @@ export {
4540
4595
  tryGetProviderTokens,
4541
4596
  jsonSchemaToZod,
4542
4597
  jsonSchemaPropertyToZod,
4598
+ handleOpenAIToolCalls,
4599
+ handleOpenAIResponse,
4543
4600
  handleAnthropicToolCalls,
4601
+ handleAnthropicMessage,
4544
4602
  getVercelAITools,
4545
4603
  getProviderTokens,
4546
4604
  getProviderForTool,
@@ -6,6 +6,7 @@
6
6
  import type { MCPClient } from "../client.js";
7
7
  import type { MCPTool } from "../protocol/messages.js";
8
8
  import { type AIToolsOptions } from "./utils.js";
9
+ import type { OpenAI } from "openai";
9
10
  /**
10
11
  * OpenAI function tool definition
11
12
  * Compatible with OpenAI's Responses API format
@@ -13,14 +14,11 @@ import { type AIToolsOptions } from "./utils.js";
13
14
  export interface OpenAITool {
14
15
  type: 'function';
15
16
  name: string;
16
- description?: string;
17
17
  parameters: {
18
- type: 'object';
19
- properties?: Record<string, unknown>;
20
- required?: string[];
21
18
  [key: string]: unknown;
22
- };
23
- strict?: boolean;
19
+ } | null;
20
+ strict: boolean | null;
21
+ description?: string | null;
24
22
  }
25
23
  /**
26
24
  * Options for converting MCP tools to OpenAI format
@@ -127,4 +125,100 @@ export declare function executeOpenAIToolCall(client: MCPClient<any>, toolCall:
127
125
  * ```
128
126
  */
129
127
  export declare function getOpenAITools(client: MCPClient<any>, options?: OpenAIToolsOptions): Promise<OpenAITool[]>;
128
+ /**
129
+ * Handle multiple tool calls from OpenAI's response output
130
+ *
131
+ * This function processes all function_call items from the response output,
132
+ * executes each tool call, and returns formatted results for the next request.
133
+ *
134
+ * @param client - The MCP client instance
135
+ * @param toolCalls - Array of output items from OpenAI response (filters for function_call type)
136
+ * @param options - Optional configuration including provider tokens
137
+ * @returns Array of function call outputs to send back to OpenAI
138
+ *
139
+ * @example
140
+ * ```typescript
141
+ * // Handle tool calls from a response
142
+ * const response = await openai.responses.create({
143
+ * model: 'gpt-4o-2024-11-20',
144
+ * input: 'Create a GitHub issue',
145
+ * tools: await getOpenAITools(serverClient),
146
+ * });
147
+ *
148
+ * // Execute the tool calls and get outputs
149
+ * const toolOutputs = await handleOpenAIToolCalls(
150
+ * serverClient,
151
+ * response.output,
152
+ * { providerTokens }
153
+ * );
154
+ *
155
+ * // Continue the conversation with tool results
156
+ * const nextResponse = await openai.responses.create({
157
+ * model: 'gpt-4o-2024-11-20',
158
+ * input: toolOutputs,
159
+ * tools: await getOpenAITools(serverClient),
160
+ * });
161
+ * ```
162
+ */
163
+ export declare function handleOpenAIToolCalls(client: MCPClient<any>, toolCalls: OpenAI.Responses.ResponseOutputItem[], options?: OpenAIToolsOptions): Promise<OpenAI.Responses.ResponseInputItem.FunctionCallOutput[]>;
164
+ /**
165
+ * Handle an entire OpenAI Response object
166
+ *
167
+ * This is a convenience function that extracts tool calls from a Response
168
+ * object and executes them. Use this when you want to process all tool
169
+ * calls from a response in one go.
170
+ *
171
+ * **Auto-extraction**: Provider tokens are automatically extracted from request headers
172
+ * or environment variables if not provided in options.
173
+ *
174
+ * @param client - The MCP client instance
175
+ * @param response - The complete Response object from OpenAI
176
+ * @param options - Optional configuration including provider tokens
177
+ * @returns Array of function call outputs to send back to OpenAI
178
+ *
179
+ * @example
180
+ * ```typescript
181
+ * import { serverClient } from '@/lib/integrate-server';
182
+ * import { getOpenAITools, handleOpenAIResponse } from 'integrate-sdk/server';
183
+ * import OpenAI from 'openai';
184
+ *
185
+ * const openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY });
186
+ *
187
+ * export async function POST(req: Request) {
188
+ * const { messages } = await req.json();
189
+ *
190
+ * // Initial request with tools
191
+ * const response = await openai.responses.create({
192
+ * model: 'gpt-4o-2024-11-20',
193
+ * input: messages,
194
+ * tools: await getOpenAITools(serverClient),
195
+ * });
196
+ *
197
+ * // If there are tool calls, handle them automatically
198
+ * if (response.output.some(item => item.type === 'function_call')) {
199
+ * const toolOutputs = await handleOpenAIResponse(serverClient, response);
200
+ *
201
+ * // Continue conversation with tool results
202
+ * const finalResponse = await openai.responses.create({
203
+ * model: 'gpt-4o-2024-11-20',
204
+ * input: toolOutputs,
205
+ * tools: await getOpenAITools(serverClient),
206
+ * });
207
+ *
208
+ * return Response.json(finalResponse);
209
+ * }
210
+ *
211
+ * return Response.json(response);
212
+ * }
213
+ * ```
214
+ *
215
+ * @example
216
+ * ```typescript
217
+ * // Manual token override
218
+ * const toolOutputs = await handleOpenAIResponse(serverClient, response, {
219
+ * providerTokens: { github: 'ghp_...', gmail: 'ya29...' }
220
+ * });
221
+ * ```
222
+ */
223
+ export declare function handleOpenAIResponse(client: MCPClient<any>, response: OpenAI.Responses.Response, options?: OpenAIToolsOptions): Promise<OpenAI.Responses.ResponseInputItem.FunctionCallOutput[]>;
130
224
  //# sourceMappingURL=openai.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../../src/ai/openai.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAkE,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjH;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,UAAU,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE;QACV,IAAI,EAAE,QAAQ,CAAC;QACf,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACrC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;QACpB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;KACxB,CAAC;IACF,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAmB,SAAQ,cAAc;IACxD;;;OAGG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,SAAS,CAAC,GAAG,CAAC,EACvB,OAAO,CAAC,EAAE,kBAAkB,GAC3B,UAAU,CAcZ;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,EACtB,OAAO,CAAC,EAAE,kBAAkB,GAC3B,UAAU,EAAE,CAGd;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,EACtB,QAAQ,EAAE;IACR,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB,EACD,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC,MAAM,CAAC,CAIjB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,EACtB,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC,UAAU,EAAE,CAAC,CAevB"}
1
+ {"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../../src/ai/openai.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAkE,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC;AACjH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAErC;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,UAAU,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE;QACV,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;KACxB,GAAG,IAAI,CAAC;IACT,MAAM,EAAE,OAAO,GAAG,IAAI,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,kBAAmB,SAAQ,cAAc;IACxD;;;OAGG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,SAAS,CAAC,GAAG,CAAC,EACvB,OAAO,CAAC,EAAE,kBAAkB,GAC3B,UAAU,CAUZ;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,EACtB,OAAO,CAAC,EAAE,kBAAkB,GAC3B,UAAU,EAAE,CAGd;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,EACtB,QAAQ,EAAE;IACR,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB,EACD,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC,MAAM,CAAC,CAIjB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,EACtB,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC,UAAU,EAAE,CAAC,CAevB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,EACtB,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,kBAAkB,EAAE,EAChD,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,iBAAiB,CAAC,kBAAkB,EAAE,CAAC,CA+BlE;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0DG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,EACtB,QAAQ,EAAE,MAAM,CAAC,SAAS,CAAC,QAAQ,EACnC,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,iBAAiB,CAAC,kBAAkB,EAAE,CAAC,CAoBlE"}
package/dist/ai/openai.js CHANGED
@@ -4208,13 +4208,9 @@ function convertMCPToolToOpenAI(mcpTool, _client, options) {
4208
4208
  return {
4209
4209
  type: "function",
4210
4210
  name: mcpTool.name,
4211
- description: mcpTool.description || `Execute ${mcpTool.name}`,
4212
- parameters: inputParams || {
4213
- type: "object",
4214
- properties: {},
4215
- required: []
4216
- },
4217
- strict: options?.strict ?? false
4211
+ parameters: inputParams || null,
4212
+ strict: options?.strict ?? null,
4213
+ description: mcpTool.description || null
4218
4214
  };
4219
4215
  }
4220
4216
  function convertMCPToolsToOpenAI(client, options) {
@@ -4237,7 +4233,49 @@ async function getOpenAITools(client, options) {
4237
4233
  const finalOptions = providerTokens ? { ...options, providerTokens } : options;
4238
4234
  return convertMCPToolsToOpenAI(client, finalOptions);
4239
4235
  }
4236
+ async function handleOpenAIToolCalls(client, toolCalls, options) {
4237
+ const toolOutputs = [];
4238
+ for (const output of toolCalls) {
4239
+ if (output.type === "function_call") {
4240
+ const toolCall = {
4241
+ id: output.id ?? "",
4242
+ name: output.name,
4243
+ arguments: output.arguments
4244
+ };
4245
+ try {
4246
+ const result = await executeOpenAIToolCall(client, toolCall, options);
4247
+ toolOutputs.push({
4248
+ call_id: output.call_id ?? output.id ?? "",
4249
+ type: "function_call_output",
4250
+ output: result,
4251
+ status: "completed"
4252
+ });
4253
+ } catch (error) {
4254
+ toolOutputs.push({
4255
+ call_id: output.call_id ?? output.id ?? "",
4256
+ type: "function_call_output",
4257
+ output: error instanceof Error ? error.message : "Unknown error",
4258
+ status: "incomplete"
4259
+ });
4260
+ }
4261
+ }
4262
+ }
4263
+ return toolOutputs;
4264
+ }
4265
+ async function handleOpenAIResponse(client, response, options) {
4266
+ let providerTokens = options?.providerTokens;
4267
+ if (!providerTokens) {
4268
+ try {
4269
+ providerTokens = await getProviderTokens();
4270
+ } catch {}
4271
+ }
4272
+ const finalOptions = providerTokens ? { ...options, providerTokens } : options;
4273
+ const functionCalls = response.output.filter((output) => output.type === "function_call");
4274
+ return handleOpenAIToolCalls(client, functionCalls, finalOptions);
4275
+ }
4240
4276
  export {
4277
+ handleOpenAIToolCalls,
4278
+ handleOpenAIResponse,
4241
4279
  getOpenAITools,
4242
4280
  executeOpenAIToolCall,
4243
4281
  convertMCPToolsToOpenAI,
package/dist/server.js CHANGED
@@ -6507,13 +6507,9 @@ function convertMCPToolToOpenAI(mcpTool, _client, options) {
6507
6507
  return {
6508
6508
  type: "function",
6509
6509
  name: mcpTool.name,
6510
- description: mcpTool.description || `Execute ${mcpTool.name}`,
6511
- parameters: inputParams || {
6512
- type: "object",
6513
- properties: {},
6514
- required: []
6515
- },
6516
- strict: options?.strict ?? false
6510
+ parameters: inputParams || null,
6511
+ strict: options?.strict ?? null,
6512
+ description: mcpTool.description || null
6517
6513
  };
6518
6514
  }
6519
6515
  function convertMCPToolsToOpenAI(client, options) {
@@ -6536,6 +6532,46 @@ async function getOpenAITools(client, options) {
6536
6532
  const finalOptions = providerTokens ? { ...options, providerTokens } : options;
6537
6533
  return convertMCPToolsToOpenAI(client, finalOptions);
6538
6534
  }
6535
+ async function handleOpenAIToolCalls(client, toolCalls, options) {
6536
+ const toolOutputs = [];
6537
+ for (const output of toolCalls) {
6538
+ if (output.type === "function_call") {
6539
+ const toolCall = {
6540
+ id: output.id ?? "",
6541
+ name: output.name,
6542
+ arguments: output.arguments
6543
+ };
6544
+ try {
6545
+ const result = await executeOpenAIToolCall(client, toolCall, options);
6546
+ toolOutputs.push({
6547
+ call_id: output.call_id ?? output.id ?? "",
6548
+ type: "function_call_output",
6549
+ output: result,
6550
+ status: "completed"
6551
+ });
6552
+ } catch (error) {
6553
+ toolOutputs.push({
6554
+ call_id: output.call_id ?? output.id ?? "",
6555
+ type: "function_call_output",
6556
+ output: error instanceof Error ? error.message : "Unknown error",
6557
+ status: "incomplete"
6558
+ });
6559
+ }
6560
+ }
6561
+ }
6562
+ return toolOutputs;
6563
+ }
6564
+ async function handleOpenAIResponse(client, response, options) {
6565
+ let providerTokens = options?.providerTokens;
6566
+ if (!providerTokens) {
6567
+ try {
6568
+ providerTokens = await getProviderTokens();
6569
+ } catch {}
6570
+ }
6571
+ const finalOptions = providerTokens ? { ...options, providerTokens } : options;
6572
+ const functionCalls = response.output.filter((output) => output.type === "function_call");
6573
+ return handleOpenAIToolCalls(client, functionCalls, finalOptions);
6574
+ }
6539
6575
  // src/ai/openai-agents.ts
6540
6576
  function convertMCPToolToOpenAIAgents(mcpTool, client, options) {
6541
6577
  return {
@@ -6616,6 +6652,25 @@ async function getAnthropicTools(client, options) {
6616
6652
  const finalOptions = providerTokens ? { ...options, providerTokens } : options;
6617
6653
  return convertMCPToolsToAnthropic(client, finalOptions);
6618
6654
  }
6655
+ async function handleAnthropicMessage(client, message, options) {
6656
+ let providerTokens = options?.providerTokens;
6657
+ if (!providerTokens) {
6658
+ try {
6659
+ providerTokens = await getProviderTokens();
6660
+ } catch {}
6661
+ }
6662
+ const finalOptions = providerTokens ? { ...options, providerTokens } : options;
6663
+ const toolResults = await handleAnthropicToolCalls(client, message.content, finalOptions);
6664
+ if (toolResults.length === 0) {
6665
+ return [];
6666
+ }
6667
+ return [
6668
+ {
6669
+ role: "user",
6670
+ content: toolResults
6671
+ }
6672
+ ];
6673
+ }
6619
6674
  // src/ai/google.ts
6620
6675
  function convertMCPToolToGoogle(mcpTool, _client, _options) {
6621
6676
  return {
@@ -6967,7 +7022,10 @@ export {
6967
7022
  svelteKitHandler,
6968
7023
  jsonSchemaToZod,
6969
7024
  jsonSchemaPropertyToZod,
7025
+ handleOpenAIToolCalls,
7026
+ handleOpenAIResponse,
6970
7027
  handleAnthropicToolCalls,
7028
+ handleAnthropicMessage,
6971
7029
  gmailIntegration,
6972
7030
  githubIntegration,
6973
7031
  getVercelAITools,
@@ -6,6 +6,7 @@
6
6
  import type { MCPClient } from "../client.js";
7
7
  import type { MCPTool } from "../protocol/messages.js";
8
8
  import { type AIToolsOptions } from "./utils.js";
9
+ import type Anthropic from "@anthropic-ai/sdk";
9
10
  /**
10
11
  * Anthropic tool definition
11
12
  * Compatible with Anthropic's Claude API
@@ -179,4 +180,70 @@ export declare function handleAnthropicToolCalls(client: MCPClient<any>, message
179
180
  * ```
180
181
  */
181
182
  export declare function getAnthropicTools(client: MCPClient<any>, options?: AnthropicToolsOptions): Promise<AnthropicTool[]>;
183
+ /**
184
+ * Handle an entire Anthropic Message object
185
+ *
186
+ * This is a convenience function that extracts tool calls from a Message
187
+ * object, executes them, and returns the results formatted as MessageParam
188
+ * ready to be passed directly to the next API call.
189
+ *
190
+ * **Auto-extraction**: Provider tokens are automatically extracted from request headers
191
+ * or environment variables if not provided in options.
192
+ *
193
+ * @param client - The MCP client instance
194
+ * @param message - The complete Message object from Anthropic
195
+ * @param options - Optional configuration including provider tokens
196
+ * @returns Array with a single user message containing tool results, or empty array if no tool calls
197
+ *
198
+ * @example
199
+ * ```typescript
200
+ * import { serverClient } from '@/lib/integrate-server';
201
+ * import { getAnthropicTools, handleAnthropicMessage } from 'integrate-sdk/server';
202
+ * import Anthropic from '@anthropic-ai/sdk';
203
+ *
204
+ * const anthropic = new Anthropic({ apiKey: process.env.ANTHROPIC_API_KEY });
205
+ *
206
+ * export async function POST(req: Request) {
207
+ * const { messages } = await req.json();
208
+ *
209
+ * // Initial request with tools
210
+ * const message = await anthropic.messages.create({
211
+ * model: 'claude-3-5-sonnet-20241022',
212
+ * max_tokens: 1024,
213
+ * tools: await getAnthropicTools(serverClient),
214
+ * messages,
215
+ * });
216
+ *
217
+ * // If there are tool calls, handle them automatically
218
+ * if (message.stop_reason === 'tool_use') {
219
+ * const toolMessages = await handleAnthropicMessage(serverClient, message);
220
+ *
221
+ * // Continue conversation with tool results
222
+ * const finalMessage = await anthropic.messages.create({
223
+ * model: 'claude-3-5-sonnet-20241022',
224
+ * max_tokens: 1024,
225
+ * tools: await getAnthropicTools(serverClient),
226
+ * messages: [
227
+ * ...messages,
228
+ * { role: 'assistant', content: message.content },
229
+ * ...toolMessages,
230
+ * ],
231
+ * });
232
+ *
233
+ * return Response.json(finalMessage);
234
+ * }
235
+ *
236
+ * return Response.json(message);
237
+ * }
238
+ * ```
239
+ *
240
+ * @example
241
+ * ```typescript
242
+ * // Manual token override
243
+ * const toolMessages = await handleAnthropicMessage(serverClient, message, {
244
+ * providerTokens: { github: 'ghp_...', gmail: 'ya29...' }
245
+ * });
246
+ * ```
247
+ */
248
+ export declare function handleAnthropicMessage(client: MCPClient<any>, message: Anthropic.Messages.Message, options?: AnthropicToolsOptions): Promise<Anthropic.Messages.MessageParam[]>;
182
249
  //# sourceMappingURL=anthropic.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../../src/ai/anthropic.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAkE,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjH;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE;QACZ,IAAI,EAAE,QAAQ,CAAC;QACf,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACrC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;QACpB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;KACxB,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,qBAAsB,SAAQ,cAAc;CAAI;AAEjE;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,UAAU,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC;AAED;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,aAAa,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,SAAS,CAAC,GAAG,CAAC,EACvB,QAAQ,CAAC,EAAE,qBAAqB,GAC/B,aAAa,CAUf;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,EACtB,OAAO,CAAC,EAAE,qBAAqB,GAC9B,aAAa,EAAE,CAGjB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,wBAAwB,CAC5C,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,EACtB,OAAO,EAAE,qBAAqB,EAC9B,OAAO,CAAC,EAAE,qBAAqB,GAC9B,OAAO,CAAC,MAAM,CAAC,CAGjB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,wBAAsB,wBAAwB,CAC5C,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,EACtB,cAAc,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAA,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CAAE,CAAC,EAC1D,OAAO,CAAC,EAAE,qBAAqB,GAC9B,OAAO,CAAC,wBAAwB,EAAE,CAAC,CAkCrC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,EACtB,OAAO,CAAC,EAAE,qBAAqB,GAC9B,OAAO,CAAC,aAAa,EAAE,CAAC,CAe1B"}
1
+ {"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../../src/ai/anthropic.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAkE,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC;AACjH,OAAO,KAAK,SAAS,MAAM,mBAAmB,CAAC;AAE/C;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE;QACZ,IAAI,EAAE,QAAQ,CAAC;QACf,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACrC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;QACpB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;KACxB,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,qBAAsB,SAAQ,cAAc;CAAI;AAEjE;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,UAAU,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC;AAED;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,aAAa,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,SAAS,CAAC,GAAG,CAAC,EACvB,QAAQ,CAAC,EAAE,qBAAqB,GAC/B,aAAa,CAUf;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,EACtB,OAAO,CAAC,EAAE,qBAAqB,GAC9B,aAAa,EAAE,CAGjB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,wBAAwB,CAC5C,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,EACtB,OAAO,EAAE,qBAAqB,EAC9B,OAAO,CAAC,EAAE,qBAAqB,GAC9B,OAAO,CAAC,MAAM,CAAC,CAGjB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,wBAAsB,wBAAwB,CAC5C,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,EACtB,cAAc,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAA,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CAAE,CAAC,EAC1D,OAAO,CAAC,EAAE,qBAAqB,GAC9B,OAAO,CAAC,wBAAwB,EAAE,CAAC,CAkCrC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,EACtB,OAAO,CAAC,EAAE,qBAAqB,GAC9B,OAAO,CAAC,aAAa,EAAE,CAAC,CAe1B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgEG;AACH,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,EACtB,OAAO,EAAE,SAAS,CAAC,QAAQ,CAAC,OAAO,EACnC,OAAO,CAAC,EAAE,qBAAqB,GAC9B,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC,CA4B5C"}
@@ -6,6 +6,7 @@
6
6
  import type { MCPClient } from "../client.js";
7
7
  import type { MCPTool } from "../protocol/messages.js";
8
8
  import { type AIToolsOptions } from "./utils.js";
9
+ import type { OpenAI } from "openai";
9
10
  /**
10
11
  * OpenAI function tool definition
11
12
  * Compatible with OpenAI's Responses API format
@@ -13,14 +14,11 @@ import { type AIToolsOptions } from "./utils.js";
13
14
  export interface OpenAITool {
14
15
  type: 'function';
15
16
  name: string;
16
- description?: string;
17
17
  parameters: {
18
- type: 'object';
19
- properties?: Record<string, unknown>;
20
- required?: string[];
21
18
  [key: string]: unknown;
22
- };
23
- strict?: boolean;
19
+ } | null;
20
+ strict: boolean | null;
21
+ description?: string | null;
24
22
  }
25
23
  /**
26
24
  * Options for converting MCP tools to OpenAI format
@@ -127,4 +125,100 @@ export declare function executeOpenAIToolCall(client: MCPClient<any>, toolCall:
127
125
  * ```
128
126
  */
129
127
  export declare function getOpenAITools(client: MCPClient<any>, options?: OpenAIToolsOptions): Promise<OpenAITool[]>;
128
+ /**
129
+ * Handle multiple tool calls from OpenAI's response output
130
+ *
131
+ * This function processes all function_call items from the response output,
132
+ * executes each tool call, and returns formatted results for the next request.
133
+ *
134
+ * @param client - The MCP client instance
135
+ * @param toolCalls - Array of output items from OpenAI response (filters for function_call type)
136
+ * @param options - Optional configuration including provider tokens
137
+ * @returns Array of function call outputs to send back to OpenAI
138
+ *
139
+ * @example
140
+ * ```typescript
141
+ * // Handle tool calls from a response
142
+ * const response = await openai.responses.create({
143
+ * model: 'gpt-4o-2024-11-20',
144
+ * input: 'Create a GitHub issue',
145
+ * tools: await getOpenAITools(serverClient),
146
+ * });
147
+ *
148
+ * // Execute the tool calls and get outputs
149
+ * const toolOutputs = await handleOpenAIToolCalls(
150
+ * serverClient,
151
+ * response.output,
152
+ * { providerTokens }
153
+ * );
154
+ *
155
+ * // Continue the conversation with tool results
156
+ * const nextResponse = await openai.responses.create({
157
+ * model: 'gpt-4o-2024-11-20',
158
+ * input: toolOutputs,
159
+ * tools: await getOpenAITools(serverClient),
160
+ * });
161
+ * ```
162
+ */
163
+ export declare function handleOpenAIToolCalls(client: MCPClient<any>, toolCalls: OpenAI.Responses.ResponseOutputItem[], options?: OpenAIToolsOptions): Promise<OpenAI.Responses.ResponseInputItem.FunctionCallOutput[]>;
164
+ /**
165
+ * Handle an entire OpenAI Response object
166
+ *
167
+ * This is a convenience function that extracts tool calls from a Response
168
+ * object and executes them. Use this when you want to process all tool
169
+ * calls from a response in one go.
170
+ *
171
+ * **Auto-extraction**: Provider tokens are automatically extracted from request headers
172
+ * or environment variables if not provided in options.
173
+ *
174
+ * @param client - The MCP client instance
175
+ * @param response - The complete Response object from OpenAI
176
+ * @param options - Optional configuration including provider tokens
177
+ * @returns Array of function call outputs to send back to OpenAI
178
+ *
179
+ * @example
180
+ * ```typescript
181
+ * import { serverClient } from '@/lib/integrate-server';
182
+ * import { getOpenAITools, handleOpenAIResponse } from 'integrate-sdk/server';
183
+ * import OpenAI from 'openai';
184
+ *
185
+ * const openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY });
186
+ *
187
+ * export async function POST(req: Request) {
188
+ * const { messages } = await req.json();
189
+ *
190
+ * // Initial request with tools
191
+ * const response = await openai.responses.create({
192
+ * model: 'gpt-4o-2024-11-20',
193
+ * input: messages,
194
+ * tools: await getOpenAITools(serverClient),
195
+ * });
196
+ *
197
+ * // If there are tool calls, handle them automatically
198
+ * if (response.output.some(item => item.type === 'function_call')) {
199
+ * const toolOutputs = await handleOpenAIResponse(serverClient, response);
200
+ *
201
+ * // Continue conversation with tool results
202
+ * const finalResponse = await openai.responses.create({
203
+ * model: 'gpt-4o-2024-11-20',
204
+ * input: toolOutputs,
205
+ * tools: await getOpenAITools(serverClient),
206
+ * });
207
+ *
208
+ * return Response.json(finalResponse);
209
+ * }
210
+ *
211
+ * return Response.json(response);
212
+ * }
213
+ * ```
214
+ *
215
+ * @example
216
+ * ```typescript
217
+ * // Manual token override
218
+ * const toolOutputs = await handleOpenAIResponse(serverClient, response, {
219
+ * providerTokens: { github: 'ghp_...', gmail: 'ya29...' }
220
+ * });
221
+ * ```
222
+ */
223
+ export declare function handleOpenAIResponse(client: MCPClient<any>, response: OpenAI.Responses.Response, options?: OpenAIToolsOptions): Promise<OpenAI.Responses.ResponseInputItem.FunctionCallOutput[]>;
130
224
  //# sourceMappingURL=openai.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../../src/ai/openai.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAkE,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjH;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,UAAU,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE;QACV,IAAI,EAAE,QAAQ,CAAC;QACf,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACrC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;QACpB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;KACxB,CAAC;IACF,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAmB,SAAQ,cAAc;IACxD;;;OAGG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,SAAS,CAAC,GAAG,CAAC,EACvB,OAAO,CAAC,EAAE,kBAAkB,GAC3B,UAAU,CAcZ;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,EACtB,OAAO,CAAC,EAAE,kBAAkB,GAC3B,UAAU,EAAE,CAGd;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,EACtB,QAAQ,EAAE;IACR,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB,EACD,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC,MAAM,CAAC,CAIjB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,EACtB,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC,UAAU,EAAE,CAAC,CAevB"}
1
+ {"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../../src/ai/openai.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAkE,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC;AACjH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAErC;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,UAAU,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE;QACV,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;KACxB,GAAG,IAAI,CAAC;IACT,MAAM,EAAE,OAAO,GAAG,IAAI,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,kBAAmB,SAAQ,cAAc;IACxD;;;OAGG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,SAAS,CAAC,GAAG,CAAC,EACvB,OAAO,CAAC,EAAE,kBAAkB,GAC3B,UAAU,CAUZ;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,EACtB,OAAO,CAAC,EAAE,kBAAkB,GAC3B,UAAU,EAAE,CAGd;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,EACtB,QAAQ,EAAE;IACR,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB,EACD,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC,MAAM,CAAC,CAIjB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,EACtB,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC,UAAU,EAAE,CAAC,CAevB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,EACtB,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,kBAAkB,EAAE,EAChD,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,iBAAiB,CAAC,kBAAkB,EAAE,CAAC,CA+BlE;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0DG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,EACtB,QAAQ,EAAE,MAAM,CAAC,SAAS,CAAC,QAAQ,EACnC,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,iBAAiB,CAAC,kBAAkB,EAAE,CAAC,CAoBlE"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "integrate-sdk",
3
- "version": "0.7.36",
3
+ "version": "0.7.39",
4
4
  "description": "Type-safe 3rd party integration SDK for the Integrate MCP server",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -71,8 +71,10 @@
71
71
  "zod": "^3.23.8"
72
72
  },
73
73
  "devDependencies": {
74
+ "@anthropic-ai/sdk": "^0.32.1",
74
75
  "@types/bun": "latest",
75
76
  "@types/react": "^18.3.0",
77
+ "openai": "^4.77.3",
76
78
  "react": "^19.2.0",
77
79
  "simple-git-hooks": "^2.13.1",
78
80
  "typescript": "^5.3.3"