@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.
Files changed (130) hide show
  1. package/README.md +304 -327
  2. package/dist/hooks/use-tambo-threads.d.ts +0 -12
  3. package/dist/hooks/use-tambo-threads.d.ts.map +1 -1
  4. package/dist/hooks/use-tambo-threads.js.map +1 -1
  5. package/dist/index.d.ts +3 -1
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +6 -2
  8. package/dist/index.js.map +1 -1
  9. package/dist/mcp/__tests__/elicitation.test.js +7 -3
  10. package/dist/mcp/__tests__/elicitation.test.js.map +1 -1
  11. package/dist/mcp/__tests__/mcp-hooks.test.js +149 -123
  12. package/dist/mcp/__tests__/mcp-hooks.test.js.map +1 -1
  13. package/dist/mcp/__tests__/tambo-mcp-provider.test.js +176 -120
  14. package/dist/mcp/__tests__/tambo-mcp-provider.test.js.map +1 -1
  15. package/dist/mcp/__tests__/use-mcp-servers.test.js +12 -9
  16. package/dist/mcp/__tests__/use-mcp-servers.test.js.map +1 -1
  17. package/dist/mcp/elicitation.d.ts +4 -40
  18. package/dist/mcp/elicitation.d.ts.map +1 -1
  19. package/dist/mcp/elicitation.js +1 -1
  20. package/dist/mcp/elicitation.js.map +1 -1
  21. package/dist/mcp/index.d.ts +2 -1
  22. package/dist/mcp/index.d.ts.map +1 -1
  23. package/dist/mcp/index.js +2 -1
  24. package/dist/mcp/index.js.map +1 -1
  25. package/dist/mcp/mcp-client.d.ts +14 -26
  26. package/dist/mcp/mcp-client.d.ts.map +1 -1
  27. package/dist/mcp/mcp-client.js +4 -7
  28. package/dist/mcp/mcp-client.js.map +1 -1
  29. package/dist/mcp/mcp-hooks.d.ts +27 -78
  30. package/dist/mcp/mcp-hooks.d.ts.map +1 -1
  31. package/dist/mcp/tambo-mcp-provider.d.ts +27 -45
  32. package/dist/mcp/tambo-mcp-provider.d.ts.map +1 -1
  33. package/dist/mcp/tambo-mcp-provider.js +36 -87
  34. package/dist/mcp/tambo-mcp-provider.js.map +1 -1
  35. package/dist/model/mcp-server-info.d.ts +74 -0
  36. package/dist/model/mcp-server-info.d.ts.map +1 -0
  37. package/dist/model/mcp-server-info.js +29 -0
  38. package/dist/model/mcp-server-info.js.map +1 -0
  39. package/dist/providers/__tests__/tambo-thread-provider-initial-messages.test.js +22 -8
  40. package/dist/providers/__tests__/tambo-thread-provider-initial-messages.test.js.map +1 -1
  41. package/dist/providers/__tests__/tambo-thread-provider.test.js +318 -129
  42. package/dist/providers/__tests__/tambo-thread-provider.test.js.map +1 -1
  43. package/dist/providers/index.d.ts +1 -1
  44. package/dist/providers/index.d.ts.map +1 -1
  45. package/dist/providers/index.js +2 -1
  46. package/dist/providers/index.js.map +1 -1
  47. package/dist/providers/tambo-client-provider.d.ts +4 -0
  48. package/dist/providers/tambo-client-provider.d.ts.map +1 -1
  49. package/dist/providers/tambo-client-provider.js +3 -0
  50. package/dist/providers/tambo-client-provider.js.map +1 -1
  51. package/dist/providers/tambo-mcp-token-provider.d.ts +3 -0
  52. package/dist/providers/tambo-mcp-token-provider.d.ts.map +1 -1
  53. package/dist/providers/tambo-mcp-token-provider.js +11 -3
  54. package/dist/providers/tambo-mcp-token-provider.js.map +1 -1
  55. package/dist/providers/tambo-provider.d.ts +1 -0
  56. package/dist/providers/tambo-provider.d.ts.map +1 -1
  57. package/dist/providers/tambo-provider.js +10 -5
  58. package/dist/providers/tambo-provider.js.map +1 -1
  59. package/dist/providers/tambo-registry-provider.d.ts +37 -0
  60. package/dist/providers/tambo-registry-provider.d.ts.map +1 -1
  61. package/dist/providers/tambo-registry-provider.js +162 -2
  62. package/dist/providers/tambo-registry-provider.js.map +1 -1
  63. package/dist/providers/tambo-stubs.d.ts.map +1 -1
  64. package/dist/providers/tambo-stubs.js +10 -1
  65. package/dist/providers/tambo-stubs.js.map +1 -1
  66. package/esm/hooks/use-tambo-threads.d.ts +0 -12
  67. package/esm/hooks/use-tambo-threads.d.ts.map +1 -1
  68. package/esm/hooks/use-tambo-threads.js.map +1 -1
  69. package/esm/index.d.ts +3 -1
  70. package/esm/index.d.ts.map +1 -1
  71. package/esm/index.js +3 -2
  72. package/esm/index.js.map +1 -1
  73. package/esm/mcp/__tests__/elicitation.test.js +8 -4
  74. package/esm/mcp/__tests__/elicitation.test.js.map +1 -1
  75. package/esm/mcp/__tests__/mcp-hooks.test.js +149 -123
  76. package/esm/mcp/__tests__/mcp-hooks.test.js.map +1 -1
  77. package/esm/mcp/__tests__/tambo-mcp-provider.test.js +178 -122
  78. package/esm/mcp/__tests__/tambo-mcp-provider.test.js.map +1 -1
  79. package/esm/mcp/__tests__/use-mcp-servers.test.js +12 -9
  80. package/esm/mcp/__tests__/use-mcp-servers.test.js.map +1 -1
  81. package/esm/mcp/elicitation.d.ts +4 -40
  82. package/esm/mcp/elicitation.d.ts.map +1 -1
  83. package/esm/mcp/elicitation.js +2 -2
  84. package/esm/mcp/elicitation.js.map +1 -1
  85. package/esm/mcp/index.d.ts +2 -1
  86. package/esm/mcp/index.d.ts.map +1 -1
  87. package/esm/mcp/index.js +1 -1
  88. package/esm/mcp/index.js.map +1 -1
  89. package/esm/mcp/mcp-client.d.ts +14 -26
  90. package/esm/mcp/mcp-client.d.ts.map +1 -1
  91. package/esm/mcp/mcp-client.js +3 -5
  92. package/esm/mcp/mcp-client.js.map +1 -1
  93. package/esm/mcp/mcp-hooks.d.ts +27 -78
  94. package/esm/mcp/mcp-hooks.d.ts.map +1 -1
  95. package/esm/mcp/tambo-mcp-provider.d.ts +27 -45
  96. package/esm/mcp/tambo-mcp-provider.d.ts.map +1 -1
  97. package/esm/mcp/tambo-mcp-provider.js +35 -86
  98. package/esm/mcp/tambo-mcp-provider.js.map +1 -1
  99. package/esm/model/mcp-server-info.d.ts +74 -0
  100. package/esm/model/mcp-server-info.d.ts.map +1 -0
  101. package/esm/model/mcp-server-info.js +25 -0
  102. package/esm/model/mcp-server-info.js.map +1 -0
  103. package/esm/providers/__tests__/tambo-thread-provider-initial-messages.test.js +23 -9
  104. package/esm/providers/__tests__/tambo-thread-provider-initial-messages.test.js.map +1 -1
  105. package/esm/providers/__tests__/tambo-thread-provider.test.js +319 -130
  106. package/esm/providers/__tests__/tambo-thread-provider.test.js.map +1 -1
  107. package/esm/providers/index.d.ts +1 -1
  108. package/esm/providers/index.d.ts.map +1 -1
  109. package/esm/providers/index.js +1 -1
  110. package/esm/providers/index.js.map +1 -1
  111. package/esm/providers/tambo-client-provider.d.ts +4 -0
  112. package/esm/providers/tambo-client-provider.d.ts.map +1 -1
  113. package/esm/providers/tambo-client-provider.js +3 -0
  114. package/esm/providers/tambo-client-provider.js.map +1 -1
  115. package/esm/providers/tambo-mcp-token-provider.d.ts +3 -0
  116. package/esm/providers/tambo-mcp-token-provider.d.ts.map +1 -1
  117. package/esm/providers/tambo-mcp-token-provider.js +13 -5
  118. package/esm/providers/tambo-mcp-token-provider.js.map +1 -1
  119. package/esm/providers/tambo-provider.d.ts +1 -0
  120. package/esm/providers/tambo-provider.d.ts.map +1 -1
  121. package/esm/providers/tambo-provider.js +11 -6
  122. package/esm/providers/tambo-provider.js.map +1 -1
  123. package/esm/providers/tambo-registry-provider.d.ts +37 -0
  124. package/esm/providers/tambo-registry-provider.d.ts.map +1 -1
  125. package/esm/providers/tambo-registry-provider.js +161 -2
  126. package/esm/providers/tambo-registry-provider.js.map +1 -1
  127. package/esm/providers/tambo-stubs.d.ts.map +1 -1
  128. package/esm/providers/tambo-stubs.js +10 -1
  129. package/esm/providers/tambo-stubs.js.map +1 -1
  130. 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
- useTamboRegistry: jest.fn(),
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
- useTamboClient: jest.fn(),
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(tambo_mcp_token_provider_1.TamboMcpTokenProvider, null,
195
- react_2.default.createElement(tambo_mcp_provider_1.TamboMcpProvider, { mcpServers: ["https://a.example"] },
196
- react_2.default.createElement(Capture, { onUpdate: (s) => (latest = s) }))));
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(tambo_mcp_token_provider_1.TamboMcpTokenProvider, null,
203
- react_2.default.createElement(tambo_mcp_provider_1.TamboMcpProvider, { mcpServers: ["https://a.example", "https://b.example"] },
204
- react_2.default.createElement(Capture, { onUpdate: (s) => (latest = s) }))));
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(tambo_mcp_token_provider_1.TamboMcpTokenProvider, null,
215
- react_2.default.createElement(tambo_mcp_provider_1.TamboMcpProvider, { mcpServers: ["https://a.example", "https://b.example"] },
216
- react_2.default.createElement(Capture, { onUpdate: (s) => (latest = s) }))));
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(tambo_mcp_token_provider_1.TamboMcpTokenProvider, null,
222
- react_2.default.createElement(tambo_mcp_provider_1.TamboMcpProvider, { mcpServers: ["https://a.example"] },
223
- react_2.default.createElement(Capture, { onUpdate: (s) => (latest = s) }))));
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(tambo_mcp_token_provider_1.TamboMcpTokenProvider, null,
238
- react_2.default.createElement(tambo_mcp_provider_1.TamboMcpProvider, { mcpServers: initial },
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(tambo_mcp_token_provider_1.TamboMcpTokenProvider, null,
249
- react_2.default.createElement(tambo_mcp_provider_1.TamboMcpProvider, { mcpServers: same },
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(tambo_mcp_token_provider_1.TamboMcpTokenProvider, null,
266
- react_2.default.createElement(tambo_mcp_provider_1.TamboMcpProvider, { mcpServers: initial },
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(tambo_mcp_token_provider_1.TamboMcpTokenProvider, null,
277
- react_2.default.createElement(tambo_mcp_provider_1.TamboMcpProvider, { mcpServers: same },
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(tambo_mcp_token_provider_1.TamboMcpTokenProvider, null,
296
- react_2.default.createElement(tambo_mcp_provider_1.TamboMcpProvider, { mcpServers: ["https://a.example", "https://b.example"] },
297
- react_2.default.createElement(Capture, { onUpdate: (s) => (latest = s) }))));
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(tambo_mcp_token_provider_1.TamboMcpTokenProvider, null,
304
- react_2.default.createElement(tambo_mcp_provider_1.TamboMcpProvider, { mcpServers: ["https://a.example"] },
305
- react_2.default.createElement(Capture, { onUpdate: (s) => (latest = s) }))));
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(tambo_mcp_token_provider_1.TamboMcpTokenProvider, null,
321
- react_2.default.createElement(tambo_mcp_provider_1.TamboMcpProvider, { mcpServers: ["https://a.example", "https://b.example"] },
322
- react_2.default.createElement(Capture, { onUpdate: (s) => (latest = s) }))));
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(tambo_mcp_token_provider_1.TamboMcpTokenProvider, null,
346
- react_2.default.createElement(tambo_mcp_provider_1.TamboMcpProvider, { mcpServers: [
347
- {
348
- url: "https://a.example",
349
- transport: mcp_client_1.MCPTransport.SSE,
350
- customHeaders: { Authorization: "Bearer token1" },
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(tambo_mcp_token_provider_1.TamboMcpTokenProvider, null,
362
- react_2.default.createElement(tambo_mcp_provider_1.TamboMcpProvider, { mcpServers: [
363
- {
364
- url: "https://a.example",
365
- transport: mcp_client_1.MCPTransport.SSE,
366
- customHeaders: { Authorization: "Bearer token2" },
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(tambo_mcp_token_provider_1.TamboMcpTokenProvider, null,
422
- react_2.default.createElement(tambo_mcp_provider_1.TamboMcpProvider, { mcpServers: ["https://test.example"], handlers: handlers },
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
- transport: mcp_client_1.MCPTransport.HTTP,
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(tambo_mcp_token_provider_1.TamboMcpTokenProvider, null,
458
- react_2.default.createElement(tambo_mcp_provider_1.TamboMcpProvider, { mcpServers: ["https://test.example"], handlers: handlers },
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
- transport: mcp_client_1.MCPTransport.HTTP,
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(tambo_mcp_token_provider_1.TamboMcpTokenProvider, null,
495
- react_2.default.createElement(tambo_mcp_provider_1.TamboMcpProvider, { mcpServers: [
496
- {
497
- url: "https://test.example",
498
- handlers: {
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
- ], handlers: handlers },
503
- react_2.default.createElement(Capture, { onUpdate: (s) => (latest = s) }))));
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(tambo_mcp_token_provider_1.TamboMcpTokenProvider, null,
520
- react_2.default.createElement(tambo_mcp_provider_1.TamboMcpProvider, { mcpServers: [
521
- { url: "https://server-a.example", name: "Server A" },
522
- { url: "https://server-b.example", name: "Server B" },
523
- ], handlers: handlers },
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(tambo_mcp_token_provider_1.TamboMcpTokenProvider, null,
561
- react_2.default.createElement(tambo_mcp_provider_1.TamboMcpProvider, { mcpServers: ["https://test.example"], handlers: { elicitation: initialHandler } },
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(tambo_mcp_token_provider_1.TamboMcpTokenProvider, null,
568
- react_2.default.createElement(tambo_mcp_provider_1.TamboMcpProvider, { mcpServers: ["https://test.example"], handlers: { elicitation: updatedHandler } },
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(tambo_mcp_token_provider_1.TamboMcpTokenProvider, null,
603
- react_2.default.createElement(tambo_mcp_provider_1.TamboMcpProvider, { mcpServers: ["https://mcp.linear.app/mcp"] },
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(tambo_mcp_token_provider_1.TamboMcpTokenProvider, null,
617
- react_2.default.createElement(tambo_mcp_provider_1.TamboMcpProvider, { mcpServers: [
618
- {
619
- url: "https://mcp.linear.app/mcp",
620
- serverKey: "custom-key",
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(tambo_mcp_token_provider_1.TamboMcpTokenProvider, null,
644
- react_2.default.createElement(tambo_mcp_provider_1.TamboMcpProvider, { mcpServers: [url] },
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(tambo_mcp_token_provider_1.TamboMcpTokenProvider, null,
666
- react_2.default.createElement(tambo_mcp_provider_1.TamboMcpProvider, { mcpServers: ["https://mcp.linear.app/mcp"] },
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(tambo_mcp_token_provider_1.TamboMcpTokenProvider, null,
686
- react_2.default.createElement(tambo_mcp_provider_1.TamboMcpProvider, { mcpServers: [
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(tambo_mcp_token_provider_1.TamboMcpTokenProvider, null,
715
- react_2.default.createElement(tambo_mcp_provider_1.TamboMcpProvider, { mcpServers: [
716
- {
717
- url: "https://mcp.linear.app/mcp",
718
- serverKey: "my-server",
719
- },
720
- "https://api.github.com",
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;