@tambo-ai/react 0.54.0 → 0.55.0

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.
Files changed (84) hide show
  1. package/README.md +49 -14
  2. package/dist/hooks/__tests__/use-tambo-threads.test.js +1 -9
  3. package/dist/hooks/__tests__/use-tambo-threads.test.js.map +1 -1
  4. package/dist/mcp/__tests__/mcp-client.test.js +21 -21
  5. package/dist/mcp/__tests__/mcp-client.test.js.map +1 -1
  6. package/dist/mcp/__tests__/tambo-mcp-provider.test.js +115 -0
  7. package/dist/mcp/__tests__/tambo-mcp-provider.test.js.map +1 -1
  8. package/dist/mcp/mcp-client.d.ts +61 -210
  9. package/dist/mcp/mcp-client.d.ts.map +1 -1
  10. package/dist/mcp/mcp-client.js +43 -17
  11. package/dist/mcp/mcp-client.js.map +1 -1
  12. package/dist/mcp/tambo-mcp-provider.d.ts +1 -1
  13. package/dist/mcp/tambo-mcp-provider.d.ts.map +1 -1
  14. package/dist/mcp/tambo-mcp-provider.js +22 -4
  15. package/dist/mcp/tambo-mcp-provider.js.map +1 -1
  16. package/dist/providers/__tests__/tambo-interactable-provider-partial-updates.test.js +15 -0
  17. package/dist/providers/__tests__/tambo-interactable-provider-partial-updates.test.js.map +1 -1
  18. package/dist/providers/__tests__/tambo-registry-provider.test.js +44 -9
  19. package/dist/providers/__tests__/tambo-registry-provider.test.js.map +1 -1
  20. package/dist/providers/hooks/use-tambo-session-token.d.ts +2 -2
  21. package/dist/providers/hooks/use-tambo-session-token.js +2 -2
  22. package/dist/providers/hooks/use-tambo-session-token.js.map +1 -1
  23. package/dist/providers/tambo-context-helpers-provider.d.ts +7 -2
  24. package/dist/providers/tambo-context-helpers-provider.d.ts.map +1 -1
  25. package/dist/providers/tambo-context-helpers-provider.js +12 -7
  26. package/dist/providers/tambo-context-helpers-provider.js.map +1 -1
  27. package/dist/providers/tambo-interactable-provider.d.ts.map +1 -1
  28. package/dist/providers/tambo-interactable-provider.js +3 -0
  29. package/dist/providers/tambo-interactable-provider.js.map +1 -1
  30. package/dist/providers/tambo-prop-stream-provider/index.d.ts +1 -1
  31. package/dist/providers/tambo-prop-stream-provider/index.js +1 -1
  32. package/dist/providers/tambo-prop-stream-provider/index.js.map +1 -1
  33. package/dist/providers/tambo-provider.d.ts +1 -1
  34. package/dist/providers/tambo-provider.js +1 -1
  35. package/dist/providers/tambo-provider.js.map +1 -1
  36. package/dist/providers/tambo-registry-provider.d.ts.map +1 -1
  37. package/dist/providers/tambo-registry-provider.js +12 -1
  38. package/dist/providers/tambo-registry-provider.js.map +1 -1
  39. package/dist/util/validate-component-name.d.ts +7 -0
  40. package/dist/util/validate-component-name.d.ts.map +1 -0
  41. package/dist/util/validate-component-name.js +14 -0
  42. package/dist/util/validate-component-name.js.map +1 -0
  43. package/esm/hooks/__tests__/use-tambo-threads.test.js +1 -9
  44. package/esm/hooks/__tests__/use-tambo-threads.test.js.map +1 -1
  45. package/esm/mcp/__tests__/mcp-client.test.js +21 -21
  46. package/esm/mcp/__tests__/mcp-client.test.js.map +1 -1
  47. package/esm/mcp/__tests__/tambo-mcp-provider.test.js +83 -1
  48. package/esm/mcp/__tests__/tambo-mcp-provider.test.js.map +1 -1
  49. package/esm/mcp/mcp-client.d.ts +61 -210
  50. package/esm/mcp/mcp-client.d.ts.map +1 -1
  51. package/esm/mcp/mcp-client.js +43 -17
  52. package/esm/mcp/mcp-client.js.map +1 -1
  53. package/esm/mcp/tambo-mcp-provider.d.ts +1 -1
  54. package/esm/mcp/tambo-mcp-provider.d.ts.map +1 -1
  55. package/esm/mcp/tambo-mcp-provider.js +22 -4
  56. package/esm/mcp/tambo-mcp-provider.js.map +1 -1
  57. package/esm/providers/__tests__/tambo-interactable-provider-partial-updates.test.js +15 -0
  58. package/esm/providers/__tests__/tambo-interactable-provider-partial-updates.test.js.map +1 -1
  59. package/esm/providers/__tests__/tambo-registry-provider.test.js +44 -9
  60. package/esm/providers/__tests__/tambo-registry-provider.test.js.map +1 -1
  61. package/esm/providers/hooks/use-tambo-session-token.d.ts +2 -2
  62. package/esm/providers/hooks/use-tambo-session-token.js +2 -2
  63. package/esm/providers/hooks/use-tambo-session-token.js.map +1 -1
  64. package/esm/providers/tambo-context-helpers-provider.d.ts +7 -2
  65. package/esm/providers/tambo-context-helpers-provider.d.ts.map +1 -1
  66. package/esm/providers/tambo-context-helpers-provider.js +12 -7
  67. package/esm/providers/tambo-context-helpers-provider.js.map +1 -1
  68. package/esm/providers/tambo-interactable-provider.d.ts.map +1 -1
  69. package/esm/providers/tambo-interactable-provider.js +3 -0
  70. package/esm/providers/tambo-interactable-provider.js.map +1 -1
  71. package/esm/providers/tambo-prop-stream-provider/index.d.ts +1 -1
  72. package/esm/providers/tambo-prop-stream-provider/index.js +1 -1
  73. package/esm/providers/tambo-prop-stream-provider/index.js.map +1 -1
  74. package/esm/providers/tambo-provider.d.ts +1 -1
  75. package/esm/providers/tambo-provider.js +1 -1
  76. package/esm/providers/tambo-provider.js.map +1 -1
  77. package/esm/providers/tambo-registry-provider.d.ts.map +1 -1
  78. package/esm/providers/tambo-registry-provider.js +12 -1
  79. package/esm/providers/tambo-registry-provider.js.map +1 -1
  80. package/esm/util/validate-component-name.d.ts +7 -0
  81. package/esm/util/validate-component-name.d.ts.map +1 -0
  82. package/esm/util/validate-component-name.js +11 -0
  83. package/esm/util/validate-component-name.js.map +1 -0
  84. package/package.json +12 -11
@@ -1,5 +1,42 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
2
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
+ const react_1 = require("@testing-library/react");
37
+ const react_2 = __importStar(require("react"));
38
+ const tambo_registry_provider_1 = require("../../providers/tambo-registry-provider");
39
+ const mcp_client_1 = require("../mcp-client");
3
40
  const tambo_mcp_provider_1 = require("../tambo-mcp-provider");
4
41
  // Mock the MCP client to avoid ES module issues
5
42
  jest.mock("../mcp-client", () => ({
@@ -112,4 +149,82 @@ describe("extractErrorMessage", () => {
112
149
  });
113
150
  });
114
151
  });
152
+ describe("TamboMcpProvider server list changes", () => {
153
+ beforeEach(() => {
154
+ // Mock registry so tool registration is a no-op
155
+ tambo_registry_provider_1.useTamboRegistry.mockReturnValue({
156
+ registerTool: jest.fn(),
157
+ });
158
+ // Ensure MCPClient.create exists and returns a fake client with listTools
159
+ mcp_client_1.MCPClient.create = jest
160
+ .fn()
161
+ .mockResolvedValue({ listTools: jest.fn().mockResolvedValue([]) });
162
+ });
163
+ const Capture = ({ onUpdate, }) => {
164
+ const servers = (0, tambo_mcp_provider_1.useTamboMcpServers)();
165
+ (0, react_2.useEffect)(() => {
166
+ onUpdate(servers);
167
+ }, [servers, onUpdate]);
168
+ return react_2.default.createElement("div", { "data-testid": "urls" }, servers.map((s) => s.url).join(","));
169
+ };
170
+ it("adds a new server when the list grows", async () => {
171
+ let latest = [];
172
+ const { rerender, getByTestId } = (0, react_1.render)(react_2.default.createElement(tambo_mcp_provider_1.TamboMcpProvider, { mcpServers: ["https://a.example"] },
173
+ react_2.default.createElement(Capture, { onUpdate: (s) => (latest = s) })));
174
+ // Wait for initial connection
175
+ await (0, react_1.waitFor)(() => {
176
+ expect(latest.length).toBe(1);
177
+ });
178
+ // Add new server
179
+ rerender(react_2.default.createElement(tambo_mcp_provider_1.TamboMcpProvider, { mcpServers: ["https://a.example", "https://b.example"] },
180
+ react_2.default.createElement(Capture, { onUpdate: (s) => (latest = s) })));
181
+ await (0, react_1.waitFor)(() => {
182
+ expect(latest.length).toBe(2);
183
+ const urls = getByTestId("urls").textContent || "";
184
+ expect(urls).toContain("https://a.example");
185
+ expect(urls).toContain("https://b.example");
186
+ });
187
+ });
188
+ it("removes a server when the list shrinks", async () => {
189
+ let latest = [];
190
+ const { rerender, getByTestId } = (0, react_1.render)(react_2.default.createElement(tambo_mcp_provider_1.TamboMcpProvider, { mcpServers: ["https://a.example", "https://b.example"] },
191
+ react_2.default.createElement(Capture, { onUpdate: (s) => (latest = s) })));
192
+ await (0, react_1.waitFor)(() => {
193
+ expect(latest.length).toBe(2);
194
+ });
195
+ // Remove one server
196
+ rerender(react_2.default.createElement(tambo_mcp_provider_1.TamboMcpProvider, { mcpServers: ["https://a.example"] },
197
+ react_2.default.createElement(Capture, { onUpdate: (s) => (latest = s) })));
198
+ await (0, react_1.waitFor)(() => {
199
+ expect(latest.length).toBe(1);
200
+ const urls = getByTestId("urls").textContent || "";
201
+ expect(urls).toContain("https://a.example");
202
+ expect(urls).not.toContain("https://b.example");
203
+ });
204
+ });
205
+ it("does not duplicate when a new copy of the same list is passed", async () => {
206
+ let latest = [];
207
+ const initial = [
208
+ { url: "https://a.example", transport: mcp_client_1.MCPTransport.SSE },
209
+ { url: "https://b.example", transport: mcp_client_1.MCPTransport.SSE },
210
+ ];
211
+ const { rerender } = (0, react_1.render)(react_2.default.createElement(tambo_mcp_provider_1.TamboMcpProvider, { mcpServers: initial },
212
+ react_2.default.createElement(Capture, { onUpdate: (s) => (latest = s) })));
213
+ await (0, react_1.waitFor)(() => {
214
+ expect(latest.length).toBe(2);
215
+ });
216
+ // Pass a new array instance with the same logical servers
217
+ const same = [
218
+ { url: "https://a.example", transport: mcp_client_1.MCPTransport.SSE },
219
+ { url: "https://b.example", transport: mcp_client_1.MCPTransport.SSE },
220
+ ];
221
+ rerender(react_2.default.createElement(tambo_mcp_provider_1.TamboMcpProvider, { mcpServers: same },
222
+ react_2.default.createElement(Capture, { onUpdate: (s) => (latest = s) })));
223
+ await (0, react_1.waitFor)(() => {
224
+ expect(latest.length).toBe(2);
225
+ const urls = latest.map((s) => s.url).sort();
226
+ expect(urls).toEqual(["https://a.example", "https://b.example"].sort());
227
+ });
228
+ });
229
+ });
115
230
  //# sourceMappingURL=tambo-mcp-provider.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tambo-mcp-provider.test.js","sourceRoot":"","sources":["../../../src/mcp/__tests__/tambo-mcp-provider.test.tsx"],"names":[],"mappings":"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","sourcesContent":["import { extractErrorMessage } from \"../tambo-mcp-provider\";\n\n// Mock the MCP client to avoid ES module issues\njest.mock(\"../mcp-client\", () => ({\n MCPClient: jest.fn(),\n MCPTransport: {\n SSE: \"sse\",\n HTTP: \"http\",\n },\n}));\n\n// Mock the registry provider to avoid dependency issues\njest.mock(\"../../providers/tambo-registry-provider\", () => ({\n useTamboRegistry: jest.fn(),\n}));\n\ndescribe(\"extractErrorMessage\", () => {\n describe(\"Array content handling\", () => {\n it(\"should extract text from array content with multiple text items\", () => {\n const content = [\n { type: \"text\", text: \"Error:\" },\n { type: \"text\", text: \"Tool execution failed\" },\n { type: \"image\", url: \"http://example.com/error.png\" }, // Should be filtered out\n ];\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\"Error: Tool execution failed\");\n });\n\n it(\"should extract text from array content with single text item\", () => {\n const content = [{ type: \"text\", text: \"Simple error message\" }];\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\"Simple error message\");\n });\n\n it(\"should return fallback message for array content with no text items\", () => {\n const content = [\n { type: \"image\", url: \"http://example.com/error.png\" },\n { type: \"resource\", uri: \"file://error.log\" },\n ];\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\"Error occurred but no details provided\");\n });\n\n it(\"should return fallback message for empty array content\", () => {\n const content: any[] = [];\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\"Error occurred but no details provided\");\n });\n\n it(\"should handle array content with mixed types correctly\", () => {\n const content = [\n { type: \"resource\", uri: \"file://log.txt\" },\n { type: \"text\", text: \"First error\" },\n { type: \"image\", url: \"http://example.com/img.png\" },\n { type: \"text\", text: \"Second error\" },\n { type: \"unknown\", data: \"something\" },\n ];\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\"First error Second error\");\n });\n\n it(\"should handle array content with malformed items\", () => {\n const content = [\n null,\n { type: \"text\", text: \"Valid error\" },\n { type: \"text\" }, // Missing text property\n { type: \"text\", text: null }, // Invalid text type\n { type: \"text\", text: \"Another valid error\" },\n ];\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\"Valid error Another valid error\");\n });\n });\n\n describe(\"Non-array content handling\", () => {\n it(\"should return string content as-is\", () => {\n const content = \"Direct error message\";\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\"Direct error message\");\n });\n\n it(\"should handle null content\", () => {\n const content = null;\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\"Unknown error occurred\");\n });\n\n it(\"should handle undefined content\", () => {\n const content = undefined;\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\"Unknown error occurred\");\n });\n\n it(\"should handle number content\", () => {\n const content = 42;\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\"42\");\n });\n\n it(\"should handle boolean content\", () => {\n const content = false;\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\"false\");\n });\n\n it(\"should handle object content\", () => {\n const content = { error: \"Something went wrong\" };\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe('{\"error\":\"Something went wrong\"}');\n });\n\n it(\"should handle complex object content\", () => {\n const content = {\n error: \"Something went wrong\",\n code: 500,\n details: { message: \"Internal server error\" },\n };\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\n '{\"error\":\"Something went wrong\",\"code\":500,\"details\":{\"message\":\"Internal server error\"}}',\n );\n });\n\n it(\"should handle empty object content\", () => {\n const content = {};\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\"{}\");\n });\n });\n});\n"]}
1
+ {"version":3,"file":"tambo-mcp-provider.test.js","sourceRoot":"","sources":["../../../src/mcp/__tests__/tambo-mcp-provider.test.tsx"],"names":[],"mappings":"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","sourcesContent":["import { render, waitFor } from \"@testing-library/react\";\nimport React, { useEffect } from \"react\";\nimport { useTamboRegistry } from \"../../providers/tambo-registry-provider\";\nimport { MCPClient, MCPTransport } from \"../mcp-client\";\nimport {\n extractErrorMessage,\n TamboMcpProvider,\n useTamboMcpServers,\n type McpServer,\n} from \"../tambo-mcp-provider\";\n\n// Mock the MCP client to avoid ES module issues\njest.mock(\"../mcp-client\", () => ({\n MCPClient: jest.fn(),\n MCPTransport: {\n SSE: \"sse\",\n HTTP: \"http\",\n },\n}));\n\n// Mock the registry provider to avoid dependency issues\njest.mock(\"../../providers/tambo-registry-provider\", () => ({\n useTamboRegistry: jest.fn(),\n}));\n\ndescribe(\"extractErrorMessage\", () => {\n describe(\"Array content handling\", () => {\n it(\"should extract text from array content with multiple text items\", () => {\n const content = [\n { type: \"text\", text: \"Error:\" },\n { type: \"text\", text: \"Tool execution failed\" },\n { type: \"image\", url: \"http://example.com/error.png\" }, // Should be filtered out\n ];\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\"Error: Tool execution failed\");\n });\n\n it(\"should extract text from array content with single text item\", () => {\n const content = [{ type: \"text\", text: \"Simple error message\" }];\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\"Simple error message\");\n });\n\n it(\"should return fallback message for array content with no text items\", () => {\n const content = [\n { type: \"image\", url: \"http://example.com/error.png\" },\n { type: \"resource\", uri: \"file://error.log\" },\n ];\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\"Error occurred but no details provided\");\n });\n\n it(\"should return fallback message for empty array content\", () => {\n const content: any[] = [];\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\"Error occurred but no details provided\");\n });\n\n it(\"should handle array content with mixed types correctly\", () => {\n const content = [\n { type: \"resource\", uri: \"file://log.txt\" },\n { type: \"text\", text: \"First error\" },\n { type: \"image\", url: \"http://example.com/img.png\" },\n { type: \"text\", text: \"Second error\" },\n { type: \"unknown\", data: \"something\" },\n ];\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\"First error Second error\");\n });\n\n it(\"should handle array content with malformed items\", () => {\n const content = [\n null,\n { type: \"text\", text: \"Valid error\" },\n { type: \"text\" }, // Missing text property\n { type: \"text\", text: null }, // Invalid text type\n { type: \"text\", text: \"Another valid error\" },\n ];\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\"Valid error Another valid error\");\n });\n });\n\n describe(\"Non-array content handling\", () => {\n it(\"should return string content as-is\", () => {\n const content = \"Direct error message\";\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\"Direct error message\");\n });\n\n it(\"should handle null content\", () => {\n const content = null;\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\"Unknown error occurred\");\n });\n\n it(\"should handle undefined content\", () => {\n const content = undefined;\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\"Unknown error occurred\");\n });\n\n it(\"should handle number content\", () => {\n const content = 42;\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\"42\");\n });\n\n it(\"should handle boolean content\", () => {\n const content = false;\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\"false\");\n });\n\n it(\"should handle object content\", () => {\n const content = { error: \"Something went wrong\" };\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe('{\"error\":\"Something went wrong\"}');\n });\n\n it(\"should handle complex object content\", () => {\n const content = {\n error: \"Something went wrong\",\n code: 500,\n details: { message: \"Internal server error\" },\n };\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\n '{\"error\":\"Something went wrong\",\"code\":500,\"details\":{\"message\":\"Internal server error\"}}',\n );\n });\n\n it(\"should handle empty object content\", () => {\n const content = {};\n\n const result = extractErrorMessage(content);\n\n expect(result).toBe(\"{}\");\n });\n });\n});\n\ndescribe(\"TamboMcpProvider server list changes\", () => {\n beforeEach(() => {\n // Mock registry so tool registration is a no-op\n (useTamboRegistry as unknown as jest.Mock).mockReturnValue({\n registerTool: jest.fn(),\n });\n\n // Ensure MCPClient.create exists and returns a fake client with listTools\n (MCPClient as unknown as any).create = jest\n .fn()\n .mockResolvedValue({ listTools: jest.fn().mockResolvedValue([]) });\n });\n\n const Capture: React.FC<{ onUpdate: (servers: McpServer[]) => void }> = ({\n onUpdate,\n }) => {\n const servers = useTamboMcpServers();\n useEffect(() => {\n onUpdate(servers);\n }, [servers, onUpdate]);\n return <div data-testid=\"urls\">{servers.map((s) => s.url).join(\",\")}</div>;\n };\n\n it(\"adds a new server when the list grows\", async () => {\n let latest: McpServer[] = [];\n const { rerender, getByTestId } = render(\n <TamboMcpProvider mcpServers={[\"https://a.example\"]}>\n <Capture onUpdate={(s) => (latest = s)} />\n </TamboMcpProvider>,\n );\n\n // Wait for initial connection\n await waitFor(() => {\n expect(latest.length).toBe(1);\n });\n\n // Add new server\n rerender(\n <TamboMcpProvider mcpServers={[\"https://a.example\", \"https://b.example\"]}>\n <Capture onUpdate={(s) => (latest = s)} />\n </TamboMcpProvider>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(2);\n const urls = getByTestId(\"urls\").textContent || \"\";\n expect(urls).toContain(\"https://a.example\");\n expect(urls).toContain(\"https://b.example\");\n });\n });\n\n it(\"removes a server when the list shrinks\", async () => {\n let latest: McpServer[] = [];\n const { rerender, getByTestId } = render(\n <TamboMcpProvider mcpServers={[\"https://a.example\", \"https://b.example\"]}>\n <Capture onUpdate={(s) => (latest = s)} />\n </TamboMcpProvider>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(2);\n });\n\n // Remove one server\n rerender(\n <TamboMcpProvider mcpServers={[\"https://a.example\"]}>\n <Capture onUpdate={(s) => (latest = s)} />\n </TamboMcpProvider>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(1);\n const urls = getByTestId(\"urls\").textContent || \"\";\n expect(urls).toContain(\"https://a.example\");\n expect(urls).not.toContain(\"https://b.example\");\n });\n });\n\n it(\"does not duplicate when a new copy of the same list is passed\", async () => {\n let latest: McpServer[] = [];\n const initial = [\n { url: \"https://a.example\", transport: MCPTransport.SSE },\n { url: \"https://b.example\", transport: MCPTransport.SSE },\n ];\n\n const { rerender } = render(\n <TamboMcpProvider mcpServers={initial}>\n <Capture onUpdate={(s) => (latest = s)} />\n </TamboMcpProvider>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(2);\n });\n\n // Pass a new array instance with the same logical servers\n const same = [\n { url: \"https://a.example\", transport: MCPTransport.SSE },\n { url: \"https://b.example\", transport: MCPTransport.SSE },\n ];\n rerender(\n <TamboMcpProvider mcpServers={same}>\n <Capture onUpdate={(s) => (latest = s)} />\n </TamboMcpProvider>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(2);\n const urls = latest.map((s) => s.url).sort();\n expect(urls).toEqual([\"https://a.example\", \"https://b.example\"].sort());\n });\n });\n});\n"]}
@@ -1,3 +1,5 @@
1
+ import { type OAuthClientProvider } from "@modelcontextprotocol/sdk/client/auth.js";
2
+ import { Client } from "@modelcontextprotocol/sdk/client/index.js";
1
3
  import { JSONSchema7 } from "json-schema";
2
4
  export declare enum MCPTransport {
3
5
  SSE = "sse",
@@ -17,8 +19,10 @@ export declare class MCPClient {
17
19
  private client;
18
20
  private transport;
19
21
  private transportType;
22
+ sessionId?: string;
20
23
  private endpoint;
21
24
  private headers;
25
+ private authProvider?;
22
26
  /**
23
27
  * Tracks an in-flight reconnect so concurrent triggers coalesce
24
28
  * (single-flight). When set, additional calls to `reconnect()` or
@@ -62,16 +66,19 @@ export declare class MCPClient {
62
66
  */
63
67
  private constructor();
64
68
  /**
65
- * Creates and initializes a new MCPClient instance.
66
- * This is the recommended way to create an MCPClient as it handles both
67
- * instantiation and connection setup.
69
+ * Creates and initializes a new MCPClient instance. This is the recommended
70
+ * way to create an MCPClient as it handles both instantiation and connection
71
+ * setup.
68
72
  * @param endpoint - The URL of the MCP server to connect to
69
73
  * @param transportType - The transport type to use for the MCP client. Defaults to HTTP.
70
74
  * @param headers - Optional custom headers to include in requests
75
+ * @param authProvider - Optional auth provider to use for authentication
76
+ * @param sessionId - Optional session id to use for the MCP client - if not
77
+ * provided, a new session will be created
71
78
  * @returns A connected MCPClient instance ready for use
72
- * @throws Will throw an error if connection fails
79
+ * @throws {Error} Will throw an error if connection fails
73
80
  */
74
- static create(endpoint: string, transportType?: MCPTransport, headers?: Record<string, string>): Promise<MCPClient>;
81
+ static create(endpoint: string, transportType: MCPTransport | undefined, headers: Record<string, string> | undefined, authProvider: OAuthClientProvider | undefined, sessionId: string | undefined): Promise<MCPClient>;
75
82
  /**
76
83
  * Reconnects to the MCP server, optionally retaining the same session ID.
77
84
  *
@@ -89,6 +96,7 @@ export declare class MCPClient {
89
96
  * @param newSession - Whether to create a new session (true) or reuse existing session ID (false)
90
97
  * @param reportErrorOnClose - Whether to report errors when closing the client
91
98
  * Note that only StreamableHTTPClientTransport supports session IDs.
99
+ * @returns A promise that resolves when the reconnect is complete
92
100
  */
93
101
  reconnect(newSession?: boolean, reportErrorOnClose?: boolean): Promise<void>;
94
102
  /**
@@ -99,6 +107,7 @@ export declare class MCPClient {
99
107
  private onclose;
100
108
  /**
101
109
  * Compute the next backoff delay with symmetric jitter.
110
+ * @returns The next backoff delay in milliseconds
102
111
  */
103
112
  private computeBackoffDelayMs;
104
113
  /**
@@ -112,220 +121,62 @@ export declare class MCPClient {
112
121
  * Retrieves a complete list of all available tools from the MCP server.
113
122
  * Handles pagination automatically by following cursors until all tools are fetched.
114
123
  * @returns A complete list of all available tools and their descriptions
115
- * @throws Will throw an error if any server request fails during pagination
124
+ * @throws {Error} Will throw an error if any server request fails during pagination
116
125
  */
117
126
  listTools(): Promise<MCPToolSpec[]>;
127
+ getServerCapabilities(): {
128
+ [x: string]: unknown;
129
+ tools?: {
130
+ [x: string]: unknown;
131
+ listChanged?: boolean | undefined;
132
+ } | undefined;
133
+ experimental?: {
134
+ [x: string]: unknown;
135
+ } | undefined;
136
+ logging?: {
137
+ [x: string]: unknown;
138
+ } | undefined;
139
+ completions?: {
140
+ [x: string]: unknown;
141
+ } | undefined;
142
+ prompts?: {
143
+ [x: string]: unknown;
144
+ listChanged?: boolean | undefined;
145
+ } | undefined;
146
+ resources?: {
147
+ [x: string]: unknown;
148
+ listChanged?: boolean | undefined;
149
+ subscribe?: boolean | undefined;
150
+ } | undefined;
151
+ } | undefined;
152
+ getServerVersion(): {
153
+ [x: string]: unknown;
154
+ name: string;
155
+ version: string;
156
+ title?: string | undefined;
157
+ websiteUrl?: string | undefined;
158
+ icons?: {
159
+ [x: string]: unknown;
160
+ src: string;
161
+ mimeType?: string | undefined;
162
+ sizes?: string | undefined;
163
+ }[] | undefined;
164
+ } | undefined;
165
+ getInstructions(): string | undefined;
118
166
  /**
119
167
  * Calls a specific tool on the MCP server with the provided arguments.
120
168
  * @param name - The name of the tool to call
121
169
  * @param args - Arguments to pass to the tool, must match the tool's expected schema
122
170
  * @returns The result from the tool execution
123
- * @throws Will throw an error if the tool call fails or if arguments are invalid
171
+ * @throws {Error} Will throw an error if the tool call fails or if arguments are invalid
124
172
  */
125
- callTool(name: string, args: Record<string, unknown>): Promise<import("zod").objectOutputType<{
126
- _meta: import("zod").ZodOptional<import("zod").ZodObject<{}, "passthrough", import("zod").ZodTypeAny, import("zod").objectOutputType<{}, import("zod").ZodTypeAny, "passthrough">, import("zod").objectInputType<{}, import("zod").ZodTypeAny, "passthrough">>>;
127
- } & {
128
- content: import("zod").ZodDefault<import("zod").ZodArray<import("zod").ZodUnion<[import("zod").ZodObject<{
129
- type: import("zod").ZodLiteral<"text">;
130
- text: import("zod").ZodString;
131
- _meta: import("zod").ZodOptional<import("zod").ZodObject<{}, "passthrough", import("zod").ZodTypeAny, import("zod").objectOutputType<{}, import("zod").ZodTypeAny, "passthrough">, import("zod").objectInputType<{}, import("zod").ZodTypeAny, "passthrough">>>;
132
- }, "passthrough", import("zod").ZodTypeAny, import("zod").objectOutputType<{
133
- type: import("zod").ZodLiteral<"text">;
134
- text: import("zod").ZodString;
135
- _meta: import("zod").ZodOptional<import("zod").ZodObject<{}, "passthrough", import("zod").ZodTypeAny, import("zod").objectOutputType<{}, import("zod").ZodTypeAny, "passthrough">, import("zod").objectInputType<{}, import("zod").ZodTypeAny, "passthrough">>>;
136
- }, import("zod").ZodTypeAny, "passthrough">, import("zod").objectInputType<{
137
- type: import("zod").ZodLiteral<"text">;
138
- text: import("zod").ZodString;
139
- _meta: import("zod").ZodOptional<import("zod").ZodObject<{}, "passthrough", import("zod").ZodTypeAny, import("zod").objectOutputType<{}, import("zod").ZodTypeAny, "passthrough">, import("zod").objectInputType<{}, import("zod").ZodTypeAny, "passthrough">>>;
140
- }, import("zod").ZodTypeAny, "passthrough">>, import("zod").ZodObject<{
141
- type: import("zod").ZodLiteral<"image">;
142
- data: import("zod").ZodEffects<import("zod").ZodString, string, string>;
143
- mimeType: import("zod").ZodString;
144
- _meta: import("zod").ZodOptional<import("zod").ZodObject<{}, "passthrough", import("zod").ZodTypeAny, import("zod").objectOutputType<{}, import("zod").ZodTypeAny, "passthrough">, import("zod").objectInputType<{}, import("zod").ZodTypeAny, "passthrough">>>;
145
- }, "passthrough", import("zod").ZodTypeAny, import("zod").objectOutputType<{
146
- type: import("zod").ZodLiteral<"image">;
147
- data: import("zod").ZodEffects<import("zod").ZodString, string, string>;
148
- mimeType: import("zod").ZodString;
149
- _meta: import("zod").ZodOptional<import("zod").ZodObject<{}, "passthrough", import("zod").ZodTypeAny, import("zod").objectOutputType<{}, import("zod").ZodTypeAny, "passthrough">, import("zod").objectInputType<{}, import("zod").ZodTypeAny, "passthrough">>>;
150
- }, import("zod").ZodTypeAny, "passthrough">, import("zod").objectInputType<{
151
- type: import("zod").ZodLiteral<"image">;
152
- data: import("zod").ZodEffects<import("zod").ZodString, string, string>;
153
- mimeType: import("zod").ZodString;
154
- _meta: import("zod").ZodOptional<import("zod").ZodObject<{}, "passthrough", import("zod").ZodTypeAny, import("zod").objectOutputType<{}, import("zod").ZodTypeAny, "passthrough">, import("zod").objectInputType<{}, import("zod").ZodTypeAny, "passthrough">>>;
155
- }, import("zod").ZodTypeAny, "passthrough">>, import("zod").ZodObject<{
156
- type: import("zod").ZodLiteral<"audio">;
157
- data: import("zod").ZodEffects<import("zod").ZodString, string, string>;
158
- mimeType: import("zod").ZodString;
159
- _meta: import("zod").ZodOptional<import("zod").ZodObject<{}, "passthrough", import("zod").ZodTypeAny, import("zod").objectOutputType<{}, import("zod").ZodTypeAny, "passthrough">, import("zod").objectInputType<{}, import("zod").ZodTypeAny, "passthrough">>>;
160
- }, "passthrough", import("zod").ZodTypeAny, import("zod").objectOutputType<{
161
- type: import("zod").ZodLiteral<"audio">;
162
- data: import("zod").ZodEffects<import("zod").ZodString, string, string>;
163
- mimeType: import("zod").ZodString;
164
- _meta: import("zod").ZodOptional<import("zod").ZodObject<{}, "passthrough", import("zod").ZodTypeAny, import("zod").objectOutputType<{}, import("zod").ZodTypeAny, "passthrough">, import("zod").objectInputType<{}, import("zod").ZodTypeAny, "passthrough">>>;
165
- }, import("zod").ZodTypeAny, "passthrough">, import("zod").objectInputType<{
166
- type: import("zod").ZodLiteral<"audio">;
167
- data: import("zod").ZodEffects<import("zod").ZodString, string, string>;
168
- mimeType: import("zod").ZodString;
169
- _meta: import("zod").ZodOptional<import("zod").ZodObject<{}, "passthrough", import("zod").ZodTypeAny, import("zod").objectOutputType<{}, import("zod").ZodTypeAny, "passthrough">, import("zod").objectInputType<{}, import("zod").ZodTypeAny, "passthrough">>>;
170
- }, import("zod").ZodTypeAny, "passthrough">>, import("zod").ZodObject<import("zod").objectUtil.extendShape<import("zod").objectUtil.extendShape<{
171
- name: import("zod").ZodString;
172
- title: import("zod").ZodOptional<import("zod").ZodString>;
173
- }, {
174
- uri: import("zod").ZodString;
175
- description: import("zod").ZodOptional<import("zod").ZodString>;
176
- mimeType: import("zod").ZodOptional<import("zod").ZodString>;
177
- _meta: import("zod").ZodOptional<import("zod").ZodObject<{}, "passthrough", import("zod").ZodTypeAny, import("zod").objectOutputType<{}, import("zod").ZodTypeAny, "passthrough">, import("zod").objectInputType<{}, import("zod").ZodTypeAny, "passthrough">>>;
178
- }>, {
179
- type: import("zod").ZodLiteral<"resource_link">;
180
- }>, "passthrough", import("zod").ZodTypeAny, import("zod").objectOutputType<import("zod").objectUtil.extendShape<import("zod").objectUtil.extendShape<{
181
- name: import("zod").ZodString;
182
- title: import("zod").ZodOptional<import("zod").ZodString>;
183
- }, {
184
- uri: import("zod").ZodString;
185
- description: import("zod").ZodOptional<import("zod").ZodString>;
186
- mimeType: import("zod").ZodOptional<import("zod").ZodString>;
187
- _meta: import("zod").ZodOptional<import("zod").ZodObject<{}, "passthrough", import("zod").ZodTypeAny, import("zod").objectOutputType<{}, import("zod").ZodTypeAny, "passthrough">, import("zod").objectInputType<{}, import("zod").ZodTypeAny, "passthrough">>>;
188
- }>, {
189
- type: import("zod").ZodLiteral<"resource_link">;
190
- }>, import("zod").ZodTypeAny, "passthrough">, import("zod").objectInputType<import("zod").objectUtil.extendShape<import("zod").objectUtil.extendShape<{
191
- name: import("zod").ZodString;
192
- title: import("zod").ZodOptional<import("zod").ZodString>;
193
- }, {
194
- uri: import("zod").ZodString;
195
- description: import("zod").ZodOptional<import("zod").ZodString>;
196
- mimeType: import("zod").ZodOptional<import("zod").ZodString>;
197
- _meta: import("zod").ZodOptional<import("zod").ZodObject<{}, "passthrough", import("zod").ZodTypeAny, import("zod").objectOutputType<{}, import("zod").ZodTypeAny, "passthrough">, import("zod").objectInputType<{}, import("zod").ZodTypeAny, "passthrough">>>;
198
- }>, {
199
- type: import("zod").ZodLiteral<"resource_link">;
200
- }>, import("zod").ZodTypeAny, "passthrough">>, import("zod").ZodObject<{
201
- type: import("zod").ZodLiteral<"resource">;
202
- resource: import("zod").ZodUnion<[import("zod").ZodObject<import("zod").objectUtil.extendShape<{
203
- uri: import("zod").ZodString;
204
- mimeType: import("zod").ZodOptional<import("zod").ZodString>;
205
- _meta: import("zod").ZodOptional<import("zod").ZodObject<{}, "passthrough", import("zod").ZodTypeAny, import("zod").objectOutputType<{}, import("zod").ZodTypeAny, "passthrough">, import("zod").objectInputType<{}, import("zod").ZodTypeAny, "passthrough">>>;
206
- }, {
207
- text: import("zod").ZodString;
208
- }>, "passthrough", import("zod").ZodTypeAny, import("zod").objectOutputType<import("zod").objectUtil.extendShape<{
209
- uri: import("zod").ZodString;
210
- mimeType: import("zod").ZodOptional<import("zod").ZodString>;
211
- _meta: import("zod").ZodOptional<import("zod").ZodObject<{}, "passthrough", import("zod").ZodTypeAny, import("zod").objectOutputType<{}, import("zod").ZodTypeAny, "passthrough">, import("zod").objectInputType<{}, import("zod").ZodTypeAny, "passthrough">>>;
212
- }, {
213
- text: import("zod").ZodString;
214
- }>, import("zod").ZodTypeAny, "passthrough">, import("zod").objectInputType<import("zod").objectUtil.extendShape<{
215
- uri: import("zod").ZodString;
216
- mimeType: import("zod").ZodOptional<import("zod").ZodString>;
217
- _meta: import("zod").ZodOptional<import("zod").ZodObject<{}, "passthrough", import("zod").ZodTypeAny, import("zod").objectOutputType<{}, import("zod").ZodTypeAny, "passthrough">, import("zod").objectInputType<{}, import("zod").ZodTypeAny, "passthrough">>>;
218
- }, {
219
- text: import("zod").ZodString;
220
- }>, import("zod").ZodTypeAny, "passthrough">>, import("zod").ZodObject<import("zod").objectUtil.extendShape<{
221
- uri: import("zod").ZodString;
222
- mimeType: import("zod").ZodOptional<import("zod").ZodString>;
223
- _meta: import("zod").ZodOptional<import("zod").ZodObject<{}, "passthrough", import("zod").ZodTypeAny, import("zod").objectOutputType<{}, import("zod").ZodTypeAny, "passthrough">, import("zod").objectInputType<{}, import("zod").ZodTypeAny, "passthrough">>>;
224
- }, {
225
- blob: import("zod").ZodEffects<import("zod").ZodString, string, string>;
226
- }>, "passthrough", import("zod").ZodTypeAny, import("zod").objectOutputType<import("zod").objectUtil.extendShape<{
227
- uri: import("zod").ZodString;
228
- mimeType: import("zod").ZodOptional<import("zod").ZodString>;
229
- _meta: import("zod").ZodOptional<import("zod").ZodObject<{}, "passthrough", import("zod").ZodTypeAny, import("zod").objectOutputType<{}, import("zod").ZodTypeAny, "passthrough">, import("zod").objectInputType<{}, import("zod").ZodTypeAny, "passthrough">>>;
230
- }, {
231
- blob: import("zod").ZodEffects<import("zod").ZodString, string, string>;
232
- }>, import("zod").ZodTypeAny, "passthrough">, import("zod").objectInputType<import("zod").objectUtil.extendShape<{
233
- uri: import("zod").ZodString;
234
- mimeType: import("zod").ZodOptional<import("zod").ZodString>;
235
- _meta: import("zod").ZodOptional<import("zod").ZodObject<{}, "passthrough", import("zod").ZodTypeAny, import("zod").objectOutputType<{}, import("zod").ZodTypeAny, "passthrough">, import("zod").objectInputType<{}, import("zod").ZodTypeAny, "passthrough">>>;
236
- }, {
237
- blob: import("zod").ZodEffects<import("zod").ZodString, string, string>;
238
- }>, import("zod").ZodTypeAny, "passthrough">>]>;
239
- _meta: import("zod").ZodOptional<import("zod").ZodObject<{}, "passthrough", import("zod").ZodTypeAny, import("zod").objectOutputType<{}, import("zod").ZodTypeAny, "passthrough">, import("zod").objectInputType<{}, import("zod").ZodTypeAny, "passthrough">>>;
240
- }, "passthrough", import("zod").ZodTypeAny, import("zod").objectOutputType<{
241
- type: import("zod").ZodLiteral<"resource">;
242
- resource: import("zod").ZodUnion<[import("zod").ZodObject<import("zod").objectUtil.extendShape<{
243
- uri: import("zod").ZodString;
244
- mimeType: import("zod").ZodOptional<import("zod").ZodString>;
245
- _meta: import("zod").ZodOptional<import("zod").ZodObject<{}, "passthrough", import("zod").ZodTypeAny, import("zod").objectOutputType<{}, import("zod").ZodTypeAny, "passthrough">, import("zod").objectInputType<{}, import("zod").ZodTypeAny, "passthrough">>>;
246
- }, {
247
- text: import("zod").ZodString;
248
- }>, "passthrough", import("zod").ZodTypeAny, import("zod").objectOutputType<import("zod").objectUtil.extendShape<{
249
- uri: import("zod").ZodString;
250
- mimeType: import("zod").ZodOptional<import("zod").ZodString>;
251
- _meta: import("zod").ZodOptional<import("zod").ZodObject<{}, "passthrough", import("zod").ZodTypeAny, import("zod").objectOutputType<{}, import("zod").ZodTypeAny, "passthrough">, import("zod").objectInputType<{}, import("zod").ZodTypeAny, "passthrough">>>;
252
- }, {
253
- text: import("zod").ZodString;
254
- }>, import("zod").ZodTypeAny, "passthrough">, import("zod").objectInputType<import("zod").objectUtil.extendShape<{
255
- uri: import("zod").ZodString;
256
- mimeType: import("zod").ZodOptional<import("zod").ZodString>;
257
- _meta: import("zod").ZodOptional<import("zod").ZodObject<{}, "passthrough", import("zod").ZodTypeAny, import("zod").objectOutputType<{}, import("zod").ZodTypeAny, "passthrough">, import("zod").objectInputType<{}, import("zod").ZodTypeAny, "passthrough">>>;
258
- }, {
259
- text: import("zod").ZodString;
260
- }>, import("zod").ZodTypeAny, "passthrough">>, import("zod").ZodObject<import("zod").objectUtil.extendShape<{
261
- uri: import("zod").ZodString;
262
- mimeType: import("zod").ZodOptional<import("zod").ZodString>;
263
- _meta: import("zod").ZodOptional<import("zod").ZodObject<{}, "passthrough", import("zod").ZodTypeAny, import("zod").objectOutputType<{}, import("zod").ZodTypeAny, "passthrough">, import("zod").objectInputType<{}, import("zod").ZodTypeAny, "passthrough">>>;
264
- }, {
265
- blob: import("zod").ZodEffects<import("zod").ZodString, string, string>;
266
- }>, "passthrough", import("zod").ZodTypeAny, import("zod").objectOutputType<import("zod").objectUtil.extendShape<{
267
- uri: import("zod").ZodString;
268
- mimeType: import("zod").ZodOptional<import("zod").ZodString>;
269
- _meta: import("zod").ZodOptional<import("zod").ZodObject<{}, "passthrough", import("zod").ZodTypeAny, import("zod").objectOutputType<{}, import("zod").ZodTypeAny, "passthrough">, import("zod").objectInputType<{}, import("zod").ZodTypeAny, "passthrough">>>;
270
- }, {
271
- blob: import("zod").ZodEffects<import("zod").ZodString, string, string>;
272
- }>, import("zod").ZodTypeAny, "passthrough">, import("zod").objectInputType<import("zod").objectUtil.extendShape<{
273
- uri: import("zod").ZodString;
274
- mimeType: import("zod").ZodOptional<import("zod").ZodString>;
275
- _meta: import("zod").ZodOptional<import("zod").ZodObject<{}, "passthrough", import("zod").ZodTypeAny, import("zod").objectOutputType<{}, import("zod").ZodTypeAny, "passthrough">, import("zod").objectInputType<{}, import("zod").ZodTypeAny, "passthrough">>>;
276
- }, {
277
- blob: import("zod").ZodEffects<import("zod").ZodString, string, string>;
278
- }>, import("zod").ZodTypeAny, "passthrough">>]>;
279
- _meta: import("zod").ZodOptional<import("zod").ZodObject<{}, "passthrough", import("zod").ZodTypeAny, import("zod").objectOutputType<{}, import("zod").ZodTypeAny, "passthrough">, import("zod").objectInputType<{}, import("zod").ZodTypeAny, "passthrough">>>;
280
- }, import("zod").ZodTypeAny, "passthrough">, import("zod").objectInputType<{
281
- type: import("zod").ZodLiteral<"resource">;
282
- resource: import("zod").ZodUnion<[import("zod").ZodObject<import("zod").objectUtil.extendShape<{
283
- uri: import("zod").ZodString;
284
- mimeType: import("zod").ZodOptional<import("zod").ZodString>;
285
- _meta: import("zod").ZodOptional<import("zod").ZodObject<{}, "passthrough", import("zod").ZodTypeAny, import("zod").objectOutputType<{}, import("zod").ZodTypeAny, "passthrough">, import("zod").objectInputType<{}, import("zod").ZodTypeAny, "passthrough">>>;
286
- }, {
287
- text: import("zod").ZodString;
288
- }>, "passthrough", import("zod").ZodTypeAny, import("zod").objectOutputType<import("zod").objectUtil.extendShape<{
289
- uri: import("zod").ZodString;
290
- mimeType: import("zod").ZodOptional<import("zod").ZodString>;
291
- _meta: import("zod").ZodOptional<import("zod").ZodObject<{}, "passthrough", import("zod").ZodTypeAny, import("zod").objectOutputType<{}, import("zod").ZodTypeAny, "passthrough">, import("zod").objectInputType<{}, import("zod").ZodTypeAny, "passthrough">>>;
292
- }, {
293
- text: import("zod").ZodString;
294
- }>, import("zod").ZodTypeAny, "passthrough">, import("zod").objectInputType<import("zod").objectUtil.extendShape<{
295
- uri: import("zod").ZodString;
296
- mimeType: import("zod").ZodOptional<import("zod").ZodString>;
297
- _meta: import("zod").ZodOptional<import("zod").ZodObject<{}, "passthrough", import("zod").ZodTypeAny, import("zod").objectOutputType<{}, import("zod").ZodTypeAny, "passthrough">, import("zod").objectInputType<{}, import("zod").ZodTypeAny, "passthrough">>>;
298
- }, {
299
- text: import("zod").ZodString;
300
- }>, import("zod").ZodTypeAny, "passthrough">>, import("zod").ZodObject<import("zod").objectUtil.extendShape<{
301
- uri: import("zod").ZodString;
302
- mimeType: import("zod").ZodOptional<import("zod").ZodString>;
303
- _meta: import("zod").ZodOptional<import("zod").ZodObject<{}, "passthrough", import("zod").ZodTypeAny, import("zod").objectOutputType<{}, import("zod").ZodTypeAny, "passthrough">, import("zod").objectInputType<{}, import("zod").ZodTypeAny, "passthrough">>>;
304
- }, {
305
- blob: import("zod").ZodEffects<import("zod").ZodString, string, string>;
306
- }>, "passthrough", import("zod").ZodTypeAny, import("zod").objectOutputType<import("zod").objectUtil.extendShape<{
307
- uri: import("zod").ZodString;
308
- mimeType: import("zod").ZodOptional<import("zod").ZodString>;
309
- _meta: import("zod").ZodOptional<import("zod").ZodObject<{}, "passthrough", import("zod").ZodTypeAny, import("zod").objectOutputType<{}, import("zod").ZodTypeAny, "passthrough">, import("zod").objectInputType<{}, import("zod").ZodTypeAny, "passthrough">>>;
310
- }, {
311
- blob: import("zod").ZodEffects<import("zod").ZodString, string, string>;
312
- }>, import("zod").ZodTypeAny, "passthrough">, import("zod").objectInputType<import("zod").objectUtil.extendShape<{
313
- uri: import("zod").ZodString;
314
- mimeType: import("zod").ZodOptional<import("zod").ZodString>;
315
- _meta: import("zod").ZodOptional<import("zod").ZodObject<{}, "passthrough", import("zod").ZodTypeAny, import("zod").objectOutputType<{}, import("zod").ZodTypeAny, "passthrough">, import("zod").objectInputType<{}, import("zod").ZodTypeAny, "passthrough">>>;
316
- }, {
317
- blob: import("zod").ZodEffects<import("zod").ZodString, string, string>;
318
- }>, import("zod").ZodTypeAny, "passthrough">>]>;
319
- _meta: import("zod").ZodOptional<import("zod").ZodObject<{}, "passthrough", import("zod").ZodTypeAny, import("zod").objectOutputType<{}, import("zod").ZodTypeAny, "passthrough">, import("zod").objectInputType<{}, import("zod").ZodTypeAny, "passthrough">>>;
320
- }, import("zod").ZodTypeAny, "passthrough">>]>, "many">>;
321
- structuredContent: import("zod").ZodOptional<import("zod").ZodObject<{}, "passthrough", import("zod").ZodTypeAny, import("zod").objectOutputType<{}, import("zod").ZodTypeAny, "passthrough">, import("zod").objectInputType<{}, import("zod").ZodTypeAny, "passthrough">>>;
322
- isError: import("zod").ZodOptional<import("zod").ZodBoolean>;
323
- }, import("zod").ZodTypeAny, "passthrough"> | import("zod").objectOutputType<{
324
- _meta: import("zod").ZodOptional<import("zod").ZodObject<{}, "passthrough", import("zod").ZodTypeAny, import("zod").objectOutputType<{}, import("zod").ZodTypeAny, "passthrough">, import("zod").objectInputType<{}, import("zod").ZodTypeAny, "passthrough">>>;
325
- } & {
326
- toolResult: import("zod").ZodUnknown;
327
- }, import("zod").ZodTypeAny, "passthrough">>;
173
+ callTool(name: string, args: Record<string, unknown>): Promise<MCPToolCallResult>;
328
174
  }
175
+ /**
176
+ * The result of a tool call.
177
+ * This is the same as the result of a tool call in the OpenAI SDK, but is reified here
178
+ */
179
+ export type MCPToolCallResult = Awaited<ReturnType<typeof Client.prototype.callTool>>;
329
180
  export interface MCPToolSpec {
330
181
  name: string;
331
182
  description?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-client.d.ts","sourceRoot":"","sources":["../../src/mcp/mcp-client.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,oBAAY,YAAY;IACtB,GAAG,QAAQ;IACX,IAAI,SAAS;CACd;AACD;;;;;;;;;GASG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,SAAS,CAAqD;IACtE,OAAO,CAAC,aAAa,CAAe;IACpC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,OAAO,CAAyB;IACxC;;;;;OAKG;IACH,OAAO,CAAC,YAAY,CAAC,CAAgB;IACrC;;;OAGG;IACH,OAAO,CAAC,cAAc,CAAC,CAAgC;IACvD;;;OAGG;IACH,OAAO,CAAC,eAAe,CAAK;IAE5B;;;;;;;;;;;;;OAaG;IACH,MAAM,CAAC,QAAQ,CAAC,kBAAkB,OAAO;IACzC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,KAAK;IACvC,MAAM,CAAC,QAAQ,CAAC,cAAc,SAAU;IACxC,MAAM,CAAC,QAAQ,CAAC,oBAAoB,OAAO;IAE3C;;;;;OAKG;IACH,OAAO;IAYP;;;;;;;;;OASG;WACU,MAAM,CACjB,QAAQ,EAAE,MAAM,EAChB,aAAa,GAAE,YAAgC,EAC/C,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/B,OAAO,CAAC,SAAS,CAAC;IAKrB;;;;;;;;;;;;;;;;;OAiBG;IACG,SAAS,CAAC,UAAU,UAAQ,EAAE,kBAAkB,UAAO;IAmD7D;;;;OAIG;IACH,OAAO,CAAC,OAAO;IAIf;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAY7B;;;OAGG;IACH,OAAO,CAAC,qBAAqB;IAoC7B,OAAO,CAAC,mBAAmB;IAa3B,OAAO,CAAC,gBAAgB;IASxB;;;;;OAKG;IACG,SAAS,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IAiCzC;;;;;;OAMG;IACG,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAO3D;AASD,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B"}
1
+ {"version":3,"file":"mcp-client.d.ts","sourceRoot":"","sources":["../../src/mcp/mcp-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,0CAA0C,CAAC;AACpF,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAGnE,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,oBAAY,YAAY;IACtB,GAAG,QAAQ;IACX,IAAI,SAAS;CACd;AACD;;;;;;;;;GASG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,SAAS,CAAqD;IACtE,OAAO,CAAC,aAAa,CAAe;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IAC1B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,OAAO,CAAyB;IACxC,OAAO,CAAC,YAAY,CAAC,CAAsB;IAC3C;;;;;OAKG;IACH,OAAO,CAAC,YAAY,CAAC,CAAgB;IACrC;;;OAGG;IACH,OAAO,CAAC,cAAc,CAAC,CAAgC;IACvD;;;OAGG;IACH,OAAO,CAAC,eAAe,CAAK;IAE5B;;;;;;;;;;;;;OAaG;IACH,MAAM,CAAC,QAAQ,CAAC,kBAAkB,OAAO;IACzC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,KAAK;IACvC,MAAM,CAAC,QAAQ,CAAC,cAAc,SAAU;IACxC,MAAM,CAAC,QAAQ,CAAC,oBAAoB,OAAO;IAE3C;;;;;OAKG;IACH,OAAO;IAeP;;;;;;;;;;;;OAYG;WACU,MAAM,CACjB,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,YAAY,YAAoB,EAC/C,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,EAC3C,YAAY,EAAE,mBAAmB,GAAG,SAAS,EAC7C,SAAS,EAAE,MAAM,GAAG,SAAS,GAC5B,OAAO,CAAC,SAAS,CAAC;IAcrB;;;;;;;;;;;;;;;;;;OAkBG;IACG,SAAS,CAAC,UAAU,UAAQ,EAAE,kBAAkB,UAAO;IAuD7D;;;;OAIG;IACH,OAAO,CAAC,OAAO;IAIf;;;OAGG;IACH,OAAO,CAAC,qBAAqB;IAY7B;;;OAGG;IACH,OAAO,CAAC,qBAAqB;IAoC7B,OAAO,CAAC,mBAAmB;IAe3B,OAAO,CAAC,gBAAgB;IASxB;;;;;OAKG;IACG,SAAS,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IAiCzC,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;IAIrB,gBAAgB;;;;;;;;;;;;;IAIhB,eAAe;IAIf;;;;;;OAMG;IACG,QAAQ,CACZ,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,iBAAiB,CAAC;CAO9B;AAED;;;GAGG;AACH,MAAM,MAAM,iBAAiB,GAAG,OAAO,CACrC,UAAU,CAAC,OAAO,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,CAC7C,CAAC;AASF,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B"}