@tambo-ai/react 0.64.1 → 0.65.1
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 +304 -327
- package/dist/hooks/use-tambo-threads.d.ts +0 -12
- package/dist/hooks/use-tambo-threads.d.ts.map +1 -1
- package/dist/hooks/use-tambo-threads.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -2
- package/dist/index.js.map +1 -1
- package/dist/mcp/__tests__/elicitation.test.js +7 -3
- package/dist/mcp/__tests__/elicitation.test.js.map +1 -1
- package/dist/mcp/__tests__/mcp-hooks.test.js +149 -123
- package/dist/mcp/__tests__/mcp-hooks.test.js.map +1 -1
- package/dist/mcp/__tests__/tambo-mcp-provider.test.js +176 -120
- package/dist/mcp/__tests__/tambo-mcp-provider.test.js.map +1 -1
- package/dist/mcp/__tests__/use-mcp-servers.test.js +12 -9
- package/dist/mcp/__tests__/use-mcp-servers.test.js.map +1 -1
- package/dist/mcp/elicitation.d.ts +4 -40
- package/dist/mcp/elicitation.d.ts.map +1 -1
- package/dist/mcp/elicitation.js +1 -1
- package/dist/mcp/elicitation.js.map +1 -1
- package/dist/mcp/index.d.ts +2 -1
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js +2 -1
- package/dist/mcp/index.js.map +1 -1
- package/dist/mcp/mcp-client.d.ts +14 -26
- package/dist/mcp/mcp-client.d.ts.map +1 -1
- package/dist/mcp/mcp-client.js +4 -7
- package/dist/mcp/mcp-client.js.map +1 -1
- package/dist/mcp/mcp-hooks.d.ts +27 -78
- package/dist/mcp/mcp-hooks.d.ts.map +1 -1
- package/dist/mcp/tambo-mcp-provider.d.ts +27 -45
- package/dist/mcp/tambo-mcp-provider.d.ts.map +1 -1
- package/dist/mcp/tambo-mcp-provider.js +36 -87
- package/dist/mcp/tambo-mcp-provider.js.map +1 -1
- package/dist/model/mcp-server-info.d.ts +74 -0
- package/dist/model/mcp-server-info.d.ts.map +1 -0
- package/dist/model/mcp-server-info.js +29 -0
- package/dist/model/mcp-server-info.js.map +1 -0
- package/dist/providers/__tests__/tambo-thread-provider-initial-messages.test.js +22 -8
- package/dist/providers/__tests__/tambo-thread-provider-initial-messages.test.js.map +1 -1
- package/dist/providers/__tests__/tambo-thread-provider.test.js +318 -129
- package/dist/providers/__tests__/tambo-thread-provider.test.js.map +1 -1
- package/dist/providers/index.d.ts +1 -1
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +2 -1
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/tambo-client-provider.d.ts +4 -0
- package/dist/providers/tambo-client-provider.d.ts.map +1 -1
- package/dist/providers/tambo-client-provider.js +3 -0
- package/dist/providers/tambo-client-provider.js.map +1 -1
- package/dist/providers/tambo-mcp-token-provider.d.ts +3 -0
- package/dist/providers/tambo-mcp-token-provider.d.ts.map +1 -1
- package/dist/providers/tambo-mcp-token-provider.js +11 -3
- package/dist/providers/tambo-mcp-token-provider.js.map +1 -1
- package/dist/providers/tambo-provider.d.ts +1 -0
- package/dist/providers/tambo-provider.d.ts.map +1 -1
- package/dist/providers/tambo-provider.js +10 -5
- package/dist/providers/tambo-provider.js.map +1 -1
- package/dist/providers/tambo-registry-provider.d.ts +37 -0
- package/dist/providers/tambo-registry-provider.d.ts.map +1 -1
- package/dist/providers/tambo-registry-provider.js +162 -2
- package/dist/providers/tambo-registry-provider.js.map +1 -1
- package/dist/providers/tambo-stubs.d.ts.map +1 -1
- package/dist/providers/tambo-stubs.js +10 -1
- package/dist/providers/tambo-stubs.js.map +1 -1
- package/esm/hooks/use-tambo-threads.d.ts +0 -12
- package/esm/hooks/use-tambo-threads.d.ts.map +1 -1
- package/esm/hooks/use-tambo-threads.js.map +1 -1
- package/esm/index.d.ts +3 -1
- package/esm/index.d.ts.map +1 -1
- package/esm/index.js +3 -2
- package/esm/index.js.map +1 -1
- package/esm/mcp/__tests__/elicitation.test.js +8 -4
- package/esm/mcp/__tests__/elicitation.test.js.map +1 -1
- package/esm/mcp/__tests__/mcp-hooks.test.js +149 -123
- package/esm/mcp/__tests__/mcp-hooks.test.js.map +1 -1
- package/esm/mcp/__tests__/tambo-mcp-provider.test.js +178 -122
- package/esm/mcp/__tests__/tambo-mcp-provider.test.js.map +1 -1
- package/esm/mcp/__tests__/use-mcp-servers.test.js +12 -9
- package/esm/mcp/__tests__/use-mcp-servers.test.js.map +1 -1
- package/esm/mcp/elicitation.d.ts +4 -40
- package/esm/mcp/elicitation.d.ts.map +1 -1
- package/esm/mcp/elicitation.js +2 -2
- package/esm/mcp/elicitation.js.map +1 -1
- package/esm/mcp/index.d.ts +2 -1
- package/esm/mcp/index.d.ts.map +1 -1
- package/esm/mcp/index.js +1 -1
- package/esm/mcp/index.js.map +1 -1
- package/esm/mcp/mcp-client.d.ts +14 -26
- package/esm/mcp/mcp-client.d.ts.map +1 -1
- package/esm/mcp/mcp-client.js +3 -5
- package/esm/mcp/mcp-client.js.map +1 -1
- package/esm/mcp/mcp-hooks.d.ts +27 -78
- package/esm/mcp/mcp-hooks.d.ts.map +1 -1
- package/esm/mcp/tambo-mcp-provider.d.ts +27 -45
- package/esm/mcp/tambo-mcp-provider.d.ts.map +1 -1
- package/esm/mcp/tambo-mcp-provider.js +35 -86
- package/esm/mcp/tambo-mcp-provider.js.map +1 -1
- package/esm/model/mcp-server-info.d.ts +74 -0
- package/esm/model/mcp-server-info.d.ts.map +1 -0
- package/esm/model/mcp-server-info.js +25 -0
- package/esm/model/mcp-server-info.js.map +1 -0
- package/esm/providers/__tests__/tambo-thread-provider-initial-messages.test.js +23 -9
- package/esm/providers/__tests__/tambo-thread-provider-initial-messages.test.js.map +1 -1
- package/esm/providers/__tests__/tambo-thread-provider.test.js +319 -130
- package/esm/providers/__tests__/tambo-thread-provider.test.js.map +1 -1
- package/esm/providers/index.d.ts +1 -1
- package/esm/providers/index.d.ts.map +1 -1
- package/esm/providers/index.js +1 -1
- package/esm/providers/index.js.map +1 -1
- package/esm/providers/tambo-client-provider.d.ts +4 -0
- package/esm/providers/tambo-client-provider.d.ts.map +1 -1
- package/esm/providers/tambo-client-provider.js +3 -0
- package/esm/providers/tambo-client-provider.js.map +1 -1
- package/esm/providers/tambo-mcp-token-provider.d.ts +3 -0
- package/esm/providers/tambo-mcp-token-provider.d.ts.map +1 -1
- package/esm/providers/tambo-mcp-token-provider.js +13 -5
- package/esm/providers/tambo-mcp-token-provider.js.map +1 -1
- package/esm/providers/tambo-provider.d.ts +1 -0
- package/esm/providers/tambo-provider.d.ts.map +1 -1
- package/esm/providers/tambo-provider.js +11 -6
- package/esm/providers/tambo-provider.js.map +1 -1
- package/esm/providers/tambo-registry-provider.d.ts +37 -0
- package/esm/providers/tambo-registry-provider.d.ts.map +1 -1
- package/esm/providers/tambo-registry-provider.js +161 -2
- package/esm/providers/tambo-registry-provider.js.map +1 -1
- package/esm/providers/tambo-stubs.d.ts.map +1 -1
- package/esm/providers/tambo-stubs.js +10 -1
- package/esm/providers/tambo-stubs.js.map +1 -1
- package/package.json +6 -6
|
@@ -60,13 +60,34 @@ jest.mock("../mcp-client", () => ({
|
|
|
60
60
|
},
|
|
61
61
|
}));
|
|
62
62
|
// Mock the registry provider to avoid dependency issues
|
|
63
|
-
jest.mock("../../providers/tambo-registry-provider", () =>
|
|
64
|
-
|
|
65
|
-
|
|
63
|
+
jest.mock("../../providers/tambo-registry-provider", () => {
|
|
64
|
+
const actual = jest.requireActual("../../providers/tambo-registry-provider");
|
|
65
|
+
return {
|
|
66
|
+
...actual,
|
|
67
|
+
useTamboRegistry: jest.fn(),
|
|
68
|
+
};
|
|
69
|
+
});
|
|
66
70
|
// Mock the client provider to avoid dependency issues
|
|
67
|
-
jest.mock("../../providers/tambo-client-provider", () =>
|
|
68
|
-
|
|
69
|
-
|
|
71
|
+
jest.mock("../../providers/tambo-client-provider", () => {
|
|
72
|
+
return {
|
|
73
|
+
useTamboClient: jest.fn(),
|
|
74
|
+
TamboClientContext: react_2.default.createContext(undefined),
|
|
75
|
+
};
|
|
76
|
+
});
|
|
77
|
+
// Helper to wrap tests with all required providers (used across multiple describe blocks)
|
|
78
|
+
const TestWrapper = ({ mcpServers, handlers, children }) => {
|
|
79
|
+
const client = (0, tambo_client_provider_1.useTamboClient)();
|
|
80
|
+
return (react_2.default.createElement(tambo_client_provider_1.TamboClientContext.Provider, { value: {
|
|
81
|
+
client,
|
|
82
|
+
queryClient: {},
|
|
83
|
+
isUpdatingToken: false,
|
|
84
|
+
mcpAccessToken: null,
|
|
85
|
+
setMcpAccessToken: () => { },
|
|
86
|
+
} },
|
|
87
|
+
react_2.default.createElement(tambo_registry_provider_1.TamboRegistryProvider, { mcpServers: mcpServers },
|
|
88
|
+
react_2.default.createElement(tambo_mcp_token_provider_1.TamboMcpTokenProvider, null,
|
|
89
|
+
react_2.default.createElement(tambo_mcp_provider_1.TamboMcpProvider, { handlers: handlers }, children)))));
|
|
90
|
+
};
|
|
70
91
|
describe("extractErrorMessage", () => {
|
|
71
92
|
describe("Array content handling", () => {
|
|
72
93
|
it("should extract text from array content with multiple text items", () => {
|
|
@@ -191,17 +212,33 @@ describe("TamboMcpProvider server list changes", () => {
|
|
|
191
212
|
};
|
|
192
213
|
it("adds a new server when the list grows", async () => {
|
|
193
214
|
let latest = [];
|
|
194
|
-
const { rerender, getByTestId } = (0, react_1.render)(react_2.default.createElement(
|
|
195
|
-
|
|
196
|
-
|
|
215
|
+
const { rerender, getByTestId } = (0, react_1.render)(react_2.default.createElement(tambo_client_provider_1.TamboClientContext.Provider, { value: {
|
|
216
|
+
client: (0, tambo_client_provider_1.useTamboClient)(),
|
|
217
|
+
queryClient: {},
|
|
218
|
+
isUpdatingToken: false,
|
|
219
|
+
mcpAccessToken: null,
|
|
220
|
+
setMcpAccessToken: () => { },
|
|
221
|
+
} },
|
|
222
|
+
react_2.default.createElement(tambo_registry_provider_1.TamboRegistryProvider, { mcpServers: ["https://a.example"] },
|
|
223
|
+
react_2.default.createElement(tambo_mcp_token_provider_1.TamboMcpTokenProvider, null,
|
|
224
|
+
react_2.default.createElement(tambo_mcp_provider_1.TamboMcpProvider, null,
|
|
225
|
+
react_2.default.createElement(Capture, { onUpdate: (s) => (latest = s) }))))));
|
|
197
226
|
// Wait for initial connection
|
|
198
227
|
await (0, react_1.waitFor)(() => {
|
|
199
228
|
expect(latest.length).toBe(1);
|
|
200
229
|
});
|
|
201
230
|
// Add new server
|
|
202
|
-
rerender(react_2.default.createElement(
|
|
203
|
-
|
|
204
|
-
|
|
231
|
+
rerender(react_2.default.createElement(tambo_client_provider_1.TamboClientContext.Provider, { value: {
|
|
232
|
+
client: (0, tambo_client_provider_1.useTamboClient)(),
|
|
233
|
+
queryClient: {},
|
|
234
|
+
isUpdatingToken: false,
|
|
235
|
+
mcpAccessToken: null,
|
|
236
|
+
setMcpAccessToken: () => { },
|
|
237
|
+
} },
|
|
238
|
+
react_2.default.createElement(tambo_registry_provider_1.TamboRegistryProvider, { mcpServers: ["https://a.example", "https://b.example"] },
|
|
239
|
+
react_2.default.createElement(tambo_mcp_token_provider_1.TamboMcpTokenProvider, null,
|
|
240
|
+
react_2.default.createElement(tambo_mcp_provider_1.TamboMcpProvider, null,
|
|
241
|
+
react_2.default.createElement(Capture, { onUpdate: (s) => (latest = s) }))))));
|
|
205
242
|
await (0, react_1.waitFor)(() => {
|
|
206
243
|
expect(latest.length).toBe(2);
|
|
207
244
|
const urls = getByTestId("urls").textContent || "";
|
|
@@ -211,16 +248,32 @@ describe("TamboMcpProvider server list changes", () => {
|
|
|
211
248
|
});
|
|
212
249
|
it("removes a server when the list shrinks", async () => {
|
|
213
250
|
let latest = [];
|
|
214
|
-
const { rerender, getByTestId } = (0, react_1.render)(react_2.default.createElement(
|
|
215
|
-
|
|
216
|
-
|
|
251
|
+
const { rerender, getByTestId } = (0, react_1.render)(react_2.default.createElement(tambo_client_provider_1.TamboClientContext.Provider, { value: {
|
|
252
|
+
client: (0, tambo_client_provider_1.useTamboClient)(),
|
|
253
|
+
queryClient: {},
|
|
254
|
+
isUpdatingToken: false,
|
|
255
|
+
mcpAccessToken: null,
|
|
256
|
+
setMcpAccessToken: () => { },
|
|
257
|
+
} },
|
|
258
|
+
react_2.default.createElement(tambo_registry_provider_1.TamboRegistryProvider, { mcpServers: ["https://a.example", "https://b.example"] },
|
|
259
|
+
react_2.default.createElement(tambo_mcp_token_provider_1.TamboMcpTokenProvider, null,
|
|
260
|
+
react_2.default.createElement(tambo_mcp_provider_1.TamboMcpProvider, null,
|
|
261
|
+
react_2.default.createElement(Capture, { onUpdate: (s) => (latest = s) }))))));
|
|
217
262
|
await (0, react_1.waitFor)(() => {
|
|
218
263
|
expect(latest.length).toBe(2);
|
|
219
264
|
});
|
|
220
265
|
// Remove one server
|
|
221
|
-
rerender(react_2.default.createElement(
|
|
222
|
-
|
|
223
|
-
|
|
266
|
+
rerender(react_2.default.createElement(tambo_client_provider_1.TamboClientContext.Provider, { value: {
|
|
267
|
+
client: (0, tambo_client_provider_1.useTamboClient)(),
|
|
268
|
+
queryClient: {},
|
|
269
|
+
isUpdatingToken: false,
|
|
270
|
+
mcpAccessToken: null,
|
|
271
|
+
setMcpAccessToken: () => { },
|
|
272
|
+
} },
|
|
273
|
+
react_2.default.createElement(tambo_registry_provider_1.TamboRegistryProvider, { mcpServers: ["https://a.example"] },
|
|
274
|
+
react_2.default.createElement(tambo_mcp_token_provider_1.TamboMcpTokenProvider, null,
|
|
275
|
+
react_2.default.createElement(tambo_mcp_provider_1.TamboMcpProvider, null,
|
|
276
|
+
react_2.default.createElement(Capture, { onUpdate: (s) => (latest = s) }))))));
|
|
224
277
|
await (0, react_1.waitFor)(() => {
|
|
225
278
|
expect(latest.length).toBe(1);
|
|
226
279
|
const urls = getByTestId("urls").textContent || "";
|
|
@@ -234,9 +287,8 @@ describe("TamboMcpProvider server list changes", () => {
|
|
|
234
287
|
{ url: "https://a.example", transport: mcp_client_1.MCPTransport.SSE },
|
|
235
288
|
{ url: "https://b.example", transport: mcp_client_1.MCPTransport.SSE },
|
|
236
289
|
];
|
|
237
|
-
const { rerender } = (0, react_1.render)(react_2.default.createElement(
|
|
238
|
-
react_2.default.createElement(
|
|
239
|
-
react_2.default.createElement(Capture, { onUpdate: (s) => (latest = s) }))));
|
|
290
|
+
const { rerender } = (0, react_1.render)(react_2.default.createElement(TestWrapper, { mcpServers: initial },
|
|
291
|
+
react_2.default.createElement(Capture, { onUpdate: (s) => (latest = s) })));
|
|
240
292
|
await (0, react_1.waitFor)(() => {
|
|
241
293
|
expect(latest.length).toBe(2);
|
|
242
294
|
});
|
|
@@ -245,9 +297,8 @@ describe("TamboMcpProvider server list changes", () => {
|
|
|
245
297
|
{ url: "https://a.example", transport: mcp_client_1.MCPTransport.SSE },
|
|
246
298
|
{ url: "https://b.example", transport: mcp_client_1.MCPTransport.SSE },
|
|
247
299
|
];
|
|
248
|
-
rerender(react_2.default.createElement(
|
|
249
|
-
react_2.default.createElement(
|
|
250
|
-
react_2.default.createElement(Capture, { onUpdate: (s) => (latest = s) }))));
|
|
300
|
+
rerender(react_2.default.createElement(TestWrapper, { mcpServers: same },
|
|
301
|
+
react_2.default.createElement(Capture, { onUpdate: (s) => (latest = s) })));
|
|
251
302
|
await (0, react_1.waitFor)(() => {
|
|
252
303
|
expect(latest.length).toBe(2);
|
|
253
304
|
const urls = latest.map((s) => s.url).sort();
|
|
@@ -262,9 +313,8 @@ describe("TamboMcpProvider server list changes", () => {
|
|
|
262
313
|
mcp_client_1.MCPClient.create = createSpy;
|
|
263
314
|
let latest = [];
|
|
264
315
|
const initial = [{ url: "https://a.example", transport: mcp_client_1.MCPTransport.SSE }];
|
|
265
|
-
const { rerender } = (0, react_1.render)(react_2.default.createElement(
|
|
266
|
-
react_2.default.createElement(
|
|
267
|
-
react_2.default.createElement(Capture, { onUpdate: (s) => (latest = s) }))));
|
|
316
|
+
const { rerender } = (0, react_1.render)(react_2.default.createElement(TestWrapper, { mcpServers: initial },
|
|
317
|
+
react_2.default.createElement(Capture, { onUpdate: (s) => (latest = s) })));
|
|
268
318
|
await (0, react_1.waitFor)(() => {
|
|
269
319
|
expect(latest.length).toBe(1);
|
|
270
320
|
});
|
|
@@ -273,9 +323,8 @@ describe("TamboMcpProvider server list changes", () => {
|
|
|
273
323
|
const firstClient = latest[0].client;
|
|
274
324
|
// Pass a new array with same server
|
|
275
325
|
const same = [{ url: "https://a.example", transport: mcp_client_1.MCPTransport.SSE }];
|
|
276
|
-
rerender(react_2.default.createElement(
|
|
277
|
-
react_2.default.createElement(
|
|
278
|
-
react_2.default.createElement(Capture, { onUpdate: (s) => (latest = s) }))));
|
|
326
|
+
rerender(react_2.default.createElement(TestWrapper, { mcpServers: same },
|
|
327
|
+
react_2.default.createElement(Capture, { onUpdate: (s) => (latest = s) })));
|
|
279
328
|
await (0, react_1.waitFor)(() => {
|
|
280
329
|
expect(latest.length).toBe(1);
|
|
281
330
|
});
|
|
@@ -292,17 +341,33 @@ describe("TamboMcpProvider server list changes", () => {
|
|
|
292
341
|
});
|
|
293
342
|
mcp_client_1.MCPClient.create = createSpy;
|
|
294
343
|
let latest = [];
|
|
295
|
-
const { rerender } = (0, react_1.render)(react_2.default.createElement(
|
|
296
|
-
|
|
297
|
-
|
|
344
|
+
const { rerender } = (0, react_1.render)(react_2.default.createElement(tambo_client_provider_1.TamboClientContext.Provider, { value: {
|
|
345
|
+
client: (0, tambo_client_provider_1.useTamboClient)(),
|
|
346
|
+
queryClient: {},
|
|
347
|
+
isUpdatingToken: false,
|
|
348
|
+
mcpAccessToken: null,
|
|
349
|
+
setMcpAccessToken: () => { },
|
|
350
|
+
} },
|
|
351
|
+
react_2.default.createElement(tambo_registry_provider_1.TamboRegistryProvider, { mcpServers: ["https://a.example", "https://b.example"] },
|
|
352
|
+
react_2.default.createElement(tambo_mcp_token_provider_1.TamboMcpTokenProvider, null,
|
|
353
|
+
react_2.default.createElement(tambo_mcp_provider_1.TamboMcpProvider, null,
|
|
354
|
+
react_2.default.createElement(Capture, { onUpdate: (s) => (latest = s) }))))));
|
|
298
355
|
await (0, react_1.waitFor)(() => {
|
|
299
356
|
expect(latest.length).toBe(2);
|
|
300
357
|
});
|
|
301
358
|
expect(closeSpy).not.toHaveBeenCalled();
|
|
302
359
|
// Remove one server
|
|
303
|
-
rerender(react_2.default.createElement(
|
|
304
|
-
|
|
305
|
-
|
|
360
|
+
rerender(react_2.default.createElement(tambo_client_provider_1.TamboClientContext.Provider, { value: {
|
|
361
|
+
client: (0, tambo_client_provider_1.useTamboClient)(),
|
|
362
|
+
queryClient: {},
|
|
363
|
+
isUpdatingToken: false,
|
|
364
|
+
mcpAccessToken: null,
|
|
365
|
+
setMcpAccessToken: () => { },
|
|
366
|
+
} },
|
|
367
|
+
react_2.default.createElement(tambo_registry_provider_1.TamboRegistryProvider, { mcpServers: ["https://a.example"] },
|
|
368
|
+
react_2.default.createElement(tambo_mcp_token_provider_1.TamboMcpTokenProvider, null,
|
|
369
|
+
react_2.default.createElement(tambo_mcp_provider_1.TamboMcpProvider, null,
|
|
370
|
+
react_2.default.createElement(Capture, { onUpdate: (s) => (latest = s) }))))));
|
|
306
371
|
await (0, react_1.waitFor)(() => {
|
|
307
372
|
expect(latest.length).toBe(1);
|
|
308
373
|
});
|
|
@@ -317,9 +382,17 @@ describe("TamboMcpProvider server list changes", () => {
|
|
|
317
382
|
});
|
|
318
383
|
mcp_client_1.MCPClient.create = createSpy;
|
|
319
384
|
let latest = [];
|
|
320
|
-
const { unmount } = (0, react_1.render)(react_2.default.createElement(
|
|
321
|
-
|
|
322
|
-
|
|
385
|
+
const { unmount } = (0, react_1.render)(react_2.default.createElement(tambo_client_provider_1.TamboClientContext.Provider, { value: {
|
|
386
|
+
client: (0, tambo_client_provider_1.useTamboClient)(),
|
|
387
|
+
queryClient: {},
|
|
388
|
+
isUpdatingToken: false,
|
|
389
|
+
mcpAccessToken: null,
|
|
390
|
+
setMcpAccessToken: () => { },
|
|
391
|
+
} },
|
|
392
|
+
react_2.default.createElement(tambo_registry_provider_1.TamboRegistryProvider, { mcpServers: ["https://a.example", "https://b.example"] },
|
|
393
|
+
react_2.default.createElement(tambo_mcp_token_provider_1.TamboMcpTokenProvider, null,
|
|
394
|
+
react_2.default.createElement(tambo_mcp_provider_1.TamboMcpProvider, null,
|
|
395
|
+
react_2.default.createElement(Capture, { onUpdate: (s) => (latest = s) }))))));
|
|
323
396
|
await (0, react_1.waitFor)(() => {
|
|
324
397
|
expect(latest.length).toBe(2);
|
|
325
398
|
});
|
|
@@ -342,15 +415,14 @@ describe("TamboMcpProvider server list changes", () => {
|
|
|
342
415
|
});
|
|
343
416
|
mcp_client_1.MCPClient.create = createSpy;
|
|
344
417
|
let latest = [];
|
|
345
|
-
const { rerender } = (0, react_1.render)(react_2.default.createElement(
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
react_2.default.createElement(Capture, { onUpdate: (s) => (latest = s) }))));
|
|
418
|
+
const { rerender } = (0, react_1.render)(react_2.default.createElement(TestWrapper, { mcpServers: [
|
|
419
|
+
{
|
|
420
|
+
url: "https://a.example",
|
|
421
|
+
transport: mcp_client_1.MCPTransport.SSE,
|
|
422
|
+
customHeaders: { Authorization: "Bearer token1" },
|
|
423
|
+
},
|
|
424
|
+
] },
|
|
425
|
+
react_2.default.createElement(Capture, { onUpdate: (s) => (latest = s) })));
|
|
354
426
|
await (0, react_1.waitFor)(() => {
|
|
355
427
|
expect(latest.length).toBe(1);
|
|
356
428
|
expect(createSpy).toHaveBeenCalledTimes(1);
|
|
@@ -358,15 +430,14 @@ describe("TamboMcpProvider server list changes", () => {
|
|
|
358
430
|
const firstClientId = latest[0].client?.id;
|
|
359
431
|
expect(firstClientId).toBe(1);
|
|
360
432
|
// Change the customHeaders
|
|
361
|
-
rerender(react_2.default.createElement(
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
react_2.default.createElement(Capture, { onUpdate: (s) => (latest = s) }))));
|
|
433
|
+
rerender(react_2.default.createElement(TestWrapper, { mcpServers: [
|
|
434
|
+
{
|
|
435
|
+
url: "https://a.example",
|
|
436
|
+
transport: mcp_client_1.MCPTransport.SSE,
|
|
437
|
+
customHeaders: { Authorization: "Bearer token2" },
|
|
438
|
+
},
|
|
439
|
+
] },
|
|
440
|
+
react_2.default.createElement(Capture, { onUpdate: (s) => (latest = s) })));
|
|
370
441
|
// Wait for old client to be closed and new client to be created
|
|
371
442
|
await (0, react_1.waitFor)(() => {
|
|
372
443
|
expect(closeSpy).toHaveBeenCalledTimes(1);
|
|
@@ -418,13 +489,12 @@ describe("TamboMcpProvider handler support", () => {
|
|
|
418
489
|
elicitation: mockElicitationHandler,
|
|
419
490
|
};
|
|
420
491
|
let latest = [];
|
|
421
|
-
(0, react_1.render)(react_2.default.createElement(
|
|
422
|
-
react_2.default.createElement(
|
|
423
|
-
react_2.default.createElement(Capture, { onUpdate: (s) => (latest = s) }))));
|
|
492
|
+
(0, react_1.render)(react_2.default.createElement(TestWrapper, { mcpServers: ["https://test.example"], handlers: handlers },
|
|
493
|
+
react_2.default.createElement(Capture, { onUpdate: (s) => (latest = s) })));
|
|
424
494
|
await (0, react_1.waitFor)(() => {
|
|
425
495
|
expect(latest.length).toBe(1);
|
|
426
496
|
});
|
|
427
|
-
// Verify MCPClient.create was called
|
|
497
|
+
// Verify MCPClient.create was called with an HTTP transport and wrapped handler
|
|
428
498
|
expect(createSpy).toHaveBeenCalledWith("https://test.example", mcp_client_1.MCPTransport.HTTP, undefined, undefined, undefined, expect.objectContaining({
|
|
429
499
|
elicitation: expect.any(Function),
|
|
430
500
|
}));
|
|
@@ -440,7 +510,7 @@ describe("TamboMcpProvider handler support", () => {
|
|
|
440
510
|
await passedHandlers.elicitation(mockRequest, mockExtra);
|
|
441
511
|
expect(mockElicitationHandler).toHaveBeenCalledWith(mockRequest, mockExtra, expect.objectContaining({
|
|
442
512
|
url: "https://test.example",
|
|
443
|
-
|
|
513
|
+
serverKey: "test",
|
|
444
514
|
}));
|
|
445
515
|
});
|
|
446
516
|
it("should pass provider-level sampling handler to MCPClient.create", async () => {
|
|
@@ -454,13 +524,12 @@ describe("TamboMcpProvider handler support", () => {
|
|
|
454
524
|
sampling: mockSamplingHandler,
|
|
455
525
|
};
|
|
456
526
|
let latest = [];
|
|
457
|
-
(0, react_1.render)(react_2.default.createElement(
|
|
458
|
-
react_2.default.createElement(
|
|
459
|
-
react_2.default.createElement(Capture, { onUpdate: (s) => (latest = s) }))));
|
|
527
|
+
(0, react_1.render)(react_2.default.createElement(TestWrapper, { mcpServers: ["https://test.example"], handlers: handlers },
|
|
528
|
+
react_2.default.createElement(Capture, { onUpdate: (s) => (latest = s) })));
|
|
460
529
|
await (0, react_1.waitFor)(() => {
|
|
461
530
|
expect(latest.length).toBe(1);
|
|
462
531
|
});
|
|
463
|
-
// Verify MCPClient.create was called with sampling handler
|
|
532
|
+
// Verify MCPClient.create was called with HTTP transport and sampling handler
|
|
464
533
|
expect(createSpy).toHaveBeenCalledWith("https://test.example", mcp_client_1.MCPTransport.HTTP, undefined, undefined, undefined, expect.objectContaining({
|
|
465
534
|
sampling: expect.any(Function),
|
|
466
535
|
}));
|
|
@@ -477,7 +546,7 @@ describe("TamboMcpProvider handler support", () => {
|
|
|
477
546
|
await passedHandlers.sampling(mockRequest, mockExtra);
|
|
478
547
|
expect(mockSamplingHandler).toHaveBeenCalledWith(mockRequest, mockExtra, expect.objectContaining({
|
|
479
548
|
url: "https://test.example",
|
|
480
|
-
|
|
549
|
+
serverKey: "test",
|
|
481
550
|
}));
|
|
482
551
|
});
|
|
483
552
|
it("should allow per-server handlers to override provider-level handlers", async () => {
|
|
@@ -491,16 +560,15 @@ describe("TamboMcpProvider handler support", () => {
|
|
|
491
560
|
elicitation: providerElicitationHandler,
|
|
492
561
|
};
|
|
493
562
|
let latest = [];
|
|
494
|
-
(0, react_1.render)(react_2.default.createElement(
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
elicitation: serverElicitationHandler,
|
|
500
|
-
},
|
|
563
|
+
(0, react_1.render)(react_2.default.createElement(TestWrapper, { mcpServers: [
|
|
564
|
+
{
|
|
565
|
+
url: "https://test.example",
|
|
566
|
+
handlers: {
|
|
567
|
+
elicitation: serverElicitationHandler,
|
|
501
568
|
},
|
|
502
|
-
|
|
503
|
-
|
|
569
|
+
},
|
|
570
|
+
], handlers: handlers },
|
|
571
|
+
react_2.default.createElement(Capture, { onUpdate: (s) => (latest = s) })));
|
|
504
572
|
await (0, react_1.waitFor)(() => {
|
|
505
573
|
expect(latest.length).toBe(1);
|
|
506
574
|
});
|
|
@@ -516,12 +584,11 @@ describe("TamboMcpProvider handler support", () => {
|
|
|
516
584
|
elicitation: mockElicitationHandler,
|
|
517
585
|
};
|
|
518
586
|
let latest = [];
|
|
519
|
-
(0, react_1.render)(react_2.default.createElement(
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
react_2.default.createElement(Capture, { onUpdate: (s) => (latest = s) }))));
|
|
587
|
+
(0, react_1.render)(react_2.default.createElement(TestWrapper, { mcpServers: [
|
|
588
|
+
{ url: "https://server-a.example", name: "Server A" },
|
|
589
|
+
{ url: "https://server-b.example", name: "Server B" },
|
|
590
|
+
], handlers: handlers },
|
|
591
|
+
react_2.default.createElement(Capture, { onUpdate: (s) => (latest = s) })));
|
|
525
592
|
await (0, react_1.waitFor)(() => {
|
|
526
593
|
expect(latest.length).toBe(2);
|
|
527
594
|
});
|
|
@@ -557,16 +624,14 @@ describe("TamboMcpProvider handler support", () => {
|
|
|
557
624
|
content: [{ type: "text", text: "updated" }],
|
|
558
625
|
});
|
|
559
626
|
let latest = [];
|
|
560
|
-
const { rerender } = (0, react_1.render)(react_2.default.createElement(
|
|
561
|
-
react_2.default.createElement(
|
|
562
|
-
react_2.default.createElement(Capture, { onUpdate: (s) => (latest = s) }))));
|
|
627
|
+
const { rerender } = (0, react_1.render)(react_2.default.createElement(TestWrapper, { mcpServers: ["https://test.example"], handlers: { elicitation: initialHandler } },
|
|
628
|
+
react_2.default.createElement(Capture, { onUpdate: (s) => (latest = s) })));
|
|
563
629
|
await (0, react_1.waitFor)(() => {
|
|
564
630
|
expect(latest.length).toBe(1);
|
|
565
631
|
});
|
|
566
632
|
// Update the handlers
|
|
567
|
-
rerender(react_2.default.createElement(
|
|
568
|
-
react_2.default.createElement(
|
|
569
|
-
react_2.default.createElement(Capture, { onUpdate: (s) => (latest = s) }))));
|
|
633
|
+
rerender(react_2.default.createElement(TestWrapper, { mcpServers: ["https://test.example"], handlers: { elicitation: updatedHandler } },
|
|
634
|
+
react_2.default.createElement(Capture, { onUpdate: (s) => (latest = s) })));
|
|
570
635
|
await (0, react_1.waitFor)(() => {
|
|
571
636
|
expect(mockClient.updateElicitationHandler).toHaveBeenCalled();
|
|
572
637
|
});
|
|
@@ -599,9 +664,8 @@ describe("TamboMcpProvider serverKey derivation and tool prefixing", () => {
|
|
|
599
664
|
close: jest.fn(),
|
|
600
665
|
});
|
|
601
666
|
let latest = [];
|
|
602
|
-
(0, react_1.render)(react_2.default.createElement(
|
|
603
|
-
react_2.default.createElement(
|
|
604
|
-
react_2.default.createElement(Capture, { onUpdate: (s) => (latest = s) }))));
|
|
667
|
+
(0, react_1.render)(react_2.default.createElement(TestWrapper, { mcpServers: ["https://mcp.linear.app/mcp"] },
|
|
668
|
+
react_2.default.createElement(Capture, { onUpdate: (s) => (latest = s) })));
|
|
605
669
|
await (0, react_1.waitFor)(() => {
|
|
606
670
|
expect(latest.length).toBe(1);
|
|
607
671
|
expect(latest[0].serverKey).toBe("linear");
|
|
@@ -613,14 +677,13 @@ describe("TamboMcpProvider serverKey derivation and tool prefixing", () => {
|
|
|
613
677
|
close: jest.fn(),
|
|
614
678
|
});
|
|
615
679
|
let latest = [];
|
|
616
|
-
(0, react_1.render)(react_2.default.createElement(
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
react_2.default.createElement(Capture, { onUpdate: (s) => (latest = s) }))));
|
|
680
|
+
(0, react_1.render)(react_2.default.createElement(TestWrapper, { mcpServers: [
|
|
681
|
+
{
|
|
682
|
+
url: "https://mcp.linear.app/mcp",
|
|
683
|
+
serverKey: "custom-key",
|
|
684
|
+
},
|
|
685
|
+
] },
|
|
686
|
+
react_2.default.createElement(Capture, { onUpdate: (s) => (latest = s) })));
|
|
624
687
|
await (0, react_1.waitFor)(() => {
|
|
625
688
|
expect(latest.length).toBe(1);
|
|
626
689
|
expect(latest[0].serverKey).toBe("custom-key");
|
|
@@ -640,9 +703,8 @@ describe("TamboMcpProvider serverKey derivation and tool prefixing", () => {
|
|
|
640
703
|
];
|
|
641
704
|
for (const { url, expected } of testCases) {
|
|
642
705
|
let latest = [];
|
|
643
|
-
const { unmount } = (0, react_1.render)(react_2.default.createElement(
|
|
644
|
-
react_2.default.createElement(
|
|
645
|
-
react_2.default.createElement(Capture, { onUpdate: (s) => (latest = s) }))));
|
|
706
|
+
const { unmount } = (0, react_1.render)(react_2.default.createElement(TestWrapper, { mcpServers: [url] },
|
|
707
|
+
react_2.default.createElement(Capture, { onUpdate: (s) => (latest = s) })));
|
|
646
708
|
await (0, react_1.waitFor)(() => {
|
|
647
709
|
expect(latest.length).toBe(1);
|
|
648
710
|
expect(latest[0].serverKey).toBe(expected);
|
|
@@ -662,9 +724,8 @@ describe("TamboMcpProvider serverKey derivation and tool prefixing", () => {
|
|
|
662
724
|
close: jest.fn(),
|
|
663
725
|
});
|
|
664
726
|
let latest = [];
|
|
665
|
-
(0, react_1.render)(react_2.default.createElement(
|
|
666
|
-
react_2.default.createElement(
|
|
667
|
-
react_2.default.createElement(Capture, { onUpdate: (s) => (latest = s) }))));
|
|
727
|
+
(0, react_1.render)(react_2.default.createElement(TestWrapper, { mcpServers: ["https://mcp.linear.app/mcp"] },
|
|
728
|
+
react_2.default.createElement(Capture, { onUpdate: (s) => (latest = s) })));
|
|
668
729
|
await (0, react_1.waitFor)(() => {
|
|
669
730
|
expect(latest.length).toBe(1);
|
|
670
731
|
expect(mockRegisterTool).toHaveBeenCalledWith(expect.objectContaining({
|
|
@@ -682,12 +743,8 @@ describe("TamboMcpProvider serverKey derivation and tool prefixing", () => {
|
|
|
682
743
|
close: jest.fn(),
|
|
683
744
|
});
|
|
684
745
|
let latest = [];
|
|
685
|
-
(0, react_1.render)(react_2.default.createElement(
|
|
686
|
-
react_2.default.createElement(
|
|
687
|
-
"https://mcp.linear.app/mcp",
|
|
688
|
-
"https://api.github.com",
|
|
689
|
-
] },
|
|
690
|
-
react_2.default.createElement(Capture, { onUpdate: (s) => (latest = s) }))));
|
|
746
|
+
(0, react_1.render)(react_2.default.createElement(TestWrapper, { mcpServers: ["https://mcp.linear.app/mcp", "https://api.github.com"] },
|
|
747
|
+
react_2.default.createElement(Capture, { onUpdate: (s) => (latest = s) })));
|
|
691
748
|
await (0, react_1.waitFor)(() => {
|
|
692
749
|
expect(latest.length).toBe(2);
|
|
693
750
|
// Check that tools are registered with prefixed names
|
|
@@ -711,15 +768,14 @@ describe("TamboMcpProvider serverKey derivation and tool prefixing", () => {
|
|
|
711
768
|
close: jest.fn(),
|
|
712
769
|
});
|
|
713
770
|
let latest = [];
|
|
714
|
-
(0, react_1.render)(react_2.default.createElement(
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
react_2.default.createElement(Capture, { onUpdate: (s) => (latest = s) }))));
|
|
771
|
+
(0, react_1.render)(react_2.default.createElement(TestWrapper, { mcpServers: [
|
|
772
|
+
{
|
|
773
|
+
url: "https://mcp.linear.app/mcp",
|
|
774
|
+
serverKey: "my-server",
|
|
775
|
+
},
|
|
776
|
+
"https://api.github.com",
|
|
777
|
+
] },
|
|
778
|
+
react_2.default.createElement(Capture, { onUpdate: (s) => (latest = s) })));
|
|
723
779
|
await (0, react_1.waitFor)(() => {
|
|
724
780
|
expect(latest.length).toBe(2);
|
|
725
781
|
const calls = mockRegisterTool.mock.calls;
|