@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.
- package/LICENSE +21 -0
- package/README.md +2321 -0
- package/dist/agent.d.ts +52 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +2122 -0
- package/dist/agent.js.map +1 -0
- package/dist/backend.d.ts +378 -0
- package/dist/backend.d.ts.map +1 -0
- package/dist/backend.js +71 -0
- package/dist/backend.js.map +1 -0
- package/dist/backends/composite.d.ts +258 -0
- package/dist/backends/composite.d.ts.map +1 -0
- package/dist/backends/composite.js +437 -0
- package/dist/backends/composite.js.map +1 -0
- package/dist/backends/filesystem.d.ts +268 -0
- package/dist/backends/filesystem.d.ts.map +1 -0
- package/dist/backends/filesystem.js +623 -0
- package/dist/backends/filesystem.js.map +1 -0
- package/dist/backends/index.d.ts +14 -0
- package/dist/backends/index.d.ts.map +1 -0
- package/dist/backends/index.js +14 -0
- package/dist/backends/index.js.map +1 -0
- package/dist/backends/persistent.d.ts +312 -0
- package/dist/backends/persistent.d.ts.map +1 -0
- package/dist/backends/persistent.js +519 -0
- package/dist/backends/persistent.js.map +1 -0
- package/dist/backends/sandbox.d.ts +315 -0
- package/dist/backends/sandbox.d.ts.map +1 -0
- package/dist/backends/sandbox.js +490 -0
- package/dist/backends/sandbox.js.map +1 -0
- package/dist/backends/state.d.ts +225 -0
- package/dist/backends/state.d.ts.map +1 -0
- package/dist/backends/state.js +396 -0
- package/dist/backends/state.js.map +1 -0
- package/dist/checkpointer/file-saver.d.ts +182 -0
- package/dist/checkpointer/file-saver.d.ts.map +1 -0
- package/dist/checkpointer/file-saver.js +298 -0
- package/dist/checkpointer/file-saver.js.map +1 -0
- package/dist/checkpointer/index.d.ts +40 -0
- package/dist/checkpointer/index.d.ts.map +1 -0
- package/dist/checkpointer/index.js +40 -0
- package/dist/checkpointer/index.js.map +1 -0
- package/dist/checkpointer/kv-saver.d.ts +142 -0
- package/dist/checkpointer/kv-saver.d.ts.map +1 -0
- package/dist/checkpointer/kv-saver.js +176 -0
- package/dist/checkpointer/kv-saver.js.map +1 -0
- package/dist/checkpointer/memory-saver.d.ts +158 -0
- package/dist/checkpointer/memory-saver.d.ts.map +1 -0
- package/dist/checkpointer/memory-saver.js +222 -0
- package/dist/checkpointer/memory-saver.js.map +1 -0
- package/dist/checkpointer/types.d.ts +353 -0
- package/dist/checkpointer/types.d.ts.map +1 -0
- package/dist/checkpointer/types.js +159 -0
- package/dist/checkpointer/types.js.map +1 -0
- package/dist/context-manager.d.ts +627 -0
- package/dist/context-manager.d.ts.map +1 -0
- package/dist/context-manager.js +1039 -0
- package/dist/context-manager.js.map +1 -0
- package/dist/context.d.ts +57 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +76 -0
- package/dist/context.js.map +1 -0
- package/dist/errors/index.d.ts +611 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +1023 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/generation-helpers.d.ts +126 -0
- package/dist/generation-helpers.d.ts.map +1 -0
- package/dist/generation-helpers.js +181 -0
- package/dist/generation-helpers.js.map +1 -0
- package/dist/hooks/audit.d.ts +210 -0
- package/dist/hooks/audit.d.ts.map +1 -0
- package/dist/hooks/audit.js +305 -0
- package/dist/hooks/audit.js.map +1 -0
- package/dist/hooks/cache.d.ts +180 -0
- package/dist/hooks/cache.d.ts.map +1 -0
- package/dist/hooks/cache.js +273 -0
- package/dist/hooks/cache.js.map +1 -0
- package/dist/hooks/guardrails.d.ts +145 -0
- package/dist/hooks/guardrails.d.ts.map +1 -0
- package/dist/hooks/guardrails.js +326 -0
- package/dist/hooks/guardrails.js.map +1 -0
- package/dist/hooks/index.d.ts +18 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +32 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/logging.d.ts +193 -0
- package/dist/hooks/logging.d.ts.map +1 -0
- package/dist/hooks/logging.js +345 -0
- package/dist/hooks/logging.js.map +1 -0
- package/dist/hooks/parallel-guardrails.d.ts +268 -0
- package/dist/hooks/parallel-guardrails.d.ts.map +1 -0
- package/dist/hooks/parallel-guardrails.js +416 -0
- package/dist/hooks/parallel-guardrails.js.map +1 -0
- package/dist/hooks/rate-limit.d.ts +305 -0
- package/dist/hooks/rate-limit.d.ts.map +1 -0
- package/dist/hooks/rate-limit.js +372 -0
- package/dist/hooks/rate-limit.js.map +1 -0
- package/dist/hooks/retry.d.ts +144 -0
- package/dist/hooks/retry.d.ts.map +1 -0
- package/dist/hooks/retry.js +210 -0
- package/dist/hooks/retry.js.map +1 -0
- package/dist/hooks/secrets.d.ts +174 -0
- package/dist/hooks/secrets.d.ts.map +1 -0
- package/dist/hooks/secrets.js +306 -0
- package/dist/hooks/secrets.js.map +1 -0
- package/dist/hooks.d.ts +229 -0
- package/dist/hooks.d.ts.map +1 -0
- package/dist/hooks.js +352 -0
- package/dist/hooks.js.map +1 -0
- package/dist/index.d.ts +97 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +182 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/env.d.ts +25 -0
- package/dist/mcp/env.d.ts.map +1 -0
- package/dist/mcp/env.js +18 -0
- package/dist/mcp/env.js.map +1 -0
- package/dist/mcp/index.d.ts +16 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +17 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/manager.d.ts +184 -0
- package/dist/mcp/manager.d.ts.map +1 -0
- package/dist/mcp/manager.js +446 -0
- package/dist/mcp/manager.js.map +1 -0
- package/dist/mcp/types.d.ts +58 -0
- package/dist/mcp/types.d.ts.map +1 -0
- package/dist/mcp/types.js +7 -0
- package/dist/mcp/types.js.map +1 -0
- package/dist/mcp/validation.d.ts +119 -0
- package/dist/mcp/validation.d.ts.map +1 -0
- package/dist/mcp/validation.js +407 -0
- package/dist/mcp/validation.js.map +1 -0
- package/dist/mcp/virtual-server.d.ts +78 -0
- package/dist/mcp/virtual-server.d.ts.map +1 -0
- package/dist/mcp/virtual-server.js +137 -0
- package/dist/mcp/virtual-server.js.map +1 -0
- package/dist/memory/filesystem-store.d.ts +217 -0
- package/dist/memory/filesystem-store.d.ts.map +1 -0
- package/dist/memory/filesystem-store.js +343 -0
- package/dist/memory/filesystem-store.js.map +1 -0
- package/dist/memory/index.d.ts +46 -0
- package/dist/memory/index.d.ts.map +1 -0
- package/dist/memory/index.js +46 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/memory/loader.d.ts +396 -0
- package/dist/memory/loader.d.ts.map +1 -0
- package/dist/memory/loader.js +419 -0
- package/dist/memory/loader.js.map +1 -0
- package/dist/memory/permissions.d.ts +282 -0
- package/dist/memory/permissions.d.ts.map +1 -0
- package/dist/memory/permissions.js +297 -0
- package/dist/memory/permissions.js.map +1 -0
- package/dist/memory/rules.d.ts +249 -0
- package/dist/memory/rules.d.ts.map +1 -0
- package/dist/memory/rules.js +362 -0
- package/dist/memory/rules.js.map +1 -0
- package/dist/memory/store.d.ts +286 -0
- package/dist/memory/store.d.ts.map +1 -0
- package/dist/memory/store.js +263 -0
- package/dist/memory/store.js.map +1 -0
- package/dist/middleware/apply.d.ts +73 -0
- package/dist/middleware/apply.d.ts.map +1 -0
- package/dist/middleware/apply.js +219 -0
- package/dist/middleware/apply.js.map +1 -0
- package/dist/middleware/context.d.ts +33 -0
- package/dist/middleware/context.d.ts.map +1 -0
- package/dist/middleware/context.js +176 -0
- package/dist/middleware/context.js.map +1 -0
- package/dist/middleware/index.d.ts +31 -0
- package/dist/middleware/index.d.ts.map +1 -0
- package/dist/middleware/index.js +32 -0
- package/dist/middleware/index.js.map +1 -0
- package/dist/middleware/logging.d.ts +137 -0
- package/dist/middleware/logging.d.ts.map +1 -0
- package/dist/middleware/logging.js +374 -0
- package/dist/middleware/logging.js.map +1 -0
- package/dist/middleware/types.d.ts +183 -0
- package/dist/middleware/types.d.ts.map +1 -0
- package/dist/middleware/types.js +11 -0
- package/dist/middleware/types.js.map +1 -0
- package/dist/observability/events.d.ts +183 -0
- package/dist/observability/events.d.ts.map +1 -0
- package/dist/observability/events.js +305 -0
- package/dist/observability/events.js.map +1 -0
- package/dist/observability/index.d.ts +55 -0
- package/dist/observability/index.d.ts.map +1 -0
- package/dist/observability/index.js +87 -0
- package/dist/observability/index.js.map +1 -0
- package/dist/observability/logger.d.ts +318 -0
- package/dist/observability/logger.d.ts.map +1 -0
- package/dist/observability/logger.js +436 -0
- package/dist/observability/logger.js.map +1 -0
- package/dist/observability/metrics.d.ts +341 -0
- package/dist/observability/metrics.d.ts.map +1 -0
- package/dist/observability/metrics.js +490 -0
- package/dist/observability/metrics.js.map +1 -0
- package/dist/observability/preset.d.ts +161 -0
- package/dist/observability/preset.d.ts.map +1 -0
- package/dist/observability/preset.js +133 -0
- package/dist/observability/preset.js.map +1 -0
- package/dist/observability/streaming.d.ts +113 -0
- package/dist/observability/streaming.d.ts.map +1 -0
- package/dist/observability/streaming.js +114 -0
- package/dist/observability/streaming.js.map +1 -0
- package/dist/observability/tracing.d.ts +378 -0
- package/dist/observability/tracing.d.ts.map +1 -0
- package/dist/observability/tracing.js +539 -0
- package/dist/observability/tracing.js.map +1 -0
- package/dist/plugins.d.ts +55 -0
- package/dist/plugins.d.ts.map +1 -0
- package/dist/plugins.js +63 -0
- package/dist/plugins.js.map +1 -0
- package/dist/presets/index.d.ts +7 -0
- package/dist/presets/index.d.ts.map +1 -0
- package/dist/presets/index.js +7 -0
- package/dist/presets/index.js.map +1 -0
- package/dist/presets/production.d.ts +262 -0
- package/dist/presets/production.d.ts.map +1 -0
- package/dist/presets/production.js +295 -0
- package/dist/presets/production.js.map +1 -0
- package/dist/security/index.d.ts +179 -0
- package/dist/security/index.d.ts.map +1 -0
- package/dist/security/index.js +323 -0
- package/dist/security/index.js.map +1 -0
- package/dist/subagents/advanced.d.ts +413 -0
- package/dist/subagents/advanced.d.ts.map +1 -0
- package/dist/subagents/advanced.js +396 -0
- package/dist/subagents/advanced.js.map +1 -0
- package/dist/subagents/index.d.ts +14 -0
- package/dist/subagents/index.d.ts.map +1 -0
- package/dist/subagents/index.js +15 -0
- package/dist/subagents/index.js.map +1 -0
- package/dist/subagents.d.ts +73 -0
- package/dist/subagents.d.ts.map +1 -0
- package/dist/subagents.js +213 -0
- package/dist/subagents.js.map +1 -0
- package/dist/task-store/file-store.d.ts +76 -0
- package/dist/task-store/file-store.d.ts.map +1 -0
- package/dist/task-store/file-store.js +190 -0
- package/dist/task-store/file-store.js.map +1 -0
- package/dist/task-store/index.d.ts +11 -0
- package/dist/task-store/index.d.ts.map +1 -0
- package/dist/task-store/index.js +10 -0
- package/dist/task-store/index.js.map +1 -0
- package/dist/task-store/kv-store.d.ts +140 -0
- package/dist/task-store/kv-store.d.ts.map +1 -0
- package/dist/task-store/kv-store.js +169 -0
- package/dist/task-store/kv-store.js.map +1 -0
- package/dist/task-store/memory-store.d.ts +66 -0
- package/dist/task-store/memory-store.d.ts.map +1 -0
- package/dist/task-store/memory-store.js +125 -0
- package/dist/task-store/memory-store.js.map +1 -0
- package/dist/task-store/types.d.ts +235 -0
- package/dist/task-store/types.d.ts.map +1 -0
- package/dist/task-store/types.js +110 -0
- package/dist/task-store/types.js.map +1 -0
- package/dist/testing/assertions.d.ts +401 -0
- package/dist/testing/assertions.d.ts.map +1 -0
- package/dist/testing/assertions.js +630 -0
- package/dist/testing/assertions.js.map +1 -0
- package/dist/testing/index.d.ts +343 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +360 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/mock-agent.d.ts +214 -0
- package/dist/testing/mock-agent.d.ts.map +1 -0
- package/dist/testing/mock-agent.js +448 -0
- package/dist/testing/mock-agent.js.map +1 -0
- package/dist/testing/recorder.d.ts +288 -0
- package/dist/testing/recorder.d.ts.map +1 -0
- package/dist/testing/recorder.js +499 -0
- package/dist/testing/recorder.js.map +1 -0
- package/dist/tools/execute.d.ts +104 -0
- package/dist/tools/execute.d.ts.map +1 -0
- package/dist/tools/execute.js +191 -0
- package/dist/tools/execute.js.map +1 -0
- package/dist/tools/factory.d.ts +260 -0
- package/dist/tools/factory.d.ts.map +1 -0
- package/dist/tools/factory.js +241 -0
- package/dist/tools/factory.js.map +1 -0
- package/dist/tools/filesystem.d.ts +215 -0
- package/dist/tools/filesystem.d.ts.map +1 -0
- package/dist/tools/filesystem.js +311 -0
- package/dist/tools/filesystem.js.map +1 -0
- package/dist/tools/index.d.ts +33 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +33 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/search.d.ts +59 -0
- package/dist/tools/search.d.ts.map +1 -0
- package/dist/tools/search.js +94 -0
- package/dist/tools/search.js.map +1 -0
- package/dist/tools/skills.d.ts +354 -0
- package/dist/tools/skills.d.ts.map +1 -0
- package/dist/tools/skills.js +413 -0
- package/dist/tools/skills.js.map +1 -0
- package/dist/tools/task.d.ts +272 -0
- package/dist/tools/task.d.ts.map +1 -0
- package/dist/tools/task.js +521 -0
- package/dist/tools/task.js.map +1 -0
- package/dist/tools/todos.d.ts +131 -0
- package/dist/tools/todos.d.ts.map +1 -0
- package/dist/tools/todos.js +120 -0
- package/dist/tools/todos.js.map +1 -0
- package/dist/tools/tool-registry.d.ts +424 -0
- package/dist/tools/tool-registry.d.ts.map +1 -0
- package/dist/tools/tool-registry.js +607 -0
- package/dist/tools/tool-registry.js.map +1 -0
- package/dist/tools/user-interaction.d.ts +116 -0
- package/dist/tools/user-interaction.d.ts.map +1 -0
- package/dist/tools/user-interaction.js +147 -0
- package/dist/tools/user-interaction.js.map +1 -0
- package/dist/tools/utils.d.ts +124 -0
- package/dist/tools/utils.d.ts.map +1 -0
- package/dist/tools/utils.js +189 -0
- package/dist/tools/utils.js.map +1 -0
- package/dist/tools.d.ts +74 -0
- package/dist/tools.d.ts.map +1 -0
- package/dist/tools.js +73 -0
- package/dist/tools.js.map +1 -0
- package/dist/types.d.ts +2421 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +55 -0
- package/dist/types.js.map +1 -0
- package/package.json +81 -0
|
@@ -0,0 +1,407 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Input validation utilities for MCP tools.
|
|
3
|
+
*
|
|
4
|
+
* @packageDocumentation
|
|
5
|
+
*/
|
|
6
|
+
import { Ajv } from "ajv";
|
|
7
|
+
import { z } from "zod";
|
|
8
|
+
/**
|
|
9
|
+
* Validation error thrown when MCP tool input validation fails.
|
|
10
|
+
*
|
|
11
|
+
* @category MCP
|
|
12
|
+
*/
|
|
13
|
+
export class MCPInputValidationError extends Error {
|
|
14
|
+
toolName;
|
|
15
|
+
errors;
|
|
16
|
+
constructor(toolName, errors) {
|
|
17
|
+
super(`Invalid input for MCP tool '${toolName}': ${errors.join(", ")}`);
|
|
18
|
+
this.toolName = toolName;
|
|
19
|
+
this.errors = errors;
|
|
20
|
+
this.name = "MCPInputValidationError";
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Check if a JSON Schema is non-empty and meaningful.
|
|
25
|
+
* An empty schema is one that accepts anything (no properties, no required fields, etc.).
|
|
26
|
+
*
|
|
27
|
+
* @internal
|
|
28
|
+
*/
|
|
29
|
+
export function isSchemaEmpty(schema) {
|
|
30
|
+
// Empty schema with just type: object and no properties/required/additionalProperties constraints
|
|
31
|
+
if (schema.type === "object") {
|
|
32
|
+
const hasProperties = schema.properties && Object.keys(schema.properties).length > 0;
|
|
33
|
+
const hasRequired = schema.required && schema.required.length > 0;
|
|
34
|
+
const hasAdditionalProperties = schema.additionalProperties !== undefined;
|
|
35
|
+
const hasPatternProperties = schema.patternProperties && Object.keys(schema.patternProperties).length > 0;
|
|
36
|
+
const hasConstraints = hasProperties || hasRequired || hasAdditionalProperties || hasPatternProperties;
|
|
37
|
+
if (!hasConstraints) {
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
// Schema with no type and no constraints is empty
|
|
42
|
+
if (!schema.type &&
|
|
43
|
+
!schema.properties &&
|
|
44
|
+
!schema.required &&
|
|
45
|
+
!schema.anyOf &&
|
|
46
|
+
!schema.oneOf &&
|
|
47
|
+
!schema.allOf &&
|
|
48
|
+
!schema.enum) {
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
51
|
+
return false;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Validator for MCP tool inputs using AJV.
|
|
55
|
+
*
|
|
56
|
+
* @category MCP
|
|
57
|
+
*/
|
|
58
|
+
export class MCPInputValidator {
|
|
59
|
+
ajv;
|
|
60
|
+
validators = new Map();
|
|
61
|
+
constructor() {
|
|
62
|
+
// Create AJV instance with permissive settings for MCP schemas
|
|
63
|
+
this.ajv = new Ajv({
|
|
64
|
+
strict: false, // MCP schemas may not be strict JSON Schema
|
|
65
|
+
allErrors: true, // Collect all errors for better error messages
|
|
66
|
+
coerceTypes: false, // Don't coerce types - be strict about input types
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Register a tool's input schema for validation.
|
|
71
|
+
*
|
|
72
|
+
* @param toolName - Full MCP tool name
|
|
73
|
+
* @param schema - JSON Schema for the tool's inputs
|
|
74
|
+
*/
|
|
75
|
+
registerSchema(toolName, schema) {
|
|
76
|
+
try {
|
|
77
|
+
const validator = this.ajv.compile(schema);
|
|
78
|
+
this.validators.set(toolName, validator);
|
|
79
|
+
}
|
|
80
|
+
catch (err) {
|
|
81
|
+
throw new Error(`Failed to compile schema for MCP tool '${toolName}': ${err instanceof Error ? err.message : String(err)}`);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Validate tool input against its registered schema.
|
|
86
|
+
*
|
|
87
|
+
* @param toolName - Full MCP tool name
|
|
88
|
+
* @param input - Tool input to validate
|
|
89
|
+
* @throws {MCPInputValidationError} If validation fails
|
|
90
|
+
*/
|
|
91
|
+
validate(toolName, input) {
|
|
92
|
+
const validator = this.validators.get(toolName);
|
|
93
|
+
if (!validator) {
|
|
94
|
+
throw new Error(`No schema registered for MCP tool '${toolName}'. Call registerSchema first.`);
|
|
95
|
+
}
|
|
96
|
+
const valid = validator(input);
|
|
97
|
+
if (!valid && validator.errors) {
|
|
98
|
+
const errors = validator.errors.map((err) => `${err.instancePath || "input"} ${err.message || "is invalid"}`);
|
|
99
|
+
throw new MCPInputValidationError(toolName, errors);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Check if a tool has a registered schema.
|
|
104
|
+
*
|
|
105
|
+
* @param toolName - Full MCP tool name
|
|
106
|
+
* @returns True if schema is registered
|
|
107
|
+
*/
|
|
108
|
+
hasSchema(toolName) {
|
|
109
|
+
return this.validators.has(toolName);
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Unregister a tool's schema.
|
|
113
|
+
*
|
|
114
|
+
* @param toolName - Full MCP tool name
|
|
115
|
+
*/
|
|
116
|
+
unregisterSchema(toolName) {
|
|
117
|
+
this.validators.delete(toolName);
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Clear all registered schemas.
|
|
121
|
+
*/
|
|
122
|
+
clear() {
|
|
123
|
+
this.validators.clear();
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Convert a JSON Schema to a Zod schema for AI SDK tool definitions.
|
|
128
|
+
*
|
|
129
|
+
* This is a best-effort conversion that handles common JSON Schema patterns.
|
|
130
|
+
* Falls back to a permissive schema if conversion fails.
|
|
131
|
+
*
|
|
132
|
+
* Supported JSON Schema features:
|
|
133
|
+
* - Primitive types: string, number, integer, boolean, null
|
|
134
|
+
* - Objects with properties and required fields
|
|
135
|
+
* - Arrays with items
|
|
136
|
+
* - Enums
|
|
137
|
+
* - anyOf/oneOf unions
|
|
138
|
+
* - Basic format validators (date-time, email, uri, uuid)
|
|
139
|
+
* - String constraints (minLength, maxLength, pattern)
|
|
140
|
+
* - Number constraints (minimum, maximum, exclusiveMinimum, exclusiveMaximum)
|
|
141
|
+
* - Array constraints (minItems, maxItems)
|
|
142
|
+
*
|
|
143
|
+
* @param jsonSchema - JSON Schema to convert
|
|
144
|
+
* @returns Conversion result with Zod schema
|
|
145
|
+
*
|
|
146
|
+
* @example
|
|
147
|
+
* ```typescript
|
|
148
|
+
* const result = jsonSchemaToZod({
|
|
149
|
+
* type: "object",
|
|
150
|
+
* properties: {
|
|
151
|
+
* name: { type: "string" },
|
|
152
|
+
* age: { type: "number" }
|
|
153
|
+
* },
|
|
154
|
+
* required: ["name"]
|
|
155
|
+
* });
|
|
156
|
+
*
|
|
157
|
+
* if (result.success) {
|
|
158
|
+
* // Use result.schema for AI SDK tool definition
|
|
159
|
+
* }
|
|
160
|
+
* ```
|
|
161
|
+
*
|
|
162
|
+
* @category MCP
|
|
163
|
+
*/
|
|
164
|
+
export function jsonSchemaToZod(jsonSchema) {
|
|
165
|
+
try {
|
|
166
|
+
const zodSchema = convertJsonSchemaToZod(jsonSchema);
|
|
167
|
+
return { success: true, schema: zodSchema };
|
|
168
|
+
}
|
|
169
|
+
catch (err) {
|
|
170
|
+
return {
|
|
171
|
+
success: false,
|
|
172
|
+
schema: z.record(z.string(), z.unknown()),
|
|
173
|
+
error: err instanceof Error ? err.message : String(err),
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Internal conversion function that may throw.
|
|
179
|
+
* @internal
|
|
180
|
+
*/
|
|
181
|
+
function convertJsonSchemaToZod(schema, depth = 0) {
|
|
182
|
+
// Prevent infinite recursion
|
|
183
|
+
if (depth > 20) {
|
|
184
|
+
throw new Error("JSON Schema too deeply nested");
|
|
185
|
+
}
|
|
186
|
+
// Handle const first - a const-only schema is not empty
|
|
187
|
+
if (schema.const !== undefined) {
|
|
188
|
+
return z.literal(schema.const);
|
|
189
|
+
}
|
|
190
|
+
// Handle empty schema or schema with no constraints - accepts any value
|
|
191
|
+
if (isSchemaEmpty(schema)) {
|
|
192
|
+
return z.unknown();
|
|
193
|
+
}
|
|
194
|
+
// Handle anyOf
|
|
195
|
+
if (schema.anyOf && schema.anyOf.length > 0) {
|
|
196
|
+
const schemas = schema.anyOf.map((s) => convertJsonSchemaToZod(s, depth + 1));
|
|
197
|
+
if (schemas.length === 1) {
|
|
198
|
+
return schemas[0];
|
|
199
|
+
}
|
|
200
|
+
return z.union([schemas[0], schemas[1], ...schemas.slice(2)]);
|
|
201
|
+
}
|
|
202
|
+
// Handle oneOf (same as anyOf for our purposes)
|
|
203
|
+
if (schema.oneOf && schema.oneOf.length > 0) {
|
|
204
|
+
const schemas = schema.oneOf.map((s) => convertJsonSchemaToZod(s, depth + 1));
|
|
205
|
+
if (schemas.length === 1) {
|
|
206
|
+
return schemas[0];
|
|
207
|
+
}
|
|
208
|
+
return z.union([schemas[0], schemas[1], ...schemas.slice(2)]);
|
|
209
|
+
}
|
|
210
|
+
// Handle allOf - intersect all schemas
|
|
211
|
+
if (schema.allOf && schema.allOf.length > 0) {
|
|
212
|
+
const schemas = schema.allOf.map((s) => convertJsonSchemaToZod(s, depth + 1));
|
|
213
|
+
if (schemas.length === 1) {
|
|
214
|
+
return schemas[0];
|
|
215
|
+
}
|
|
216
|
+
// For simplicity, merge object schemas or take the first one
|
|
217
|
+
let result = schemas[0];
|
|
218
|
+
for (let i = 1; i < schemas.length; i++) {
|
|
219
|
+
result = z.intersection(result, schemas[i]);
|
|
220
|
+
}
|
|
221
|
+
return result;
|
|
222
|
+
}
|
|
223
|
+
// Handle enum
|
|
224
|
+
if (schema.enum && schema.enum.length > 0) {
|
|
225
|
+
const values = schema.enum;
|
|
226
|
+
if (values.length === 1) {
|
|
227
|
+
return z.literal(values[0]);
|
|
228
|
+
}
|
|
229
|
+
// z.enum() only supports string arrays, so check if all values are strings
|
|
230
|
+
const allStrings = values.every((v) => typeof v === "string");
|
|
231
|
+
if (allStrings) {
|
|
232
|
+
return z.enum(values);
|
|
233
|
+
}
|
|
234
|
+
// For numeric, boolean, null, or mixed enums, use z.union() with literals
|
|
235
|
+
const literals = values.map((v) => z.literal(v));
|
|
236
|
+
return z.union([literals[0], literals[1], ...literals.slice(2)]);
|
|
237
|
+
}
|
|
238
|
+
// Handle type-based conversion
|
|
239
|
+
const type = schema.type;
|
|
240
|
+
// Handle array of types
|
|
241
|
+
if (Array.isArray(type)) {
|
|
242
|
+
const schemas = type.map((t) => convertJsonSchemaToZod({ ...schema, type: t }, depth + 1));
|
|
243
|
+
if (schemas.length === 1) {
|
|
244
|
+
return schemas[0];
|
|
245
|
+
}
|
|
246
|
+
return z.union([schemas[0], schemas[1], ...schemas.slice(2)]);
|
|
247
|
+
}
|
|
248
|
+
switch (type) {
|
|
249
|
+
case "string":
|
|
250
|
+
return convertStringSchema(schema);
|
|
251
|
+
case "number":
|
|
252
|
+
case "integer":
|
|
253
|
+
return convertNumberSchema(schema, type === "integer");
|
|
254
|
+
case "boolean":
|
|
255
|
+
return z.boolean();
|
|
256
|
+
case "null":
|
|
257
|
+
return z.null();
|
|
258
|
+
case "array":
|
|
259
|
+
return convertArraySchema(schema, depth);
|
|
260
|
+
case "object":
|
|
261
|
+
return convertObjectSchema(schema, depth);
|
|
262
|
+
default:
|
|
263
|
+
// No type specified but has properties - treat as object
|
|
264
|
+
if (schema.properties) {
|
|
265
|
+
return convertObjectSchema(schema, depth);
|
|
266
|
+
}
|
|
267
|
+
// Fall back to permissive schema
|
|
268
|
+
return z.unknown();
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* Convert a string JSON Schema to Zod.
|
|
273
|
+
* @internal
|
|
274
|
+
*/
|
|
275
|
+
function convertStringSchema(schema) {
|
|
276
|
+
let zodString = z.string();
|
|
277
|
+
// Apply format validators
|
|
278
|
+
if (schema.format) {
|
|
279
|
+
switch (schema.format) {
|
|
280
|
+
case "email":
|
|
281
|
+
zodString = zodString.email();
|
|
282
|
+
break;
|
|
283
|
+
case "uri":
|
|
284
|
+
case "url":
|
|
285
|
+
zodString = zodString.url();
|
|
286
|
+
break;
|
|
287
|
+
case "uuid":
|
|
288
|
+
zodString = zodString.uuid();
|
|
289
|
+
break;
|
|
290
|
+
case "date-time":
|
|
291
|
+
zodString = zodString.datetime();
|
|
292
|
+
break;
|
|
293
|
+
case "date":
|
|
294
|
+
zodString = zodString.date();
|
|
295
|
+
break;
|
|
296
|
+
case "time":
|
|
297
|
+
zodString = zodString.time();
|
|
298
|
+
break;
|
|
299
|
+
case "ipv4":
|
|
300
|
+
zodString = zodString.regex(/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/);
|
|
301
|
+
break;
|
|
302
|
+
case "ipv6":
|
|
303
|
+
zodString = zodString.regex(/^(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$/);
|
|
304
|
+
break;
|
|
305
|
+
// Other formats are not validated strictly
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
// Apply length constraints
|
|
309
|
+
if (typeof schema.minLength === "number") {
|
|
310
|
+
zodString = zodString.min(schema.minLength);
|
|
311
|
+
}
|
|
312
|
+
if (typeof schema.maxLength === "number") {
|
|
313
|
+
zodString = zodString.max(schema.maxLength);
|
|
314
|
+
}
|
|
315
|
+
// Apply pattern constraint
|
|
316
|
+
if (schema.pattern) {
|
|
317
|
+
zodString = zodString.regex(new RegExp(schema.pattern));
|
|
318
|
+
}
|
|
319
|
+
return zodString;
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* Convert a number JSON Schema to Zod.
|
|
323
|
+
* @internal
|
|
324
|
+
*/
|
|
325
|
+
function convertNumberSchema(schema, isInteger) {
|
|
326
|
+
let zodNumber = isInteger ? z.number().int() : z.number();
|
|
327
|
+
// Apply range constraints
|
|
328
|
+
if (typeof schema.minimum === "number") {
|
|
329
|
+
zodNumber = zodNumber.min(schema.minimum);
|
|
330
|
+
}
|
|
331
|
+
if (typeof schema.maximum === "number") {
|
|
332
|
+
zodNumber = zodNumber.max(schema.maximum);
|
|
333
|
+
}
|
|
334
|
+
if (typeof schema.exclusiveMinimum === "number") {
|
|
335
|
+
zodNumber = zodNumber.gt(schema.exclusiveMinimum);
|
|
336
|
+
}
|
|
337
|
+
if (typeof schema.exclusiveMaximum === "number") {
|
|
338
|
+
zodNumber = zodNumber.lt(schema.exclusiveMaximum);
|
|
339
|
+
}
|
|
340
|
+
if (typeof schema.multipleOf === "number") {
|
|
341
|
+
zodNumber = zodNumber.multipleOf(schema.multipleOf);
|
|
342
|
+
}
|
|
343
|
+
return zodNumber;
|
|
344
|
+
}
|
|
345
|
+
/**
|
|
346
|
+
* Convert an array JSON Schema to Zod.
|
|
347
|
+
* @internal
|
|
348
|
+
*/
|
|
349
|
+
function convertArraySchema(schema, depth) {
|
|
350
|
+
let itemSchema = z.unknown();
|
|
351
|
+
if (schema.items) {
|
|
352
|
+
if (Array.isArray(schema.items)) {
|
|
353
|
+
// Tuple type - for simplicity, use the first item's schema or union
|
|
354
|
+
if (schema.items.length > 0) {
|
|
355
|
+
const itemSchemas = schema.items.map((s) => convertJsonSchemaToZod(s, depth + 1));
|
|
356
|
+
if (itemSchemas.length === 1) {
|
|
357
|
+
itemSchema = itemSchemas[0];
|
|
358
|
+
}
|
|
359
|
+
else {
|
|
360
|
+
itemSchema = z.union([itemSchemas[0], itemSchemas[1], ...itemSchemas.slice(2)]);
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
else {
|
|
365
|
+
itemSchema = convertJsonSchemaToZod(schema.items, depth + 1);
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
let zodArray = z.array(itemSchema);
|
|
369
|
+
// Apply length constraints
|
|
370
|
+
if (typeof schema.minItems === "number") {
|
|
371
|
+
zodArray = zodArray.min(schema.minItems);
|
|
372
|
+
}
|
|
373
|
+
if (typeof schema.maxItems === "number") {
|
|
374
|
+
zodArray = zodArray.max(schema.maxItems);
|
|
375
|
+
}
|
|
376
|
+
return zodArray;
|
|
377
|
+
}
|
|
378
|
+
/**
|
|
379
|
+
* Convert an object JSON Schema to Zod.
|
|
380
|
+
* @internal
|
|
381
|
+
*/
|
|
382
|
+
function convertObjectSchema(schema, depth) {
|
|
383
|
+
const shape = {};
|
|
384
|
+
const required = new Set(schema.required || []);
|
|
385
|
+
if (schema.properties) {
|
|
386
|
+
for (const [key, propSchema] of Object.entries(schema.properties)) {
|
|
387
|
+
let propZod = convertJsonSchemaToZod(propSchema, depth + 1);
|
|
388
|
+
if (!required.has(key)) {
|
|
389
|
+
propZod = propZod.optional();
|
|
390
|
+
}
|
|
391
|
+
shape[key] = propZod;
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
// Handle additionalProperties
|
|
395
|
+
if (schema.additionalProperties === false) {
|
|
396
|
+
return z.object(shape).strict();
|
|
397
|
+
}
|
|
398
|
+
else if (schema.additionalProperties !== undefined &&
|
|
399
|
+
schema.additionalProperties !== true &&
|
|
400
|
+
typeof schema.additionalProperties === "object") {
|
|
401
|
+
// Allow additional properties with specific schema
|
|
402
|
+
const additionalSchema = convertJsonSchemaToZod(schema.additionalProperties, depth + 1);
|
|
403
|
+
return z.object(shape).catchall(additionalSchema);
|
|
404
|
+
}
|
|
405
|
+
return z.object(shape);
|
|
406
|
+
}
|
|
407
|
+
//# sourceMappingURL=validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/mcp/validation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Virtual MCP server for inline plugin tools.
|
|
3
|
+
*
|
|
4
|
+
* Wraps AI SDK tools with MCP-compatible naming and metadata
|
|
5
|
+
* without running an actual MCP server process.
|
|
6
|
+
*
|
|
7
|
+
* @packageDocumentation
|
|
8
|
+
*/
|
|
9
|
+
import type { ToolSet } from "ai";
|
|
10
|
+
import type { MCPToolMetadata } from "./types.js";
|
|
11
|
+
/**
|
|
12
|
+
* Virtual MCP server that wraps inline plugin tools.
|
|
13
|
+
*
|
|
14
|
+
* This provides a consistent interface for tools defined in code,
|
|
15
|
+
* making them appear the same as tools from external MCP servers.
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```typescript
|
|
19
|
+
* const server = new VirtualMCPServer("my-plugin", {
|
|
20
|
+
* greet: tool({
|
|
21
|
+
* description: "Greet someone",
|
|
22
|
+
* inputSchema: z.object({ name: z.string() }),
|
|
23
|
+
* execute: async ({ name }) => `Hello, ${name}!`,
|
|
24
|
+
* }),
|
|
25
|
+
* });
|
|
26
|
+
*
|
|
27
|
+
* const metadata = server.getToolMetadata();
|
|
28
|
+
* // [{ name: "mcp__my-plugin__greet", ... }]
|
|
29
|
+
* ```
|
|
30
|
+
*
|
|
31
|
+
* @category MCP
|
|
32
|
+
*/
|
|
33
|
+
export declare class VirtualMCPServer {
|
|
34
|
+
/** Server/plugin name */
|
|
35
|
+
readonly name: string;
|
|
36
|
+
/** Original tools keyed by original name */
|
|
37
|
+
private tools;
|
|
38
|
+
/**
|
|
39
|
+
* Create a virtual MCP server.
|
|
40
|
+
*
|
|
41
|
+
* @param name - Server/plugin name (used in mcp__<name>__<tool> naming)
|
|
42
|
+
* @param tools - AI SDK tools to wrap
|
|
43
|
+
*/
|
|
44
|
+
constructor(name: string, tools: ToolSet);
|
|
45
|
+
/**
|
|
46
|
+
* Get MCP-formatted metadata for all tools.
|
|
47
|
+
*
|
|
48
|
+
* @returns Array of tool metadata with MCP naming
|
|
49
|
+
*/
|
|
50
|
+
getToolMetadata(): MCPToolMetadata[];
|
|
51
|
+
/**
|
|
52
|
+
* Execute a tool by its original name.
|
|
53
|
+
*
|
|
54
|
+
* @param toolName - Original tool name (without mcp__ prefix)
|
|
55
|
+
* @param args - Tool arguments
|
|
56
|
+
* @param abortSignal - Optional abort signal for cancellation
|
|
57
|
+
* @returns Tool execution result
|
|
58
|
+
* @throws If tool not found
|
|
59
|
+
*/
|
|
60
|
+
callTool(toolName: string, args: unknown, abortSignal?: AbortSignal): Promise<unknown>;
|
|
61
|
+
/**
|
|
62
|
+
* Get AI SDK compatible ToolSet with MCP naming.
|
|
63
|
+
*
|
|
64
|
+
* @returns ToolSet with mcp__<name>__<tool> keys
|
|
65
|
+
*/
|
|
66
|
+
getToolSet(): ToolSet;
|
|
67
|
+
/**
|
|
68
|
+
* Check if a tool exists by original name.
|
|
69
|
+
*
|
|
70
|
+
* @param toolName - Original tool name
|
|
71
|
+
*/
|
|
72
|
+
hasTool(toolName: string): boolean;
|
|
73
|
+
/**
|
|
74
|
+
* Get list of original tool names.
|
|
75
|
+
*/
|
|
76
|
+
getToolNames(): string[];
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=virtual-server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"virtual-server.d.ts","sourceRoot":"","sources":["../../src/mcp/virtual-server.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAQ,OAAO,EAAE,MAAM,IAAI,CAAC;AAExC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,qBAAa,gBAAgB;IAC3B,yBAAyB;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,4CAA4C;IAC5C,OAAO,CAAC,KAAK,CAAgC;IAE7C;;;;;OAKG;gBACS,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO;IAOxC;;;;OAIG;IACH,eAAe,IAAI,eAAe,EAAE;IAqCpC;;;;;;;;OAQG;IACG,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC;IAiB5F;;;;OAIG;IACH,UAAU,IAAI,OAAO;IAWrB;;;;OAIG;IACH,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAIlC;;OAEG;IACH,YAAY,IAAI,MAAM,EAAE;CAGzB"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Virtual MCP server for inline plugin tools.
|
|
3
|
+
*
|
|
4
|
+
* Wraps AI SDK tools with MCP-compatible naming and metadata
|
|
5
|
+
* without running an actual MCP server process.
|
|
6
|
+
*
|
|
7
|
+
* @packageDocumentation
|
|
8
|
+
*/
|
|
9
|
+
import { asSchema } from "ai";
|
|
10
|
+
/**
|
|
11
|
+
* Virtual MCP server that wraps inline plugin tools.
|
|
12
|
+
*
|
|
13
|
+
* This provides a consistent interface for tools defined in code,
|
|
14
|
+
* making them appear the same as tools from external MCP servers.
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```typescript
|
|
18
|
+
* const server = new VirtualMCPServer("my-plugin", {
|
|
19
|
+
* greet: tool({
|
|
20
|
+
* description: "Greet someone",
|
|
21
|
+
* inputSchema: z.object({ name: z.string() }),
|
|
22
|
+
* execute: async ({ name }) => `Hello, ${name}!`,
|
|
23
|
+
* }),
|
|
24
|
+
* });
|
|
25
|
+
*
|
|
26
|
+
* const metadata = server.getToolMetadata();
|
|
27
|
+
* // [{ name: "mcp__my-plugin__greet", ... }]
|
|
28
|
+
* ```
|
|
29
|
+
*
|
|
30
|
+
* @category MCP
|
|
31
|
+
*/
|
|
32
|
+
export class VirtualMCPServer {
|
|
33
|
+
/** Server/plugin name */
|
|
34
|
+
name;
|
|
35
|
+
/** Original tools keyed by original name */
|
|
36
|
+
tools = new Map();
|
|
37
|
+
/**
|
|
38
|
+
* Create a virtual MCP server.
|
|
39
|
+
*
|
|
40
|
+
* @param name - Server/plugin name (used in mcp__<name>__<tool> naming)
|
|
41
|
+
* @param tools - AI SDK tools to wrap
|
|
42
|
+
*/
|
|
43
|
+
constructor(name, tools) {
|
|
44
|
+
this.name = name;
|
|
45
|
+
for (const [toolName, tool] of Object.entries(tools)) {
|
|
46
|
+
this.tools.set(toolName, tool);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Get MCP-formatted metadata for all tools.
|
|
51
|
+
*
|
|
52
|
+
* @returns Array of tool metadata with MCP naming
|
|
53
|
+
*/
|
|
54
|
+
getToolMetadata() {
|
|
55
|
+
const metadata = [];
|
|
56
|
+
for (const [toolName, tool] of this.tools) {
|
|
57
|
+
const mcpName = `mcp__${this.name}__${toolName}`;
|
|
58
|
+
// Convert FlexibleSchema to JSON Schema using AI SDK's asSchema
|
|
59
|
+
let inputSchema = {
|
|
60
|
+
type: "object",
|
|
61
|
+
properties: {},
|
|
62
|
+
};
|
|
63
|
+
if (tool.inputSchema) {
|
|
64
|
+
try {
|
|
65
|
+
const schema = asSchema(tool.inputSchema);
|
|
66
|
+
// Handle both sync and async jsonSchema (Schema type allows PromiseLike)
|
|
67
|
+
const jsonSchema = schema.jsonSchema;
|
|
68
|
+
if (jsonSchema && typeof jsonSchema === "object") {
|
|
69
|
+
inputSchema = jsonSchema;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
// Fall back to empty schema if conversion fails
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
metadata.push({
|
|
77
|
+
name: mcpName,
|
|
78
|
+
description: tool.description ?? "",
|
|
79
|
+
inputSchema,
|
|
80
|
+
source: this.name,
|
|
81
|
+
sourceType: "inline",
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
return metadata;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Execute a tool by its original name.
|
|
88
|
+
*
|
|
89
|
+
* @param toolName - Original tool name (without mcp__ prefix)
|
|
90
|
+
* @param args - Tool arguments
|
|
91
|
+
* @param abortSignal - Optional abort signal for cancellation
|
|
92
|
+
* @returns Tool execution result
|
|
93
|
+
* @throws If tool not found
|
|
94
|
+
*/
|
|
95
|
+
async callTool(toolName, args, abortSignal) {
|
|
96
|
+
const tool = this.tools.get(toolName);
|
|
97
|
+
if (!tool) {
|
|
98
|
+
throw new Error(`Tool '${toolName}' not found in virtual server '${this.name}'`);
|
|
99
|
+
}
|
|
100
|
+
if (!tool.execute) {
|
|
101
|
+
throw new Error(`Tool '${toolName}' has no execute function`);
|
|
102
|
+
}
|
|
103
|
+
return tool.execute(args, {
|
|
104
|
+
toolCallId: `virtual-${Date.now()}`,
|
|
105
|
+
messages: [],
|
|
106
|
+
abortSignal: abortSignal ?? new AbortController().signal,
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Get AI SDK compatible ToolSet with MCP naming.
|
|
111
|
+
*
|
|
112
|
+
* @returns ToolSet with mcp__<name>__<tool> keys
|
|
113
|
+
*/
|
|
114
|
+
getToolSet() {
|
|
115
|
+
const toolSet = {};
|
|
116
|
+
for (const [toolName, tool] of this.tools) {
|
|
117
|
+
const mcpName = `mcp__${this.name}__${toolName}`;
|
|
118
|
+
toolSet[mcpName] = tool;
|
|
119
|
+
}
|
|
120
|
+
return toolSet;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Check if a tool exists by original name.
|
|
124
|
+
*
|
|
125
|
+
* @param toolName - Original tool name
|
|
126
|
+
*/
|
|
127
|
+
hasTool(toolName) {
|
|
128
|
+
return this.tools.has(toolName);
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Get list of original tool names.
|
|
132
|
+
*/
|
|
133
|
+
getToolNames() {
|
|
134
|
+
return Array.from(this.tools.keys());
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=virtual-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"virtual-server.js","sourceRoot":"","sources":["../../src/mcp/virtual-server.ts"],"names":[],"mappings":"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"}
|