@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
|
@@ -35,10 +35,14 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
36
|
const react_1 = require("@testing-library/react");
|
|
37
37
|
const react_2 = __importStar(require("react"));
|
|
38
|
+
const tambo_mcp_token_provider_1 = require("../../providers/tambo-mcp-token-provider");
|
|
38
39
|
const tambo_registry_provider_1 = require("../../providers/tambo-registry-provider");
|
|
40
|
+
const tambo_client_provider_1 = require("../../providers/tambo-client-provider");
|
|
41
|
+
const react_query_1 = require("@tanstack/react-query");
|
|
39
42
|
const tambo_mcp_provider_1 = require("../tambo-mcp-provider");
|
|
40
43
|
// Mock the registry to provide a no-op registerTool
|
|
41
44
|
// Do not mock the registry; use the real provider in render
|
|
45
|
+
// Provide a minimal client context instead of mocking the hook
|
|
42
46
|
// Mock the MCP client; use a mutable implementation to avoid TDZ issues
|
|
43
47
|
let createImpl = jest.fn();
|
|
44
48
|
jest.mock("../mcp-client", () => ({
|
|
@@ -59,9 +63,18 @@ describe("useTamboMcpServers + TamboMcpProvider", () => {
|
|
|
59
63
|
react_2.default.createElement("div", { "data-testid": "count" }, servers.length),
|
|
60
64
|
react_2.default.createElement("div", { "data-testid": "urls" }, servers.map((s) => s.url).join(","))));
|
|
61
65
|
};
|
|
62
|
-
const { getByTestId } = (0, react_1.render)(react_2.default.createElement(
|
|
63
|
-
|
|
64
|
-
|
|
66
|
+
const { getByTestId } = (0, react_1.render)(react_2.default.createElement(tambo_client_provider_1.TamboClientContext.Provider, { value: {
|
|
67
|
+
client: { baseURL: "https://api.tambo.co" },
|
|
68
|
+
queryClient: new react_query_1.QueryClient(),
|
|
69
|
+
isUpdatingToken: false,
|
|
70
|
+
} },
|
|
71
|
+
react_2.default.createElement(tambo_registry_provider_1.TamboRegistryProvider, null,
|
|
72
|
+
react_2.default.createElement(tambo_mcp_token_provider_1.TamboMcpTokenProvider, null,
|
|
73
|
+
react_2.default.createElement(tambo_mcp_provider_1.TamboMcpProvider, { mcpServers: [
|
|
74
|
+
{ url: "https://one.example" },
|
|
75
|
+
"https://two.example",
|
|
76
|
+
] },
|
|
77
|
+
react_2.default.createElement(Inner, null))))));
|
|
65
78
|
await (0, react_1.waitFor)(() => {
|
|
66
79
|
expect(getByTestId("count").textContent).toBe("2");
|
|
67
80
|
const urls = getByTestId("urls").textContent || "";
|
|
@@ -80,9 +93,15 @@ describe("useTamboMcpServers + TamboMcpProvider", () => {
|
|
|
80
93
|
}, [servers]);
|
|
81
94
|
return null;
|
|
82
95
|
};
|
|
83
|
-
(0, react_1.render)(react_2.default.createElement(
|
|
84
|
-
|
|
85
|
-
|
|
96
|
+
(0, react_1.render)(react_2.default.createElement(tambo_client_provider_1.TamboClientContext.Provider, { value: {
|
|
97
|
+
client: { baseURL: "https://api.tambo.co" },
|
|
98
|
+
queryClient: new react_query_1.QueryClient(),
|
|
99
|
+
isUpdatingToken: false,
|
|
100
|
+
} },
|
|
101
|
+
react_2.default.createElement(tambo_registry_provider_1.TamboRegistryProvider, null,
|
|
102
|
+
react_2.default.createElement(tambo_mcp_token_provider_1.TamboMcpTokenProvider, null,
|
|
103
|
+
react_2.default.createElement(tambo_mcp_provider_1.TamboMcpProvider, { mcpServers: [{ url: "https://ok.example" }] },
|
|
104
|
+
react_2.default.createElement(Capture, null))))));
|
|
86
105
|
await (0, react_1.waitFor)(() => {
|
|
87
106
|
expect(latest.length).toBe(1);
|
|
88
107
|
expect("client" in latest[0]).toBe(true);
|
|
@@ -102,9 +121,15 @@ describe("useTamboMcpServers + TamboMcpProvider", () => {
|
|
|
102
121
|
}, [servers]);
|
|
103
122
|
return null;
|
|
104
123
|
};
|
|
105
|
-
(0, react_1.render)(react_2.default.createElement(
|
|
106
|
-
|
|
107
|
-
|
|
124
|
+
(0, react_1.render)(react_2.default.createElement(tambo_client_provider_1.TamboClientContext.Provider, { value: {
|
|
125
|
+
client: { baseURL: "https://api.tambo.co" },
|
|
126
|
+
queryClient: new react_query_1.QueryClient(),
|
|
127
|
+
isUpdatingToken: false,
|
|
128
|
+
} },
|
|
129
|
+
react_2.default.createElement(tambo_registry_provider_1.TamboRegistryProvider, null,
|
|
130
|
+
react_2.default.createElement(tambo_mcp_token_provider_1.TamboMcpTokenProvider, null,
|
|
131
|
+
react_2.default.createElement(tambo_mcp_provider_1.TamboMcpProvider, { mcpServers: [{ url: "https://fail.example" }] },
|
|
132
|
+
react_2.default.createElement(Capture, null))))));
|
|
108
133
|
await (0, react_1.waitFor)(() => {
|
|
109
134
|
expect(latest.length).toBe(1);
|
|
110
135
|
expect("client" in latest[0]).toBe(false);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-mcp-servers.test.js","sourceRoot":"","sources":["../../../src/mcp/__tests__/use-mcp-servers.test.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,kDAAyD;AACzD,+CAAyC;AACzC,qFAAgF;AAChF,8DAI+B;AAE/B,oDAAoD;AACpD,4DAA4D;AAE5D,wEAAwE;AACxE,IAAI,UAAU,GAAwB,IAAI,CAAC,EAAE,EAAE,CAAC;AAChD,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,GAAG,EAAE,CAAC,CAAC;IAChC,SAAS,EAAE,EAAE,MAAM,EAAE,CAAC,GAAG,IAAW,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,EAAE;IAC9D,YAAY,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE;CAC3C,CAAC,CAAC,CAAC;AAEJ,qFAAqF;AAErF,QAAQ,CAAC,uCAAuC,EAAE,GAAG,EAAE;IACrD,UAAU,CAAC,GAAG,EAAE;QACd,UAAU,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;QAC1E,MAAM,UAAU,GAAG,EAAE,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC,EAAS,CAAC;QACzE,UAAU,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;QAEzC,MAAM,KAAK,GAAa,GAAG,EAAE;YAC3B,MAAM,OAAO,GAAG,IAAA,uCAAkB,GAAE,CAAC;YACrC,OAAO,CACL;gBACE,sDAAiB,OAAO,IAAE,OAAO,CAAC,MAAM,CAAO;gBAC/C,sDAAiB,MAAM,IAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAO,CAC/D,CACP,CAAC;QACJ,CAAC,CAAC;QAEF,MAAM,EAAE,WAAW,EAAE,GAAG,IAAA,cAAM,EAC5B,8BAAC,+CAAqB;
|
|
1
|
+
{"version":3,"file":"use-mcp-servers.test.js","sourceRoot":"","sources":["../../../src/mcp/__tests__/use-mcp-servers.test.tsx"],"names":[],"mappings":"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","sourcesContent":["import { render, waitFor } from \"@testing-library/react\";\nimport React, { useEffect } from \"react\";\nimport { TamboMcpTokenProvider } from \"../../providers/tambo-mcp-token-provider\";\nimport { TamboRegistryProvider } from \"../../providers/tambo-registry-provider\";\nimport { TamboClientContext } from \"../../providers/tambo-client-provider\";\nimport { QueryClient } from \"@tanstack/react-query\";\nimport {\n TamboMcpProvider,\n useTamboMcpServers,\n type McpServer,\n} from \"../tambo-mcp-provider\";\n\n// Mock the registry to provide a no-op registerTool\n// Do not mock the registry; use the real provider in render\n\n// Provide a minimal client context instead of mocking the hook\n\n// Mock the MCP client; use a mutable implementation to avoid TDZ issues\nlet createImpl: jest.Mock<any, any> = jest.fn();\njest.mock(\"../mcp-client\", () => ({\n MCPClient: { create: (...args: any[]) => createImpl(...args) },\n MCPTransport: { SSE: \"sse\", HTTP: \"http\" },\n}));\n\n// Import after mocks note: jest.mock calls are hoisted, so standard imports are fine\n\ndescribe(\"useTamboMcpServers + TamboMcpProvider\", () => {\n beforeEach(() => {\n createImpl = jest.fn();\n });\n\n it(\"provides normalized MCP server entries to inner components\", async () => {\n const fakeClient = { listTools: jest.fn().mockResolvedValue([]) } as any;\n createImpl.mockResolvedValue(fakeClient);\n\n const Inner: React.FC = () => {\n const servers = useTamboMcpServers();\n return (\n <div>\n <div data-testid=\"count\">{servers.length}</div>\n <div data-testid=\"urls\">{servers.map((s) => s.url).join(\",\")}</div>\n </div>\n );\n };\n\n const { getByTestId } = render(\n <TamboClientContext.Provider\n value={{\n client: { baseURL: \"https://api.tambo.co\" } as any,\n queryClient: new QueryClient(),\n isUpdatingToken: false,\n }}\n >\n <TamboRegistryProvider>\n <TamboMcpTokenProvider>\n <TamboMcpProvider\n mcpServers={[\n { url: \"https://one.example\" },\n \"https://two.example\",\n ]}\n >\n <Inner />\n </TamboMcpProvider>\n </TamboMcpTokenProvider>\n </TamboRegistryProvider>\n </TamboClientContext.Provider>,\n );\n\n await waitFor(() => {\n expect(getByTestId(\"count\").textContent).toBe(\"2\");\n const urls = getByTestId(\"urls\").textContent || \"\";\n expect(urls).toContain(\"https://one.example\");\n expect(urls).toContain(\"https://two.example\");\n });\n });\n\n it(\"marks a successfully connected server with a client instance\", async () => {\n const fakeClient = { listTools: jest.fn().mockResolvedValue([]) } as any;\n createImpl.mockResolvedValue(fakeClient);\n\n let latest: McpServer[] = [];\n const Capture: React.FC = () => {\n const servers = useTamboMcpServers();\n useEffect(() => {\n latest = servers;\n }, [servers]);\n return null;\n };\n\n render(\n <TamboClientContext.Provider\n value={{\n client: { baseURL: \"https://api.tambo.co\" } as any,\n queryClient: new QueryClient(),\n isUpdatingToken: false,\n }}\n >\n <TamboRegistryProvider>\n <TamboMcpTokenProvider>\n <TamboMcpProvider mcpServers={[{ url: \"https://ok.example\" }]}>\n <Capture />\n </TamboMcpProvider>\n </TamboMcpTokenProvider>\n </TamboRegistryProvider>\n </TamboClientContext.Provider>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(1);\n expect(\"client\" in latest[0]).toBe(true);\n expect((latest[0] as any).client).toBe(fakeClient);\n // no connectionError on connected server\n expect((latest[0] as any).connectionError).toBeUndefined();\n });\n });\n\n it(\"marks a failed server with a connectionError and no client\", async () => {\n const boom = new Error(\"boom\");\n createImpl.mockRejectedValue(boom);\n\n let latest: McpServer[] = [];\n const Capture: React.FC = () => {\n const servers = useTamboMcpServers();\n useEffect(() => {\n latest = servers;\n }, [servers]);\n return null;\n };\n\n render(\n <TamboClientContext.Provider\n value={{\n client: { baseURL: \"https://api.tambo.co\" } as any,\n queryClient: new QueryClient(),\n isUpdatingToken: false,\n }}\n >\n <TamboRegistryProvider>\n <TamboMcpTokenProvider>\n <TamboMcpProvider mcpServers={[{ url: \"https://fail.example\" }]}>\n <Capture />\n </TamboMcpProvider>\n </TamboMcpTokenProvider>\n </TamboRegistryProvider>\n </TamboClientContext.Provider>,\n );\n\n await waitFor(() => {\n expect(latest.length).toBe(1);\n expect(\"client\" in latest[0]).toBe(false);\n // @ts-expect-error narrowing at runtime\n expect(latest[0].connectionError).toBeInstanceOf(Error);\n // @ts-expect-error narrowing at runtime\n expect(latest[0].connectionError?.message).toBe(\"boom\");\n });\n });\n});\n"]}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import type { RequestHandlerExtra } from "@modelcontextprotocol/sdk/shared/protocol.js";
|
|
2
|
+
import type { ClientNotification, ClientRequest } from "@modelcontextprotocol/sdk/types.js";
|
|
3
|
+
/**
|
|
4
|
+
* JSON Schema types for elicitation fields
|
|
5
|
+
*/
|
|
6
|
+
interface BaseFieldSchema {
|
|
7
|
+
type: "string" | "number" | "integer" | "boolean";
|
|
8
|
+
description?: string;
|
|
9
|
+
default?: unknown;
|
|
10
|
+
}
|
|
11
|
+
interface StringFieldSchema extends BaseFieldSchema {
|
|
12
|
+
type: "string";
|
|
13
|
+
minLength?: number;
|
|
14
|
+
maxLength?: number;
|
|
15
|
+
pattern?: string;
|
|
16
|
+
format?: "email" | "uri" | "date" | "date-time";
|
|
17
|
+
enum?: string[];
|
|
18
|
+
enumNames?: string[];
|
|
19
|
+
}
|
|
20
|
+
interface NumberFieldSchema extends BaseFieldSchema {
|
|
21
|
+
type: "number" | "integer";
|
|
22
|
+
minimum?: number;
|
|
23
|
+
maximum?: number;
|
|
24
|
+
}
|
|
25
|
+
interface BooleanFieldSchema extends BaseFieldSchema {
|
|
26
|
+
type: "boolean";
|
|
27
|
+
}
|
|
28
|
+
type FieldSchema = StringFieldSchema | NumberFieldSchema | BooleanFieldSchema;
|
|
29
|
+
/**
|
|
30
|
+
* Elicitation request from MCP server
|
|
31
|
+
*/
|
|
32
|
+
export interface TamboElicitationRequest {
|
|
33
|
+
message: string;
|
|
34
|
+
requestedSchema: {
|
|
35
|
+
type: "object";
|
|
36
|
+
properties: Record<string, FieldSchema>;
|
|
37
|
+
required?: string[];
|
|
38
|
+
};
|
|
39
|
+
/** AbortSignal that fires when the server cancels the request (e.g., timeout) */
|
|
40
|
+
signal?: AbortSignal;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Elicitation response to be sent back
|
|
44
|
+
*/
|
|
45
|
+
export interface TamboElicitationResponse {
|
|
46
|
+
action: "accept" | "decline" | "cancel";
|
|
47
|
+
content?: Record<string, unknown>;
|
|
48
|
+
[x: string]: unknown;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Elicitation context state - read-only interface for consumers.
|
|
52
|
+
* State management is handled internally by useElicitation hook.
|
|
53
|
+
*/
|
|
54
|
+
export interface ElicitationContextState {
|
|
55
|
+
/** Current elicitation request, or null if none active */
|
|
56
|
+
elicitation: TamboElicitationRequest | null;
|
|
57
|
+
/** Function to call when user responds to elicitation (clears state automatically) */
|
|
58
|
+
resolveElicitation: ((response: TamboElicitationResponse) => void) | null;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Internal hook that manages elicitation state and creates a default handler.
|
|
62
|
+
* This bundles all the state management and handler creation for elicitation.
|
|
63
|
+
*
|
|
64
|
+
* Do not export this hook from this package. It is only intended to be used internally by the TamboMcpProvider.
|
|
65
|
+
* @returns Elicitation state and default handler
|
|
66
|
+
*/
|
|
67
|
+
export declare function useElicitation(): {
|
|
68
|
+
elicitation: TamboElicitationRequest | null;
|
|
69
|
+
setElicitation: import("react").Dispatch<import("react").SetStateAction<TamboElicitationRequest | null>>;
|
|
70
|
+
resolveElicitation: ((response: TamboElicitationResponse) => void) | null;
|
|
71
|
+
setResolveElicitation: import("react").Dispatch<import("react").SetStateAction<((response: TamboElicitationResponse) => void) | null>>;
|
|
72
|
+
defaultElicitationHandler: (request: {
|
|
73
|
+
params: {
|
|
74
|
+
message: string;
|
|
75
|
+
requestedSchema: TamboElicitationRequest["requestedSchema"];
|
|
76
|
+
};
|
|
77
|
+
}, extra: RequestHandlerExtra<ClientRequest, ClientNotification>) => Promise<TamboElicitationResponse>;
|
|
78
|
+
};
|
|
79
|
+
export {};
|
|
80
|
+
//# sourceMappingURL=elicitation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"elicitation.d.ts","sourceRoot":"","sources":["../../src/mcp/elicitation.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,8CAA8C,CAAC;AACxF,OAAO,KAAK,EACV,kBAAkB,EAClB,aAAa,EACd,MAAM,oCAAoC,CAAC;AAE5C;;GAEG;AACH,UAAU,eAAe;IACvB,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;IAClD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,UAAU,iBAAkB,SAAQ,eAAe;IACjD,IAAI,EAAE,QAAQ,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,GAAG,KAAK,GAAG,MAAM,GAAG,WAAW,CAAC;IAChD,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,UAAU,iBAAkB,SAAQ,eAAe;IACjD,IAAI,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,kBAAmB,SAAQ,eAAe;IAClD,IAAI,EAAE,SAAS,CAAC;CACjB;AAED,KAAK,WAAW,GAAG,iBAAiB,GAAG,iBAAiB,GAAG,kBAAkB,CAAC;AAE9E;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE;QACf,IAAI,EAAE,QAAQ,CAAC;QACf,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QACxC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;KACrB,CAAC;IACF,iFAAiF;IACjF,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAAC;IACxC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CACtB;AAED;;;GAGG;AACH,MAAM,WAAW,uBAAuB;IACtC,0DAA0D;IAC1D,WAAW,EAAE,uBAAuB,GAAG,IAAI,CAAC;IAC5C,sFAAsF;IACtF,kBAAkB,EAAE,CAAC,CAAC,QAAQ,EAAE,wBAAwB,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC;CAC3E;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc;;;oCAId,wBAAwB,KAAK,IAAI;+FAAjC,wBAAwB,KAAK,IAAI;yCAMhC;QACP,MAAM,EAAE;YACN,OAAO,EAAE,MAAM,CAAC;YAChB,eAAe,EAAE,uBAAuB,CAAC,iBAAiB,CAAC,CAAC;SAC7D,CAAC;KACH,SACM,mBAAmB,CAAC,aAAa,EAAE,kBAAkB,CAAC,KAC5D,OAAO,CAAC,wBAAwB,CAAC;EAkDzC"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.useElicitation = useElicitation;
|
|
4
|
+
const react_1 = require("react");
|
|
5
|
+
/**
|
|
6
|
+
* Internal hook that manages elicitation state and creates a default handler.
|
|
7
|
+
* This bundles all the state management and handler creation for elicitation.
|
|
8
|
+
*
|
|
9
|
+
* Do not export this hook from this package. It is only intended to be used internally by the TamboMcpProvider.
|
|
10
|
+
* @returns Elicitation state and default handler
|
|
11
|
+
*/
|
|
12
|
+
function useElicitation() {
|
|
13
|
+
const [elicitation, setElicitation] = (0, react_1.useState)(null);
|
|
14
|
+
const [resolveElicitation, setResolveElicitation] = (0, react_1.useState)(null);
|
|
15
|
+
const defaultElicitationHandler = (0, react_1.useMemo)(() => async (request, extra) => {
|
|
16
|
+
return await new Promise((resolve, reject) => {
|
|
17
|
+
// Set the elicitation request to show the UI
|
|
18
|
+
setElicitation({
|
|
19
|
+
message: request.params.message,
|
|
20
|
+
requestedSchema: request.params.requestedSchema,
|
|
21
|
+
signal: extra.signal,
|
|
22
|
+
});
|
|
23
|
+
// If the signal is already aborted, reject immediately
|
|
24
|
+
if (extra.signal.aborted) {
|
|
25
|
+
setElicitation(null);
|
|
26
|
+
reject(new Error("Request aborted"));
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
// Listen for abort signal to clean up
|
|
30
|
+
const handleAbort = () => {
|
|
31
|
+
setElicitation(null);
|
|
32
|
+
setResolveElicitation(null);
|
|
33
|
+
reject(new Error("Request aborted"));
|
|
34
|
+
};
|
|
35
|
+
extra.signal.addEventListener("abort", handleAbort, { once: true });
|
|
36
|
+
// Store the resolve function so we can call it when the user responds
|
|
37
|
+
setResolveElicitation(() => (response) => {
|
|
38
|
+
// Remove abort listener since we're resolving normally
|
|
39
|
+
extra.signal.removeEventListener("abort", handleAbort);
|
|
40
|
+
// Clear state now that user has responded
|
|
41
|
+
setElicitation(null);
|
|
42
|
+
setResolveElicitation(null);
|
|
43
|
+
resolve(response);
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
}, []);
|
|
47
|
+
return {
|
|
48
|
+
elicitation,
|
|
49
|
+
setElicitation,
|
|
50
|
+
resolveElicitation,
|
|
51
|
+
setResolveElicitation,
|
|
52
|
+
defaultElicitationHandler,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=elicitation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"elicitation.js","sourceRoot":"","sources":["../../src/mcp/elicitation.ts"],"names":[],"mappings":";;AA+EA,wCAmEC;AAlJD,iCAA0C;AAwE1C;;;;;;GAMG;AACH,SAAgB,cAAc;IAC5B,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GACjC,IAAA,gBAAQ,EAAiC,IAAI,CAAC,CAAC;IACjD,MAAM,CAAC,kBAAkB,EAAE,qBAAqB,CAAC,GAAG,IAAA,gBAAQ,EAE1D,IAAI,CAAC,CAAC;IAER,MAAM,yBAAyB,GAAG,IAAA,eAAO,EACvC,GAAG,EAAE,CACH,KAAK,EACH,OAKC,EACD,KAA6D,EAC1B,EAAE;QACrC,OAAO,MAAM,IAAI,OAAO,CACtB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAClB,6CAA6C;YAC7C,cAAc,CAAC;gBACb,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO;gBAC/B,eAAe,EAAE,OAAO,CAAC,MAAM,CAAC,eAAe;gBAC/C,MAAM,EAAE,KAAK,CAAC,MAAM;aACrB,CAAC,CAAC;YAEH,uDAAuD;YACvD,IAAI,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACzB,cAAc,CAAC,IAAI,CAAC,CAAC;gBACrB,MAAM,CAAC,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC;gBACrC,OAAO;YACT,CAAC;YAED,sCAAsC;YACtC,MAAM,WAAW,GAAG,GAAG,EAAE;gBACvB,cAAc,CAAC,IAAI,CAAC,CAAC;gBACrB,qBAAqB,CAAC,IAAI,CAAC,CAAC;gBAC5B,MAAM,CAAC,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC;YACvC,CAAC,CAAC;YAEF,KAAK,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YAEpE,sEAAsE;YACtE,qBAAqB,CACnB,GAAG,EAAE,CAAC,CAAC,QAAkC,EAAE,EAAE;gBAC3C,uDAAuD;gBACvD,KAAK,CAAC,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;gBACvD,0CAA0C;gBAC1C,cAAc,CAAC,IAAI,CAAC,CAAC;gBACrB,qBAAqB,CAAC,IAAI,CAAC,CAAC;gBAC5B,OAAO,CAAC,QAAQ,CAAC,CAAC;YACpB,CAAC,CACF,CAAC;QACJ,CAAC,CACF,CAAC;IACJ,CAAC,EACH,EAAE,CACH,CAAC;IAEF,OAAO;QACL,WAAW;QACX,cAAc;QACd,kBAAkB;QAClB,qBAAqB;QACrB,yBAAyB;KAC1B,CAAC;AACJ,CAAC","sourcesContent":["import { useMemo, useState } from \"react\";\nimport type { RequestHandlerExtra } from \"@modelcontextprotocol/sdk/shared/protocol.js\";\nimport type {\n ClientNotification,\n ClientRequest,\n} from \"@modelcontextprotocol/sdk/types.js\";\n\n/**\n * JSON Schema types for elicitation fields\n */\ninterface BaseFieldSchema {\n type: \"string\" | \"number\" | \"integer\" | \"boolean\";\n description?: string;\n default?: unknown;\n}\n\ninterface StringFieldSchema extends BaseFieldSchema {\n type: \"string\";\n minLength?: number;\n maxLength?: number;\n pattern?: string;\n format?: \"email\" | \"uri\" | \"date\" | \"date-time\";\n enum?: string[];\n enumNames?: string[];\n}\n\ninterface NumberFieldSchema extends BaseFieldSchema {\n type: \"number\" | \"integer\";\n minimum?: number;\n maximum?: number;\n}\n\ninterface BooleanFieldSchema extends BaseFieldSchema {\n type: \"boolean\";\n}\n\ntype FieldSchema = StringFieldSchema | NumberFieldSchema | BooleanFieldSchema;\n\n/**\n * Elicitation request from MCP server\n */\nexport interface TamboElicitationRequest {\n message: string;\n requestedSchema: {\n type: \"object\";\n properties: Record<string, FieldSchema>;\n required?: string[];\n };\n /** AbortSignal that fires when the server cancels the request (e.g., timeout) */\n signal?: AbortSignal;\n}\n\n/**\n * Elicitation response to be sent back\n */\nexport interface TamboElicitationResponse {\n action: \"accept\" | \"decline\" | \"cancel\";\n content?: Record<string, unknown>;\n [x: string]: unknown;\n}\n\n/**\n * Elicitation context state - read-only interface for consumers.\n * State management is handled internally by useElicitation hook.\n */\nexport interface ElicitationContextState {\n /** Current elicitation request, or null if none active */\n elicitation: TamboElicitationRequest | null;\n /** Function to call when user responds to elicitation (clears state automatically) */\n resolveElicitation: ((response: TamboElicitationResponse) => void) | null;\n}\n\n/**\n * Internal hook that manages elicitation state and creates a default handler.\n * This bundles all the state management and handler creation for elicitation.\n *\n * Do not export this hook from this package. It is only intended to be used internally by the TamboMcpProvider.\n * @returns Elicitation state and default handler\n */\nexport function useElicitation() {\n const [elicitation, setElicitation] =\n useState<TamboElicitationRequest | null>(null);\n const [resolveElicitation, setResolveElicitation] = useState<\n ((response: TamboElicitationResponse) => void) | null\n >(null);\n\n const defaultElicitationHandler = useMemo(\n () =>\n async (\n request: {\n params: {\n message: string;\n requestedSchema: TamboElicitationRequest[\"requestedSchema\"];\n };\n },\n extra: RequestHandlerExtra<ClientRequest, ClientNotification>,\n ): Promise<TamboElicitationResponse> => {\n return await new Promise<TamboElicitationResponse>(\n (resolve, reject) => {\n // Set the elicitation request to show the UI\n setElicitation({\n message: request.params.message,\n requestedSchema: request.params.requestedSchema,\n signal: extra.signal,\n });\n\n // If the signal is already aborted, reject immediately\n if (extra.signal.aborted) {\n setElicitation(null);\n reject(new Error(\"Request aborted\"));\n return;\n }\n\n // Listen for abort signal to clean up\n const handleAbort = () => {\n setElicitation(null);\n setResolveElicitation(null);\n reject(new Error(\"Request aborted\"));\n };\n\n extra.signal.addEventListener(\"abort\", handleAbort, { once: true });\n\n // Store the resolve function so we can call it when the user responds\n setResolveElicitation(\n () => (response: TamboElicitationResponse) => {\n // Remove abort listener since we're resolving normally\n extra.signal.removeEventListener(\"abort\", handleAbort);\n // Clear state now that user has responded\n setElicitation(null);\n setResolveElicitation(null);\n resolve(response);\n },\n );\n },\n );\n },\n [],\n );\n\n return {\n elicitation,\n setElicitation,\n resolveElicitation,\n setResolveElicitation,\n defaultElicitationHandler,\n };\n}\n"]}
|
package/dist/mcp/index.d.ts
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
1
1
|
export { MCPTransport } from "./mcp-client";
|
|
2
|
-
export
|
|
2
|
+
export type { MCPElicitationHandler, MCPHandlers, MCPSamplingHandler, } from "./mcp-client";
|
|
3
|
+
export type { TamboElicitationRequest, TamboElicitationResponse, } from "./elicitation";
|
|
4
|
+
export { useTamboMcpPrompt, useTamboMcpPromptList } from "./mcp-hooks";
|
|
5
|
+
export { TamboMcpProvider, useTamboMcpServers, useTamboElicitationContext, type ConnectedMcpServer, type FailedMcpServer, type McpServer, type McpServerInfo, type ProviderMCPHandlers, } from "./tambo-mcp-provider";
|
|
3
6
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/mcp/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,KAAK,kBAAkB,EACvB,KAAK,eAAe,EACpB,KAAK,SAAS,EACd,KAAK,aAAa,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,YAAY,EACV,qBAAqB,EACrB,WAAW,EACX,kBAAkB,GACnB,MAAM,cAAc,CAAC;AACtB,YAAY,EACV,uBAAuB,EACvB,wBAAwB,GACzB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACvE,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,0BAA0B,EAC1B,KAAK,kBAAkB,EACvB,KAAK,eAAe,EACpB,KAAK,SAAS,EACd,KAAK,aAAa,EAClB,KAAK,mBAAmB,GACzB,MAAM,sBAAsB,CAAC"}
|
package/dist/mcp/index.js
CHANGED
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.useTamboMcpServers = exports.TamboMcpProvider = exports.MCPTransport = void 0;
|
|
3
|
+
exports.useTamboElicitationContext = exports.useTamboMcpServers = exports.TamboMcpProvider = exports.useTamboMcpPromptList = exports.useTamboMcpPrompt = exports.MCPTransport = void 0;
|
|
4
4
|
var mcp_client_1 = require("./mcp-client");
|
|
5
5
|
Object.defineProperty(exports, "MCPTransport", { enumerable: true, get: function () { return mcp_client_1.MCPTransport; } });
|
|
6
|
+
var mcp_hooks_1 = require("./mcp-hooks");
|
|
7
|
+
Object.defineProperty(exports, "useTamboMcpPrompt", { enumerable: true, get: function () { return mcp_hooks_1.useTamboMcpPrompt; } });
|
|
8
|
+
Object.defineProperty(exports, "useTamboMcpPromptList", { enumerable: true, get: function () { return mcp_hooks_1.useTamboMcpPromptList; } });
|
|
6
9
|
var tambo_mcp_provider_1 = require("./tambo-mcp-provider");
|
|
7
10
|
Object.defineProperty(exports, "TamboMcpProvider", { enumerable: true, get: function () { return tambo_mcp_provider_1.TamboMcpProvider; } });
|
|
8
11
|
Object.defineProperty(exports, "useTamboMcpServers", { enumerable: true, get: function () { return tambo_mcp_provider_1.useTamboMcpServers; } });
|
|
12
|
+
Object.defineProperty(exports, "useTamboElicitationContext", { enumerable: true, get: function () { return tambo_mcp_provider_1.useTamboElicitationContext; } });
|
|
9
13
|
//# sourceMappingURL=index.js.map
|
package/dist/mcp/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":";;;AAAA,2CAA4C;AAAnC,0GAAA,YAAY,OAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":";;;AAAA,2CAA4C;AAAnC,0GAAA,YAAY,OAAA;AAUrB,yCAAuE;AAA9D,8GAAA,iBAAiB,OAAA;AAAE,kHAAA,qBAAqB,OAAA;AACjD,2DAS8B;AAR5B,sHAAA,gBAAgB,OAAA;AAChB,wHAAA,kBAAkB,OAAA;AAClB,gIAAA,0BAA0B,OAAA","sourcesContent":["export { MCPTransport } from \"./mcp-client\";\nexport type {\n MCPElicitationHandler,\n MCPHandlers,\n MCPSamplingHandler,\n} from \"./mcp-client\";\nexport type {\n TamboElicitationRequest,\n TamboElicitationResponse,\n} from \"./elicitation\";\nexport { useTamboMcpPrompt, useTamboMcpPromptList } from \"./mcp-hooks\";\nexport {\n TamboMcpProvider,\n useTamboMcpServers,\n useTamboElicitationContext,\n type ConnectedMcpServer,\n type FailedMcpServer,\n type McpServer,\n type McpServerInfo,\n type ProviderMCPHandlers,\n} from \"./tambo-mcp-provider\";\n"]}
|
package/dist/mcp/mcp-client.d.ts
CHANGED
|
@@ -1,15 +1,47 @@
|
|
|
1
1
|
import { type OAuthClientProvider } from "@modelcontextprotocol/sdk/client/auth.js";
|
|
2
2
|
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
|
|
3
|
-
import {
|
|
3
|
+
import type { RequestHandlerExtra } from "@modelcontextprotocol/sdk/shared/protocol.js";
|
|
4
|
+
import { ClientNotification, ClientRequest, CreateMessageRequest, CreateMessageResult, ElicitRequest, ElicitResult } from "@modelcontextprotocol/sdk/types.js";
|
|
4
5
|
import { JSONSchema7 } from "json-schema";
|
|
5
6
|
export declare enum MCPTransport {
|
|
6
7
|
SSE = "sse",
|
|
7
8
|
HTTP = "http"
|
|
8
9
|
}
|
|
10
|
+
/**
|
|
11
|
+
* Handler for MCP elicitation requests.
|
|
12
|
+
* Receives the elicit request and a RequestHandlerExtra containing an AbortSignal that fires when the request is cancelled.
|
|
13
|
+
* @param request - The elicitation request from the server
|
|
14
|
+
* @param extra - Additional context including AbortSignal for cancellation
|
|
15
|
+
* @returns Promise resolving to the elicitation result
|
|
16
|
+
* @example
|
|
17
|
+
* ```typescript
|
|
18
|
+
* const handler: MCPElicitationHandler = async (request, extra) => {
|
|
19
|
+
* // Listen for cancellation
|
|
20
|
+
* extra.signal.addEventListener('abort', () => {
|
|
21
|
+
* console.log('Request cancelled');
|
|
22
|
+
* });
|
|
23
|
+
*
|
|
24
|
+
* // Return user's response
|
|
25
|
+
* return {
|
|
26
|
+
* action: 'accept',
|
|
27
|
+
* content: { name: 'John' }
|
|
28
|
+
* };
|
|
29
|
+
* };
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
export type MCPElicitationHandler = (e: ElicitRequest, extra: RequestHandlerExtra<ClientRequest, ClientNotification>) => Promise<ElicitResult>;
|
|
33
|
+
/**
|
|
34
|
+
* Handler for MCP sampling requests (create_message).
|
|
35
|
+
* Receives the sampling request and a RequestHandlerExtra containing an AbortSignal that fires when the request is cancelled.
|
|
36
|
+
* @param request - The sampling/create_message request from the server
|
|
37
|
+
* @param extra - Additional context including AbortSignal for cancellation
|
|
38
|
+
* @returns Promise resolving to the sampling result
|
|
39
|
+
*/
|
|
40
|
+
export type MCPSamplingHandler = (e: CreateMessageRequest, extra: RequestHandlerExtra<ClientRequest, ClientNotification>) => Promise<CreateMessageResult>;
|
|
9
41
|
/**
|
|
10
42
|
* Handlers for MCP requests - these are only used if the server supports the corresponding capabilities
|
|
11
|
-
* @param elicitation - Handler for elicitation requests
|
|
12
|
-
* @param sampling - Handler for sampling requests
|
|
43
|
+
* @param elicitation - Handler for elicitation requests (receives request and RequestHandlerExtra with AbortSignal)
|
|
44
|
+
* @param sampling - Handler for sampling requests (receives request and RequestHandlerExtra with AbortSignal)
|
|
13
45
|
* @example
|
|
14
46
|
* ```typescript
|
|
15
47
|
* const mcp = await MCPClient.create(
|
|
@@ -19,14 +51,14 @@ export declare enum MCPTransport {
|
|
|
19
51
|
* undefined,
|
|
20
52
|
* undefined,
|
|
21
53
|
* {
|
|
22
|
-
* elicitation: (e
|
|
54
|
+
* elicitation: (e, extra) => Promise.resolve({...}),
|
|
23
55
|
* },
|
|
24
|
-
*
|
|
56
|
+
* );
|
|
25
57
|
* ```
|
|
26
58
|
*/
|
|
27
|
-
interface MCPHandlers {
|
|
28
|
-
elicitation
|
|
29
|
-
sampling
|
|
59
|
+
export interface MCPHandlers {
|
|
60
|
+
elicitation: MCPElicitationHandler;
|
|
61
|
+
sampling: MCPSamplingHandler;
|
|
30
62
|
}
|
|
31
63
|
/**
|
|
32
64
|
* A client for interacting with MCP (Model Context Protocol) servers.
|
|
@@ -39,7 +71,12 @@ interface MCPHandlers {
|
|
|
39
71
|
* ```
|
|
40
72
|
*/
|
|
41
73
|
export declare class MCPClient {
|
|
42
|
-
|
|
74
|
+
/**
|
|
75
|
+
* The underlying MCP client
|
|
76
|
+
*
|
|
77
|
+
* Be careful not to mutate the client directly, use the methods provided instead.
|
|
78
|
+
*/
|
|
79
|
+
client: Client;
|
|
43
80
|
private transport;
|
|
44
81
|
private transportType;
|
|
45
82
|
sessionId?: string;
|
|
@@ -47,42 +84,6 @@ export declare class MCPClient {
|
|
|
47
84
|
private headers;
|
|
48
85
|
private authProvider?;
|
|
49
86
|
private handlers;
|
|
50
|
-
/**
|
|
51
|
-
* Tracks an in-flight reconnect so concurrent triggers coalesce
|
|
52
|
-
* (single-flight). When set, additional calls to `reconnect()` or
|
|
53
|
-
* the automatic `onclose` handler will await the same Promise instead of
|
|
54
|
-
* starting another reconnect sequence.
|
|
55
|
-
*/
|
|
56
|
-
private reconnecting?;
|
|
57
|
-
/**
|
|
58
|
-
* Timer id for a scheduled automatic reconnect (used by `onclose`).
|
|
59
|
-
* Present only while waiting for the backoff delay to elapse.
|
|
60
|
-
*/
|
|
61
|
-
private reconnectTimer?;
|
|
62
|
-
/**
|
|
63
|
-
* Count of consecutive automatic reconnect failures used to compute
|
|
64
|
-
* exponential backoff. Reset to 0 after a successful connection.
|
|
65
|
-
*/
|
|
66
|
-
private backoffAttempts;
|
|
67
|
-
/**
|
|
68
|
-
* Backoff policy (discoverable constants)
|
|
69
|
-
* - BACKOFF_INITIAL_MS: initial delay for the first automatic retry
|
|
70
|
-
* - BACKOFF_MULTIPLIER: exponential growth factor for each failed attempt
|
|
71
|
-
* - BACKOFF_MAX_MS: upper bound for the delay
|
|
72
|
-
* - BACKOFF_JITTER_RATIO: jitter range as a fraction of the base delay
|
|
73
|
-
*
|
|
74
|
-
* Jitter is applied symmetrically in [-ratio, +ratio]. For example, with a
|
|
75
|
-
* 500ms base delay and 0.2 ratio, the actual delay is in [400ms, 600ms].
|
|
76
|
-
*
|
|
77
|
-
* The backoff applies only to automatic reconnects started from the
|
|
78
|
-
* `onclose` handler. Explicit/manual calls to `reconnect()` run immediately
|
|
79
|
-
* (no backoff), and will preempt any scheduled automatic attempt.
|
|
80
|
-
*/
|
|
81
|
-
static readonly BACKOFF_INITIAL_MS = 500;
|
|
82
|
-
static readonly BACKOFF_MULTIPLIER = 2;
|
|
83
|
-
static readonly BACKOFF_MAX_MS = 30000;
|
|
84
|
-
static readonly BACKOFF_JITTER_RATIO = 0.2;
|
|
85
|
-
elicitation: EventTarget;
|
|
86
87
|
/**
|
|
87
88
|
* Private constructor to enforce using the static create method.
|
|
88
89
|
* @param endpoint - The URL of the MCP server to connect to
|
|
@@ -103,43 +104,7 @@ export declare class MCPClient {
|
|
|
103
104
|
* @returns A connected MCPClient instance ready for use
|
|
104
105
|
* @throws {Error} Will throw an error if connection fails
|
|
105
106
|
*/
|
|
106
|
-
static create(endpoint: string, transportType: MCPTransport | undefined, headers: Record<string, string> | undefined, authProvider: OAuthClientProvider | undefined, sessionId: string | undefined, handlers?: MCPHandlers): Promise<MCPClient>;
|
|
107
|
-
/**
|
|
108
|
-
* Reconnects to the MCP server, optionally retaining the same session ID.
|
|
109
|
-
*
|
|
110
|
-
* Single‑flight semantics:
|
|
111
|
-
* - If a reconnect is already in progress (triggered either manually or by
|
|
112
|
-
* the automatic `onclose` handler), additional calls will await the
|
|
113
|
-
* in-flight reconnect rather than start another one.
|
|
114
|
-
* - If an automatic reconnect has been scheduled but not yet started (i.e.,
|
|
115
|
-
* we are waiting in a backoff delay), calling `reconnect()` manually will
|
|
116
|
-
* cancel the scheduled attempt and perform an immediate reconnect.
|
|
117
|
-
*
|
|
118
|
-
* Backoff policy:
|
|
119
|
-
* - Backoff delays with jitter are applied only for automatic reconnects
|
|
120
|
-
* (via `onclose`). Manual calls to `reconnect()` do not use backoff.
|
|
121
|
-
* @param newSession - Whether to create a new session (true) or reuse existing session ID (false)
|
|
122
|
-
* @param reportErrorOnClose - Whether to report errors when closing the client
|
|
123
|
-
* Note that only StreamableHTTPClientTransport supports session IDs.
|
|
124
|
-
* @returns A promise that resolves when the reconnect is complete
|
|
125
|
-
*/
|
|
126
|
-
reconnect(newSession?: boolean, reportErrorOnClose?: boolean): Promise<void>;
|
|
127
|
-
/**
|
|
128
|
-
* Called by the underlying MCP SDK when the connection closes.
|
|
129
|
-
* Schedules an automatic reconnect with bounded exponential backoff and
|
|
130
|
-
* jitter. If a reconnect is already scheduled or running, this is a no-op.
|
|
131
|
-
*/
|
|
132
|
-
private onclose;
|
|
133
|
-
/**
|
|
134
|
-
* Compute the next backoff delay with symmetric jitter.
|
|
135
|
-
* @returns The next backoff delay in milliseconds
|
|
136
|
-
*/
|
|
137
|
-
private computeBackoffDelayMs;
|
|
138
|
-
/**
|
|
139
|
-
* Schedule an automatic reconnect attempt if one is not already scheduled
|
|
140
|
-
* or running. Uses the backoff policy and self-reschedules on failure.
|
|
141
|
-
*/
|
|
142
|
-
private scheduleAutoReconnect;
|
|
107
|
+
static create(endpoint: string, transportType: MCPTransport | undefined, headers: Record<string, string> | undefined, authProvider: OAuthClientProvider | undefined, sessionId: string | undefined, handlers?: Partial<MCPHandlers>): Promise<MCPClient>;
|
|
143
108
|
private initializeTransport;
|
|
144
109
|
/**
|
|
145
110
|
* Initializes the MCP client with the appropriate capabilities and handlers
|
|
@@ -199,9 +164,10 @@ export declare class MCPClient {
|
|
|
199
164
|
* @returns The result from the tool execution
|
|
200
165
|
* @throws {Error} Will throw an error if the tool call fails or if arguments are invalid
|
|
201
166
|
*/
|
|
202
|
-
callTool(name: string, args: Record<string, unknown>): Promise<MCPToolCallResult>;
|
|
203
|
-
updateElicitationHandler(handler:
|
|
204
|
-
updateSamplingHandler(handler:
|
|
167
|
+
callTool(name: string, args: Record<string, unknown>, _meta?: Record<string, unknown>): Promise<MCPToolCallResult>;
|
|
168
|
+
updateElicitationHandler(handler: MCPElicitationHandler | undefined): void;
|
|
169
|
+
updateSamplingHandler(handler: MCPSamplingHandler | undefined): void;
|
|
170
|
+
close(): Promise<void>;
|
|
205
171
|
}
|
|
206
172
|
/**
|
|
207
173
|
* The result of a tool call.
|
|
@@ -213,5 +179,4 @@ export interface MCPToolSpec {
|
|
|
213
179
|
description?: string;
|
|
214
180
|
inputSchema?: JSONSchema7;
|
|
215
181
|
}
|
|
216
|
-
export {};
|
|
217
182
|
//# sourceMappingURL=mcp-client.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-client.d.ts","sourceRoot":"","sources":["../../src/mcp/mcp-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,0CAA0C,CAAC;AACpF,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAGnE,OAAO,EACL,oBAAoB,EAEpB,mBAAmB,EACnB,aAAa,EAEb,YAAY,EACb,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,oBAAY,YAAY;IACtB,GAAG,QAAQ;IACX,IAAI,SAAS;CACd;AAED
|
|
1
|
+
{"version":3,"file":"mcp-client.d.ts","sourceRoot":"","sources":["../../src/mcp/mcp-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,0CAA0C,CAAC;AACpF,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAGnE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,8CAA8C,CAAC;AACxF,OAAO,EACL,kBAAkB,EAClB,aAAa,EACb,oBAAoB,EAEpB,mBAAmB,EACnB,aAAa,EAEb,YAAY,EACb,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,oBAAY,YAAY;IACtB,GAAG,QAAQ;IACX,IAAI,SAAS;CACd;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,MAAM,qBAAqB,GAAG,CAClC,CAAC,EAAE,aAAa,EAChB,KAAK,EAAE,mBAAmB,CAAC,aAAa,EAAE,kBAAkB,CAAC,KAC1D,OAAO,CAAC,YAAY,CAAC,CAAC;AAE3B;;;;;;GAMG;AACH,MAAM,MAAM,kBAAkB,GAAG,CAC/B,CAAC,EAAE,oBAAoB,EACvB,KAAK,EAAE,mBAAmB,CAAC,aAAa,EAAE,kBAAkB,CAAC,KAC1D,OAAO,CAAC,mBAAmB,CAAC,CAAC;AAElC;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,qBAAqB,CAAC;IACnC,QAAQ,EAAE,kBAAkB,CAAC;CAC9B;AAED;;;;;;;;;GASG;AACH,qBAAa,SAAS;IACpB;;;;OAIG;IACH,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,SAAS,CAAqD;IACtE,OAAO,CAAC,aAAa,CAAe;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IAC1B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,OAAO,CAAyB;IACxC,OAAO,CAAC,YAAY,CAAC,CAAsB;IAC3C,OAAO,CAAC,QAAQ,CAAuB;IAEvC;;;;;OAKG;IACH,OAAO;IAiBP;;;;;;;;;;;;OAYG;WACU,MAAM,CACjB,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,YAAY,YAAoB,EAC/C,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,EAC3C,YAAY,EAAE,mBAAmB,GAAG,SAAS,EAC7C,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,QAAQ,GAAE,OAAO,CAAC,WAAW,CAAM,GAClC,OAAO,CAAC,SAAS,CAAC;IAgBrB,OAAO,CAAC,mBAAmB;IAe3B;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IA8BxB;;;;;OAKG;IACG,SAAS,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IAmCzC,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;IAIrB,gBAAgB;;;;;;;;;;;;;IAIhB,eAAe;IAIf;;;;;;OAMG;IACG,QAAQ,CACZ,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,OAAO,CAAC,iBAAiB,CAAC;IAS7B,wBAAwB,CAAC,OAAO,EAAE,qBAAqB,GAAG,SAAS;IAuBnE,qBAAqB,CAAC,OAAO,EAAE,kBAAkB,GAAG,SAAS;IAuBvD,KAAK;CAOZ;AAED;;;GAGG;AACH,MAAM,MAAM,iBAAiB,GAAG,OAAO,CACrC,UAAU,CAAC,OAAO,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,CAC7C,CAAC;AASF,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B"}
|