@lleverage-ai/agent-sdk 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (327) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +2321 -0
  3. package/dist/agent.d.ts +52 -0
  4. package/dist/agent.d.ts.map +1 -0
  5. package/dist/agent.js +2122 -0
  6. package/dist/agent.js.map +1 -0
  7. package/dist/backend.d.ts +378 -0
  8. package/dist/backend.d.ts.map +1 -0
  9. package/dist/backend.js +71 -0
  10. package/dist/backend.js.map +1 -0
  11. package/dist/backends/composite.d.ts +258 -0
  12. package/dist/backends/composite.d.ts.map +1 -0
  13. package/dist/backends/composite.js +437 -0
  14. package/dist/backends/composite.js.map +1 -0
  15. package/dist/backends/filesystem.d.ts +268 -0
  16. package/dist/backends/filesystem.d.ts.map +1 -0
  17. package/dist/backends/filesystem.js +623 -0
  18. package/dist/backends/filesystem.js.map +1 -0
  19. package/dist/backends/index.d.ts +14 -0
  20. package/dist/backends/index.d.ts.map +1 -0
  21. package/dist/backends/index.js +14 -0
  22. package/dist/backends/index.js.map +1 -0
  23. package/dist/backends/persistent.d.ts +312 -0
  24. package/dist/backends/persistent.d.ts.map +1 -0
  25. package/dist/backends/persistent.js +519 -0
  26. package/dist/backends/persistent.js.map +1 -0
  27. package/dist/backends/sandbox.d.ts +315 -0
  28. package/dist/backends/sandbox.d.ts.map +1 -0
  29. package/dist/backends/sandbox.js +490 -0
  30. package/dist/backends/sandbox.js.map +1 -0
  31. package/dist/backends/state.d.ts +225 -0
  32. package/dist/backends/state.d.ts.map +1 -0
  33. package/dist/backends/state.js +396 -0
  34. package/dist/backends/state.js.map +1 -0
  35. package/dist/checkpointer/file-saver.d.ts +182 -0
  36. package/dist/checkpointer/file-saver.d.ts.map +1 -0
  37. package/dist/checkpointer/file-saver.js +298 -0
  38. package/dist/checkpointer/file-saver.js.map +1 -0
  39. package/dist/checkpointer/index.d.ts +40 -0
  40. package/dist/checkpointer/index.d.ts.map +1 -0
  41. package/dist/checkpointer/index.js +40 -0
  42. package/dist/checkpointer/index.js.map +1 -0
  43. package/dist/checkpointer/kv-saver.d.ts +142 -0
  44. package/dist/checkpointer/kv-saver.d.ts.map +1 -0
  45. package/dist/checkpointer/kv-saver.js +176 -0
  46. package/dist/checkpointer/kv-saver.js.map +1 -0
  47. package/dist/checkpointer/memory-saver.d.ts +158 -0
  48. package/dist/checkpointer/memory-saver.d.ts.map +1 -0
  49. package/dist/checkpointer/memory-saver.js +222 -0
  50. package/dist/checkpointer/memory-saver.js.map +1 -0
  51. package/dist/checkpointer/types.d.ts +353 -0
  52. package/dist/checkpointer/types.d.ts.map +1 -0
  53. package/dist/checkpointer/types.js +159 -0
  54. package/dist/checkpointer/types.js.map +1 -0
  55. package/dist/context-manager.d.ts +627 -0
  56. package/dist/context-manager.d.ts.map +1 -0
  57. package/dist/context-manager.js +1039 -0
  58. package/dist/context-manager.js.map +1 -0
  59. package/dist/context.d.ts +57 -0
  60. package/dist/context.d.ts.map +1 -0
  61. package/dist/context.js +76 -0
  62. package/dist/context.js.map +1 -0
  63. package/dist/errors/index.d.ts +611 -0
  64. package/dist/errors/index.d.ts.map +1 -0
  65. package/dist/errors/index.js +1023 -0
  66. package/dist/errors/index.js.map +1 -0
  67. package/dist/generation-helpers.d.ts +126 -0
  68. package/dist/generation-helpers.d.ts.map +1 -0
  69. package/dist/generation-helpers.js +181 -0
  70. package/dist/generation-helpers.js.map +1 -0
  71. package/dist/hooks/audit.d.ts +210 -0
  72. package/dist/hooks/audit.d.ts.map +1 -0
  73. package/dist/hooks/audit.js +305 -0
  74. package/dist/hooks/audit.js.map +1 -0
  75. package/dist/hooks/cache.d.ts +180 -0
  76. package/dist/hooks/cache.d.ts.map +1 -0
  77. package/dist/hooks/cache.js +273 -0
  78. package/dist/hooks/cache.js.map +1 -0
  79. package/dist/hooks/guardrails.d.ts +145 -0
  80. package/dist/hooks/guardrails.d.ts.map +1 -0
  81. package/dist/hooks/guardrails.js +326 -0
  82. package/dist/hooks/guardrails.js.map +1 -0
  83. package/dist/hooks/index.d.ts +18 -0
  84. package/dist/hooks/index.d.ts.map +1 -0
  85. package/dist/hooks/index.js +32 -0
  86. package/dist/hooks/index.js.map +1 -0
  87. package/dist/hooks/logging.d.ts +193 -0
  88. package/dist/hooks/logging.d.ts.map +1 -0
  89. package/dist/hooks/logging.js +345 -0
  90. package/dist/hooks/logging.js.map +1 -0
  91. package/dist/hooks/parallel-guardrails.d.ts +268 -0
  92. package/dist/hooks/parallel-guardrails.d.ts.map +1 -0
  93. package/dist/hooks/parallel-guardrails.js +416 -0
  94. package/dist/hooks/parallel-guardrails.js.map +1 -0
  95. package/dist/hooks/rate-limit.d.ts +305 -0
  96. package/dist/hooks/rate-limit.d.ts.map +1 -0
  97. package/dist/hooks/rate-limit.js +372 -0
  98. package/dist/hooks/rate-limit.js.map +1 -0
  99. package/dist/hooks/retry.d.ts +144 -0
  100. package/dist/hooks/retry.d.ts.map +1 -0
  101. package/dist/hooks/retry.js +210 -0
  102. package/dist/hooks/retry.js.map +1 -0
  103. package/dist/hooks/secrets.d.ts +174 -0
  104. package/dist/hooks/secrets.d.ts.map +1 -0
  105. package/dist/hooks/secrets.js +306 -0
  106. package/dist/hooks/secrets.js.map +1 -0
  107. package/dist/hooks.d.ts +229 -0
  108. package/dist/hooks.d.ts.map +1 -0
  109. package/dist/hooks.js +352 -0
  110. package/dist/hooks.js.map +1 -0
  111. package/dist/index.d.ts +97 -0
  112. package/dist/index.d.ts.map +1 -0
  113. package/dist/index.js +182 -0
  114. package/dist/index.js.map +1 -0
  115. package/dist/mcp/env.d.ts +25 -0
  116. package/dist/mcp/env.d.ts.map +1 -0
  117. package/dist/mcp/env.js +18 -0
  118. package/dist/mcp/env.js.map +1 -0
  119. package/dist/mcp/index.d.ts +16 -0
  120. package/dist/mcp/index.d.ts.map +1 -0
  121. package/dist/mcp/index.js +17 -0
  122. package/dist/mcp/index.js.map +1 -0
  123. package/dist/mcp/manager.d.ts +184 -0
  124. package/dist/mcp/manager.d.ts.map +1 -0
  125. package/dist/mcp/manager.js +446 -0
  126. package/dist/mcp/manager.js.map +1 -0
  127. package/dist/mcp/types.d.ts +58 -0
  128. package/dist/mcp/types.d.ts.map +1 -0
  129. package/dist/mcp/types.js +7 -0
  130. package/dist/mcp/types.js.map +1 -0
  131. package/dist/mcp/validation.d.ts +119 -0
  132. package/dist/mcp/validation.d.ts.map +1 -0
  133. package/dist/mcp/validation.js +407 -0
  134. package/dist/mcp/validation.js.map +1 -0
  135. package/dist/mcp/virtual-server.d.ts +78 -0
  136. package/dist/mcp/virtual-server.d.ts.map +1 -0
  137. package/dist/mcp/virtual-server.js +137 -0
  138. package/dist/mcp/virtual-server.js.map +1 -0
  139. package/dist/memory/filesystem-store.d.ts +217 -0
  140. package/dist/memory/filesystem-store.d.ts.map +1 -0
  141. package/dist/memory/filesystem-store.js +343 -0
  142. package/dist/memory/filesystem-store.js.map +1 -0
  143. package/dist/memory/index.d.ts +46 -0
  144. package/dist/memory/index.d.ts.map +1 -0
  145. package/dist/memory/index.js +46 -0
  146. package/dist/memory/index.js.map +1 -0
  147. package/dist/memory/loader.d.ts +396 -0
  148. package/dist/memory/loader.d.ts.map +1 -0
  149. package/dist/memory/loader.js +419 -0
  150. package/dist/memory/loader.js.map +1 -0
  151. package/dist/memory/permissions.d.ts +282 -0
  152. package/dist/memory/permissions.d.ts.map +1 -0
  153. package/dist/memory/permissions.js +297 -0
  154. package/dist/memory/permissions.js.map +1 -0
  155. package/dist/memory/rules.d.ts +249 -0
  156. package/dist/memory/rules.d.ts.map +1 -0
  157. package/dist/memory/rules.js +362 -0
  158. package/dist/memory/rules.js.map +1 -0
  159. package/dist/memory/store.d.ts +286 -0
  160. package/dist/memory/store.d.ts.map +1 -0
  161. package/dist/memory/store.js +263 -0
  162. package/dist/memory/store.js.map +1 -0
  163. package/dist/middleware/apply.d.ts +73 -0
  164. package/dist/middleware/apply.d.ts.map +1 -0
  165. package/dist/middleware/apply.js +219 -0
  166. package/dist/middleware/apply.js.map +1 -0
  167. package/dist/middleware/context.d.ts +33 -0
  168. package/dist/middleware/context.d.ts.map +1 -0
  169. package/dist/middleware/context.js +176 -0
  170. package/dist/middleware/context.js.map +1 -0
  171. package/dist/middleware/index.d.ts +31 -0
  172. package/dist/middleware/index.d.ts.map +1 -0
  173. package/dist/middleware/index.js +32 -0
  174. package/dist/middleware/index.js.map +1 -0
  175. package/dist/middleware/logging.d.ts +137 -0
  176. package/dist/middleware/logging.d.ts.map +1 -0
  177. package/dist/middleware/logging.js +374 -0
  178. package/dist/middleware/logging.js.map +1 -0
  179. package/dist/middleware/types.d.ts +183 -0
  180. package/dist/middleware/types.d.ts.map +1 -0
  181. package/dist/middleware/types.js +11 -0
  182. package/dist/middleware/types.js.map +1 -0
  183. package/dist/observability/events.d.ts +183 -0
  184. package/dist/observability/events.d.ts.map +1 -0
  185. package/dist/observability/events.js +305 -0
  186. package/dist/observability/events.js.map +1 -0
  187. package/dist/observability/index.d.ts +55 -0
  188. package/dist/observability/index.d.ts.map +1 -0
  189. package/dist/observability/index.js +87 -0
  190. package/dist/observability/index.js.map +1 -0
  191. package/dist/observability/logger.d.ts +318 -0
  192. package/dist/observability/logger.d.ts.map +1 -0
  193. package/dist/observability/logger.js +436 -0
  194. package/dist/observability/logger.js.map +1 -0
  195. package/dist/observability/metrics.d.ts +341 -0
  196. package/dist/observability/metrics.d.ts.map +1 -0
  197. package/dist/observability/metrics.js +490 -0
  198. package/dist/observability/metrics.js.map +1 -0
  199. package/dist/observability/preset.d.ts +161 -0
  200. package/dist/observability/preset.d.ts.map +1 -0
  201. package/dist/observability/preset.js +133 -0
  202. package/dist/observability/preset.js.map +1 -0
  203. package/dist/observability/streaming.d.ts +113 -0
  204. package/dist/observability/streaming.d.ts.map +1 -0
  205. package/dist/observability/streaming.js +114 -0
  206. package/dist/observability/streaming.js.map +1 -0
  207. package/dist/observability/tracing.d.ts +378 -0
  208. package/dist/observability/tracing.d.ts.map +1 -0
  209. package/dist/observability/tracing.js +539 -0
  210. package/dist/observability/tracing.js.map +1 -0
  211. package/dist/plugins.d.ts +55 -0
  212. package/dist/plugins.d.ts.map +1 -0
  213. package/dist/plugins.js +63 -0
  214. package/dist/plugins.js.map +1 -0
  215. package/dist/presets/index.d.ts +7 -0
  216. package/dist/presets/index.d.ts.map +1 -0
  217. package/dist/presets/index.js +7 -0
  218. package/dist/presets/index.js.map +1 -0
  219. package/dist/presets/production.d.ts +262 -0
  220. package/dist/presets/production.d.ts.map +1 -0
  221. package/dist/presets/production.js +295 -0
  222. package/dist/presets/production.js.map +1 -0
  223. package/dist/security/index.d.ts +179 -0
  224. package/dist/security/index.d.ts.map +1 -0
  225. package/dist/security/index.js +323 -0
  226. package/dist/security/index.js.map +1 -0
  227. package/dist/subagents/advanced.d.ts +413 -0
  228. package/dist/subagents/advanced.d.ts.map +1 -0
  229. package/dist/subagents/advanced.js +396 -0
  230. package/dist/subagents/advanced.js.map +1 -0
  231. package/dist/subagents/index.d.ts +14 -0
  232. package/dist/subagents/index.d.ts.map +1 -0
  233. package/dist/subagents/index.js +15 -0
  234. package/dist/subagents/index.js.map +1 -0
  235. package/dist/subagents.d.ts +73 -0
  236. package/dist/subagents.d.ts.map +1 -0
  237. package/dist/subagents.js +213 -0
  238. package/dist/subagents.js.map +1 -0
  239. package/dist/task-store/file-store.d.ts +76 -0
  240. package/dist/task-store/file-store.d.ts.map +1 -0
  241. package/dist/task-store/file-store.js +190 -0
  242. package/dist/task-store/file-store.js.map +1 -0
  243. package/dist/task-store/index.d.ts +11 -0
  244. package/dist/task-store/index.d.ts.map +1 -0
  245. package/dist/task-store/index.js +10 -0
  246. package/dist/task-store/index.js.map +1 -0
  247. package/dist/task-store/kv-store.d.ts +140 -0
  248. package/dist/task-store/kv-store.d.ts.map +1 -0
  249. package/dist/task-store/kv-store.js +169 -0
  250. package/dist/task-store/kv-store.js.map +1 -0
  251. package/dist/task-store/memory-store.d.ts +66 -0
  252. package/dist/task-store/memory-store.d.ts.map +1 -0
  253. package/dist/task-store/memory-store.js +125 -0
  254. package/dist/task-store/memory-store.js.map +1 -0
  255. package/dist/task-store/types.d.ts +235 -0
  256. package/dist/task-store/types.d.ts.map +1 -0
  257. package/dist/task-store/types.js +110 -0
  258. package/dist/task-store/types.js.map +1 -0
  259. package/dist/testing/assertions.d.ts +401 -0
  260. package/dist/testing/assertions.d.ts.map +1 -0
  261. package/dist/testing/assertions.js +630 -0
  262. package/dist/testing/assertions.js.map +1 -0
  263. package/dist/testing/index.d.ts +343 -0
  264. package/dist/testing/index.d.ts.map +1 -0
  265. package/dist/testing/index.js +360 -0
  266. package/dist/testing/index.js.map +1 -0
  267. package/dist/testing/mock-agent.d.ts +214 -0
  268. package/dist/testing/mock-agent.d.ts.map +1 -0
  269. package/dist/testing/mock-agent.js +448 -0
  270. package/dist/testing/mock-agent.js.map +1 -0
  271. package/dist/testing/recorder.d.ts +288 -0
  272. package/dist/testing/recorder.d.ts.map +1 -0
  273. package/dist/testing/recorder.js +499 -0
  274. package/dist/testing/recorder.js.map +1 -0
  275. package/dist/tools/execute.d.ts +104 -0
  276. package/dist/tools/execute.d.ts.map +1 -0
  277. package/dist/tools/execute.js +191 -0
  278. package/dist/tools/execute.js.map +1 -0
  279. package/dist/tools/factory.d.ts +260 -0
  280. package/dist/tools/factory.d.ts.map +1 -0
  281. package/dist/tools/factory.js +241 -0
  282. package/dist/tools/factory.js.map +1 -0
  283. package/dist/tools/filesystem.d.ts +215 -0
  284. package/dist/tools/filesystem.d.ts.map +1 -0
  285. package/dist/tools/filesystem.js +311 -0
  286. package/dist/tools/filesystem.js.map +1 -0
  287. package/dist/tools/index.d.ts +33 -0
  288. package/dist/tools/index.d.ts.map +1 -0
  289. package/dist/tools/index.js +33 -0
  290. package/dist/tools/index.js.map +1 -0
  291. package/dist/tools/search.d.ts +59 -0
  292. package/dist/tools/search.d.ts.map +1 -0
  293. package/dist/tools/search.js +94 -0
  294. package/dist/tools/search.js.map +1 -0
  295. package/dist/tools/skills.d.ts +354 -0
  296. package/dist/tools/skills.d.ts.map +1 -0
  297. package/dist/tools/skills.js +413 -0
  298. package/dist/tools/skills.js.map +1 -0
  299. package/dist/tools/task.d.ts +272 -0
  300. package/dist/tools/task.d.ts.map +1 -0
  301. package/dist/tools/task.js +521 -0
  302. package/dist/tools/task.js.map +1 -0
  303. package/dist/tools/todos.d.ts +131 -0
  304. package/dist/tools/todos.d.ts.map +1 -0
  305. package/dist/tools/todos.js +120 -0
  306. package/dist/tools/todos.js.map +1 -0
  307. package/dist/tools/tool-registry.d.ts +424 -0
  308. package/dist/tools/tool-registry.d.ts.map +1 -0
  309. package/dist/tools/tool-registry.js +607 -0
  310. package/dist/tools/tool-registry.js.map +1 -0
  311. package/dist/tools/user-interaction.d.ts +116 -0
  312. package/dist/tools/user-interaction.d.ts.map +1 -0
  313. package/dist/tools/user-interaction.js +147 -0
  314. package/dist/tools/user-interaction.js.map +1 -0
  315. package/dist/tools/utils.d.ts +124 -0
  316. package/dist/tools/utils.d.ts.map +1 -0
  317. package/dist/tools/utils.js +189 -0
  318. package/dist/tools/utils.js.map +1 -0
  319. package/dist/tools.d.ts +74 -0
  320. package/dist/tools.d.ts.map +1 -0
  321. package/dist/tools.js +73 -0
  322. package/dist/tools.js.map +1 -0
  323. package/dist/types.d.ts +2421 -0
  324. package/dist/types.d.ts.map +1 -0
  325. package/dist/types.js +55 -0
  326. package/dist/types.js.map +1 -0
  327. package/package.json +81 -0
@@ -0,0 +1,446 @@
1
+ /**
2
+ * MCP Manager for unified tool management.
3
+ *
4
+ * Handles both inline plugin tools (via VirtualMCPServer) and
5
+ * external MCP servers (via official SDK).
6
+ *
7
+ * @packageDocumentation
8
+ */
9
+ import { Client } from "@modelcontextprotocol/sdk/client/index.js";
10
+ import { SSEClientTransport } from "@modelcontextprotocol/sdk/client/sse.js";
11
+ import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";
12
+ import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
13
+ import { tool } from "ai";
14
+ import { expandEnvVars } from "./env.js";
15
+ import { isSchemaEmpty, jsonSchemaToZod, MCPInputValidator } from "./validation.js";
16
+ import { VirtualMCPServer } from "./virtual-server.js";
17
+ /**
18
+ * Manages MCP tool registration, discovery, and execution.
19
+ *
20
+ * Provides a unified interface for tools from:
21
+ * - Inline plugin definitions (wrapped as virtual MCP servers)
22
+ * - External MCP servers (stdio, http, sse)
23
+ *
24
+ * @example
25
+ * ```typescript
26
+ * const manager = new MCPManager();
27
+ *
28
+ * // Register inline plugin tools
29
+ * manager.registerPluginTools("my-plugin", { myTool: tool(...) });
30
+ *
31
+ * // Connect to external MCP server
32
+ * await manager.connectServer("github", {
33
+ * type: "stdio",
34
+ * command: "npx",
35
+ * args: ["-y", "@modelcontextprotocol/server-github"],
36
+ * env: { GITHUB_TOKEN: "${GITHUB_TOKEN}" },
37
+ * });
38
+ *
39
+ * // Search and use tools
40
+ * const tools = manager.searchTools("github issues");
41
+ * const toolSet = manager.getToolSet();
42
+ * ```
43
+ *
44
+ * @category MCP
45
+ */
46
+ export class MCPManager {
47
+ /** Virtual servers for inline plugin tools */
48
+ virtualServers = new Map();
49
+ /** Connected external MCP clients */
50
+ externalClients = new Map();
51
+ /** Cached tool metadata for search */
52
+ toolMetadataCache = [];
53
+ /** Whether cache needs refresh */
54
+ cacheInvalid = true;
55
+ /** Set of tools that are loaded and available for use */
56
+ loadedTools = new Set();
57
+ /** Track which servers have auto-load enabled */
58
+ autoLoadServers = new Set();
59
+ /** Connection failure callback */
60
+ onConnectionFailed;
61
+ /** Connection restored callback */
62
+ onConnectionRestored;
63
+ /** Input validator for MCP tools */
64
+ validator = new MCPInputValidator();
65
+ /**
66
+ * Creates a new MCP manager.
67
+ *
68
+ * @param options - Configuration options including hook callbacks
69
+ */
70
+ constructor(options = {}) {
71
+ this.onConnectionFailed = options.onConnectionFailed;
72
+ this.onConnectionRestored = options.onConnectionRestored;
73
+ }
74
+ /**
75
+ * Connect to an external MCP server.
76
+ *
77
+ * @param name - Unique name for this server (used in tool naming)
78
+ * @param config - Server connection configuration
79
+ * @throws If server with same name is already connected
80
+ *
81
+ * @example
82
+ * ```typescript
83
+ * // Connect to stdio server
84
+ * await manager.connectServer("github", {
85
+ * type: "stdio",
86
+ * command: "npx",
87
+ * args: ["-y", "@modelcontextprotocol/server-github"],
88
+ * env: { GITHUB_TOKEN: "${GITHUB_TOKEN}" },
89
+ * });
90
+ *
91
+ * // Connect to HTTP server
92
+ * await manager.connectServer("docs", {
93
+ * type: "http",
94
+ * url: "https://docs.example.com/mcp",
95
+ * headers: { Authorization: "Bearer ${API_TOKEN}" },
96
+ * });
97
+ * ```
98
+ */
99
+ async connectServer(name, config) {
100
+ // Check for duplicate
101
+ if (this.externalClients.has(name) || this.virtualServers.has(name)) {
102
+ throw new Error(`Server '${name}' is already connected`);
103
+ }
104
+ try {
105
+ // Create transport based on config type
106
+ const transport = this.createTransport(config);
107
+ // Create and connect client
108
+ const client = new Client({
109
+ name: `agent-sdk-${name}`,
110
+ version: "1.0.0",
111
+ });
112
+ await client.connect(transport);
113
+ // Fetch available tools
114
+ const { tools: serverTools } = await client.listTools();
115
+ // Convert to MCPToolMetadata and apply security filters
116
+ const sourceType = config.type;
117
+ const allowedToolsSet = config.allowedTools ? new Set(config.allowedTools) : null;
118
+ const tools = [];
119
+ for (const t of serverTools) {
120
+ // Apply allowlist filter
121
+ if (allowedToolsSet && !allowedToolsSet.has(t.name)) {
122
+ continue; // Skip tools not in allowlist
123
+ }
124
+ const schema = t.inputSchema ?? {
125
+ type: "object",
126
+ properties: {},
127
+ };
128
+ // Apply requireSchema filter
129
+ if (config.requireSchema && isSchemaEmpty(schema)) {
130
+ continue; // Skip tools without meaningful schema
131
+ }
132
+ const mcpName = `mcp__${name}__${t.name}`;
133
+ tools.push({
134
+ name: mcpName,
135
+ description: t.description ?? "",
136
+ inputSchema: schema,
137
+ source: name,
138
+ sourceType,
139
+ });
140
+ // Register schema for validation if enabled
141
+ if (config.validateInputs) {
142
+ this.validator.registerSchema(mcpName, schema);
143
+ }
144
+ }
145
+ // Store client and metadata
146
+ this.externalClients.set(name, { client, sourceType, tools, config });
147
+ this.cacheInvalid = true;
148
+ // Auto-load external server tools (they're always available once connected)
149
+ for (const t of tools) {
150
+ this.loadedTools.add(t.name);
151
+ }
152
+ // Emit connection restored event (for reconnections)
153
+ await this.onConnectionRestored?.({
154
+ server_name: name,
155
+ tool_count: tools.length,
156
+ });
157
+ }
158
+ catch (error) {
159
+ // Emit connection failed event
160
+ await this.onConnectionFailed?.({
161
+ server_name: name,
162
+ config,
163
+ error: error,
164
+ });
165
+ // Re-throw the error
166
+ throw error;
167
+ }
168
+ }
169
+ /**
170
+ * Create transport for MCP connection.
171
+ * @internal
172
+ */
173
+ createTransport(config) {
174
+ switch (config.type) {
175
+ case "stdio": {
176
+ const stdioConfig = config;
177
+ return new StdioClientTransport({
178
+ command: stdioConfig.command,
179
+ args: stdioConfig.args,
180
+ env: stdioConfig.env ? expandEnvVars(stdioConfig.env) : undefined,
181
+ });
182
+ }
183
+ case "http": {
184
+ const httpConfig = config;
185
+ const url = new URL(expandEnvVars(httpConfig.url));
186
+ return new StreamableHTTPClientTransport(url, {
187
+ requestInit: httpConfig.headers
188
+ ? { headers: expandEnvVars(httpConfig.headers) }
189
+ : undefined,
190
+ });
191
+ }
192
+ case "sse": {
193
+ const sseConfig = config;
194
+ const url = new URL(expandEnvVars(sseConfig.url));
195
+ return new SSEClientTransport(url, {
196
+ requestInit: sseConfig.headers
197
+ ? { headers: expandEnvVars(sseConfig.headers) }
198
+ : undefined,
199
+ });
200
+ }
201
+ default:
202
+ throw new Error(`Unknown MCP server type: ${config.type}`);
203
+ }
204
+ }
205
+ /**
206
+ * Register inline plugin tools as a virtual MCP server.
207
+ *
208
+ * Tools will be exposed with naming pattern `mcp__<pluginName>__<toolName>`.
209
+ *
210
+ * @param pluginName - Plugin/server name
211
+ * @param tools - AI SDK tools to register
212
+ * @param options - Registration options
213
+ */
214
+ registerPluginTools(pluginName, tools, options = {}) {
215
+ const { autoLoad = true } = options;
216
+ const server = new VirtualMCPServer(pluginName, tools);
217
+ this.virtualServers.set(pluginName, server);
218
+ this.cacheInvalid = true;
219
+ // Track auto-load setting and mark tools as loaded if auto-load is enabled
220
+ if (autoLoad) {
221
+ this.autoLoadServers.add(pluginName);
222
+ // Mark all tools from this server as loaded
223
+ const serverTools = server.getToolSet();
224
+ for (const name of Object.keys(serverTools)) {
225
+ this.loadedTools.add(name);
226
+ }
227
+ }
228
+ }
229
+ /**
230
+ * List all available tools from all sources.
231
+ *
232
+ * @returns Array of tool metadata
233
+ */
234
+ listTools() {
235
+ this.refreshCacheIfNeeded();
236
+ return [...this.toolMetadataCache];
237
+ }
238
+ /**
239
+ * Search tools by query string.
240
+ *
241
+ * Matches against tool name and description (case-insensitive).
242
+ *
243
+ * @param query - Search query
244
+ * @param limit - Maximum results to return
245
+ * @returns Matching tool metadata
246
+ */
247
+ searchTools(query, limit = 10) {
248
+ this.refreshCacheIfNeeded();
249
+ if (!query) {
250
+ return this.toolMetadataCache.slice(0, limit);
251
+ }
252
+ const lowerQuery = query.toLowerCase();
253
+ const matches = this.toolMetadataCache.filter((tool) => tool.name.toLowerCase().includes(lowerQuery) ||
254
+ tool.description.toLowerCase().includes(lowerQuery));
255
+ return matches.slice(0, limit);
256
+ }
257
+ /**
258
+ * Get AI SDK compatible ToolSet.
259
+ *
260
+ * Only returns tools that have been loaded (either via autoLoad or explicit loadTools call).
261
+ *
262
+ * @param filter - Optional list of tool names to include
263
+ * @returns ToolSet with MCP-named tools
264
+ */
265
+ getToolSet(filter) {
266
+ const toolSet = {};
267
+ const filterSet = filter ? new Set(filter) : null;
268
+ // Include virtual server tools (only if loaded)
269
+ for (const server of this.virtualServers.values()) {
270
+ const serverTools = server.getToolSet();
271
+ for (const [name, t] of Object.entries(serverTools)) {
272
+ // Only include if loaded and passes filter
273
+ if (this.loadedTools.has(name)) {
274
+ if (!filterSet || filterSet.has(name)) {
275
+ toolSet[name] = t;
276
+ }
277
+ }
278
+ }
279
+ }
280
+ // Include external server tools (only if loaded)
281
+ for (const [serverName, { tools }] of this.externalClients) {
282
+ for (const metadata of tools) {
283
+ if (this.loadedTools.has(metadata.name)) {
284
+ if (!filterSet || filterSet.has(metadata.name)) {
285
+ toolSet[metadata.name] = this.createExternalTool(serverName, metadata);
286
+ }
287
+ }
288
+ }
289
+ }
290
+ return toolSet;
291
+ }
292
+ /**
293
+ * Extract text result from MCP tool response.
294
+ * @internal
295
+ */
296
+ extractTextResult(result) {
297
+ if (result && typeof result === "object" && "content" in result) {
298
+ const content = result.content;
299
+ if (Array.isArray(content)) {
300
+ const textContent = content.find((c) => c.type === "text");
301
+ if (textContent && "text" in textContent) {
302
+ return textContent.text;
303
+ }
304
+ }
305
+ }
306
+ return typeof result === "object" ? JSON.stringify(result) : result;
307
+ }
308
+ /**
309
+ * Create an AI SDK tool for an external MCP tool.
310
+ * @internal
311
+ */
312
+ createExternalTool(serverName, metadata) {
313
+ const originalName = metadata.name.replace(`mcp__${serverName}__`, "");
314
+ // Convert JSON Schema to Zod schema for tighter model-facing validation
315
+ // This gives the AI model better constraints about what inputs are valid
316
+ const conversionResult = jsonSchemaToZod(metadata.inputSchema);
317
+ const inputSchema = conversionResult.schema;
318
+ return tool({
319
+ description: metadata.description,
320
+ inputSchema,
321
+ execute: async (args) => {
322
+ const connected = this.externalClients.get(serverName);
323
+ if (!connected) {
324
+ throw new Error(`Server '${serverName}' is not connected`);
325
+ }
326
+ // Validate inputs if enabled for this server (belt-and-suspenders with Zod)
327
+ if (connected.config.validateInputs) {
328
+ this.validator.validate(metadata.name, args);
329
+ }
330
+ const result = await connected.client.callTool({
331
+ name: originalName,
332
+ arguments: args,
333
+ });
334
+ return this.extractTextResult(result);
335
+ },
336
+ });
337
+ }
338
+ /**
339
+ * Call a tool by its MCP name.
340
+ *
341
+ * @param mcpName - Full MCP tool name (mcp__<source>__<tool>)
342
+ * @param args - Tool arguments
343
+ * @returns Tool execution result
344
+ */
345
+ async callTool(mcpName, args) {
346
+ // Parse MCP name: mcp__<source>__<tool>
347
+ const parts = mcpName.split("__");
348
+ if (parts.length < 3 || parts[0] !== "mcp") {
349
+ throw new Error(`Invalid MCP tool name format: ${mcpName}`);
350
+ }
351
+ // Try to find a matching server
352
+ // Start by assuming the tool name is just the last part
353
+ for (let i = parts.length - 1; i >= 2; i--) {
354
+ const sourceName = parts.slice(1, i).join("__");
355
+ const toolName = parts.slice(i).join("__");
356
+ // Check virtual servers first
357
+ const virtualServer = this.virtualServers.get(sourceName);
358
+ if (virtualServer?.hasTool(toolName)) {
359
+ return virtualServer.callTool(toolName, args);
360
+ }
361
+ // Check external clients
362
+ const externalClient = this.externalClients.get(sourceName);
363
+ if (externalClient) {
364
+ const hasMatchingTool = externalClient.tools.some((t) => t.name === mcpName);
365
+ if (hasMatchingTool) {
366
+ // Validate inputs if enabled for this server
367
+ if (externalClient.config.validateInputs) {
368
+ this.validator.validate(mcpName, args);
369
+ }
370
+ const result = await externalClient.client.callTool({
371
+ name: toolName,
372
+ arguments: args,
373
+ });
374
+ return this.extractTextResult(result);
375
+ }
376
+ }
377
+ }
378
+ throw new Error(`Tool not found: ${mcpName}`);
379
+ }
380
+ /**
381
+ * Load specific tools by name, making them available via getToolSet().
382
+ *
383
+ * @param toolNames - MCP tool names to load
384
+ * @returns Load result with loaded/alreadyLoaded/notFound lists
385
+ */
386
+ loadTools(toolNames) {
387
+ this.refreshCacheIfNeeded();
388
+ const loaded = [];
389
+ const alreadyLoaded = [];
390
+ const notFound = [];
391
+ for (const name of toolNames) {
392
+ const metadata = this.toolMetadataCache.find((t) => t.name === name);
393
+ if (metadata) {
394
+ if (this.loadedTools.has(name)) {
395
+ alreadyLoaded.push(name);
396
+ }
397
+ else {
398
+ this.loadedTools.add(name);
399
+ loaded.push(name);
400
+ }
401
+ }
402
+ else {
403
+ notFound.push(name);
404
+ }
405
+ }
406
+ return { loaded, alreadyLoaded, notFound };
407
+ }
408
+ /**
409
+ * Disconnect all external MCP servers.
410
+ */
411
+ async disconnect() {
412
+ // Close external clients
413
+ for (const { client } of this.externalClients.values()) {
414
+ try {
415
+ await client.close();
416
+ }
417
+ catch {
418
+ // Ignore close errors
419
+ }
420
+ }
421
+ this.externalClients.clear();
422
+ // Clear virtual servers
423
+ this.virtualServers.clear();
424
+ this.cacheInvalid = true;
425
+ // Clear all validators
426
+ this.validator.clear();
427
+ }
428
+ /**
429
+ * Refresh metadata cache if invalid.
430
+ */
431
+ refreshCacheIfNeeded() {
432
+ if (!this.cacheInvalid)
433
+ return;
434
+ this.toolMetadataCache = [];
435
+ // Add virtual server tools
436
+ for (const server of this.virtualServers.values()) {
437
+ this.toolMetadataCache.push(...server.getToolMetadata());
438
+ }
439
+ // Add external server tools
440
+ for (const { tools } of this.externalClients.values()) {
441
+ this.toolMetadataCache.push(...tools);
442
+ }
443
+ this.cacheInvalid = false;
444
+ }
445
+ }
446
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/mcp/manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * MCP-specific type definitions.
3
+ *
4
+ * @packageDocumentation
5
+ */
6
+ import type { JSONSchema7 } from "json-schema";
7
+ /**
8
+ * Source type for MCP tools.
9
+ *
10
+ * - `inline` - Tool defined in plugin code (virtual MCP server)
11
+ * - `stdio` - Tool from stdio-based MCP server
12
+ * - `http` - Tool from HTTP-based MCP server
13
+ * - `sse` - Tool from SSE-based MCP server
14
+ *
15
+ * @category MCP
16
+ */
17
+ export type MCPToolSource = "inline" | "stdio" | "http" | "sse";
18
+ /**
19
+ * Metadata for an MCP tool.
20
+ *
21
+ * Used for tool discovery and search without loading full tool definition.
22
+ *
23
+ * @category MCP
24
+ */
25
+ export interface MCPToolMetadata {
26
+ /**
27
+ * Full MCP tool name.
28
+ * Format: `mcp__<source>__<tool-name>`
29
+ */
30
+ name: string;
31
+ /** Human-readable description of what the tool does */
32
+ description: string;
33
+ /** JSON Schema for the tool's input parameters */
34
+ inputSchema: JSONSchema7;
35
+ /** Plugin or server name this tool comes from */
36
+ source: string;
37
+ /** How this tool is provided */
38
+ sourceType: MCPToolSource;
39
+ }
40
+ /**
41
+ * Result from loading MCP tools.
42
+ *
43
+ * @category MCP
44
+ */
45
+ export interface MCPToolLoadResult {
46
+ /** Tools that were successfully loaded */
47
+ loaded: string[];
48
+ /** Tools that were already loaded (skipped) */
49
+ alreadyLoaded: string[];
50
+ /** Tools that could not be found */
51
+ notFound: string[];
52
+ /** Any errors that occurred during loading */
53
+ errors?: Array<{
54
+ tool: string;
55
+ error: Error;
56
+ }>;
57
+ }
58
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/mcp/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C;;;;;;;;;GASG;AACH,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,KAAK,CAAC;AAEhE;;;;;;GAMG;AACH,MAAM,WAAW,eAAe;IAC9B;;;OAGG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb,uDAAuD;IACvD,WAAW,EAAE,MAAM,CAAC;IAEpB,kDAAkD;IAClD,WAAW,EAAE,WAAW,CAAC;IAEzB,iDAAiD;IACjD,MAAM,EAAE,MAAM,CAAC;IAEf,gCAAgC;IAChC,UAAU,EAAE,aAAa,CAAC;CAC3B;AAED;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IAChC,0CAA0C;IAC1C,MAAM,EAAE,MAAM,EAAE,CAAC;IAEjB,+CAA+C;IAC/C,aAAa,EAAE,MAAM,EAAE,CAAC;IAExB,oCAAoC;IACpC,QAAQ,EAAE,MAAM,EAAE,CAAC;IAEnB,8CAA8C;IAC9C,MAAM,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,KAAK,CAAA;KAAE,CAAC,CAAC;CAChD"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * MCP-specific type definitions.
3
+ *
4
+ * @packageDocumentation
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/mcp/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
@@ -0,0 +1,119 @@
1
+ /**
2
+ * Input validation utilities for MCP tools.
3
+ *
4
+ * @packageDocumentation
5
+ */
6
+ import type { JSONSchema7 } from "json-schema";
7
+ import { z } from "zod";
8
+ /**
9
+ * Validation error thrown when MCP tool input validation fails.
10
+ *
11
+ * @category MCP
12
+ */
13
+ export declare class MCPInputValidationError extends Error {
14
+ readonly toolName: string;
15
+ readonly errors: string[];
16
+ constructor(toolName: string, errors: string[]);
17
+ }
18
+ /**
19
+ * Check if a JSON Schema is non-empty and meaningful.
20
+ * An empty schema is one that accepts anything (no properties, no required fields, etc.).
21
+ *
22
+ * @internal
23
+ */
24
+ export declare function isSchemaEmpty(schema: JSONSchema7): boolean;
25
+ /**
26
+ * Validator for MCP tool inputs using AJV.
27
+ *
28
+ * @category MCP
29
+ */
30
+ export declare class MCPInputValidator {
31
+ private ajv;
32
+ private validators;
33
+ constructor();
34
+ /**
35
+ * Register a tool's input schema for validation.
36
+ *
37
+ * @param toolName - Full MCP tool name
38
+ * @param schema - JSON Schema for the tool's inputs
39
+ */
40
+ registerSchema(toolName: string, schema: JSONSchema7): void;
41
+ /**
42
+ * Validate tool input against its registered schema.
43
+ *
44
+ * @param toolName - Full MCP tool name
45
+ * @param input - Tool input to validate
46
+ * @throws {MCPInputValidationError} If validation fails
47
+ */
48
+ validate(toolName: string, input: unknown): void;
49
+ /**
50
+ * Check if a tool has a registered schema.
51
+ *
52
+ * @param toolName - Full MCP tool name
53
+ * @returns True if schema is registered
54
+ */
55
+ hasSchema(toolName: string): boolean;
56
+ /**
57
+ * Unregister a tool's schema.
58
+ *
59
+ * @param toolName - Full MCP tool name
60
+ */
61
+ unregisterSchema(toolName: string): void;
62
+ /**
63
+ * Clear all registered schemas.
64
+ */
65
+ clear(): void;
66
+ }
67
+ /**
68
+ * Result of JSON Schema to Zod conversion.
69
+ *
70
+ * @category MCP
71
+ */
72
+ export interface JsonSchemaToZodResult {
73
+ /** Whether the conversion succeeded */
74
+ success: boolean;
75
+ /** The converted Zod schema (permissive fallback if conversion failed) */
76
+ schema: z.ZodType;
77
+ /** Error message if conversion failed */
78
+ error?: string;
79
+ }
80
+ /**
81
+ * Convert a JSON Schema to a Zod schema for AI SDK tool definitions.
82
+ *
83
+ * This is a best-effort conversion that handles common JSON Schema patterns.
84
+ * Falls back to a permissive schema if conversion fails.
85
+ *
86
+ * Supported JSON Schema features:
87
+ * - Primitive types: string, number, integer, boolean, null
88
+ * - Objects with properties and required fields
89
+ * - Arrays with items
90
+ * - Enums
91
+ * - anyOf/oneOf unions
92
+ * - Basic format validators (date-time, email, uri, uuid)
93
+ * - String constraints (minLength, maxLength, pattern)
94
+ * - Number constraints (minimum, maximum, exclusiveMinimum, exclusiveMaximum)
95
+ * - Array constraints (minItems, maxItems)
96
+ *
97
+ * @param jsonSchema - JSON Schema to convert
98
+ * @returns Conversion result with Zod schema
99
+ *
100
+ * @example
101
+ * ```typescript
102
+ * const result = jsonSchemaToZod({
103
+ * type: "object",
104
+ * properties: {
105
+ * name: { type: "string" },
106
+ * age: { type: "number" }
107
+ * },
108
+ * required: ["name"]
109
+ * });
110
+ *
111
+ * if (result.success) {
112
+ * // Use result.schema for AI SDK tool definition
113
+ * }
114
+ * ```
115
+ *
116
+ * @category MCP
117
+ */
118
+ export declare function jsonSchemaToZod(jsonSchema: JSONSchema7): JsonSchemaToZodResult;
119
+ //# sourceMappingURL=validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/mcp/validation.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAuB,MAAM,aAAa,CAAC;AACpE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;GAIG;AACH,qBAAa,uBAAwB,SAAQ,KAAK;aAE9B,QAAQ,EAAE,MAAM;aAChB,MAAM,EAAE,MAAM,EAAE;gBADhB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EAAE;CAKnC;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CA8B1D;AAED;;;;GAIG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,GAAG,CAAM;IACjB,OAAO,CAAC,UAAU,CAA4C;;IAW9D;;;;;OAKG;IACH,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,IAAI;IAa3D;;;;;;OAMG;IACH,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;IAiBhD;;;;;OAKG;IACH,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAIpC;;;;OAIG;IACH,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAIxC;;OAEG;IACH,KAAK,IAAI,IAAI;CAGd;AAED;;;;GAIG;AACH,MAAM,WAAW,qBAAqB;IACpC,uCAAuC;IACvC,OAAO,EAAE,OAAO,CAAC;IACjB,0EAA0E;IAC1E,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC;IAClB,yCAAyC;IACzC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,WAAW,GAAG,qBAAqB,CAW9E"}