@mcp-ts/sdk 1.0.1 → 1.2.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/README.md +42 -19
- package/dist/adapters/agui-adapter.d.mts +6 -6
- package/dist/adapters/agui-adapter.d.ts +6 -6
- package/dist/adapters/agui-adapter.js +50 -25
- package/dist/adapters/agui-adapter.js.map +1 -1
- package/dist/adapters/agui-adapter.mjs +50 -25
- package/dist/adapters/agui-adapter.mjs.map +1 -1
- package/dist/adapters/agui-middleware.d.mts +23 -8
- package/dist/adapters/agui-middleware.d.ts +23 -8
- package/dist/adapters/agui-middleware.js +71 -43
- package/dist/adapters/agui-middleware.js.map +1 -1
- package/dist/adapters/agui-middleware.mjs +71 -44
- package/dist/adapters/agui-middleware.mjs.map +1 -1
- package/dist/adapters/ai-adapter.d.mts +2 -2
- package/dist/adapters/ai-adapter.d.ts +2 -2
- package/dist/adapters/langchain-adapter.d.mts +2 -2
- package/dist/adapters/langchain-adapter.d.ts +2 -2
- package/dist/adapters/mastra-adapter.d.mts +2 -2
- package/dist/adapters/mastra-adapter.d.ts +2 -2
- package/dist/client/index.d.mts +182 -55
- package/dist/client/index.d.ts +182 -55
- package/dist/client/index.js +535 -130
- package/dist/client/index.js.map +1 -1
- package/dist/client/index.mjs +535 -131
- package/dist/client/index.mjs.map +1 -1
- package/dist/client/react.d.mts +386 -4
- package/dist/client/react.d.ts +386 -4
- package/dist/client/react.js +890 -143
- package/dist/client/react.js.map +1 -1
- package/dist/client/react.mjs +883 -145
- package/dist/client/react.mjs.map +1 -1
- package/dist/client/vue.d.mts +3 -3
- package/dist/client/vue.d.ts +3 -3
- package/dist/client/vue.js +546 -141
- package/dist/client/vue.js.map +1 -1
- package/dist/client/vue.mjs +546 -142
- package/dist/client/vue.mjs.map +1 -1
- package/dist/{events-BP6WyRNh.d.mts → events-BgeztGYZ.d.mts} +12 -1
- package/dist/{events-BP6WyRNh.d.ts → events-BgeztGYZ.d.ts} +12 -1
- package/dist/index.d.mts +4 -4
- package/dist/index.d.ts +4 -4
- package/dist/index.js +797 -248
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +791 -245
- package/dist/index.mjs.map +1 -1
- package/dist/{multi-session-client-DMF3ED2O.d.mts → multi-session-client-CxogNckF.d.mts} +1 -1
- package/dist/{multi-session-client-BOFgPypS.d.ts → multi-session-client-cox_WXUj.d.ts} +1 -1
- package/dist/server/index.d.mts +41 -37
- package/dist/server/index.d.ts +41 -37
- package/dist/server/index.js +241 -116
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs +237 -112
- package/dist/server/index.mjs.map +1 -1
- package/dist/shared/index.d.mts +39 -3
- package/dist/shared/index.d.ts +39 -3
- package/dist/shared/index.js +19 -0
- package/dist/shared/index.js.map +1 -1
- package/dist/shared/index.mjs +18 -1
- package/dist/shared/index.mjs.map +1 -1
- package/package.json +9 -2
- package/src/adapters/agui-adapter.ts +58 -35
- package/src/adapters/agui-middleware.ts +83 -45
- package/src/client/core/app-host.ts +417 -0
- package/src/client/core/sse-client.ts +365 -212
- package/src/client/core/types.ts +31 -0
- package/src/client/index.ts +1 -0
- package/src/client/react/agui-subscriber.ts +275 -0
- package/src/client/react/index.ts +23 -3
- package/src/client/react/use-agui-subscriber.ts +270 -0
- package/src/client/react/use-app-host.ts +73 -0
- package/src/client/react/use-mcp-app-iframe.ts +164 -0
- package/src/client/react/{useMcp.ts → use-mcp.ts} +18 -0
- package/src/client/vue/index.ts +1 -1
- package/src/server/handlers/nextjs-handler.ts +8 -7
- package/src/server/handlers/sse-handler.ts +129 -165
- package/src/server/mcp/oauth-client.ts +32 -2
- package/src/server/storage/index.ts +17 -1
- package/src/server/storage/sqlite-backend.ts +185 -0
- package/src/shared/events.ts +12 -0
- package/src/shared/index.ts +6 -1
- package/src/shared/tool-utils.ts +61 -0
- package/src/shared/types.ts +3 -1
- /package/src/client/vue/{useMcp.ts → use-mcp.ts} +0 -0
package/README.md
CHANGED
|
@@ -1,14 +1,10 @@
|
|
|
1
1
|
<div align="center">
|
|
2
|
-
<
|
|
3
|
-
<img src="docs/static/img/logo.svg" alt="mcp-ts Logo" width="80" height="80" />
|
|
4
|
-
</a>
|
|
5
|
-
<h1 align="center">@mcp-ts</h1>
|
|
6
|
-
<p>TypeScript SDK providing MCP capabilities to agents across JavaScript/cross-runtime environments.</p>
|
|
2
|
+
<img src="docs/static/img/mcp-ts-banner.svg" alt="MCP-TS Banner" width="100%" style="max-width: 1200px;" />
|
|
7
3
|
</div>
|
|
8
4
|
|
|
9
5
|
<div align="center">
|
|
10
|
-
<a href="https://github.
|
|
11
|
-
<em>
|
|
6
|
+
<a href="https://zonlabs.github.io/mcp-ts/#ag-ui-demo">
|
|
7
|
+
<em>Watch AG-UI + LangChain demo</em>
|
|
12
8
|
</a>
|
|
13
9
|
</div>
|
|
14
10
|
<br />
|
|
@@ -18,13 +14,13 @@
|
|
|
18
14
|
|
|
19
15
|
| *Supported Frameworks* | *Agent Frameworks and Protocol* | *Storage Backends* |
|
|
20
16
|
| :---: | :---: | :---: |
|
|
21
|
-
| <img src="docs/static/img/framework/next.svg" width="35" height="35" /> <img src="docs/static/img/framework/node.svg" width="35" height="35" /> <img src="docs/static/img/framework/react.svg" width="35" height="35" /> <img src="docs/static/img/framework/vue.svg" width="35" height="35" /> <img src="docs/static/img/framework/express.svg" width="35" height="35" /> | <img src="docs/static/img/framework/vercel.svg" width="35" height="35" /> <img src="docs/static/img/agent-framework/langchain.svg" width="35" height="35" /> <img src="docs/static/img/agent-framework/mastra.svg" width="35" height="35" /> <img src="docs/static/img/agent-framework/agui.webp" width="35" height="35" /> | <img src="docs/static/img/storage-backend/redis.svg" width="35" height="35" /> <img src="docs/static/img/storage-backend/filesystem.svg" width="35" height="35" /> <img src="docs/static/img/storage-backend/memory.svg" width="35" height="35" /> |
|
|
17
|
+
| <img src="docs/static/img/framework/next.svg" width="35" height="35" /> <img src="docs/static/img/framework/node.svg" width="35" height="35" /> <img src="docs/static/img/framework/react.svg" width="35" height="35" /> <img src="docs/static/img/framework/vue.svg" width="35" height="35" /> <img src="docs/static/img/framework/express.svg" width="35" height="35" /> | <img src="docs/static/img/framework/vercel.svg" width="35" height="35" /> <img src="docs/static/img/agent-framework/langchain.svg" width="35" height="35" /> <img src="docs/static/img/agent-framework/mastra.svg" width="35" height="35" /> <img src="docs/static/img/agent-framework/agui.webp" width="35" height="35" /> | <img src="docs/static/img/storage-backend/redis.svg" width="35" height="35" /> <img src="docs/static/img/storage-backend/sqlite.svg" width="35" height="35" /> <img src="docs/static/img/storage-backend/filesystem.svg" width="35" height="35" /> <img src="docs/static/img/storage-backend/memory.svg" width="35" height="35" /> |
|
|
22
18
|
|
|
23
19
|
</div>
|
|
24
20
|
|
|
25
21
|
<p align="center">
|
|
26
22
|
<a href="https://www.npmjs.com/package/@mcp-ts/sdk">
|
|
27
|
-
<img src="https://
|
|
23
|
+
<img src="https://img.shields.io/npm/v/@mcp-ts/sdk.svg" alt="npm version" />
|
|
28
24
|
</a>
|
|
29
25
|
<a href="https://opensource.org/licenses/MIT">
|
|
30
26
|
<img src="https://img.shields.io/badge/License-MIT-yellow.svg" alt="License: MIT" />
|
|
@@ -35,18 +31,37 @@
|
|
|
35
31
|
|
|
36
32
|
## Features
|
|
37
33
|
|
|
38
|
-
- **
|
|
39
|
-
- **Flexible Storage** - Redis, File System, or In-Memory backends
|
|
40
|
-
- **Serverless
|
|
34
|
+
- **SSE** - Server-Sent Events for connection state and observability updates
|
|
35
|
+
- **Flexible Storage** - Redis, SQLite, File System, or In-Memory backends
|
|
36
|
+
- **Serverless** - Works in serverless environments (Vercel, AWS Lambda, etc.)
|
|
41
37
|
- **React Hook** - `useMcp` hook for easy React integration
|
|
42
38
|
- **Vue Composable** - `useMcp` composable for Vue applications
|
|
43
|
-
- **
|
|
44
|
-
- **TypeScript** - Complete type safety with exported types
|
|
39
|
+
- **MCP Protocol** - Support for tools, prompts, and resources
|
|
45
40
|
- **Agent Adapters** - Built-in adapters for AI SDK, LangChain, Mastra, and AG-UI
|
|
41
|
+
- **MCP Apps Extension (SEP-1865)** - Interactive UI-driven tool interfaces
|
|
42
|
+
|
|
43
|
+
## Examples
|
|
44
|
+
|
|
45
|
+
Check out working examples demonstrating the MCP Apps extension and agent integrations in the [examples/agents](examples/agents) directory.
|
|
46
|
+
|
|
47
|
+
> Examples MCP Apps referred from [modelcontextprotocol/ext-apps](https://github.com/modelcontextprotocol/ext-apps/tree/main/examples)
|
|
48
|
+
|
|
49
|
+
<div align="center">
|
|
50
|
+
<table cellspacing="5" cellpadding="0">
|
|
51
|
+
<tr>
|
|
52
|
+
<td width="50%">
|
|
53
|
+
<img src="docs/static/img/mcp-apps-img-1.png" alt="MCP Apps 1" width="100%" />
|
|
54
|
+
</td>
|
|
55
|
+
<td width="50%">
|
|
56
|
+
<img src="docs/static/img/mcp-apps-img-2.png" alt="MCP Apps 2" width="100%" />
|
|
57
|
+
</td>
|
|
58
|
+
</tr>
|
|
59
|
+
</table>
|
|
60
|
+
<p><em>Interactive UIs for MCP tools</em></p>
|
|
61
|
+
</div>
|
|
46
62
|
|
|
47
63
|
## Inspiration
|
|
48
64
|
|
|
49
|
-
> [!NOTE]
|
|
50
65
|
> I got the idea for `@mcp-ts` while working on 🌐 **[MCP Assistant](https://mcp-assistant.in)**.
|
|
51
66
|
While building custom storage for persistence, managing the flow became harder than it should have been.
|
|
52
67
|
So I built this client to handle the heavy lifting of client applications and make agent interactions easier.
|
|
@@ -69,6 +84,7 @@ npm install @mcp-ts/sdk
|
|
|
69
84
|
The package supports multiple storage backends out of the box:
|
|
70
85
|
- **Memory** (default, no setup required)
|
|
71
86
|
- **File** (local persistence)
|
|
87
|
+
- **SQLite** (fast local persistence, requires `npm install better-sqlite3`)
|
|
72
88
|
- **Redis** (production-ready, requires `npm install ioredis`)
|
|
73
89
|
|
|
74
90
|
## Quick Start
|
|
@@ -210,7 +226,7 @@ Full documentation is available at: **[Docs](https://zonlabs.github.io/mcp-ts/)*
|
|
|
210
226
|
|
|
211
227
|
The library supports multiple storage backends. You can explicitly select one using `MCP_TS_STORAGE_TYPE` or rely on automatic detection.
|
|
212
228
|
|
|
213
|
-
**Supported Types:** `redis`, `file`, `memory`.
|
|
229
|
+
**Supported Types:** `redis`, `sqlite`, `file`, `memory`.
|
|
214
230
|
|
|
215
231
|
### Configuration Examples
|
|
216
232
|
|
|
@@ -220,13 +236,20 @@ The library supports multiple storage backends. You can explicitly select one us
|
|
|
220
236
|
REDIS_URL=redis://localhost:6379
|
|
221
237
|
```
|
|
222
238
|
|
|
223
|
-
2. **<img src="docs/static/img/storage-backend/
|
|
239
|
+
2. **<img src="docs/static/img/storage-backend/sqlite.svg" width="20" height="20" align="center" /> SQLite** (Fast & Persistent)
|
|
240
|
+
```bash
|
|
241
|
+
MCP_TS_STORAGE_TYPE=sqlite
|
|
242
|
+
# Optional path
|
|
243
|
+
MCP_TS_STORAGE_SQLITE_PATH=./sessions.db
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
3. **<img src="docs/static/img/storage-backend/filesystem.svg" width="20" height="20" align="center" /> File System** (Great for local dev)
|
|
224
247
|
```bash
|
|
225
248
|
MCP_TS_STORAGE_TYPE=file
|
|
226
249
|
MCP_TS_STORAGE_FILE=./sessions.json
|
|
227
250
|
```
|
|
228
251
|
|
|
229
|
-
|
|
252
|
+
4. **<img src="docs/static/img/storage-backend/memory.svg" width="20" height="20" align="center" /> In-Memory** (Default for testing)
|
|
230
253
|
```bash
|
|
231
254
|
MCP_TS_STORAGE_TYPE=memory
|
|
232
255
|
```
|
|
@@ -287,7 +310,7 @@ For more details, refer to the documentation and follow the **installation guide
|
|
|
287
310
|
|
|
288
311
|
## Contributing
|
|
289
312
|
|
|
290
|
-
Contributions are welcome! Please read [
|
|
313
|
+
Contributions are welcome! Please read [CONTRIBUTING.md](./CONTRIBUTING.md) for guidelines on how to contribute.
|
|
291
314
|
|
|
292
315
|
## License
|
|
293
316
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { M as MCPClient, a as MultiSessionClient } from '../multi-session-client-
|
|
2
|
-
import '../events-
|
|
1
|
+
import { M as MCPClient, a as MultiSessionClient } from '../multi-session-client-CxogNckF.mjs';
|
|
2
|
+
import '../events-BgeztGYZ.mjs';
|
|
3
3
|
import '@modelcontextprotocol/sdk/types.js';
|
|
4
4
|
import '@modelcontextprotocol/sdk/shared/auth.js';
|
|
5
5
|
import '@modelcontextprotocol/sdk/client/auth.js';
|
|
@@ -34,12 +34,10 @@ import '@modelcontextprotocol/sdk/client/auth.js';
|
|
|
34
34
|
|
|
35
35
|
/**
|
|
36
36
|
* Cleans a JSON Schema by removing meta-properties that cause issues with
|
|
37
|
-
* strict Pydantic validation (e.g., Google ADK).
|
|
38
|
-
*
|
|
39
|
-
* Removes: $schema, $id, $comment, $defs, definitions
|
|
37
|
+
* strict Pydantic validation (e.g., Google ADK, LangGraph).
|
|
40
38
|
*
|
|
41
39
|
* @param schema - The JSON Schema to clean
|
|
42
|
-
* @returns Cleaned schema without
|
|
40
|
+
* @returns Cleaned schema without forbidden properties
|
|
43
41
|
*/
|
|
44
42
|
declare function cleanSchema(schema: Record<string, any> | undefined): Record<string, any>;
|
|
45
43
|
/**
|
|
@@ -59,6 +57,7 @@ interface AguiTool {
|
|
|
59
57
|
name: string;
|
|
60
58
|
description: string;
|
|
61
59
|
parameters?: Record<string, any>;
|
|
60
|
+
_meta?: Record<string, any>;
|
|
62
61
|
handler?: (args: any) => any | Promise<any>;
|
|
63
62
|
}
|
|
64
63
|
/**
|
|
@@ -68,6 +67,7 @@ interface AguiToolDefinition {
|
|
|
68
67
|
name: string;
|
|
69
68
|
description: string;
|
|
70
69
|
parameters: Record<string, any>;
|
|
70
|
+
_meta?: Record<string, any>;
|
|
71
71
|
}
|
|
72
72
|
/**
|
|
73
73
|
* Adapter that transforms MCP tools into AG-UI compatible formats.
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { M as MCPClient, a as MultiSessionClient } from '../multi-session-client-
|
|
2
|
-
import '../events-
|
|
1
|
+
import { M as MCPClient, a as MultiSessionClient } from '../multi-session-client-cox_WXUj.js';
|
|
2
|
+
import '../events-BgeztGYZ.js';
|
|
3
3
|
import '@modelcontextprotocol/sdk/types.js';
|
|
4
4
|
import '@modelcontextprotocol/sdk/shared/auth.js';
|
|
5
5
|
import '@modelcontextprotocol/sdk/client/auth.js';
|
|
@@ -34,12 +34,10 @@ import '@modelcontextprotocol/sdk/client/auth.js';
|
|
|
34
34
|
|
|
35
35
|
/**
|
|
36
36
|
* Cleans a JSON Schema by removing meta-properties that cause issues with
|
|
37
|
-
* strict Pydantic validation (e.g., Google ADK).
|
|
38
|
-
*
|
|
39
|
-
* Removes: $schema, $id, $comment, $defs, definitions
|
|
37
|
+
* strict Pydantic validation (e.g., Google ADK, LangGraph).
|
|
40
38
|
*
|
|
41
39
|
* @param schema - The JSON Schema to clean
|
|
42
|
-
* @returns Cleaned schema without
|
|
40
|
+
* @returns Cleaned schema without forbidden properties
|
|
43
41
|
*/
|
|
44
42
|
declare function cleanSchema(schema: Record<string, any> | undefined): Record<string, any>;
|
|
45
43
|
/**
|
|
@@ -59,6 +57,7 @@ interface AguiTool {
|
|
|
59
57
|
name: string;
|
|
60
58
|
description: string;
|
|
61
59
|
parameters?: Record<string, any>;
|
|
60
|
+
_meta?: Record<string, any>;
|
|
62
61
|
handler?: (args: any) => any | Promise<any>;
|
|
63
62
|
}
|
|
64
63
|
/**
|
|
@@ -68,6 +67,7 @@ interface AguiToolDefinition {
|
|
|
68
67
|
name: string;
|
|
69
68
|
description: string;
|
|
70
69
|
parameters: Record<string, any>;
|
|
70
|
+
_meta?: Record<string, any>;
|
|
71
71
|
}
|
|
72
72
|
/**
|
|
73
73
|
* Adapter that transforms MCP tools into AG-UI compatible formats.
|
|
@@ -1,16 +1,33 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
// src/adapters/agui-adapter.ts
|
|
4
|
+
var PYDANTIC_FORBIDDEN_PROPS = [
|
|
5
|
+
// JSON Schema meta-properties
|
|
6
|
+
"$schema",
|
|
7
|
+
"$id",
|
|
8
|
+
"$comment",
|
|
9
|
+
"$defs",
|
|
10
|
+
"definitions",
|
|
11
|
+
// Extended properties used by some MCP servers (e.g., Apify)
|
|
12
|
+
"prefill",
|
|
13
|
+
"examples",
|
|
14
|
+
"enumTitles",
|
|
15
|
+
"enumDescriptions",
|
|
16
|
+
// Other common extensions
|
|
17
|
+
"deprecated",
|
|
18
|
+
"readOnly",
|
|
19
|
+
"writeOnly",
|
|
20
|
+
"contentMediaType",
|
|
21
|
+
"contentEncoding"
|
|
22
|
+
];
|
|
4
23
|
function cleanSchema(schema) {
|
|
5
24
|
if (!schema) {
|
|
6
25
|
return { type: "object", properties: {} };
|
|
7
26
|
}
|
|
8
27
|
const cleaned = { ...schema };
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
delete cleaned.$defs;
|
|
13
|
-
delete cleaned.definitions;
|
|
28
|
+
for (const prop of PYDANTIC_FORBIDDEN_PROPS) {
|
|
29
|
+
delete cleaned[prop];
|
|
30
|
+
}
|
|
14
31
|
if (cleaned.properties && typeof cleaned.properties === "object") {
|
|
15
32
|
const cleanedProps = {};
|
|
16
33
|
for (const [key, value] of Object.entries(cleaned.properties)) {
|
|
@@ -75,31 +92,39 @@ var AguiAdapter = class {
|
|
|
75
92
|
async transformTools(client) {
|
|
76
93
|
if (!client.isConnected()) return [];
|
|
77
94
|
const result = await client.listTools();
|
|
78
|
-
const
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
95
|
+
const serverId = typeof client.getServerId === "function" ? client.getServerId() : void 0;
|
|
96
|
+
const normalizedPrefix = (this.options.prefix ?? serverId ?? "mcp").replace(/-/g, "");
|
|
97
|
+
const prefix = `tool_${normalizedPrefix}`;
|
|
98
|
+
return result.tools.map((tool) => {
|
|
99
|
+
const mcpTool = tool;
|
|
100
|
+
const mcpToolName = tool.name;
|
|
101
|
+
return {
|
|
102
|
+
name: `${prefix}_${tool.name}`,
|
|
103
|
+
description: tool.description || `Execute ${tool.name}`,
|
|
104
|
+
parameters: cleanSchema(tool.inputSchema),
|
|
105
|
+
_meta: { ...mcpTool._meta, sessionId: client.getSessionId?.() },
|
|
106
|
+
handler: async (args) => {
|
|
107
|
+
const callResult = await client.callTool(mcpToolName, args ?? {});
|
|
108
|
+
return callResult;
|
|
89
109
|
}
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
}));
|
|
110
|
+
};
|
|
111
|
+
});
|
|
93
112
|
}
|
|
94
113
|
async transformToolDefinitions(client) {
|
|
95
114
|
if (!client.isConnected()) return [];
|
|
96
115
|
const result = await client.listTools();
|
|
97
|
-
const
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
116
|
+
const serverId = typeof client.getServerId === "function" ? client.getServerId() : void 0;
|
|
117
|
+
const normalizedPrefix = (this.options.prefix ?? serverId ?? "mcp").replace(/-/g, "");
|
|
118
|
+
const prefix = `tool_${normalizedPrefix}`;
|
|
119
|
+
return result.tools.map((tool) => {
|
|
120
|
+
const mcpTool = tool;
|
|
121
|
+
return {
|
|
122
|
+
name: `${prefix}_${tool.name}`,
|
|
123
|
+
description: tool.description || `Execute ${tool.name}`,
|
|
124
|
+
parameters: cleanSchema(tool.inputSchema),
|
|
125
|
+
_meta: { ...mcpTool._meta, sessionId: client.getSessionId?.() }
|
|
126
|
+
};
|
|
127
|
+
});
|
|
103
128
|
}
|
|
104
129
|
};
|
|
105
130
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/adapters/agui-adapter.ts"],"names":["result"],"mappings":"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","file":"agui-adapter.js","sourcesContent":["/**\r\n * MCP Adapter for AG-UI Integration\r\n *\r\n * This adapter transforms MCP tools into formats compatible with AG-UI agents.\r\n * It provides tools with handlers for server-side execution and tool definitions\r\n * in JSON Schema format for passing to remote agents.\r\n *\r\n * @example\r\n * ```typescript\r\n * import { MultiSessionClient } from '@mcp-ts/sdk/server';\r\n * import { AguiAdapter } from '@mcp-ts/sdk/adapters/agui-adapter';\r\n * import { createMcpMiddleware } from '@mcp-ts/sdk/adapters/agui-middleware';\r\n * import { HttpAgent } from '@ag-ui/client';\r\n *\r\n * // Create MCP client\r\n * const mcpClient = new MultiSessionClient('user_123');\r\n * await mcpClient.connect();\r\n *\r\n * // Create adapter and get tools\r\n * const adapter = new AguiAdapter(mcpClient);\r\n * const tools = await adapter.getTools();\r\n *\r\n * // Use with AG-UI middleware\r\n * const agent = new HttpAgent({ url: 'http://localhost:8000/agent' });\r\n * agent.use(createMcpMiddleware({ tools }));\r\n * ```\r\n */\r\n\r\nimport { MCPClient } from '../server/mcp/oauth-client.js';\r\nimport { MultiSessionClient } from '../server/mcp/multi-session-client.js';\r\n\r\n/**\r\n * Cleans a JSON Schema by removing meta-properties that cause issues with\r\n * strict Pydantic validation (e.g., Google ADK).\r\n *\r\n * Removes: $schema, $id, $comment, $defs, definitions\r\n *\r\n * @param schema - The JSON Schema to clean\r\n * @returns Cleaned schema without meta-properties\r\n */\r\nexport function cleanSchema(schema: Record<string, any> | undefined): Record<string, any> {\r\n if (!schema) {\r\n return { type: 'object', properties: {} };\r\n }\r\n\r\n const cleaned = { ...schema };\r\n\r\n // Remove JSON Schema meta-properties that cause Pydantic validation errors\r\n delete cleaned.$schema;\r\n delete cleaned.$id;\r\n delete cleaned.$comment;\r\n delete cleaned.$defs;\r\n delete cleaned.definitions;\r\n\r\n // Recursively clean nested properties\r\n if (cleaned.properties && typeof cleaned.properties === 'object') {\r\n const cleanedProps: Record<string, any> = {};\r\n for (const [key, value] of Object.entries(cleaned.properties)) {\r\n if (typeof value === 'object' && value !== null) {\r\n cleanedProps[key] = cleanSchema(value as Record<string, any>);\r\n } else {\r\n cleanedProps[key] = value;\r\n }\r\n }\r\n cleaned.properties = cleanedProps;\r\n }\r\n\r\n // Clean items if it's an array schema\r\n if (cleaned.items && typeof cleaned.items === 'object') {\r\n cleaned.items = cleanSchema(cleaned.items);\r\n }\r\n\r\n // Clean additionalProperties if it's an object schema\r\n if (cleaned.additionalProperties && typeof cleaned.additionalProperties === 'object') {\r\n cleaned.additionalProperties = cleanSchema(cleaned.additionalProperties);\r\n }\r\n\r\n return cleaned;\r\n}\r\n\r\n/**\r\n * Configuration options for AguiAdapter\r\n */\r\nexport interface AguiAdapterOptions {\r\n /**\r\n * Prefix for tool names to avoid collision with other tools.\r\n * @default serverId or 'mcp'\r\n */\r\n prefix?: string;\r\n}\r\n\r\n/**\r\n * AG-UI Tool with handler for server-side execution.\r\n */\r\nexport interface AguiTool {\r\n name: string;\r\n description: string;\r\n parameters?: Record<string, any>;\r\n handler?: (args: any) => any | Promise<any>;\r\n}\r\n\r\n/**\r\n * Tool definition format for passing to remote agents (without handler).\r\n */\r\nexport interface AguiToolDefinition {\r\n name: string;\r\n description: string;\r\n parameters: Record<string, any>;\r\n}\r\n\r\n/**\r\n * Adapter that transforms MCP tools into AG-UI compatible formats.\r\n */\r\nexport class AguiAdapter {\r\n constructor(\r\n private client: MCPClient | MultiSessionClient,\r\n private options: AguiAdapterOptions = {}\r\n ) { }\r\n\r\n /**\r\n * Get tools with handlers for MCP tool execution.\r\n */\r\n async getTools(): Promise<AguiTool[]> {\r\n if (this.isMultiSession()) {\r\n const clients = (this.client as MultiSessionClient).getClients();\r\n const allTools: AguiTool[] = [];\r\n for (const client of clients) {\r\n allTools.push(...await this.transformTools(client));\r\n }\r\n return allTools;\r\n }\r\n return this.transformTools(this.client as MCPClient);\r\n }\r\n\r\n /**\r\n * Get tool definitions in JSON Schema format for passing to remote agents.\r\n */\r\n async getToolDefinitions(): Promise<AguiToolDefinition[]> {\r\n if (this.isMultiSession()) {\r\n const clients = (this.client as MultiSessionClient).getClients();\r\n const allTools: AguiToolDefinition[] = [];\r\n for (const client of clients) {\r\n allTools.push(...await this.transformToolDefinitions(client));\r\n }\r\n return allTools;\r\n }\r\n return this.transformToolDefinitions(this.client as MCPClient);\r\n }\r\n\r\n /**\r\n * Get tools as a function (for dynamic loading).\r\n */\r\n getToolsFunction(): () => Promise<AguiTool[]> {\r\n return () => this.getTools();\r\n }\r\n\r\n private isMultiSession(): boolean {\r\n return typeof (this.client as any).getClients === 'function';\r\n }\r\n\r\n private async transformTools(client: MCPClient): Promise<AguiTool[]> {\r\n if (!client.isConnected()) return [];\r\n\r\n const result = await client.listTools();\r\n const prefix = this.options.prefix ?? `tool_${client.getServerId() ?? 'mcp'}`;\r\n\r\n return result.tools.map(tool => ({\r\n name: `${prefix}_${tool.name}`,\r\n description: tool.description || `Execute ${tool.name}`,\r\n parameters: cleanSchema(tool.inputSchema),\r\n handler: async (args: any) => {\r\n console.log(`[AguiAdapter] Executing MCP tool: ${tool.name}`, args);\r\n const result = await client.callTool(tool.name, args);\r\n\r\n if (result.content && Array.isArray(result.content)) {\r\n const textContent = result.content\r\n .filter((c: any) => c.type === 'text')\r\n .map((c: any) => c.text)\r\n .join('\\n');\r\n return textContent || result;\r\n }\r\n return result;\r\n }\r\n }));\r\n }\r\n\r\n private async transformToolDefinitions(client: MCPClient): Promise<AguiToolDefinition[]> {\r\n if (!client.isConnected()) return [];\r\n\r\n const result = await client.listTools();\r\n const prefix = this.options.prefix ?? `tool_${client.getServerId() ?? 'mcp'}`;\r\n\r\n return result.tools.map(tool => ({\r\n name: `${prefix}_${tool.name}`,\r\n description: tool.description || `Execute ${tool.name}`,\r\n parameters: cleanSchema(tool.inputSchema),\r\n }));\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/adapters/agui-adapter.ts"],"names":[],"mappings":"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","file":"agui-adapter.js","sourcesContent":["/**\r\n * MCP Adapter for AG-UI Integration\r\n *\r\n * This adapter transforms MCP tools into formats compatible with AG-UI agents.\r\n * It provides tools with handlers for server-side execution and tool definitions\r\n * in JSON Schema format for passing to remote agents.\r\n *\r\n * @example\r\n * ```typescript\r\n * import { MultiSessionClient } from '@mcp-ts/sdk/server';\r\n * import { AguiAdapter } from '@mcp-ts/sdk/adapters/agui-adapter';\r\n * import { createMcpMiddleware } from '@mcp-ts/sdk/adapters/agui-middleware';\r\n * import { HttpAgent } from '@ag-ui/client';\r\n *\r\n * // Create MCP client\r\n * const mcpClient = new MultiSessionClient('user_123');\r\n * await mcpClient.connect();\r\n *\r\n * // Create adapter and get tools\r\n * const adapter = new AguiAdapter(mcpClient);\r\n * const tools = await adapter.getTools();\r\n *\r\n * // Use with AG-UI middleware\r\n * const agent = new HttpAgent({ url: 'http://localhost:8000/agent' });\r\n * agent.use(createMcpMiddleware({ tools }));\r\n * ```\r\n */\r\n\r\nimport { MCPClient } from '../server/mcp/oauth-client.js';\r\nimport { MultiSessionClient } from '../server/mcp/multi-session-client.js';\r\n\r\n/**\r\n * Extended JSON Schema properties that Pydantic's strict validation rejects.\r\n * These are valid JSON Schema extensions but not part of the core spec.\r\n */\r\nconst PYDANTIC_FORBIDDEN_PROPS = [\r\n // JSON Schema meta-properties\r\n '$schema', '$id', '$comment', '$defs', 'definitions',\r\n // Extended properties used by some MCP servers (e.g., Apify)\r\n 'prefill', 'examples', 'enumTitles', 'enumDescriptions',\r\n // Other common extensions\r\n 'deprecated', 'readOnly', 'writeOnly', 'contentMediaType', 'contentEncoding',\r\n];\r\n\r\n/**\r\n * Cleans a JSON Schema by removing meta-properties that cause issues with\r\n * strict Pydantic validation (e.g., Google ADK, LangGraph).\r\n *\r\n * @param schema - The JSON Schema to clean\r\n * @returns Cleaned schema without forbidden properties\r\n */\r\nexport function cleanSchema(schema: Record<string, any> | undefined): Record<string, any> {\r\n if (!schema) {\r\n return { type: 'object', properties: {} };\r\n }\r\n\r\n const cleaned = { ...schema };\r\n\r\n // Remove all forbidden properties\r\n for (const prop of PYDANTIC_FORBIDDEN_PROPS) {\r\n delete cleaned[prop];\r\n }\r\n\r\n // Recursively clean nested properties\r\n if (cleaned.properties && typeof cleaned.properties === 'object') {\r\n const cleanedProps: Record<string, any> = {};\r\n for (const [key, value] of Object.entries(cleaned.properties)) {\r\n if (typeof value === 'object' && value !== null) {\r\n cleanedProps[key] = cleanSchema(value as Record<string, any>);\r\n } else {\r\n cleanedProps[key] = value;\r\n }\r\n }\r\n cleaned.properties = cleanedProps;\r\n }\r\n\r\n // Clean items if it's an array schema\r\n if (cleaned.items && typeof cleaned.items === 'object') {\r\n cleaned.items = cleanSchema(cleaned.items);\r\n }\r\n\r\n // Clean additionalProperties if it's an object schema\r\n if (cleaned.additionalProperties && typeof cleaned.additionalProperties === 'object') {\r\n cleaned.additionalProperties = cleanSchema(cleaned.additionalProperties);\r\n }\r\n\r\n return cleaned;\r\n}\r\n\r\n/**\r\n * Configuration options for AguiAdapter\r\n */\r\nexport interface AguiAdapterOptions {\r\n /**\r\n * Prefix for tool names to avoid collision with other tools.\r\n * @default serverId or 'mcp'\r\n */\r\n prefix?: string;\r\n}\r\n\r\n/**\r\n * AG-UI Tool with handler for server-side execution.\r\n */\r\nexport interface AguiTool {\r\n name: string;\r\n description: string;\r\n parameters?: Record<string, any>;\r\n _meta?: Record<string, any>; // Add _meta to AguiTool\r\n handler?: (args: any) => any | Promise<any>;\r\n}\r\n\r\n/**\r\n * Tool definition format for passing to remote agents (without handler).\r\n */\r\nexport interface AguiToolDefinition {\r\n name: string;\r\n description: string;\r\n parameters: Record<string, any>;\r\n _meta?: Record<string, any>; // Add _meta to AguiToolDefinition\r\n}\r\n\r\n/**\r\n * Adapter that transforms MCP tools into AG-UI compatible formats.\r\n */\r\nexport class AguiAdapter {\r\n constructor(\r\n private client: MCPClient | MultiSessionClient,\r\n private options: AguiAdapterOptions = {}\r\n ) { }\r\n\r\n /**\r\n * Get tools with handlers for MCP tool execution.\r\n */\r\n async getTools(): Promise<AguiTool[]> {\r\n if (this.isMultiSession()) {\r\n const clients = (this.client as MultiSessionClient).getClients();\r\n const allTools: AguiTool[] = [];\r\n for (const client of clients) {\r\n allTools.push(...await this.transformTools(client));\r\n }\r\n return allTools;\r\n }\r\n return this.transformTools(this.client as MCPClient);\r\n }\r\n\r\n /**\r\n * Get tool definitions in JSON Schema format for passing to remote agents.\r\n */\r\n async getToolDefinitions(): Promise<AguiToolDefinition[]> {\r\n if (this.isMultiSession()) {\r\n const clients = (this.client as MultiSessionClient).getClients();\r\n const allTools: AguiToolDefinition[] = [];\r\n for (const client of clients) {\r\n allTools.push(...await this.transformToolDefinitions(client));\r\n }\r\n return allTools;\r\n }\r\n return this.transformToolDefinitions(this.client as MCPClient);\r\n }\r\n\r\n /**\r\n * Get tools as a function (for dynamic loading).\r\n */\r\n getToolsFunction(): () => Promise<AguiTool[]> {\r\n return () => this.getTools();\r\n }\r\n\r\n private isMultiSession(): boolean {\r\n return typeof (this.client as any).getClients === 'function';\r\n }\r\n\r\n private async transformTools(client: MCPClient): Promise<AguiTool[]> {\r\n if (!client.isConnected()) return [];\r\n\r\n const result = await client.listTools();\r\n const serverId = (typeof (client as any).getServerId === 'function'\r\n ? (client as any).getServerId()\r\n : undefined) as string | undefined;\r\n const normalizedPrefix = (this.options.prefix ?? serverId ?? 'mcp').replace(/-/g, '');\r\n const prefix = `tool_${normalizedPrefix}`;\r\n\r\n return result.tools.map(tool => {\r\n // Type assertion to access _meta if it exists on the tool object (it comes from MCP SDK)\r\n const mcpTool = tool as any;\r\n const mcpToolName = tool.name;\r\n return {\r\n name: `${prefix}_${tool.name}`,\r\n description: tool.description || `Execute ${tool.name}`,\r\n parameters: cleanSchema(tool.inputSchema),\r\n _meta: { ...mcpTool._meta, sessionId: (client as any).getSessionId?.() },\r\n handler: async (args: any) => {\r\n // Call the actual MCP tool\r\n const callResult = await (client as any).callTool(mcpToolName, args ?? {});\r\n\r\n // Return the raw result object so middleware can inspect `_meta` (e.g. for UI triggers)\r\n return callResult;\r\n }\r\n }\r\n });\r\n }\r\n\r\n private async transformToolDefinitions(client: MCPClient): Promise<AguiToolDefinition[]> {\r\n if (!client.isConnected()) return [];\r\n\r\n const result = await client.listTools();\r\n const serverId = (typeof (client as any).getServerId === 'function'\r\n ? (client as any).getServerId()\r\n : undefined) as string | undefined;\r\n const normalizedPrefix = (this.options.prefix ?? serverId ?? 'mcp').replace(/-/g, '');\r\n const prefix = `tool_${normalizedPrefix}`;\r\n\r\n return result.tools.map(tool => {\r\n const mcpTool = tool as any;\r\n return {\r\n name: `${prefix}_${tool.name}`,\r\n description: tool.description || `Execute ${tool.name}`,\r\n parameters: cleanSchema(tool.inputSchema),\r\n _meta: { ...mcpTool._meta, sessionId: (client as any).getSessionId?.() },\r\n };\r\n });\r\n }\r\n}\r\n"]}
|
|
@@ -1,14 +1,31 @@
|
|
|
1
1
|
// src/adapters/agui-adapter.ts
|
|
2
|
+
var PYDANTIC_FORBIDDEN_PROPS = [
|
|
3
|
+
// JSON Schema meta-properties
|
|
4
|
+
"$schema",
|
|
5
|
+
"$id",
|
|
6
|
+
"$comment",
|
|
7
|
+
"$defs",
|
|
8
|
+
"definitions",
|
|
9
|
+
// Extended properties used by some MCP servers (e.g., Apify)
|
|
10
|
+
"prefill",
|
|
11
|
+
"examples",
|
|
12
|
+
"enumTitles",
|
|
13
|
+
"enumDescriptions",
|
|
14
|
+
// Other common extensions
|
|
15
|
+
"deprecated",
|
|
16
|
+
"readOnly",
|
|
17
|
+
"writeOnly",
|
|
18
|
+
"contentMediaType",
|
|
19
|
+
"contentEncoding"
|
|
20
|
+
];
|
|
2
21
|
function cleanSchema(schema) {
|
|
3
22
|
if (!schema) {
|
|
4
23
|
return { type: "object", properties: {} };
|
|
5
24
|
}
|
|
6
25
|
const cleaned = { ...schema };
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
delete cleaned.$defs;
|
|
11
|
-
delete cleaned.definitions;
|
|
26
|
+
for (const prop of PYDANTIC_FORBIDDEN_PROPS) {
|
|
27
|
+
delete cleaned[prop];
|
|
28
|
+
}
|
|
12
29
|
if (cleaned.properties && typeof cleaned.properties === "object") {
|
|
13
30
|
const cleanedProps = {};
|
|
14
31
|
for (const [key, value] of Object.entries(cleaned.properties)) {
|
|
@@ -73,31 +90,39 @@ var AguiAdapter = class {
|
|
|
73
90
|
async transformTools(client) {
|
|
74
91
|
if (!client.isConnected()) return [];
|
|
75
92
|
const result = await client.listTools();
|
|
76
|
-
const
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
93
|
+
const serverId = typeof client.getServerId === "function" ? client.getServerId() : void 0;
|
|
94
|
+
const normalizedPrefix = (this.options.prefix ?? serverId ?? "mcp").replace(/-/g, "");
|
|
95
|
+
const prefix = `tool_${normalizedPrefix}`;
|
|
96
|
+
return result.tools.map((tool) => {
|
|
97
|
+
const mcpTool = tool;
|
|
98
|
+
const mcpToolName = tool.name;
|
|
99
|
+
return {
|
|
100
|
+
name: `${prefix}_${tool.name}`,
|
|
101
|
+
description: tool.description || `Execute ${tool.name}`,
|
|
102
|
+
parameters: cleanSchema(tool.inputSchema),
|
|
103
|
+
_meta: { ...mcpTool._meta, sessionId: client.getSessionId?.() },
|
|
104
|
+
handler: async (args) => {
|
|
105
|
+
const callResult = await client.callTool(mcpToolName, args ?? {});
|
|
106
|
+
return callResult;
|
|
87
107
|
}
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
}));
|
|
108
|
+
};
|
|
109
|
+
});
|
|
91
110
|
}
|
|
92
111
|
async transformToolDefinitions(client) {
|
|
93
112
|
if (!client.isConnected()) return [];
|
|
94
113
|
const result = await client.listTools();
|
|
95
|
-
const
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
114
|
+
const serverId = typeof client.getServerId === "function" ? client.getServerId() : void 0;
|
|
115
|
+
const normalizedPrefix = (this.options.prefix ?? serverId ?? "mcp").replace(/-/g, "");
|
|
116
|
+
const prefix = `tool_${normalizedPrefix}`;
|
|
117
|
+
return result.tools.map((tool) => {
|
|
118
|
+
const mcpTool = tool;
|
|
119
|
+
return {
|
|
120
|
+
name: `${prefix}_${tool.name}`,
|
|
121
|
+
description: tool.description || `Execute ${tool.name}`,
|
|
122
|
+
parameters: cleanSchema(tool.inputSchema),
|
|
123
|
+
_meta: { ...mcpTool._meta, sessionId: client.getSessionId?.() }
|
|
124
|
+
};
|
|
125
|
+
});
|
|
101
126
|
}
|
|
102
127
|
};
|
|
103
128
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/adapters/agui-adapter.ts"],"names":["result"],"mappings":"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","file":"agui-adapter.mjs","sourcesContent":["/**\r\n * MCP Adapter for AG-UI Integration\r\n *\r\n * This adapter transforms MCP tools into formats compatible with AG-UI agents.\r\n * It provides tools with handlers for server-side execution and tool definitions\r\n * in JSON Schema format for passing to remote agents.\r\n *\r\n * @example\r\n * ```typescript\r\n * import { MultiSessionClient } from '@mcp-ts/sdk/server';\r\n * import { AguiAdapter } from '@mcp-ts/sdk/adapters/agui-adapter';\r\n * import { createMcpMiddleware } from '@mcp-ts/sdk/adapters/agui-middleware';\r\n * import { HttpAgent } from '@ag-ui/client';\r\n *\r\n * // Create MCP client\r\n * const mcpClient = new MultiSessionClient('user_123');\r\n * await mcpClient.connect();\r\n *\r\n * // Create adapter and get tools\r\n * const adapter = new AguiAdapter(mcpClient);\r\n * const tools = await adapter.getTools();\r\n *\r\n * // Use with AG-UI middleware\r\n * const agent = new HttpAgent({ url: 'http://localhost:8000/agent' });\r\n * agent.use(createMcpMiddleware({ tools }));\r\n * ```\r\n */\r\n\r\nimport { MCPClient } from '../server/mcp/oauth-client.js';\r\nimport { MultiSessionClient } from '../server/mcp/multi-session-client.js';\r\n\r\n/**\r\n * Cleans a JSON Schema by removing meta-properties that cause issues with\r\n * strict Pydantic validation (e.g., Google ADK).\r\n *\r\n * Removes: $schema, $id, $comment, $defs, definitions\r\n *\r\n * @param schema - The JSON Schema to clean\r\n * @returns Cleaned schema without meta-properties\r\n */\r\nexport function cleanSchema(schema: Record<string, any> | undefined): Record<string, any> {\r\n if (!schema) {\r\n return { type: 'object', properties: {} };\r\n }\r\n\r\n const cleaned = { ...schema };\r\n\r\n // Remove JSON Schema meta-properties that cause Pydantic validation errors\r\n delete cleaned.$schema;\r\n delete cleaned.$id;\r\n delete cleaned.$comment;\r\n delete cleaned.$defs;\r\n delete cleaned.definitions;\r\n\r\n // Recursively clean nested properties\r\n if (cleaned.properties && typeof cleaned.properties === 'object') {\r\n const cleanedProps: Record<string, any> = {};\r\n for (const [key, value] of Object.entries(cleaned.properties)) {\r\n if (typeof value === 'object' && value !== null) {\r\n cleanedProps[key] = cleanSchema(value as Record<string, any>);\r\n } else {\r\n cleanedProps[key] = value;\r\n }\r\n }\r\n cleaned.properties = cleanedProps;\r\n }\r\n\r\n // Clean items if it's an array schema\r\n if (cleaned.items && typeof cleaned.items === 'object') {\r\n cleaned.items = cleanSchema(cleaned.items);\r\n }\r\n\r\n // Clean additionalProperties if it's an object schema\r\n if (cleaned.additionalProperties && typeof cleaned.additionalProperties === 'object') {\r\n cleaned.additionalProperties = cleanSchema(cleaned.additionalProperties);\r\n }\r\n\r\n return cleaned;\r\n}\r\n\r\n/**\r\n * Configuration options for AguiAdapter\r\n */\r\nexport interface AguiAdapterOptions {\r\n /**\r\n * Prefix for tool names to avoid collision with other tools.\r\n * @default serverId or 'mcp'\r\n */\r\n prefix?: string;\r\n}\r\n\r\n/**\r\n * AG-UI Tool with handler for server-side execution.\r\n */\r\nexport interface AguiTool {\r\n name: string;\r\n description: string;\r\n parameters?: Record<string, any>;\r\n handler?: (args: any) => any | Promise<any>;\r\n}\r\n\r\n/**\r\n * Tool definition format for passing to remote agents (without handler).\r\n */\r\nexport interface AguiToolDefinition {\r\n name: string;\r\n description: string;\r\n parameters: Record<string, any>;\r\n}\r\n\r\n/**\r\n * Adapter that transforms MCP tools into AG-UI compatible formats.\r\n */\r\nexport class AguiAdapter {\r\n constructor(\r\n private client: MCPClient | MultiSessionClient,\r\n private options: AguiAdapterOptions = {}\r\n ) { }\r\n\r\n /**\r\n * Get tools with handlers for MCP tool execution.\r\n */\r\n async getTools(): Promise<AguiTool[]> {\r\n if (this.isMultiSession()) {\r\n const clients = (this.client as MultiSessionClient).getClients();\r\n const allTools: AguiTool[] = [];\r\n for (const client of clients) {\r\n allTools.push(...await this.transformTools(client));\r\n }\r\n return allTools;\r\n }\r\n return this.transformTools(this.client as MCPClient);\r\n }\r\n\r\n /**\r\n * Get tool definitions in JSON Schema format for passing to remote agents.\r\n */\r\n async getToolDefinitions(): Promise<AguiToolDefinition[]> {\r\n if (this.isMultiSession()) {\r\n const clients = (this.client as MultiSessionClient).getClients();\r\n const allTools: AguiToolDefinition[] = [];\r\n for (const client of clients) {\r\n allTools.push(...await this.transformToolDefinitions(client));\r\n }\r\n return allTools;\r\n }\r\n return this.transformToolDefinitions(this.client as MCPClient);\r\n }\r\n\r\n /**\r\n * Get tools as a function (for dynamic loading).\r\n */\r\n getToolsFunction(): () => Promise<AguiTool[]> {\r\n return () => this.getTools();\r\n }\r\n\r\n private isMultiSession(): boolean {\r\n return typeof (this.client as any).getClients === 'function';\r\n }\r\n\r\n private async transformTools(client: MCPClient): Promise<AguiTool[]> {\r\n if (!client.isConnected()) return [];\r\n\r\n const result = await client.listTools();\r\n const prefix = this.options.prefix ?? `tool_${client.getServerId() ?? 'mcp'}`;\r\n\r\n return result.tools.map(tool => ({\r\n name: `${prefix}_${tool.name}`,\r\n description: tool.description || `Execute ${tool.name}`,\r\n parameters: cleanSchema(tool.inputSchema),\r\n handler: async (args: any) => {\r\n console.log(`[AguiAdapter] Executing MCP tool: ${tool.name}`, args);\r\n const result = await client.callTool(tool.name, args);\r\n\r\n if (result.content && Array.isArray(result.content)) {\r\n const textContent = result.content\r\n .filter((c: any) => c.type === 'text')\r\n .map((c: any) => c.text)\r\n .join('\\n');\r\n return textContent || result;\r\n }\r\n return result;\r\n }\r\n }));\r\n }\r\n\r\n private async transformToolDefinitions(client: MCPClient): Promise<AguiToolDefinition[]> {\r\n if (!client.isConnected()) return [];\r\n\r\n const result = await client.listTools();\r\n const prefix = this.options.prefix ?? `tool_${client.getServerId() ?? 'mcp'}`;\r\n\r\n return result.tools.map(tool => ({\r\n name: `${prefix}_${tool.name}`,\r\n description: tool.description || `Execute ${tool.name}`,\r\n parameters: cleanSchema(tool.inputSchema),\r\n }));\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/adapters/agui-adapter.ts"],"names":[],"mappings":"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","file":"agui-adapter.mjs","sourcesContent":["/**\r\n * MCP Adapter for AG-UI Integration\r\n *\r\n * This adapter transforms MCP tools into formats compatible with AG-UI agents.\r\n * It provides tools with handlers for server-side execution and tool definitions\r\n * in JSON Schema format for passing to remote agents.\r\n *\r\n * @example\r\n * ```typescript\r\n * import { MultiSessionClient } from '@mcp-ts/sdk/server';\r\n * import { AguiAdapter } from '@mcp-ts/sdk/adapters/agui-adapter';\r\n * import { createMcpMiddleware } from '@mcp-ts/sdk/adapters/agui-middleware';\r\n * import { HttpAgent } from '@ag-ui/client';\r\n *\r\n * // Create MCP client\r\n * const mcpClient = new MultiSessionClient('user_123');\r\n * await mcpClient.connect();\r\n *\r\n * // Create adapter and get tools\r\n * const adapter = new AguiAdapter(mcpClient);\r\n * const tools = await adapter.getTools();\r\n *\r\n * // Use with AG-UI middleware\r\n * const agent = new HttpAgent({ url: 'http://localhost:8000/agent' });\r\n * agent.use(createMcpMiddleware({ tools }));\r\n * ```\r\n */\r\n\r\nimport { MCPClient } from '../server/mcp/oauth-client.js';\r\nimport { MultiSessionClient } from '../server/mcp/multi-session-client.js';\r\n\r\n/**\r\n * Extended JSON Schema properties that Pydantic's strict validation rejects.\r\n * These are valid JSON Schema extensions but not part of the core spec.\r\n */\r\nconst PYDANTIC_FORBIDDEN_PROPS = [\r\n // JSON Schema meta-properties\r\n '$schema', '$id', '$comment', '$defs', 'definitions',\r\n // Extended properties used by some MCP servers (e.g., Apify)\r\n 'prefill', 'examples', 'enumTitles', 'enumDescriptions',\r\n // Other common extensions\r\n 'deprecated', 'readOnly', 'writeOnly', 'contentMediaType', 'contentEncoding',\r\n];\r\n\r\n/**\r\n * Cleans a JSON Schema by removing meta-properties that cause issues with\r\n * strict Pydantic validation (e.g., Google ADK, LangGraph).\r\n *\r\n * @param schema - The JSON Schema to clean\r\n * @returns Cleaned schema without forbidden properties\r\n */\r\nexport function cleanSchema(schema: Record<string, any> | undefined): Record<string, any> {\r\n if (!schema) {\r\n return { type: 'object', properties: {} };\r\n }\r\n\r\n const cleaned = { ...schema };\r\n\r\n // Remove all forbidden properties\r\n for (const prop of PYDANTIC_FORBIDDEN_PROPS) {\r\n delete cleaned[prop];\r\n }\r\n\r\n // Recursively clean nested properties\r\n if (cleaned.properties && typeof cleaned.properties === 'object') {\r\n const cleanedProps: Record<string, any> = {};\r\n for (const [key, value] of Object.entries(cleaned.properties)) {\r\n if (typeof value === 'object' && value !== null) {\r\n cleanedProps[key] = cleanSchema(value as Record<string, any>);\r\n } else {\r\n cleanedProps[key] = value;\r\n }\r\n }\r\n cleaned.properties = cleanedProps;\r\n }\r\n\r\n // Clean items if it's an array schema\r\n if (cleaned.items && typeof cleaned.items === 'object') {\r\n cleaned.items = cleanSchema(cleaned.items);\r\n }\r\n\r\n // Clean additionalProperties if it's an object schema\r\n if (cleaned.additionalProperties && typeof cleaned.additionalProperties === 'object') {\r\n cleaned.additionalProperties = cleanSchema(cleaned.additionalProperties);\r\n }\r\n\r\n return cleaned;\r\n}\r\n\r\n/**\r\n * Configuration options for AguiAdapter\r\n */\r\nexport interface AguiAdapterOptions {\r\n /**\r\n * Prefix for tool names to avoid collision with other tools.\r\n * @default serverId or 'mcp'\r\n */\r\n prefix?: string;\r\n}\r\n\r\n/**\r\n * AG-UI Tool with handler for server-side execution.\r\n */\r\nexport interface AguiTool {\r\n name: string;\r\n description: string;\r\n parameters?: Record<string, any>;\r\n _meta?: Record<string, any>; // Add _meta to AguiTool\r\n handler?: (args: any) => any | Promise<any>;\r\n}\r\n\r\n/**\r\n * Tool definition format for passing to remote agents (without handler).\r\n */\r\nexport interface AguiToolDefinition {\r\n name: string;\r\n description: string;\r\n parameters: Record<string, any>;\r\n _meta?: Record<string, any>; // Add _meta to AguiToolDefinition\r\n}\r\n\r\n/**\r\n * Adapter that transforms MCP tools into AG-UI compatible formats.\r\n */\r\nexport class AguiAdapter {\r\n constructor(\r\n private client: MCPClient | MultiSessionClient,\r\n private options: AguiAdapterOptions = {}\r\n ) { }\r\n\r\n /**\r\n * Get tools with handlers for MCP tool execution.\r\n */\r\n async getTools(): Promise<AguiTool[]> {\r\n if (this.isMultiSession()) {\r\n const clients = (this.client as MultiSessionClient).getClients();\r\n const allTools: AguiTool[] = [];\r\n for (const client of clients) {\r\n allTools.push(...await this.transformTools(client));\r\n }\r\n return allTools;\r\n }\r\n return this.transformTools(this.client as MCPClient);\r\n }\r\n\r\n /**\r\n * Get tool definitions in JSON Schema format for passing to remote agents.\r\n */\r\n async getToolDefinitions(): Promise<AguiToolDefinition[]> {\r\n if (this.isMultiSession()) {\r\n const clients = (this.client as MultiSessionClient).getClients();\r\n const allTools: AguiToolDefinition[] = [];\r\n for (const client of clients) {\r\n allTools.push(...await this.transformToolDefinitions(client));\r\n }\r\n return allTools;\r\n }\r\n return this.transformToolDefinitions(this.client as MCPClient);\r\n }\r\n\r\n /**\r\n * Get tools as a function (for dynamic loading).\r\n */\r\n getToolsFunction(): () => Promise<AguiTool[]> {\r\n return () => this.getTools();\r\n }\r\n\r\n private isMultiSession(): boolean {\r\n return typeof (this.client as any).getClients === 'function';\r\n }\r\n\r\n private async transformTools(client: MCPClient): Promise<AguiTool[]> {\r\n if (!client.isConnected()) return [];\r\n\r\n const result = await client.listTools();\r\n const serverId = (typeof (client as any).getServerId === 'function'\r\n ? (client as any).getServerId()\r\n : undefined) as string | undefined;\r\n const normalizedPrefix = (this.options.prefix ?? serverId ?? 'mcp').replace(/-/g, '');\r\n const prefix = `tool_${normalizedPrefix}`;\r\n\r\n return result.tools.map(tool => {\r\n // Type assertion to access _meta if it exists on the tool object (it comes from MCP SDK)\r\n const mcpTool = tool as any;\r\n const mcpToolName = tool.name;\r\n return {\r\n name: `${prefix}_${tool.name}`,\r\n description: tool.description || `Execute ${tool.name}`,\r\n parameters: cleanSchema(tool.inputSchema),\r\n _meta: { ...mcpTool._meta, sessionId: (client as any).getSessionId?.() },\r\n handler: async (args: any) => {\r\n // Call the actual MCP tool\r\n const callResult = await (client as any).callTool(mcpToolName, args ?? {});\r\n\r\n // Return the raw result object so middleware can inspect `_meta` (e.g. for UI triggers)\r\n return callResult;\r\n }\r\n }\r\n });\r\n }\r\n\r\n private async transformToolDefinitions(client: MCPClient): Promise<AguiToolDefinition[]> {\r\n if (!client.isConnected()) return [];\r\n\r\n const result = await client.listTools();\r\n const serverId = (typeof (client as any).getServerId === 'function'\r\n ? (client as any).getServerId()\r\n : undefined) as string | undefined;\r\n const normalizedPrefix = (this.options.prefix ?? serverId ?? 'mcp').replace(/-/g, '');\r\n const prefix = `tool_${normalizedPrefix}`;\r\n\r\n return result.tools.map(tool => {\r\n const mcpTool = tool as any;\r\n return {\r\n name: `${prefix}_${tool.name}`,\r\n description: tool.description || `Execute ${tool.name}`,\r\n parameters: cleanSchema(tool.inputSchema),\r\n _meta: { ...mcpTool._meta, sessionId: (client as any).getSessionId?.() },\r\n };\r\n });\r\n }\r\n}\r\n"]}
|
|
@@ -2,8 +2,8 @@ import { Observable } from 'rxjs';
|
|
|
2
2
|
import { Middleware, RunAgentInput, AbstractAgent, BaseEvent } from '@ag-ui/client';
|
|
3
3
|
export { AbstractAgent, BaseEvent, EventType, Middleware, RunAgentInput, Tool, ToolCallEndEvent } from '@ag-ui/client';
|
|
4
4
|
import { AguiTool } from './agui-adapter.mjs';
|
|
5
|
-
import '../multi-session-client-
|
|
6
|
-
import '../events-
|
|
5
|
+
import '../multi-session-client-CxogNckF.mjs';
|
|
6
|
+
import '../events-BgeztGYZ.mjs';
|
|
7
7
|
import '@modelcontextprotocol/sdk/types.js';
|
|
8
8
|
import '@modelcontextprotocol/sdk/shared/auth.js';
|
|
9
9
|
import '@modelcontextprotocol/sdk/client/auth.js';
|
|
@@ -18,14 +18,27 @@ import '@modelcontextprotocol/sdk/client/auth.js';
|
|
|
18
18
|
* @requires rxjs - Uses RxJS Observables for event streaming
|
|
19
19
|
*/
|
|
20
20
|
|
|
21
|
+
/** New event type for MCP UI triggers */
|
|
22
|
+
declare const MCP_APP_UI_EVENT = "mcp-apps-ui";
|
|
23
|
+
/**
|
|
24
|
+
* MCP Apps UI trigger event.
|
|
25
|
+
*
|
|
26
|
+
* IMPORTANT: This must be emitted as an AG-UI CustomEvent so subscribers
|
|
27
|
+
* (e.g. CopilotKit `onCustomEvent`) can receive it.
|
|
28
|
+
*/
|
|
29
|
+
interface McpAppUiEventPayload {
|
|
30
|
+
toolCallId: string;
|
|
31
|
+
resourceUri: string;
|
|
32
|
+
sessionId?: string;
|
|
33
|
+
toolName: string;
|
|
34
|
+
result?: any;
|
|
35
|
+
}
|
|
21
36
|
/**
|
|
22
37
|
* Configuration for McpMiddleware
|
|
23
38
|
*/
|
|
24
39
|
interface McpMiddlewareConfig {
|
|
25
40
|
/** Pre-loaded tools with handlers (required) */
|
|
26
41
|
tools: AguiTool[];
|
|
27
|
-
/** Max result length in chars (default: 50000) */
|
|
28
|
-
maxResultLength?: number;
|
|
29
42
|
}
|
|
30
43
|
/**
|
|
31
44
|
* AG-UI Middleware that executes MCP tools server-side.
|
|
@@ -33,8 +46,12 @@ interface McpMiddlewareConfig {
|
|
|
33
46
|
declare class McpMiddleware extends Middleware {
|
|
34
47
|
private tools;
|
|
35
48
|
private toolSchemas;
|
|
36
|
-
private maxResultLength;
|
|
37
49
|
constructor(config: McpMiddlewareConfig);
|
|
50
|
+
/**
|
|
51
|
+
* Extract base tool name from prefixed format for event emission
|
|
52
|
+
* e.g., "tool_abc123_get-time" -> "get-time"
|
|
53
|
+
*/
|
|
54
|
+
private getBaseToolName;
|
|
38
55
|
private isMcpTool;
|
|
39
56
|
private parseArgs;
|
|
40
57
|
private executeTool;
|
|
@@ -44,7 +61,6 @@ declare class McpMiddleware extends Middleware {
|
|
|
44
61
|
private handleToolCallEvent;
|
|
45
62
|
/** Execute pending MCP tools and return results */
|
|
46
63
|
private executeTools;
|
|
47
|
-
/** Emit tool results (without RUN_FINISHED - that's emitted when truly done) */
|
|
48
64
|
private emitToolResults;
|
|
49
65
|
run(input: RunAgentInput, next: AbstractAgent): Observable<BaseEvent>;
|
|
50
66
|
}
|
|
@@ -53,7 +69,6 @@ declare class McpMiddleware extends Middleware {
|
|
|
53
69
|
*/
|
|
54
70
|
declare function createMcpMiddleware(options: {
|
|
55
71
|
tools: AguiTool[];
|
|
56
|
-
maxResultLength?: number;
|
|
57
72
|
}): (input: RunAgentInput, next: AbstractAgent) => Observable<BaseEvent>;
|
|
58
73
|
|
|
59
|
-
export { McpMiddleware, type McpMiddlewareConfig, McpMiddleware as McpToolExecutorMiddleware, createMcpMiddleware, createMcpMiddleware as createMcpToolMiddleware };
|
|
74
|
+
export { MCP_APP_UI_EVENT, type McpAppUiEventPayload, McpMiddleware, type McpMiddlewareConfig, McpMiddleware as McpToolExecutorMiddleware, createMcpMiddleware, createMcpMiddleware as createMcpToolMiddleware };
|