@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
package/dist/providers/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.useTamboThread = exports.useTamboGenerationStage = exports.TamboThreadProvider = exports.TamboThreadContext = exports.useTamboThreadInput = exports.TamboThreadInputProvider = exports.TamboStubProvider = exports.useTamboRegistry = exports.TamboRegistryProvider = exports.useTambo = exports.TamboProvider = exports.TamboContext = exports.useTamboStream = exports.TamboPropStreamProvider = exports.Success = exports.Streaming = exports.Pending = exports.useTamboContextHelpers = exports.TamboContextHelpersProvider = exports.useTamboContextAttachment = exports.TamboContextAttachmentProvider = exports.useTamboComponent = exports.TamboComponentProvider = exports.useTamboClient = exports.useIsTamboTokenUpdating = exports.TamboClientProvider = void 0;
|
|
3
|
+
exports.useTamboThread = exports.useTamboGenerationStage = exports.TamboThreadProvider = exports.TamboThreadContext = exports.useTamboThreadInput = exports.TamboThreadInputProvider = exports.TamboStubProvider = exports.useTamboRegistry = exports.useTamboMcpServerInfos = exports.TamboRegistryProvider = exports.useTambo = exports.TamboProvider = exports.TamboContext = exports.useTamboStream = exports.TamboPropStreamProvider = exports.Success = exports.Streaming = exports.Pending = exports.useTamboContextHelpers = exports.TamboContextHelpersProvider = exports.useTamboContextAttachment = exports.TamboContextAttachmentProvider = exports.useTamboComponent = exports.TamboComponentProvider = exports.useTamboClient = exports.useIsTamboTokenUpdating = exports.TamboClientProvider = void 0;
|
|
4
4
|
var tambo_client_provider_1 = require("./tambo-client-provider");
|
|
5
5
|
Object.defineProperty(exports, "TamboClientProvider", { enumerable: true, get: function () { return tambo_client_provider_1.TamboClientProvider; } });
|
|
6
6
|
Object.defineProperty(exports, "useIsTamboTokenUpdating", { enumerable: true, get: function () { return tambo_client_provider_1.useIsTamboTokenUpdating; } });
|
|
@@ -26,6 +26,7 @@ Object.defineProperty(exports, "TamboProvider", { enumerable: true, get: functio
|
|
|
26
26
|
Object.defineProperty(exports, "useTambo", { enumerable: true, get: function () { return tambo_provider_1.useTambo; } });
|
|
27
27
|
var tambo_registry_provider_1 = require("./tambo-registry-provider");
|
|
28
28
|
Object.defineProperty(exports, "TamboRegistryProvider", { enumerable: true, get: function () { return tambo_registry_provider_1.TamboRegistryProvider; } });
|
|
29
|
+
Object.defineProperty(exports, "useTamboMcpServerInfos", { enumerable: true, get: function () { return tambo_registry_provider_1.useTamboMcpServerInfos; } });
|
|
29
30
|
Object.defineProperty(exports, "useTamboRegistry", { enumerable: true, get: function () { return tambo_registry_provider_1.useTamboRegistry; } });
|
|
30
31
|
var tambo_stubs_1 = require("./tambo-stubs");
|
|
31
32
|
Object.defineProperty(exports, "TamboStubProvider", { enumerable: true, get: function () { return tambo_stubs_1.TamboStubProvider; } });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":";;;AACA,iEAIiC;AAH/B,4HAAA,mBAAmB,OAAA;AACnB,gIAAA,uBAAuB,OAAA;AACvB,uHAAA,cAAc,OAAA;AAEhB,uEAGoC;AAFlC,kIAAA,sBAAsB,OAAA;AACtB,6HAAA,iBAAiB,OAAA;AAEnB,yFAO6C;AAN3C,mJAAA,8BAA8B,OAAA;AAC9B,8IAAA,yBAAyB,OAAA;AAM3B,mFAK0C;AAJxC,6IAAA,2BAA2B,OAAA;AAC3B,wIAAA,sBAAsB,OAAA;AAIxB,2EAMsC;AALpC,qHAAA,OAAO,OAAA;AACP,uHAAA,SAAS,OAAA;AACT,qHAAA,OAAO,OAAA;AACP,qIAAA,uBAAuB,OAAA;AACvB,4HAAA,cAAc,OAAA;AAOhB,mDAAyE;AAAhE,8GAAA,YAAY,OAAA;AAAE,+GAAA,aAAa,OAAA;AAAE,0GAAA,QAAQ,OAAA;AAC9C,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":";;;AACA,iEAIiC;AAH/B,4HAAA,mBAAmB,OAAA;AACnB,gIAAA,uBAAuB,OAAA;AACvB,uHAAA,cAAc,OAAA;AAEhB,uEAGoC;AAFlC,kIAAA,sBAAsB,OAAA;AACtB,6HAAA,iBAAiB,OAAA;AAEnB,yFAO6C;AAN3C,mJAAA,8BAA8B,OAAA;AAC9B,8IAAA,yBAAyB,OAAA;AAM3B,mFAK0C;AAJxC,6IAAA,2BAA2B,OAAA;AAC3B,wIAAA,sBAAsB,OAAA;AAIxB,2EAMsC;AALpC,qHAAA,OAAO,OAAA;AACP,uHAAA,SAAS,OAAA;AACT,qHAAA,OAAO,OAAA;AACP,qIAAA,uBAAuB,OAAA;AACvB,4HAAA,cAAc,OAAA;AAOhB,mDAAyE;AAAhE,8GAAA,YAAY,OAAA;AAAE,+GAAA,aAAa,OAAA;AAAE,0GAAA,QAAQ,OAAA;AAC9C,qEAKmC;AAJjC,gIAAA,qBAAqB,OAAA;AACrB,iIAAA,sBAAsB,OAAA;AACtB,2HAAA,gBAAgB,OAAA;AAGlB,6CAA+E;AAAtE,gHAAA,iBAAiB,OAAA;AAC1B,6EAIuC;AAHrC,uIAAA,wBAAwB,OAAA;AACxB,kIAAA,mBAAmB,OAAA;AAGrB,iEAMiC;AAL/B,2HAAA,kBAAkB,OAAA;AAClB,4HAAA,mBAAmB,OAAA;AACnB,gIAAA,uBAAuB,OAAA;AACvB,uHAAA,cAAc,OAAA","sourcesContent":["export type { TamboComponent, TamboTool } from \"../model/component-metadata\";\nexport {\n TamboClientProvider,\n useIsTamboTokenUpdating,\n useTamboClient,\n} from \"./tambo-client-provider\";\nexport {\n TamboComponentProvider,\n useTamboComponent,\n} from \"./tambo-component-provider\";\nexport {\n TamboContextAttachmentProvider,\n useTamboContextAttachment,\n type ContextAttachment,\n type ContextAttachmentState,\n type ContextHelperData,\n type TamboContextAttachmentProviderProps,\n} from \"./tambo-context-attachment-provider\";\nexport {\n TamboContextHelpersProvider,\n useTamboContextHelpers,\n type TamboContextHelpersContextProps,\n type TamboContextHelpersProviderProps,\n} from \"./tambo-context-helpers-provider\";\nexport {\n Pending,\n Streaming,\n Success,\n TamboPropStreamProvider,\n useTamboStream,\n} from \"./tambo-prop-stream-provider\";\nexport type {\n StreamStateComponentProps,\n StreamStatus,\n TamboPropStreamContextValue,\n} from \"./tambo-prop-stream-provider\";\nexport { TamboContext, TamboProvider, useTambo } from \"./tambo-provider\";\nexport {\n TamboRegistryProvider,\n useTamboMcpServerInfos,\n useTamboRegistry,\n type TamboRegistryContext,\n} from \"./tambo-registry-provider\";\nexport { TamboStubProvider, type TamboStubProviderProps } from \"./tambo-stubs\";\nexport {\n TamboThreadInputProvider,\n useTamboThreadInput,\n type TamboThreadInputContextProps,\n} from \"./tambo-thread-input-provider\";\nexport {\n TamboThreadContext,\n TamboThreadProvider,\n useTamboGenerationStage,\n useTamboThread,\n type TamboThreadProviderProps,\n} from \"./tambo-thread-provider\";\n"]}
|
|
@@ -30,6 +30,10 @@ export interface TamboClientContextProps {
|
|
|
30
30
|
queryClient: QueryClient;
|
|
31
31
|
/** Whether the session token is currently being updated */
|
|
32
32
|
isUpdatingToken: boolean;
|
|
33
|
+
/** The current MCP access token for the internal Tambo MCP server */
|
|
34
|
+
mcpAccessToken: string | null;
|
|
35
|
+
/** Update the MCP access token (for internal use by TamboThreadProvider) */
|
|
36
|
+
setMcpAccessToken: (token: string | null) => void;
|
|
33
37
|
}
|
|
34
38
|
export declare const TamboClientContext: React.Context<TamboClientContextProps | undefined>;
|
|
35
39
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tambo-client-provider.d.ts","sourceRoot":"","sources":["../../src/providers/tambo-client-provider.tsx"],"names":[],"mappings":"AACA,OAAO,OAA0B,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,KAAK,EAAE,EAAiB,iBAAiB,EAAY,MAAM,OAAO,CAAC;AAI1E,MAAM,WAAW,wBAAwB;IACvC;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,MAAM,EAAE,MAAM,CAAC;IACf;;OAEG;IACH,WAAW,CAAC,EAAE,YAAY,GAAG,SAAS,CAAC;IAEvC;;;;;OAKG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,uBAAuB;IACtC,yBAAyB;IACzB,MAAM,EAAE,OAAO,CAAC;IAChB,sCAAsC;IACtC,WAAW,EAAE,WAAW,CAAC;IACzB,2DAA2D;IAC3D,eAAe,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"tambo-client-provider.d.ts","sourceRoot":"","sources":["../../src/providers/tambo-client-provider.tsx"],"names":[],"mappings":"AACA,OAAO,OAA0B,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,KAAK,EAAE,EAAiB,iBAAiB,EAAY,MAAM,OAAO,CAAC;AAI1E,MAAM,WAAW,wBAAwB;IACvC;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,MAAM,EAAE,MAAM,CAAC;IACf;;OAEG;IACH,WAAW,CAAC,EAAE,YAAY,GAAG,SAAS,CAAC;IAEvC;;;;;OAKG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,uBAAuB;IACtC,yBAAyB;IACzB,MAAM,EAAE,OAAO,CAAC;IAChB,sCAAsC;IACtC,WAAW,EAAE,WAAW,CAAC;IACzB,2DAA2D;IAC3D,eAAe,EAAE,OAAO,CAAC;IACzB,qEAAqE;IACrE,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,4EAA4E;IAC5E,iBAAiB,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;CACnD;AAED,eAAO,MAAM,kBAAkB,oDAEnB,CAAC;AAEb;;;;;;;;;;GAUG;AACH,eAAO,MAAM,mBAAmB,EAAE,KAAK,CAAC,EAAE,CACxC,iBAAiB,CAAC,wBAAwB,CAAC,CAsC5C,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,cAAc,eAM1B,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,mBAQ/B,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,uBAAuB,eAQnC,CAAC"}
|
|
@@ -70,12 +70,15 @@ const TamboClientProvider = ({ children, tamboUrl, apiKey, environment, userToke
|
|
|
70
70
|
}
|
|
71
71
|
const [client] = (0, react_1.useState)(() => new typescript_sdk_1.default(tamboConfig));
|
|
72
72
|
const [queryClient] = (0, react_1.useState)(() => new react_query_1.QueryClient());
|
|
73
|
+
const [mcpAccessToken, setMcpAccessToken] = (0, react_1.useState)(null);
|
|
73
74
|
// Keep the session token updated and get the updating state
|
|
74
75
|
const { isFetching: isUpdatingToken } = (0, use_tambo_session_token_1.useTamboSessionToken)(client, queryClient, userToken);
|
|
75
76
|
return (react_1.default.createElement(exports.TamboClientContext.Provider, { value: {
|
|
76
77
|
client,
|
|
77
78
|
queryClient,
|
|
78
79
|
isUpdatingToken,
|
|
80
|
+
mcpAccessToken,
|
|
81
|
+
setMcpAccessToken,
|
|
79
82
|
} }, children));
|
|
80
83
|
};
|
|
81
84
|
exports.TamboClientProvider = TamboClientProvider;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tambo-client-provider.js","sourceRoot":"","sources":["../../src/providers/tambo-client-provider.tsx"],"names":[],"mappings":";AAAA,YAAY,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACb,8EAAkE;AAClE,uDAAoD;AACpD,+CAA0E;AAC1E,sEAA6C;AAC7C,6EAAuE;
|
|
1
|
+
{"version":3,"file":"tambo-client-provider.js","sourceRoot":"","sources":["../../src/providers/tambo-client-provider.tsx"],"names":[],"mappings":";AAAA,YAAY,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACb,8EAAkE;AAClE,uDAAoD;AACpD,+CAA0E;AAC1E,sEAA6C;AAC7C,6EAAuE;AAuC1D,QAAA,kBAAkB,GAAG,IAAA,qBAAa,EAE7C,SAAS,CAAC,CAAC;AAEb;;;;;;;;;;GAUG;AACI,MAAM,mBAAmB,GAE5B,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,EAAE,EAAE;IAC7D,MAAM,WAAW,GAAkB;QACjC,MAAM;QACN,cAAc,EAAE;YACd,uBAAuB,EAAE,sBAAW,CAAC,OAAO;SAC7C;KACF,CAAC;IACF,IAAI,QAAQ,EAAE,CAAC;QACb,WAAW,CAAC,OAAO,GAAG,QAAQ,CAAC;IACjC,CAAC;IACD,IAAI,WAAW,EAAE,CAAC;QAChB,WAAW,CAAC,WAAW,GAAG,WAAW,CAAC;IACxC,CAAC;IACD,MAAM,CAAC,MAAM,CAAC,GAAG,IAAA,gBAAQ,EAAC,GAAG,EAAE,CAAC,IAAI,wBAAO,CAAC,WAAW,CAAC,CAAC,CAAC;IAC1D,MAAM,CAAC,WAAW,CAAC,GAAG,IAAA,gBAAQ,EAAC,GAAG,EAAE,CAAC,IAAI,yBAAW,EAAE,CAAC,CAAC;IACxD,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,IAAA,gBAAQ,EAAgB,IAAI,CAAC,CAAC;IAE1E,4DAA4D;IAC5D,MAAM,EAAE,UAAU,EAAE,eAAe,EAAE,GAAG,IAAA,8CAAoB,EAC1D,MAAM,EACN,WAAW,EACX,SAAS,CACV,CAAC;IAEF,OAAO,CACL,8BAAC,0BAAkB,CAAC,QAAQ,IAC1B,KAAK,EAAE;YACL,MAAM;YACN,WAAW;YACX,eAAe;YACf,cAAc;YACd,iBAAiB;SAClB,IAEA,QAAQ,CACmB,CAC/B,CAAC;AACJ,CAAC,CAAC;AAvCW,QAAA,mBAAmB,uBAuC9B;AAEF;;;;GAIG;AACI,MAAM,cAAc,GAAG,GAAG,EAAE;IACjC,MAAM,OAAO,GAAG,eAAK,CAAC,UAAU,CAAC,0BAAkB,CAAC,CAAC;IACrD,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;IAC9E,CAAC;IACD,OAAO,OAAO,CAAC,MAAM,CAAC;AACxB,CAAC,CAAC;AANW,QAAA,cAAc,kBAMzB;AAEF;;;;;GAKG;AACI,MAAM,mBAAmB,GAAG,GAAG,EAAE;IACtC,MAAM,OAAO,GAAG,eAAK,CAAC,UAAU,CAAC,0BAAkB,CAAC,CAAC;IACrD,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CACb,+DAA+D,CAChE,CAAC;IACJ,CAAC;IACD,OAAO,OAAO,CAAC,WAAW,CAAC;AAC7B,CAAC,CAAC;AARW,QAAA,mBAAmB,uBAQ9B;AAEF;;;GAGG;AACI,MAAM,uBAAuB,GAAG,GAAG,EAAE;IAC1C,MAAM,OAAO,GAAG,eAAK,CAAC,UAAU,CAAC,0BAAkB,CAAC,CAAC;IACrD,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CACb,mEAAmE,CACpE,CAAC;IACJ,CAAC;IACD,OAAO,OAAO,CAAC,eAAe,CAAC;AACjC,CAAC,CAAC;AARW,QAAA,uBAAuB,2BAQlC","sourcesContent":["\"use client\";\nimport TamboAI, { ClientOptions } from \"@tambo-ai/typescript-sdk\";\nimport { QueryClient } from \"@tanstack/react-query\";\nimport React, { createContext, PropsWithChildren, useState } from \"react\";\nimport packageJson from \"../../package.json\";\nimport { useTamboSessionToken } from \"./hooks/use-tambo-session-token\";\n\nexport interface TamboClientProviderProps {\n /**\n * The URL of the Tambo API (only used for local development and debugging)\n */\n tamboUrl?: string;\n /**\n * The API key for the Tambo API. This typically comes from a variable like\n * `process.env.NEXT_PUBLIC_TAMBO_API_KEY`\n */\n apiKey: string;\n /**\n * The environment to use for the Tambo API\n */\n environment?: \"production\" | \"staging\";\n\n /**\n * The user token to use to identify the user in the Tambo API. This token is\n * a 3rd party token like a Google or GitHub access token, exchanged with the\n * Tambo API to get a session token. This is used to securely identify the\n * user when calling the Tambo API.\n */\n userToken?: string;\n}\n\nexport interface TamboClientContextProps {\n /** The TamboAI client */\n client: TamboAI;\n /** The tambo-specific query client */\n queryClient: QueryClient;\n /** Whether the session token is currently being updated */\n isUpdatingToken: boolean;\n /** The current MCP access token for the internal Tambo MCP server */\n mcpAccessToken: string | null;\n /** Update the MCP access token (for internal use by TamboThreadProvider) */\n setMcpAccessToken: (token: string | null) => void;\n}\n\nexport const TamboClientContext = createContext<\n TamboClientContextProps | undefined\n>(undefined);\n\n/**\n * The TamboClientProvider is a React provider that provides a TamboAI client\n * and a query client to the descendants of the provider.\n * @param props - The props for the TamboClientProvider\n * @param props.children - The children to wrap\n * @param props.tamboUrl - The URL of the Tambo API\n * @param props.apiKey - The API key for the Tambo API\n * @param props.environment - The environment to use for the Tambo API\n * @param props.userToken - The oauth access token to use to identify the user in the Tambo API\n * @returns The TamboClientProvider component\n */\nexport const TamboClientProvider: React.FC<\n PropsWithChildren<TamboClientProviderProps>\n> = ({ children, tamboUrl, apiKey, environment, userToken }) => {\n const tamboConfig: ClientOptions = {\n apiKey,\n defaultHeaders: {\n \"X-Tambo-React-Version\": packageJson.version,\n },\n };\n if (tamboUrl) {\n tamboConfig.baseURL = tamboUrl;\n }\n if (environment) {\n tamboConfig.environment = environment;\n }\n const [client] = useState(() => new TamboAI(tamboConfig));\n const [queryClient] = useState(() => new QueryClient());\n const [mcpAccessToken, setMcpAccessToken] = useState<string | null>(null);\n\n // Keep the session token updated and get the updating state\n const { isFetching: isUpdatingToken } = useTamboSessionToken(\n client,\n queryClient,\n userToken,\n );\n\n return (\n <TamboClientContext.Provider\n value={{\n client,\n queryClient,\n isUpdatingToken,\n mcpAccessToken,\n setMcpAccessToken,\n }}\n >\n {children}\n </TamboClientContext.Provider>\n );\n};\n\n/**\n * The useTamboClient hook provides access to the TamboAI client\n * to the descendants of the TamboClientProvider.\n * @returns The TamboAI client\n */\nexport const useTamboClient = () => {\n const context = React.useContext(TamboClientContext);\n if (context === undefined) {\n throw new Error(\"useTamboClient must be used within a TamboClientProvider\");\n }\n return context.client;\n};\n\n/**\n * The useTamboQueryClient hook provides access to the tambo-specific query client\n * to the descendants of the TamboClientProvider.\n * @returns The tambo-specific query client\n * @private\n */\nexport const useTamboQueryClient = () => {\n const context = React.useContext(TamboClientContext);\n if (context === undefined) {\n throw new Error(\n \"useTamboQueryClient must be used within a TamboClientProvider\",\n );\n }\n return context.queryClient;\n};\n\n/**\n * Hook to check if the session token is currently being updated\n * @returns true if the token is being refreshed, false otherwise\n */\nexport const useIsTamboTokenUpdating = () => {\n const context = React.useContext(TamboClientContext);\n if (context === undefined) {\n throw new Error(\n \"useIsTamboTokenUpdating must be used within a TamboClientProvider\",\n );\n }\n return context.isUpdatingToken;\n};\n"]}
|
|
@@ -19,6 +19,9 @@ export interface TamboMcpTokenContextProps {
|
|
|
19
19
|
* Provider for managing the MCP access token that is returned by the Tambo API.
|
|
20
20
|
* This token is used to authenticate with the internal Tambo MCP server.
|
|
21
21
|
* The base URL is derived from the TamboClient's baseURL property.
|
|
22
|
+
*
|
|
23
|
+
* **NOTE**: This provider now delegates token state management to TamboClientProvider.
|
|
24
|
+
* It exists primarily for backward compatibility and to add the tamboBaseUrl.
|
|
22
25
|
* @internal
|
|
23
26
|
* @param props - The provider props
|
|
24
27
|
* @param props.children - The children to wrap
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tambo-mcp-token-provider.d.ts","sourceRoot":"","sources":["../../src/providers/tambo-mcp-token-provider.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAEZ,iBAAiB,EAGlB,MAAM,OAAO,CAAC;AAGf,MAAM,WAAW,yBAAyB;IACxC;;OAEG;IACH,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B;;;OAGG;IACH,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC;;;OAGG;IACH,iBAAiB,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;CACnD;AAMD
|
|
1
|
+
{"version":3,"file":"tambo-mcp-token-provider.d.ts","sourceRoot":"","sources":["../../src/providers/tambo-mcp-token-provider.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAEZ,iBAAiB,EAGlB,MAAM,OAAO,CAAC;AAGf,MAAM,WAAW,yBAAyB;IACxC;;OAEG;IACH,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B;;;OAGG;IACH,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC;;;OAGG;IACH,iBAAiB,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;CACnD;AAMD;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,qBAAqB,EAAE,KAAK,CAAC,EAAE,CAAC,iBAAiB,CAsB7D,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,QAAO,yBAQnC,CAAC"}
|
|
@@ -42,15 +42,23 @@ const TamboMcpTokenContext = (0, react_1.createContext)(undefined);
|
|
|
42
42
|
* Provider for managing the MCP access token that is returned by the Tambo API.
|
|
43
43
|
* This token is used to authenticate with the internal Tambo MCP server.
|
|
44
44
|
* The base URL is derived from the TamboClient's baseURL property.
|
|
45
|
+
*
|
|
46
|
+
* **NOTE**: This provider now delegates token state management to TamboClientProvider.
|
|
47
|
+
* It exists primarily for backward compatibility and to add the tamboBaseUrl.
|
|
45
48
|
* @internal
|
|
46
49
|
* @param props - The provider props
|
|
47
50
|
* @param props.children - The children to wrap
|
|
48
51
|
* @returns The TamboMcpTokenProvider component
|
|
49
52
|
*/
|
|
50
53
|
const TamboMcpTokenProvider = ({ children, }) => {
|
|
51
|
-
const
|
|
52
|
-
|
|
53
|
-
|
|
54
|
+
const clientContext = (0, react_1.useContext)(tambo_client_provider_1.TamboClientContext);
|
|
55
|
+
if (!clientContext) {
|
|
56
|
+
throw new Error("TamboMcpTokenProvider must be used within a TamboClientProvider");
|
|
57
|
+
}
|
|
58
|
+
const { client, mcpAccessToken, setMcpAccessToken } = clientContext;
|
|
59
|
+
const tamboBaseUrl = client.baseURL;
|
|
60
|
+
const value = (0, react_1.useMemo)(() => ({ mcpAccessToken, tamboBaseUrl, setMcpAccessToken }), [mcpAccessToken, tamboBaseUrl, setMcpAccessToken]);
|
|
61
|
+
return (react_1.default.createElement(TamboMcpTokenContext.Provider, { value: value }, children));
|
|
54
62
|
};
|
|
55
63
|
exports.TamboMcpTokenProvider = TamboMcpTokenProvider;
|
|
56
64
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tambo-mcp-token-provider.js","sourceRoot":"","sources":["../../src/providers/tambo-mcp-token-provider.tsx"],"names":[],"mappings":";AAAA,YAAY,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACb,+CAKe;AACf,
|
|
1
|
+
{"version":3,"file":"tambo-mcp-token-provider.js","sourceRoot":"","sources":["../../src/providers/tambo-mcp-token-provider.tsx"],"names":[],"mappings":";AAAA,YAAY,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACb,+CAKe;AACf,mEAA6D;AAmB7D,MAAM,oBAAoB,GAAG,IAAA,qBAAa,EAExC,SAAS,CAAC,CAAC;AAEb;;;;;;;;;;;GAWG;AACI,MAAM,qBAAqB,GAAgC,CAAC,EACjE,QAAQ,GACT,EAAE,EAAE;IACH,MAAM,aAAa,GAAG,IAAA,kBAAU,EAAC,0CAAkB,CAAC,CAAC;IACrD,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CACb,iEAAiE,CAClE,CAAC;IACJ,CAAC;IACD,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,iBAAiB,EAAE,GAAG,aAAa,CAAC;IACpE,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC;IAEpC,MAAM,KAAK,GAAG,IAAA,eAAO,EACnB,GAAG,EAAE,CAAC,CAAC,EAAE,cAAc,EAAE,YAAY,EAAE,iBAAiB,EAAE,CAAC,EAC3D,CAAC,cAAc,EAAE,YAAY,EAAE,iBAAiB,CAAC,CAClD,CAAC;IAEF,OAAO,CACL,8BAAC,oBAAoB,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,IACxC,QAAQ,CACqB,CACjC,CAAC;AACJ,CAAC,CAAC;AAtBW,QAAA,qBAAqB,yBAsBhC;AAEF;;;;GAIG;AACI,MAAM,gBAAgB,GAAG,GAA8B,EAAE;IAC9D,MAAM,OAAO,GAAG,IAAA,kBAAU,EAAC,oBAAoB,CAAC,CAAC;IACjD,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CACb,8DAA8D,CAC/D,CAAC;IACJ,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC;AARW,QAAA,gBAAgB,oBAQ3B","sourcesContent":["\"use client\";\nimport React, {\n createContext,\n PropsWithChildren,\n useContext,\n useMemo,\n} from \"react\";\nimport { TamboClientContext } from \"./tambo-client-provider\";\n\nexport interface TamboMcpTokenContextProps {\n /**\n * The current MCP access token for the internal Tambo MCP server\n */\n mcpAccessToken: string | null;\n /**\n * The base URL for the Tambo API (used to construct the MCP server URL)\n * Returns undefined if the client is not yet initialized\n */\n tamboBaseUrl: string | undefined;\n /**\n * Update the MCP access token (for internal use by TamboThreadProvider)\n * @internal\n */\n setMcpAccessToken: (token: string | null) => void;\n}\n\nconst TamboMcpTokenContext = createContext<\n TamboMcpTokenContextProps | undefined\n>(undefined);\n\n/**\n * Provider for managing the MCP access token that is returned by the Tambo API.\n * This token is used to authenticate with the internal Tambo MCP server.\n * The base URL is derived from the TamboClient's baseURL property.\n *\n * **NOTE**: This provider now delegates token state management to TamboClientProvider.\n * It exists primarily for backward compatibility and to add the tamboBaseUrl.\n * @internal\n * @param props - The provider props\n * @param props.children - The children to wrap\n * @returns The TamboMcpTokenProvider component\n */\nexport const TamboMcpTokenProvider: React.FC<PropsWithChildren> = ({\n children,\n}) => {\n const clientContext = useContext(TamboClientContext);\n if (!clientContext) {\n throw new Error(\n \"TamboMcpTokenProvider must be used within a TamboClientProvider\",\n );\n }\n const { client, mcpAccessToken, setMcpAccessToken } = clientContext;\n const tamboBaseUrl = client.baseURL;\n\n const value = useMemo(\n () => ({ mcpAccessToken, tamboBaseUrl, setMcpAccessToken }),\n [mcpAccessToken, tamboBaseUrl, setMcpAccessToken],\n );\n\n return (\n <TamboMcpTokenContext.Provider value={value}>\n {children}\n </TamboMcpTokenContext.Provider>\n );\n};\n\n/**\n * Hook to access the current MCP access token.\n * @internal\n * @returns The current MCP access token and a setter function\n */\nexport const useTamboMcpToken = (): TamboMcpTokenContextProps => {\n const context = useContext(TamboMcpTokenContext);\n if (context === undefined) {\n throw new Error(\n \"useTamboMcpToken must be used within a TamboMcpTokenProvider\",\n );\n }\n return context;\n};\n"]}
|
|
@@ -17,6 +17,7 @@ import { TamboGenerationStageContextProps, TamboThreadContextProps, TamboThreadP
|
|
|
17
17
|
* @param props.components - The components to register
|
|
18
18
|
* @param props.environment - The environment to use for the Tambo API
|
|
19
19
|
* @param props.tools - The tools to register
|
|
20
|
+
* @param props.mcpServers - The MCP servers to register (metadata only - use TamboMcpProvider for connections)
|
|
20
21
|
* @param props.streaming - Whether to stream the response by default. Defaults to true.
|
|
21
22
|
* @param props.autoGenerateThreadName - Whether to automatically generate thread names. Defaults to true.
|
|
22
23
|
* @param props.autoGenerateNameThreshold - The message count threshold at which the thread name will be auto-generated. Defaults to 3.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tambo-provider.d.ts","sourceRoot":"","sources":["../../src/providers/tambo-provider.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAAE,iBAAiB,EAA6B,MAAM,OAAO,CAAC;AAC5E,OAAO,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AACvE,OAAO,
|
|
1
|
+
{"version":3,"file":"tambo-provider.d.ts","sourceRoot":"","sources":["../../src/providers/tambo-provider.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAAE,iBAAiB,EAA6B,MAAM,OAAO,CAAC;AAC5E,OAAO,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AACvE,OAAO,EAEL,uBAAuB,EAEvB,wBAAwB,EACzB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,0BAA0B,EAG3B,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,sBAAsB,EAEtB,mCAAmC,EAEpC,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EACL,+BAA+B,EAE/B,gCAAgC,EAEjC,MAAM,kCAAkC,CAAC;AAM1C,OAAO,EAEL,0BAA0B,EAC3B,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAEL,6BAA6B,EAC9B,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,gCAAgC,EAChC,uBAAuB,EAEvB,wBAAwB,EAEzB,MAAM,yBAAyB,CAAC;AAEjC;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,EAAE,CAClC,iBAAiB,CACf,wBAAwB,GACtB,0BAA0B,GAC1B,wBAAwB,GACxB,gCAAgC,GAChC,6BAA6B,GAC7B,OAAO,CAAC,IAAI,CAAC,mCAAmC,EAAE,sBAAsB,CAAC,CAAC,CAC7E,CA2DF,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG,uBAAuB,GACrD,uBAAuB,GACvB,gCAAgC,GAChC,0BAA0B,GAC1B,wBAAwB,GACxB,+BAA+B,GAC/B,sBAAsB,CAAC;AAEzB,eAAO,MAAM,YAAY,kCAExB,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,sBAAsB,EAAE,KAAK,CAAC,EAAE,CAAC,iBAAiB,CAwC9D,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,QAAQ,yBAEpB,CAAC"}
|
|
@@ -55,6 +55,7 @@ const tambo_thread_provider_1 = require("./tambo-thread-provider");
|
|
|
55
55
|
* @param props.components - The components to register
|
|
56
56
|
* @param props.environment - The environment to use for the Tambo API
|
|
57
57
|
* @param props.tools - The tools to register
|
|
58
|
+
* @param props.mcpServers - The MCP servers to register (metadata only - use TamboMcpProvider for connections)
|
|
58
59
|
* @param props.streaming - Whether to stream the response by default. Defaults to true.
|
|
59
60
|
* @param props.autoGenerateThreadName - Whether to automatically generate thread names. Defaults to true.
|
|
60
61
|
* @param props.autoGenerateNameThreshold - The message count threshold at which the thread name will be auto-generated. Defaults to 3.
|
|
@@ -66,9 +67,9 @@ const tambo_thread_provider_1 = require("./tambo-thread-provider");
|
|
|
66
67
|
* @param props.getContextHelperData - Optional function to customize the data sent to the AI for each context attachment
|
|
67
68
|
* @returns The TamboProvider component
|
|
68
69
|
*/
|
|
69
|
-
const TamboProvider = ({ children, tamboUrl, apiKey, userToken, components, environment, tools, streaming, autoGenerateThreadName, autoGenerateNameThreshold, contextHelpers, contextKey, initialMessages, onCallUnregisteredTool, getContextHelperData, }) => {
|
|
70
|
+
const TamboProvider = ({ children, tamboUrl, apiKey, userToken, components, environment, tools, mcpServers, streaming, autoGenerateThreadName, autoGenerateNameThreshold, contextHelpers, contextKey, initialMessages, onCallUnregisteredTool, getContextHelperData, }) => {
|
|
70
71
|
return (react_1.default.createElement(tambo_client_provider_1.TamboClientProvider, { tamboUrl: tamboUrl, apiKey: apiKey, environment: environment, userToken: userToken },
|
|
71
|
-
react_1.default.createElement(tambo_registry_provider_1.TamboRegistryProvider, { components: components, tools: tools, onCallUnregisteredTool: onCallUnregisteredTool },
|
|
72
|
+
react_1.default.createElement(tambo_registry_provider_1.TamboRegistryProvider, { components: components, tools: tools, mcpServers: mcpServers, onCallUnregisteredTool: onCallUnregisteredTool },
|
|
72
73
|
react_1.default.createElement(tambo_context_helpers_provider_1.TamboContextHelpersProvider, { contextHelpers: contextHelpers },
|
|
73
74
|
react_1.default.createElement(tambo_mcp_token_provider_1.TamboMcpTokenProvider, null,
|
|
74
75
|
react_1.default.createElement(tambo_thread_provider_1.TamboThreadProvider, { streaming: streaming, autoGenerateThreadName: autoGenerateThreadName, autoGenerateNameThreshold: autoGenerateNameThreshold, initialMessages: initialMessages },
|
|
@@ -89,9 +90,11 @@ exports.TamboContext = (0, react_1.createContext)({});
|
|
|
89
90
|
*/
|
|
90
91
|
const TamboCompositeProvider = ({ children, }) => {
|
|
91
92
|
const threads = (0, tambo_thread_provider_1.useTamboThread)();
|
|
92
|
-
const
|
|
93
|
-
|
|
94
|
-
|
|
93
|
+
const clientContext = (0, react_1.useContext)(tambo_client_provider_1.TamboClientContext);
|
|
94
|
+
if (!clientContext) {
|
|
95
|
+
throw new Error("TamboCompositeProvider must be used within a TamboClientProvider");
|
|
96
|
+
}
|
|
97
|
+
const { client, queryClient, isUpdatingToken, mcpAccessToken, setMcpAccessToken, } = clientContext;
|
|
95
98
|
const componentRegistry = (0, tambo_component_provider_1.useTamboComponent)();
|
|
96
99
|
const interactableComponents = (0, tambo_interactable_provider_1.useTamboInteractable)();
|
|
97
100
|
const contextHelpers = (0, tambo_context_helpers_provider_1.useTamboContextHelpers)();
|
|
@@ -100,6 +103,8 @@ const TamboCompositeProvider = ({ children, }) => {
|
|
|
100
103
|
client,
|
|
101
104
|
queryClient,
|
|
102
105
|
isUpdatingToken,
|
|
106
|
+
mcpAccessToken,
|
|
107
|
+
setMcpAccessToken,
|
|
103
108
|
...componentRegistry,
|
|
104
109
|
...threads,
|
|
105
110
|
...interactableComponents,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tambo-provider.js","sourceRoot":"","sources":["../../src/providers/tambo-provider.tsx"],"names":[],"mappings":";AAAA,YAAY,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACb,+CAA4E;AAE5E,
|
|
1
|
+
{"version":3,"file":"tambo-provider.js","sourceRoot":"","sources":["../../src/providers/tambo-provider.tsx"],"names":[],"mappings":";AAAA,YAAY,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACb,+CAA4E;AAE5E,mEAKiC;AACjC,yEAIoC;AACpC,2FAK6C;AAC7C,qFAK0C;AAC1C,+EAGuC;AACvC,yEAAmE;AACnE,uEAGmC;AACnC,+EAGuC;AACvC,mEAMiC;AAEjC;;;;;;;;;;;;;;;;;;;;;GAqBG;AACI,MAAM,aAAa,GAStB,CAAC,EACH,QAAQ,EACR,QAAQ,EACR,MAAM,EACN,SAAS,EACT,UAAU,EACV,WAAW,EACX,KAAK,EACL,UAAU,EACV,SAAS,EACT,sBAAsB,EACtB,yBAAyB,EACzB,cAAc,EACd,UAAU,EACV,eAAe,EACf,sBAAsB,EACtB,oBAAoB,GACrB,EAAE,EAAE;IACH,OAAO,CACL,8BAAC,2CAAmB,IAClB,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,WAAW,EACxB,SAAS,EAAE,SAAS;QAEpB,8BAAC,+CAAqB,IACpB,UAAU,EAAE,UAAU,EACtB,KAAK,EAAE,KAAK,EACZ,UAAU,EAAE,UAAU,EACtB,sBAAsB,EAAE,sBAAsB;YAE9C,8BAAC,4DAA2B,IAAC,cAAc,EAAE,cAAc;gBACzD,8BAAC,gDAAqB;oBACpB,8BAAC,2CAAmB,IAClB,SAAS,EAAE,SAAS,EACpB,sBAAsB,EAAE,sBAAsB,EAC9C,yBAAyB,EAAE,yBAAyB,EACpD,eAAe,EAAE,eAAe;wBAEhC,8BAAC,sDAAwB,IAAC,UAAU,EAAE,UAAU;4BAC9C,8BAAC,kEAA8B,IAC7B,oBAAoB,EAAE,oBAAoB;gCAE1C,8BAAC,iDAAsB;oCACrB,8BAAC,uDAAyB;wCACxB,8BAAC,8BAAsB,QACpB,QAAQ,CACc,CACC,CACL,CACM,CACR,CACP,CACA,CACI,CACR,CACJ,CACvB,CAAC;AACJ,CAAC,CAAC;AAnEW,QAAA,aAAa,iBAmExB;AAUW,QAAA,YAAY,GAAG,IAAA,qBAAa,EACvC,EAAuB,CACxB,CAAC;AAEF;;;;;;GAMG;AACI,MAAM,sBAAsB,GAAgC,CAAC,EAClE,QAAQ,GACT,EAAE,EAAE;IACH,MAAM,OAAO,GAAG,IAAA,sCAAc,GAAE,CAAC;IACjC,MAAM,aAAa,GAAG,IAAA,kBAAU,EAAC,0CAAkB,CAAC,CAAC;IACrD,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CACb,kEAAkE,CACnE,CAAC;IACJ,CAAC;IACD,MAAM,EACJ,MAAM,EACN,WAAW,EACX,eAAe,EACf,cAAc,EACd,iBAAiB,GAClB,GAAG,aAAa,CAAC;IAClB,MAAM,iBAAiB,GAAG,IAAA,4CAAiB,GAAE,CAAC;IAC9C,MAAM,sBAAsB,GAAG,IAAA,kDAAoB,GAAE,CAAC;IACtD,MAAM,cAAc,GAAG,IAAA,uDAAsB,GAAE,CAAC;IAChD,MAAM,iBAAiB,GAAG,IAAA,6DAAyB,GAAE,CAAC;IAEtD,OAAO,CACL,8BAAC,oBAAY,CAAC,QAAQ,IACpB,KAAK,EAAE;YACL,MAAM;YACN,WAAW;YACX,eAAe;YACf,cAAc;YACd,iBAAiB;YACjB,GAAG,iBAAiB;YACpB,GAAG,OAAO;YACV,GAAG,sBAAsB;YACzB,GAAG,cAAc;YACjB,GAAG,iBAAiB;SACrB,IAEA,QAAQ,CACa,CACzB,CAAC;AACJ,CAAC,CAAC;AAxCW,QAAA,sBAAsB,0BAwCjC;AAEF;;;;;;;GAOG;AACI,MAAM,QAAQ,GAAG,GAAG,EAAE;IAC3B,OAAO,IAAA,kBAAU,EAAC,oBAAY,CAAC,CAAC;AAClC,CAAC,CAAC;AAFW,QAAA,QAAQ,YAEnB","sourcesContent":["\"use client\";\nimport React, { PropsWithChildren, createContext, useContext } from \"react\";\nimport { TamboInteractableContext } from \"../model/tambo-interactable\";\nimport {\n TamboClientContext,\n TamboClientContextProps,\n TamboClientProvider,\n TamboClientProviderProps,\n} from \"./tambo-client-provider\";\nimport {\n TamboComponentContextProps,\n TamboComponentProvider,\n useTamboComponent,\n} from \"./tambo-component-provider\";\nimport {\n ContextAttachmentState,\n TamboContextAttachmentProvider,\n TamboContextAttachmentProviderProps,\n useTamboContextAttachment,\n} from \"./tambo-context-attachment-provider\";\nimport {\n TamboContextHelpersContextProps,\n TamboContextHelpersProvider,\n TamboContextHelpersProviderProps,\n useTamboContextHelpers,\n} from \"./tambo-context-helpers-provider\";\nimport {\n TamboInteractableProvider,\n useTamboInteractable,\n} from \"./tambo-interactable-provider\";\nimport { TamboMcpTokenProvider } from \"./tambo-mcp-token-provider\";\nimport {\n TamboRegistryProvider,\n TamboRegistryProviderProps,\n} from \"./tambo-registry-provider\";\nimport {\n TamboThreadInputProvider,\n TamboThreadInputProviderProps,\n} from \"./tambo-thread-input-provider\";\nimport {\n TamboGenerationStageContextProps,\n TamboThreadContextProps,\n TamboThreadProvider,\n TamboThreadProviderProps,\n useTamboThread,\n} from \"./tambo-thread-provider\";\n\n/**\n * The TamboProvider gives full access to the whole Tambo API. This includes the\n * TamboAI client, the component registry, the current thread context, and interactable components.\n * @param props - The props for the TamboProvider\n * @param props.children - The children to wrap\n * @param props.tamboUrl - The URL of the Tambo API\n * @param props.apiKey - The API key for the Tambo API\n * @param props.components - The components to register\n * @param props.environment - The environment to use for the Tambo API\n * @param props.tools - The tools to register\n * @param props.mcpServers - The MCP servers to register (metadata only - use TamboMcpProvider for connections)\n * @param props.streaming - Whether to stream the response by default. Defaults to true.\n * @param props.autoGenerateThreadName - Whether to automatically generate thread names. Defaults to true.\n * @param props.autoGenerateNameThreshold - The message count threshold at which the thread name will be auto-generated. Defaults to 3.\n * @param props.contextHelpers - Configuration for which context helpers are enabled/disabled\n * @param props.userToken - The user's OAuth token (access or ID) used to identify the user and exchange for a Tambo session token (preferred over contextKey)\n * @param props.contextKey - Optional context key to be used in the thread input provider\n * @param props.onCallUnregisteredTool - Callback function called when an unregistered tool is called\n * @param props.initialMessages - Initial messages to be included in new threads\n * @param props.getContextHelperData - Optional function to customize the data sent to the AI for each context attachment\n * @returns The TamboProvider component\n */\nexport const TamboProvider: React.FC<\n PropsWithChildren<\n TamboClientProviderProps &\n TamboRegistryProviderProps &\n TamboThreadProviderProps &\n TamboContextHelpersProviderProps &\n TamboThreadInputProviderProps &\n Partial<Pick<TamboContextAttachmentProviderProps, \"getContextHelperData\">>\n >\n> = ({\n children,\n tamboUrl,\n apiKey,\n userToken,\n components,\n environment,\n tools,\n mcpServers,\n streaming,\n autoGenerateThreadName,\n autoGenerateNameThreshold,\n contextHelpers,\n contextKey,\n initialMessages,\n onCallUnregisteredTool,\n getContextHelperData,\n}) => {\n return (\n <TamboClientProvider\n tamboUrl={tamboUrl}\n apiKey={apiKey}\n environment={environment}\n userToken={userToken}\n >\n <TamboRegistryProvider\n components={components}\n tools={tools}\n mcpServers={mcpServers}\n onCallUnregisteredTool={onCallUnregisteredTool}\n >\n <TamboContextHelpersProvider contextHelpers={contextHelpers}>\n <TamboMcpTokenProvider>\n <TamboThreadProvider\n streaming={streaming}\n autoGenerateThreadName={autoGenerateThreadName}\n autoGenerateNameThreshold={autoGenerateNameThreshold}\n initialMessages={initialMessages}\n >\n <TamboThreadInputProvider contextKey={contextKey}>\n <TamboContextAttachmentProvider\n getContextHelperData={getContextHelperData}\n >\n <TamboComponentProvider>\n <TamboInteractableProvider>\n <TamboCompositeProvider>\n {children}\n </TamboCompositeProvider>\n </TamboInteractableProvider>\n </TamboComponentProvider>\n </TamboContextAttachmentProvider>\n </TamboThreadInputProvider>\n </TamboThreadProvider>\n </TamboMcpTokenProvider>\n </TamboContextHelpersProvider>\n </TamboRegistryProvider>\n </TamboClientProvider>\n );\n};\n\nexport type TamboContextProps = TamboClientContextProps &\n TamboThreadContextProps &\n TamboGenerationStageContextProps &\n TamboComponentContextProps &\n TamboInteractableContext &\n TamboContextHelpersContextProps &\n ContextAttachmentState;\n\nexport const TamboContext = createContext<TamboContextProps>(\n {} as TamboContextProps,\n);\n\n/**\n * TamboCompositeProvider is a provider that combines the TamboClient,\n * TamboThread, TamboComponent, and TamboInteractable providers\n * @param props - The props for the TamboCompositeProvider\n * @param props.children - The children to wrap\n * @returns The wrapped component\n */\nexport const TamboCompositeProvider: React.FC<PropsWithChildren> = ({\n children,\n}) => {\n const threads = useTamboThread();\n const clientContext = useContext(TamboClientContext);\n if (!clientContext) {\n throw new Error(\n \"TamboCompositeProvider must be used within a TamboClientProvider\",\n );\n }\n const {\n client,\n queryClient,\n isUpdatingToken,\n mcpAccessToken,\n setMcpAccessToken,\n } = clientContext;\n const componentRegistry = useTamboComponent();\n const interactableComponents = useTamboInteractable();\n const contextHelpers = useTamboContextHelpers();\n const contextAttachment = useTamboContextAttachment();\n\n return (\n <TamboContext.Provider\n value={{\n client,\n queryClient,\n isUpdatingToken,\n mcpAccessToken,\n setMcpAccessToken,\n ...componentRegistry,\n ...threads,\n ...interactableComponents,\n ...contextHelpers,\n ...contextAttachment,\n }}\n >\n {children}\n </TamboContext.Provider>\n );\n};\n\n/**\n * The useTambo hook provides access to the Tambo API. This is the primary entrypoint\n * for the Tambo React SDK.\n *\n * This includes the TamboAI client, the component registry, the current thread context,\n * and interactable component management.\n * @returns The Tambo API\n */\nexport const useTambo = () => {\n return useContext(TamboContext);\n};\n"]}
|
|
@@ -1,14 +1,18 @@
|
|
|
1
1
|
import type TamboAI from "@tambo-ai/typescript-sdk";
|
|
2
2
|
import React, { PropsWithChildren } from "react";
|
|
3
3
|
import { ComponentRegistry, TamboComponent, TamboTool } from "../model/component-metadata";
|
|
4
|
+
import { McpServerInfo, type NormalizedMcpServerInfo } from "../model/mcp-server-info";
|
|
4
5
|
export interface TamboRegistryContext {
|
|
5
6
|
componentList: ComponentRegistry;
|
|
6
7
|
toolRegistry: Record<string, TamboTool>;
|
|
7
8
|
componentToolAssociations: Record<string, string[]>;
|
|
9
|
+
mcpServerInfos: NormalizedMcpServerInfo[];
|
|
8
10
|
registerComponent: (options: TamboComponent) => void;
|
|
9
11
|
registerTool: (tool: TamboTool) => void;
|
|
10
12
|
registerTools: (tools: TamboTool[]) => void;
|
|
11
13
|
addToolAssociation: (componentName: string, tool: TamboTool) => void;
|
|
14
|
+
registerMcpServer: (info: McpServerInfo) => void;
|
|
15
|
+
registerMcpServers: (infos: McpServerInfo[]) => void;
|
|
12
16
|
onCallUnregisteredTool?: (toolName: string, args: TamboAI.ToolCallParameter[]) => Promise<string>;
|
|
13
17
|
}
|
|
14
18
|
export declare const TamboRegistryContext: React.Context<TamboRegistryContext>;
|
|
@@ -17,6 +21,8 @@ export interface TamboRegistryProviderProps {
|
|
|
17
21
|
components?: TamboComponent[];
|
|
18
22
|
/** The tools to register */
|
|
19
23
|
tools?: TamboTool[];
|
|
24
|
+
/** The MCP servers to register */
|
|
25
|
+
mcpServers?: (McpServerInfo | string)[];
|
|
20
26
|
/**
|
|
21
27
|
* A function to call when an unknown tool is called. If this function is not
|
|
22
28
|
* provided, an error will be thrown when a tool call is requested by the
|
|
@@ -34,6 +40,7 @@ export interface TamboRegistryProviderProps {
|
|
|
34
40
|
* @param props.children - The children to wrap
|
|
35
41
|
* @param props.components - The components to register
|
|
36
42
|
* @param props.tools - The tools to register
|
|
43
|
+
* @param props.mcpServers - The MCP servers to register
|
|
37
44
|
* @param props.onCallUnregisteredTool - The function to call when an unknown tool is called (optional)
|
|
38
45
|
* @returns The TamboRegistryProvider component
|
|
39
46
|
*/
|
|
@@ -44,4 +51,34 @@ export declare const TamboRegistryProvider: React.FC<PropsWithChildren<TamboRegi
|
|
|
44
51
|
* @returns The component registry
|
|
45
52
|
*/
|
|
46
53
|
export declare const useTamboRegistry: () => TamboRegistryContext;
|
|
54
|
+
/**
|
|
55
|
+
* Hook to access the MCP server metadata from TamboRegistryProvider.
|
|
56
|
+
* This provides access to the registered MCP server configurations (metadata only, not connections).
|
|
57
|
+
*
|
|
58
|
+
* This hook can be used anywhere within the TamboProvider hierarchy to access
|
|
59
|
+
* the list of configured MCP servers without needing to be inside TamboMcpProvider.
|
|
60
|
+
* @returns Array of MCP server metadata
|
|
61
|
+
* @example
|
|
62
|
+
* ```tsx
|
|
63
|
+
* function MyComponent() {
|
|
64
|
+
* const mcpServers = useTamboMcpServerInfos();
|
|
65
|
+
*
|
|
66
|
+
* return (
|
|
67
|
+
* <div>
|
|
68
|
+
* <h3>Configured MCP Servers:</h3>
|
|
69
|
+
* {mcpServers.map((server) => (
|
|
70
|
+
* <div key={server.url}>
|
|
71
|
+
* {server.name || server.url}
|
|
72
|
+
* </div>
|
|
73
|
+
* ))}
|
|
74
|
+
* </div>
|
|
75
|
+
* );
|
|
76
|
+
* }
|
|
77
|
+
* ```
|
|
78
|
+
*
|
|
79
|
+
* The returned objects are `NormalizedMcpServerInfo` instances, meaning both
|
|
80
|
+
* `serverKey` and `transport` are always populated (with `transport`
|
|
81
|
+
* defaulting to HTTP when not explicitly specified).
|
|
82
|
+
*/
|
|
83
|
+
export declare const useTamboMcpServerInfos: () => NormalizedMcpServerInfo[];
|
|
47
84
|
//# sourceMappingURL=tambo-registry-provider.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tambo-registry-provider.d.ts","sourceRoot":"","sources":["../../src/providers/tambo-registry-provider.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,OAAO,MAAM,0BAA0B,CAAC;AACpD,OAAO,KAAK,EAAE,EAEZ,iBAAiB,
|
|
1
|
+
{"version":3,"file":"tambo-registry-provider.d.ts","sourceRoot":"","sources":["../../src/providers/tambo-registry-provider.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,OAAO,MAAM,0BAA0B,CAAC;AACpD,OAAO,KAAK,EAAE,EAEZ,iBAAiB,EAMlB,MAAM,OAAO,CAAC;AAGf,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,SAAS,EACV,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAEL,aAAa,EAEb,KAAK,uBAAuB,EAC7B,MAAM,0BAA0B,CAAC;AAqFlC,MAAM,WAAW,oBAAoB;IACnC,aAAa,EAAE,iBAAiB,CAAC;IACjC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACxC,yBAAyB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACpD,cAAc,EAAE,uBAAuB,EAAE,CAAC;IAC1C,iBAAiB,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,CAAC;IACrD,YAAY,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,IAAI,CAAC;IACxC,aAAa,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,IAAI,CAAC;IAC5C,kBAAkB,EAAE,CAAC,aAAa,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,KAAK,IAAI,CAAC;IACrE,iBAAiB,EAAE,CAAC,IAAI,EAAE,aAAa,KAAK,IAAI,CAAC;IACjD,kBAAkB,EAAE,CAAC,KAAK,EAAE,aAAa,EAAE,KAAK,IAAI,CAAC;IACrD,sBAAsB,CAAC,EAAE,CACvB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,OAAO,CAAC,iBAAiB,EAAE,KAC9B,OAAO,CAAC,MAAM,CAAC,CAAC;CACtB;AAED,eAAO,MAAM,oBAAoB,qCA6B/B,CAAC;AAEH,MAAM,WAAW,0BAA0B;IACzC,iCAAiC;IACjC,UAAU,CAAC,EAAE,cAAc,EAAE,CAAC;IAC9B,4BAA4B;IAC5B,KAAK,CAAC,EAAE,SAAS,EAAE,CAAC;IACpB,kCAAkC;IAClC,UAAU,CAAC,EAAE,CAAC,aAAa,GAAG,MAAM,CAAC,EAAE,CAAC;IAExC;;;;;;;OAOG;IACH,sBAAsB,CAAC,EAAE,CACvB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,OAAO,CAAC,iBAAiB,EAAE,KAC9B,OAAO,CAAC,MAAM,CAAC,CAAC;CACtB;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,qBAAqB,EAAE,KAAK,CAAC,EAAE,CAC1C,iBAAiB,CAAC,0BAA0B,CAAC,CAiO9C,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,4BAE5B,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,eAAO,MAAM,sBAAsB,QAAO,uBAAuB,EAEhE,CAAC"}
|
|
@@ -37,16 +37,85 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
37
37
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
38
38
|
};
|
|
39
39
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
-
exports.useTamboRegistry = exports.TamboRegistryProvider = exports.TamboRegistryContext = void 0;
|
|
40
|
+
exports.useTamboMcpServerInfos = exports.useTamboRegistry = exports.TamboRegistryProvider = exports.TamboRegistryContext = void 0;
|
|
41
41
|
const react_1 = __importStar(require("react"));
|
|
42
42
|
const zod_1 = require("zod");
|
|
43
43
|
const zod_to_json_schema_1 = __importDefault(require("zod-to-json-schema"));
|
|
44
|
+
const mcp_server_info_1 = require("../model/mcp-server-info");
|
|
44
45
|
const validate_component_name_1 = require("../util/validate-component-name");
|
|
45
46
|
const validate_zod_schema_1 = require("../util/validate-zod-schema");
|
|
47
|
+
/**
|
|
48
|
+
* Derives a short, meaningful key from a server URL.
|
|
49
|
+
* Strips TLDs and common prefixes to get a human-readable identifier.
|
|
50
|
+
* For example, "https://mcp.linear.app/mcp" becomes "linear".
|
|
51
|
+
* @returns A lowercased, human-readable key derived from the URL
|
|
52
|
+
*/
|
|
53
|
+
function deriveServerKey(url) {
|
|
54
|
+
try {
|
|
55
|
+
const parsed = new URL(url);
|
|
56
|
+
const hostname = parsed.hostname;
|
|
57
|
+
// Split hostname into parts
|
|
58
|
+
const parts = hostname.split(".");
|
|
59
|
+
// Remove common TLD patterns
|
|
60
|
+
// Handle cases like: .com, .org, .co.uk, .com.au, etc.
|
|
61
|
+
let relevantParts = [...parts];
|
|
62
|
+
// If we have 3+ parts and the last two are short (likely TLD like .co.uk)
|
|
63
|
+
if (relevantParts.length >= 3 &&
|
|
64
|
+
relevantParts[relevantParts.length - 1].length <= 3 &&
|
|
65
|
+
relevantParts[relevantParts.length - 2].length <= 3) {
|
|
66
|
+
relevantParts = relevantParts.slice(0, -2);
|
|
67
|
+
}
|
|
68
|
+
// Otherwise just remove the last part (TLD like .com)
|
|
69
|
+
else if (relevantParts.length >= 2) {
|
|
70
|
+
relevantParts = relevantParts.slice(0, -1);
|
|
71
|
+
}
|
|
72
|
+
// From what's left, prefer the rightmost part that's not a common prefix
|
|
73
|
+
// Common prefixes: www, api, mcp, app, etc.
|
|
74
|
+
const commonPrefixes = new Set([
|
|
75
|
+
"www",
|
|
76
|
+
"api",
|
|
77
|
+
"mcp",
|
|
78
|
+
"app",
|
|
79
|
+
"staging",
|
|
80
|
+
"dev",
|
|
81
|
+
"prod",
|
|
82
|
+
]);
|
|
83
|
+
// Work backwards through the parts to find a meaningful name
|
|
84
|
+
for (let i = relevantParts.length - 1; i >= 0; i--) {
|
|
85
|
+
const part = relevantParts[i];
|
|
86
|
+
if (part && !commonPrefixes.has(part.toLowerCase())) {
|
|
87
|
+
return part.toLowerCase();
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
// Fallback: use the last relevant part even if it's a common prefix
|
|
91
|
+
return relevantParts[relevantParts.length - 1]?.toLowerCase() || hostname;
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
// If URL parsing fails, just return a sanitized version of the input
|
|
95
|
+
return url.replace(/[^a-zA-Z0-9]/g, "_").toLowerCase();
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Normalizes an MCP server info object, ensuring it has a serverKey.
|
|
100
|
+
* If serverKey is not provided, derives it from the URL.
|
|
101
|
+
* @returns The normalized MCP server info object
|
|
102
|
+
*/
|
|
103
|
+
function normalizeServerInfo(server) {
|
|
104
|
+
const base = typeof server === "string"
|
|
105
|
+
? {
|
|
106
|
+
url: server,
|
|
107
|
+
transport: mcp_server_info_1.MCPTransport.HTTP,
|
|
108
|
+
}
|
|
109
|
+
: server;
|
|
110
|
+
const serverKey = base.serverKey ?? deriveServerKey(base.url);
|
|
111
|
+
const transport = base.transport ?? mcp_server_info_1.MCPTransport.HTTP;
|
|
112
|
+
return { ...base, transport, serverKey };
|
|
113
|
+
}
|
|
46
114
|
exports.TamboRegistryContext = (0, react_1.createContext)({
|
|
47
115
|
componentList: {},
|
|
48
116
|
toolRegistry: {},
|
|
49
117
|
componentToolAssociations: {},
|
|
118
|
+
mcpServerInfos: [],
|
|
50
119
|
/**
|
|
51
120
|
*
|
|
52
121
|
*/
|
|
@@ -63,6 +132,14 @@ exports.TamboRegistryContext = (0, react_1.createContext)({
|
|
|
63
132
|
*
|
|
64
133
|
*/
|
|
65
134
|
addToolAssociation: () => { },
|
|
135
|
+
/**
|
|
136
|
+
*
|
|
137
|
+
*/
|
|
138
|
+
registerMcpServer: () => { },
|
|
139
|
+
/**
|
|
140
|
+
*
|
|
141
|
+
*/
|
|
142
|
+
registerMcpServers: () => { },
|
|
66
143
|
});
|
|
67
144
|
/**
|
|
68
145
|
* The TamboRegistryProvider is a React provider that provides a component
|
|
@@ -71,13 +148,16 @@ exports.TamboRegistryContext = (0, react_1.createContext)({
|
|
|
71
148
|
* @param props.children - The children to wrap
|
|
72
149
|
* @param props.components - The components to register
|
|
73
150
|
* @param props.tools - The tools to register
|
|
151
|
+
* @param props.mcpServers - The MCP servers to register
|
|
74
152
|
* @param props.onCallUnregisteredTool - The function to call when an unknown tool is called (optional)
|
|
75
153
|
* @returns The TamboRegistryProvider component
|
|
76
154
|
*/
|
|
77
|
-
const TamboRegistryProvider = ({ children, components: userComponents, tools: userTools, onCallUnregisteredTool, }) => {
|
|
155
|
+
const TamboRegistryProvider = ({ children, components: userComponents, tools: userTools, mcpServers: userMcpServers, onCallUnregisteredTool, }) => {
|
|
78
156
|
const [componentList, setComponentList] = (0, react_1.useState)({});
|
|
79
157
|
const [toolRegistry, setToolRegistry] = (0, react_1.useState)({});
|
|
80
158
|
const [componentToolAssociations, setComponentToolAssociations] = (0, react_1.useState)({});
|
|
159
|
+
const [staticMcpServerInfos, setStaticMcpServerInfos] = (0, react_1.useState)([]);
|
|
160
|
+
const [dynamicMcpServerInfos, setDynamicMcpServerInfos] = (0, react_1.useState)([]);
|
|
81
161
|
const registerTool = (0, react_1.useCallback)((tool, warnOnOverwrite = true) => {
|
|
82
162
|
// Validate tool name
|
|
83
163
|
(0, validate_component_name_1.assertValidName)(tool.name, "tool");
|
|
@@ -98,6 +178,14 @@ const TamboRegistryProvider = ({ children, components: userComponents, tools: us
|
|
|
98
178
|
const registerTools = (0, react_1.useCallback)((tools, warnOnOverwrite = true) => {
|
|
99
179
|
tools.forEach((tool) => registerTool(tool, warnOnOverwrite));
|
|
100
180
|
}, [registerTool]);
|
|
181
|
+
const registerMcpServer = (0, react_1.useCallback)((info) => {
|
|
182
|
+
const normalized = normalizeServerInfo(info);
|
|
183
|
+
setDynamicMcpServerInfos((prev) => [...prev, normalized]);
|
|
184
|
+
}, []);
|
|
185
|
+
const registerMcpServers = (0, react_1.useCallback)((infos) => {
|
|
186
|
+
const normalized = infos.map(normalizeServerInfo);
|
|
187
|
+
setDynamicMcpServerInfos((prev) => [...prev, ...normalized]);
|
|
188
|
+
}, []);
|
|
101
189
|
const addToolAssociation = (0, react_1.useCallback)((componentName, tool) => {
|
|
102
190
|
// Validate component and tool names
|
|
103
191
|
(0, validate_component_name_1.assertValidName)(componentName, "component");
|
|
@@ -167,14 +255,53 @@ const TamboRegistryProvider = ({ children, components: userComponents, tools: us
|
|
|
167
255
|
registerTools(userTools, false);
|
|
168
256
|
}
|
|
169
257
|
}, [registerTools, userTools]);
|
|
258
|
+
(0, react_1.useEffect)(() => {
|
|
259
|
+
if (!userMcpServers || userMcpServers.length === 0) {
|
|
260
|
+
setStaticMcpServerInfos([]);
|
|
261
|
+
return;
|
|
262
|
+
}
|
|
263
|
+
// Normalize servers from props and ensure all have serverKey and transport
|
|
264
|
+
const normalized = userMcpServers.map(normalizeServerInfo);
|
|
265
|
+
setStaticMcpServerInfos(normalized);
|
|
266
|
+
}, [userMcpServers]);
|
|
267
|
+
const mcpServerInfos = (0, react_1.useMemo)(() => {
|
|
268
|
+
const allServers = [...staticMcpServerInfos, ...dynamicMcpServerInfos];
|
|
269
|
+
if (allServers.length === 0) {
|
|
270
|
+
return allServers;
|
|
271
|
+
}
|
|
272
|
+
// 1. Deduplicate by connection identity using a stable key
|
|
273
|
+
const byKey = new Map();
|
|
274
|
+
for (const server of allServers) {
|
|
275
|
+
const key = (0, mcp_server_info_1.getMcpServerUniqueKey)(server);
|
|
276
|
+
byKey.set(key, server);
|
|
277
|
+
}
|
|
278
|
+
const deduped = Array.from(byKey.values());
|
|
279
|
+
// 2. Ensure serverKey uniqueness for readable, unambiguous prefixes
|
|
280
|
+
const seen = new Map();
|
|
281
|
+
return deduped.map((server) => {
|
|
282
|
+
const baseKey = server.serverKey;
|
|
283
|
+
const count = (seen.get(baseKey) ?? 0) + 1;
|
|
284
|
+
seen.set(baseKey, count);
|
|
285
|
+
if (count === 1) {
|
|
286
|
+
return server;
|
|
287
|
+
}
|
|
288
|
+
return {
|
|
289
|
+
...server,
|
|
290
|
+
serverKey: `${baseKey}-${count}`,
|
|
291
|
+
};
|
|
292
|
+
});
|
|
293
|
+
}, [staticMcpServerInfos, dynamicMcpServerInfos]);
|
|
170
294
|
const value = {
|
|
171
295
|
componentList,
|
|
172
296
|
toolRegistry,
|
|
173
297
|
componentToolAssociations,
|
|
298
|
+
mcpServerInfos,
|
|
174
299
|
registerComponent,
|
|
175
300
|
registerTool,
|
|
176
301
|
registerTools,
|
|
177
302
|
addToolAssociation,
|
|
303
|
+
registerMcpServer,
|
|
304
|
+
registerMcpServers,
|
|
178
305
|
onCallUnregisteredTool,
|
|
179
306
|
};
|
|
180
307
|
return (react_1.default.createElement(exports.TamboRegistryContext.Provider, { value: value }, children));
|
|
@@ -189,6 +316,39 @@ const useTamboRegistry = () => {
|
|
|
189
316
|
return (0, react_1.useContext)(exports.TamboRegistryContext);
|
|
190
317
|
};
|
|
191
318
|
exports.useTamboRegistry = useTamboRegistry;
|
|
319
|
+
/**
|
|
320
|
+
* Hook to access the MCP server metadata from TamboRegistryProvider.
|
|
321
|
+
* This provides access to the registered MCP server configurations (metadata only, not connections).
|
|
322
|
+
*
|
|
323
|
+
* This hook can be used anywhere within the TamboProvider hierarchy to access
|
|
324
|
+
* the list of configured MCP servers without needing to be inside TamboMcpProvider.
|
|
325
|
+
* @returns Array of MCP server metadata
|
|
326
|
+
* @example
|
|
327
|
+
* ```tsx
|
|
328
|
+
* function MyComponent() {
|
|
329
|
+
* const mcpServers = useTamboMcpServerInfos();
|
|
330
|
+
*
|
|
331
|
+
* return (
|
|
332
|
+
* <div>
|
|
333
|
+
* <h3>Configured MCP Servers:</h3>
|
|
334
|
+
* {mcpServers.map((server) => (
|
|
335
|
+
* <div key={server.url}>
|
|
336
|
+
* {server.name || server.url}
|
|
337
|
+
* </div>
|
|
338
|
+
* ))}
|
|
339
|
+
* </div>
|
|
340
|
+
* );
|
|
341
|
+
* }
|
|
342
|
+
* ```
|
|
343
|
+
*
|
|
344
|
+
* The returned objects are `NormalizedMcpServerInfo` instances, meaning both
|
|
345
|
+
* `serverKey` and `transport` are always populated (with `transport`
|
|
346
|
+
* defaulting to HTTP when not explicitly specified).
|
|
347
|
+
*/
|
|
348
|
+
const useTamboMcpServerInfos = () => {
|
|
349
|
+
return (0, react_1.useContext)(exports.TamboRegistryContext).mcpServerInfos;
|
|
350
|
+
};
|
|
351
|
+
exports.useTamboMcpServerInfos = useTamboMcpServerInfos;
|
|
192
352
|
function getSerializedProps(propsDefinition, propsSchema, name) {
|
|
193
353
|
if (propsDefinition) {
|
|
194
354
|
console.warn(`propsDefinition is deprecated. Use propsSchema instead.`);
|