@tambo-ai/react 0.58.1 → 0.60.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/hooks/react-query-hooks.d.ts +14 -1
- package/dist/hooks/react-query-hooks.d.ts.map +1 -1
- package/dist/hooks/react-query-hooks.js +13 -0
- package/dist/hooks/react-query-hooks.js.map +1 -1
- package/dist/hooks/use-tambo-stream-status.js +1 -1
- package/dist/hooks/use-tambo-stream-status.js.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/mcp/__tests__/elicitation.test.d.ts +2 -0
- package/dist/mcp/__tests__/elicitation.test.d.ts.map +1 -0
- package/dist/mcp/__tests__/elicitation.test.js +261 -0
- package/dist/mcp/__tests__/elicitation.test.js.map +1 -0
- package/dist/mcp/__tests__/mcp-client.test.js +0 -266
- package/dist/mcp/__tests__/mcp-client.test.js.map +1 -1
- package/dist/mcp/__tests__/mcp-hooks.test.d.ts +2 -0
- package/dist/mcp/__tests__/mcp-hooks.test.d.ts.map +1 -0
- package/dist/mcp/__tests__/mcp-hooks.test.js +504 -0
- package/dist/mcp/__tests__/mcp-hooks.test.js.map +1 -0
- package/dist/mcp/__tests__/tambo-mcp-provider.test.js +361 -16
- package/dist/mcp/__tests__/tambo-mcp-provider.test.js.map +1 -1
- package/dist/mcp/__tests__/use-mcp-servers.test.js +34 -9
- package/dist/mcp/__tests__/use-mcp-servers.test.js.map +1 -1
- package/dist/mcp/elicitation.d.ts +80 -0
- package/dist/mcp/elicitation.d.ts.map +1 -0
- package/dist/mcp/elicitation.js +55 -0
- package/dist/mcp/elicitation.js.map +1 -0
- package/dist/mcp/index.d.ts +4 -1
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js +5 -1
- package/dist/mcp/index.js.map +1 -1
- package/dist/mcp/mcp-client.d.ts +51 -86
- package/dist/mcp/mcp-client.d.ts.map +1 -1
- package/dist/mcp/mcp-client.js +22 -159
- package/dist/mcp/mcp-client.js.map +1 -1
- package/dist/mcp/mcp-hooks.d.ts +107 -0
- package/dist/mcp/mcp-hooks.d.ts.map +1 -0
- package/dist/mcp/mcp-hooks.js +103 -0
- package/dist/mcp/mcp-hooks.js.map +1 -0
- package/dist/mcp/tambo-mcp-provider.d.ts +86 -4
- package/dist/mcp/tambo-mcp-provider.d.ts.map +1 -1
- package/dist/mcp/tambo-mcp-provider.js +275 -106
- package/dist/mcp/tambo-mcp-provider.js.map +1 -1
- package/dist/providers/__tests__/tambo-thread-provider-initial-messages.test.js +3 -1
- package/dist/providers/__tests__/tambo-thread-provider-initial-messages.test.js.map +1 -1
- package/dist/providers/__tests__/tambo-thread-provider.test.js +25 -12
- package/dist/providers/__tests__/tambo-thread-provider.test.js.map +1 -1
- package/dist/providers/tambo-interactable-provider.d.ts.map +1 -1
- package/dist/providers/tambo-interactable-provider.js +11 -4
- package/dist/providers/tambo-interactable-provider.js.map +1 -1
- package/dist/providers/tambo-mcp-token-provider.d.ts +34 -0
- package/dist/providers/tambo-mcp-token-provider.d.ts.map +1 -0
- package/dist/providers/tambo-mcp-token-provider.js +69 -0
- package/dist/providers/tambo-mcp-token-provider.js.map +1 -0
- package/dist/providers/tambo-provider.d.ts.map +1 -1
- package/dist/providers/tambo-provider.js +7 -9
- package/dist/providers/tambo-provider.js.map +1 -1
- package/dist/providers/tambo-thread-provider.d.ts.map +1 -1
- package/dist/providers/tambo-thread-provider.js +14 -0
- package/dist/providers/tambo-thread-provider.js.map +1 -1
- package/esm/hooks/react-query-hooks.d.ts +14 -1
- package/esm/hooks/react-query-hooks.d.ts.map +1 -1
- package/esm/hooks/react-query-hooks.js +13 -1
- package/esm/hooks/react-query-hooks.js.map +1 -1
- package/esm/hooks/use-tambo-stream-status.js +1 -1
- package/esm/hooks/use-tambo-stream-status.js.map +1 -1
- package/esm/index.js +2 -0
- package/esm/index.js.map +1 -1
- package/esm/mcp/__tests__/elicitation.test.d.ts +2 -0
- package/esm/mcp/__tests__/elicitation.test.d.ts.map +1 -0
- package/esm/mcp/__tests__/elicitation.test.js +259 -0
- package/esm/mcp/__tests__/elicitation.test.js.map +1 -0
- package/esm/mcp/__tests__/mcp-client.test.js +0 -266
- package/esm/mcp/__tests__/mcp-client.test.js.map +1 -1
- package/esm/mcp/__tests__/mcp-hooks.test.d.ts +2 -0
- package/esm/mcp/__tests__/mcp-hooks.test.d.ts.map +1 -0
- package/esm/mcp/__tests__/mcp-hooks.test.js +469 -0
- package/esm/mcp/__tests__/mcp-hooks.test.js.map +1 -0
- package/esm/mcp/__tests__/tambo-mcp-provider.test.js +361 -16
- package/esm/mcp/__tests__/tambo-mcp-provider.test.js.map +1 -1
- package/esm/mcp/__tests__/use-mcp-servers.test.js +34 -9
- package/esm/mcp/__tests__/use-mcp-servers.test.js.map +1 -1
- package/esm/mcp/elicitation.d.ts +80 -0
- package/esm/mcp/elicitation.d.ts.map +1 -0
- package/esm/mcp/elicitation.js +52 -0
- package/esm/mcp/elicitation.js.map +1 -0
- package/esm/mcp/index.d.ts +4 -1
- package/esm/mcp/index.d.ts.map +1 -1
- package/esm/mcp/index.js +2 -1
- package/esm/mcp/index.js.map +1 -1
- package/esm/mcp/mcp-client.d.ts +51 -86
- package/esm/mcp/mcp-client.d.ts.map +1 -1
- package/esm/mcp/mcp-client.js +22 -159
- package/esm/mcp/mcp-client.js.map +1 -1
- package/esm/mcp/mcp-hooks.d.ts +107 -0
- package/esm/mcp/mcp-hooks.d.ts.map +1 -0
- package/esm/mcp/mcp-hooks.js +99 -0
- package/esm/mcp/mcp-hooks.js.map +1 -0
- package/esm/mcp/tambo-mcp-provider.d.ts +86 -4
- package/esm/mcp/tambo-mcp-provider.d.ts.map +1 -1
- package/esm/mcp/tambo-mcp-provider.js +275 -107
- package/esm/mcp/tambo-mcp-provider.js.map +1 -1
- package/esm/providers/__tests__/tambo-thread-provider-initial-messages.test.js +3 -1
- package/esm/providers/__tests__/tambo-thread-provider-initial-messages.test.js.map +1 -1
- package/esm/providers/__tests__/tambo-thread-provider.test.js +25 -12
- package/esm/providers/__tests__/tambo-thread-provider.test.js.map +1 -1
- package/esm/providers/tambo-interactable-provider.d.ts.map +1 -1
- package/esm/providers/tambo-interactable-provider.js +11 -4
- package/esm/providers/tambo-interactable-provider.js.map +1 -1
- package/esm/providers/tambo-mcp-token-provider.d.ts +34 -0
- package/esm/providers/tambo-mcp-token-provider.d.ts.map +1 -0
- package/esm/providers/tambo-mcp-token-provider.js +31 -0
- package/esm/providers/tambo-mcp-token-provider.js.map +1 -0
- package/esm/providers/tambo-provider.d.ts.map +1 -1
- package/esm/providers/tambo-provider.js +7 -9
- package/esm/providers/tambo-provider.js.map +1 -1
- package/esm/providers/tambo-thread-provider.d.ts.map +1 -1
- package/esm/providers/tambo-thread-provider.js +14 -0
- package/esm/providers/tambo-thread-provider.js.map +1 -1
- package/package.json +8 -8
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { useTamboQueries, useTamboQuery } from "../hooks";
|
|
2
|
+
import { useTamboMcpServers, } from "./tambo-mcp-provider";
|
|
3
|
+
/**
|
|
4
|
+
* Hook to get the prompts for all the registered MCP servers.
|
|
5
|
+
* @returns The prompts for the MCP servers, including the server that the prompt was found on.
|
|
6
|
+
*/
|
|
7
|
+
export function useTamboMcpPromptList() {
|
|
8
|
+
const mcpServers = useTamboMcpServers();
|
|
9
|
+
const queries = useTamboQueries({
|
|
10
|
+
queries: mcpServers.map((mcpServer) => ({
|
|
11
|
+
queryKey: ["mcp-prompts", mcpServer.key],
|
|
12
|
+
// Only run for connected servers that have a client
|
|
13
|
+
enabled: isConnectedMcpServer(mcpServer),
|
|
14
|
+
queryFn: async () => {
|
|
15
|
+
// Fast path: if this server doesn't have a client, skip work
|
|
16
|
+
if (!isConnectedMcpServer(mcpServer))
|
|
17
|
+
return [];
|
|
18
|
+
const result = await mcpServer.client.client.listPrompts();
|
|
19
|
+
const prompts = result?.prompts ?? [];
|
|
20
|
+
const promptsEntries = prompts.map((prompt) => ({
|
|
21
|
+
server: mcpServer,
|
|
22
|
+
prompt,
|
|
23
|
+
}));
|
|
24
|
+
return promptsEntries;
|
|
25
|
+
},
|
|
26
|
+
})),
|
|
27
|
+
combine: (results) => {
|
|
28
|
+
return combineArrayResults(results);
|
|
29
|
+
},
|
|
30
|
+
});
|
|
31
|
+
return queries;
|
|
32
|
+
}
|
|
33
|
+
// TODO: find a more general place for this
|
|
34
|
+
function combineArrayResults(results) {
|
|
35
|
+
const errors = results
|
|
36
|
+
.filter((result) => result.isError)
|
|
37
|
+
.map((result) => result.error);
|
|
38
|
+
// Treat queries that are idle (disabled) as non-blocking for aggregate status
|
|
39
|
+
const enabledish = results.filter((r) => r.fetchStatus !== "idle" || r.isSuccess || r.isError);
|
|
40
|
+
return {
|
|
41
|
+
// Prefer flatMap to avoid extra intermediate arrays
|
|
42
|
+
data: results.flatMap((result) => result.isSuccess && Array.isArray(result.data) ? result.data : []),
|
|
43
|
+
// Preserve a single error for compatibility and expose the full list for diagnostics
|
|
44
|
+
error: errors[0] ?? null,
|
|
45
|
+
errors,
|
|
46
|
+
isPending: enabledish.some((result) => result.isPending),
|
|
47
|
+
isSuccess: enabledish.length > 0 && enabledish.every((result) => result.isSuccess),
|
|
48
|
+
isError: errors.length > 0,
|
|
49
|
+
isPaused: enabledish.some((result) => result.isPaused),
|
|
50
|
+
isRefetching: enabledish.some((result) => result.isRefetching),
|
|
51
|
+
isFetching: enabledish.some((result) => result.isFetching),
|
|
52
|
+
isLoading: enabledish.some((result) => result.isLoading),
|
|
53
|
+
// Aggregate refetch to trigger all underlying queries
|
|
54
|
+
refetch: async () => {
|
|
55
|
+
await Promise.all(results.map(async (r) => {
|
|
56
|
+
await r.refetch();
|
|
57
|
+
}));
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
// Type guard for narrowing to connected servers
|
|
62
|
+
function isConnectedMcpServer(server) {
|
|
63
|
+
return "client" in server && server.client != null;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Hook to get the prompt for the specified name.
|
|
67
|
+
* @param promptName - The name of the prompt to get. If the prompt won't return anything
|
|
68
|
+
* @param args - The arguments to pass to the prompt.
|
|
69
|
+
* @returns The prompt for the specified name.
|
|
70
|
+
*/
|
|
71
|
+
export function useTamboMcpPrompt(promptName, args = {}) {
|
|
72
|
+
// figure out which server has the prompt
|
|
73
|
+
const { data: promptEntries } = useTamboMcpPromptList();
|
|
74
|
+
const promptEntry = promptEntries?.find((prompt) => prompt.prompt.name === promptName);
|
|
75
|
+
// Use the stable server key (and the server instance itself) instead of brittle
|
|
76
|
+
// name/url/transport matching.
|
|
77
|
+
const mcpServer = promptEntry?.server;
|
|
78
|
+
// Canonicalize args to avoid unstable cache keys from object identity/order
|
|
79
|
+
const sortedArgsEntries = Object.keys(args)
|
|
80
|
+
.sort()
|
|
81
|
+
.map((k) => [k, args[k]]);
|
|
82
|
+
return useTamboQuery({
|
|
83
|
+
// Include server identity and sorted args to prevent stale cache hits
|
|
84
|
+
queryKey: ["mcp-prompt", promptName, mcpServer?.key, sortedArgsEntries],
|
|
85
|
+
// Only run when we have a prompt name and a connected server
|
|
86
|
+
enabled: Boolean(promptName && mcpServer && isConnectedMcpServer(mcpServer)),
|
|
87
|
+
queryFn: async () => {
|
|
88
|
+
if (!promptName || !mcpServer || !isConnectedMcpServer(mcpServer)) {
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
91
|
+
const result = await mcpServer.client.client.getPrompt({
|
|
92
|
+
name: promptName,
|
|
93
|
+
arguments: args,
|
|
94
|
+
});
|
|
95
|
+
return result ?? null; // return null because react-query doesn't like undefined results
|
|
96
|
+
},
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=mcp-hooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-hooks.js","sourceRoot":"","sources":["../../src/mcp/mcp-hooks.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n GetPromptResult,\n type ListPromptsResult,\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport { UseQueryResult } from \"@tanstack/react-query\";\nimport { useTamboQueries, useTamboQuery } from \"../hooks\";\nimport {\n type ConnectedMcpServer,\n type McpServer,\n useTamboMcpServers,\n} from \"./tambo-mcp-provider\";\n\nexport type ListPromptItem = ListPromptsResult[\"prompts\"][number];\nexport interface ListPromptEntry {\n // Only connected servers produce prompt entries, so expose the connected type\n server: ConnectedMcpServer;\n prompt: ListPromptItem;\n}\n\n/**\n * Hook to get the prompts for all the registered MCP servers.\n * @returns The prompts for the MCP servers, including the server that the prompt was found on.\n */\nexport function useTamboMcpPromptList() {\n const mcpServers = useTamboMcpServers();\n const queries = useTamboQueries({\n queries: mcpServers.map((mcpServer) => ({\n queryKey: [\"mcp-prompts\", mcpServer.key],\n // Only run for connected servers that have a client\n enabled: isConnectedMcpServer(mcpServer),\n queryFn: async (): Promise<ListPromptEntry[]> => {\n // Fast path: if this server doesn't have a client, skip work\n if (!isConnectedMcpServer(mcpServer)) return [];\n\n const result = await mcpServer.client.client.listPrompts();\n const prompts: ListPromptItem[] = result?.prompts ?? [];\n const promptsEntries = prompts.map((prompt) => ({\n server: mcpServer,\n prompt,\n }));\n return promptsEntries;\n },\n })),\n combine: (results) => {\n return combineArrayResults(results);\n },\n });\n\n return queries;\n}\n// TODO: find a more general place for this\nfunction combineArrayResults<T>(results: UseQueryResult<T[], Error>[]): {\n data: T[];\n error: Error | null;\n errors: Error[];\n isPending: boolean;\n isSuccess: boolean;\n isError: boolean;\n isPaused: boolean;\n isRefetching: boolean;\n isFetching: boolean;\n isLoading: boolean;\n refetch: () => Promise<void>;\n} {\n const errors = results\n .filter((result) => result.isError)\n .map((result) => result.error as Error);\n\n // Treat queries that are idle (disabled) as non-blocking for aggregate status\n const enabledish = results.filter(\n (r) => r.fetchStatus !== \"idle\" || r.isSuccess || r.isError,\n );\n\n return {\n // Prefer flatMap to avoid extra intermediate arrays\n data: results.flatMap((result) =>\n result.isSuccess && Array.isArray(result.data) ? result.data : [],\n ),\n // Preserve a single error for compatibility and expose the full list for diagnostics\n error: errors[0] ?? null,\n errors,\n isPending: enabledish.some((result) => result.isPending),\n isSuccess:\n enabledish.length > 0 && enabledish.every((result) => result.isSuccess),\n isError: errors.length > 0,\n isPaused: enabledish.some((result) => result.isPaused),\n isRefetching: enabledish.some((result) => result.isRefetching),\n isFetching: enabledish.some((result) => result.isFetching),\n isLoading: enabledish.some((result) => result.isLoading),\n // Aggregate refetch to trigger all underlying queries\n refetch: async () => {\n await Promise.all(\n results.map(async (r) => {\n await r.refetch();\n }),\n );\n },\n };\n}\n\n// Type guard for narrowing to connected servers\nfunction isConnectedMcpServer(server: McpServer): server is ConnectedMcpServer {\n return \"client\" in server && server.client != null;\n}\n\n/**\n * Hook to get the prompt for the specified name.\n * @param promptName - The name of the prompt to get. If the prompt won't return anything\n * @param args - The arguments to pass to the prompt.\n * @returns The prompt for the specified name.\n */\nexport function useTamboMcpPrompt(\n promptName: string | undefined,\n args: Record<string, string> = {},\n) {\n // figure out which server has the prompt\n const { data: promptEntries } = useTamboMcpPromptList();\n const promptEntry = promptEntries?.find(\n (prompt) => prompt.prompt.name === promptName,\n );\n // Use the stable server key (and the server instance itself) instead of brittle\n // name/url/transport matching.\n const mcpServer = promptEntry?.server;\n\n // Canonicalize args to avoid unstable cache keys from object identity/order\n const sortedArgsEntries = Object.keys(args)\n .sort()\n .map((k) => [k, args[k]] as const);\n return useTamboQuery({\n // Include server identity and sorted args to prevent stale cache hits\n queryKey: [\"mcp-prompt\", promptName, mcpServer?.key, sortedArgsEntries],\n // Only run when we have a prompt name and a connected server\n enabled: Boolean(\n promptName && mcpServer && isConnectedMcpServer(mcpServer),\n ),\n queryFn: async (): Promise<GetPromptResult | null> => {\n if (!promptName || !mcpServer || !isConnectedMcpServer(mcpServer)) {\n return null;\n }\n const result = await mcpServer.client.client.getPrompt({\n name: promptName,\n arguments: args,\n });\n return result ?? null; // return null because react-query doesn't like undefined results\n },\n });\n}\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import React, { FC } from "react";
|
|
2
|
-
import { MCPClient, MCPTransport } from "./mcp-client";
|
|
2
|
+
import { MCPClient, MCPElicitationHandler, MCPHandlers, MCPSamplingHandler, MCPTransport } from "./mcp-client";
|
|
3
3
|
/**
|
|
4
4
|
* Extracts error message from MCP tool result content.
|
|
5
5
|
* Handles both array and string content formats.
|
|
@@ -7,27 +7,79 @@ import { MCPClient, MCPTransport } from "./mcp-client";
|
|
|
7
7
|
* @returns The extracted error message as a string
|
|
8
8
|
*/
|
|
9
9
|
export declare function extractErrorMessage(content: unknown): string;
|
|
10
|
+
/**
|
|
11
|
+
* User-provided configuration for an MCP server.
|
|
12
|
+
*/
|
|
10
13
|
export interface McpServerInfo {
|
|
14
|
+
/** Optional name for the MCP server */
|
|
11
15
|
name?: string;
|
|
16
|
+
/** The URL of the MCP server to connect to */
|
|
12
17
|
url: string;
|
|
18
|
+
/** Optional description of the MCP server */
|
|
13
19
|
description?: string;
|
|
20
|
+
/** The transport type to use (SSE or HTTP). Defaults to SSE for string URLs */
|
|
14
21
|
transport?: MCPTransport;
|
|
22
|
+
/** Optional custom headers to include in requests */
|
|
15
23
|
customHeaders?: Record<string, string>;
|
|
24
|
+
/**
|
|
25
|
+
* Optional handlers for elicitation and sampling requests from the server.
|
|
26
|
+
* Note: These callbacks should be stable (e.g., wrapped in useCallback or defined outside the component)
|
|
27
|
+
* to avoid constant re-registration of the MCP server on every render.
|
|
28
|
+
*/
|
|
29
|
+
handlers?: Partial<MCPHandlers>;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Normalized server information with a stable derived key.
|
|
33
|
+
*/
|
|
34
|
+
interface McpServerConfig extends McpServerInfo {
|
|
35
|
+
/**
|
|
36
|
+
* Stable identity for this server derived from its URL/transport/headers.
|
|
37
|
+
* Present for all server states (connected or failed).
|
|
38
|
+
*/
|
|
39
|
+
key: string;
|
|
16
40
|
}
|
|
17
|
-
|
|
41
|
+
/**
|
|
42
|
+
* Connected MCP server with an active client.
|
|
43
|
+
*/
|
|
44
|
+
export interface ConnectedMcpServer extends McpServerConfig {
|
|
18
45
|
client: MCPClient;
|
|
19
46
|
}
|
|
20
|
-
|
|
47
|
+
/**
|
|
48
|
+
* Failed MCP server with a connection error.
|
|
49
|
+
*/
|
|
50
|
+
export interface FailedMcpServer extends McpServerConfig {
|
|
21
51
|
client?: never;
|
|
22
52
|
connectionError: Error;
|
|
23
53
|
}
|
|
54
|
+
/**
|
|
55
|
+
* An active or failed MCP server, with access to the MCP client.
|
|
56
|
+
*/
|
|
24
57
|
export type McpServer = ConnectedMcpServer | FailedMcpServer;
|
|
58
|
+
/**
|
|
59
|
+
* Provider-level MCP handlers that receive the McpServerInfo as context in addition to the request.
|
|
60
|
+
* These handlers are applied to all MCP servers unless overridden by per-server handlers.
|
|
61
|
+
*
|
|
62
|
+
* Handlers receive three parameters:
|
|
63
|
+
* 1. request - The MCP request
|
|
64
|
+
* 2. extra - RequestHandlerExtra containing AbortSignal and other metadata
|
|
65
|
+
* 3. serverInfo - Configuration of the MCP server that triggered this request
|
|
66
|
+
*/
|
|
67
|
+
export interface ProviderMCPHandlers {
|
|
68
|
+
elicitation?: (request: Parameters<MCPElicitationHandler>[0], extra: Parameters<MCPElicitationHandler>[1], serverInfo: McpServerConfig) => ReturnType<MCPElicitationHandler>;
|
|
69
|
+
sampling?: (request: Parameters<MCPSamplingHandler>[0], extra: Parameters<MCPSamplingHandler>[1], serverInfo: McpServerConfig) => ReturnType<MCPSamplingHandler>;
|
|
70
|
+
}
|
|
25
71
|
/**
|
|
26
72
|
* This provider is used to register tools from MCP servers.
|
|
27
|
-
*
|
|
73
|
+
* It automatically includes an internal Tambo MCP server when an MCP access token is available.
|
|
74
|
+
* @param props - The provider props
|
|
75
|
+
* @param props.mcpServers - Array of MCP server configurations
|
|
76
|
+
* @param props.handlers - Optional handlers applied to all MCP servers unless overridden per-server
|
|
77
|
+
* @param props.children - The children to wrap
|
|
78
|
+
* @returns The TamboMcpProvider component
|
|
28
79
|
*/
|
|
29
80
|
export declare const TamboMcpProvider: FC<{
|
|
30
81
|
mcpServers: (McpServerInfo | string)[];
|
|
82
|
+
handlers?: ProviderMCPHandlers;
|
|
31
83
|
children: React.ReactNode;
|
|
32
84
|
}>;
|
|
33
85
|
/**
|
|
@@ -54,4 +106,34 @@ export declare const TamboMcpProvider: FC<{
|
|
|
54
106
|
* @returns The MCP servers
|
|
55
107
|
*/
|
|
56
108
|
export declare const useTamboMcpServers: () => McpServer[];
|
|
109
|
+
/**
|
|
110
|
+
* Hook to access elicitation context from TamboMcpProvider.
|
|
111
|
+
* This provides access to the current elicitation request and methods to respond to it.
|
|
112
|
+
*
|
|
113
|
+
* The elicitation state is automatically managed by TamboMcpProvider when MCP servers
|
|
114
|
+
* request user input through the elicitation protocol.
|
|
115
|
+
* @returns The elicitation context with current request and response handlers
|
|
116
|
+
* @example
|
|
117
|
+
* ```tsx
|
|
118
|
+
* function ElicitationUI() {
|
|
119
|
+
* const { elicitation, resolveElicitation } = useTamboElicitationContext();
|
|
120
|
+
*
|
|
121
|
+
* if (!elicitation) return null;
|
|
122
|
+
*
|
|
123
|
+
* return (
|
|
124
|
+
* <div>
|
|
125
|
+
* <p>{elicitation.message}</p>
|
|
126
|
+
* <button onClick={() => resolveElicitation?.({ action: "accept", content: {} })}>
|
|
127
|
+
* Accept
|
|
128
|
+
* </button>
|
|
129
|
+
* </div>
|
|
130
|
+
* );
|
|
131
|
+
* }
|
|
132
|
+
* ```
|
|
133
|
+
*/
|
|
134
|
+
export declare const useTamboElicitationContext: () => {
|
|
135
|
+
elicitation: import("./elicitation").TamboElicitationRequest | null;
|
|
136
|
+
resolveElicitation: ((response: import("./elicitation").TamboElicitationResponse) => void) | null;
|
|
137
|
+
};
|
|
138
|
+
export {};
|
|
57
139
|
//# sourceMappingURL=tambo-mcp-provider.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tambo-mcp-provider.d.ts","sourceRoot":"","sources":["../../src/mcp/tambo-mcp-provider.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"tambo-mcp-provider.d.ts","sourceRoot":"","sources":["../../src/mcp/tambo-mcp-provider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAEZ,EAAE,EAMH,MAAM,OAAO,CAAC;AAMf,OAAO,EACL,SAAS,EACT,qBAAqB,EACrB,WAAW,EACX,kBAAkB,EAClB,YAAY,EACb,MAAM,cAAc,CAAC;AAEtB;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAoB5D;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,uCAAuC;IACvC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,8CAA8C;IAC9C,GAAG,EAAE,MAAM,CAAC;IACZ,6CAA6C;IAC7C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+EAA+E;IAC/E,SAAS,CAAC,EAAE,YAAY,CAAC;IACzB,qDAAqD;IACrD,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC;;;;OAIG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;CACjC;AAED;;GAEG;AACH,UAAU,eAAgB,SAAQ,aAAa;IAC7C;;;OAGG;IACH,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;GAEG;AACH,MAAM,WAAW,kBAAmB,SAAQ,eAAe;IACzD,MAAM,EAAE,SAAS,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,eAAgB,SAAQ,eAAe;IACtD,MAAM,CAAC,EAAE,KAAK,CAAC;IACf,eAAe,EAAE,KAAK,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG,kBAAkB,GAAG,eAAe,CAAC;AAE7D;;;;;;;;GAQG;AACH,MAAM,WAAW,mBAAmB;IAClC,WAAW,CAAC,EAAE,CACZ,OAAO,EAAE,UAAU,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,EAC7C,KAAK,EAAE,UAAU,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,EAC3C,UAAU,EAAE,eAAe,KACxB,UAAU,CAAC,qBAAqB,CAAC,CAAC;IACvC,QAAQ,CAAC,EAAE,CACT,OAAO,EAAE,UAAU,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,EAC1C,KAAK,EAAE,UAAU,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,EACxC,UAAU,EAAE,eAAe,KACxB,UAAU,CAAC,kBAAkB,CAAC,CAAC;CACrC;AAkBD;;;;;;;;GAQG;AACH,eAAO,MAAM,gBAAgB,EAAE,EAAE,CAAC;IAChC,UAAU,EAAE,CAAC,aAAa,GAAG,MAAM,CAAC,EAAE,CAAC;IACvC,QAAQ,CAAC,EAAE,mBAAmB,CAAC;IAC/B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B,CA2RA,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,eAAO,MAAM,kBAAkB,mBAE9B,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,eAAO,MAAM,0BAA0B;;;CAMtC,CAAC"}
|