@wunderio/wdrmcp 0.1.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 +185 -0
- package/README.md +141 -0
- package/dist/config.d.ts +6 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +59 -0
- package/dist/config.js.map +1 -0
- package/dist/docker.d.ts +34 -0
- package/dist/docker.d.ts.map +1 -0
- package/dist/docker.js +115 -0
- package/dist/docker.js.map +1 -0
- package/dist/executors/base.d.ts +2 -0
- package/dist/executors/base.d.ts.map +1 -0
- package/dist/executors/base.js +4 -0
- package/dist/executors/base.js.map +1 -0
- package/dist/executors/command.d.ts +37 -0
- package/dist/executors/command.d.ts.map +1 -0
- package/dist/executors/command.js +107 -0
- package/dist/executors/command.js.map +1 -0
- package/dist/executors/mcp-proxy.d.ts +58 -0
- package/dist/executors/mcp-proxy.d.ts.map +1 -0
- package/dist/executors/mcp-proxy.js +152 -0
- package/dist/executors/mcp-proxy.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +46 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +18 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +70 -0
- package/dist/logger.js.map +1 -0
- package/dist/registry.d.ts +42 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +240 -0
- package/dist/registry.js.map +1 -0
- package/dist/server.d.ts +12 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +54 -0
- package/dist/server.js.map +1 -0
- package/dist/types.d.ts +98 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/package.json +51 -0
package/dist/registry.js
ADDED
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ToolRegistry — loads tool definitions from YAML config files
|
|
3
|
+
* and creates the appropriate executors.
|
|
4
|
+
*
|
|
5
|
+
* Refactored improvements:
|
|
6
|
+
* - BoundRemoteToolExecutor eliminates the originalName workaround
|
|
7
|
+
* - Path normalization is an arg preprocessor, not baked into executors
|
|
8
|
+
* - All tools go through a uniform execute path (no special-casing)
|
|
9
|
+
*/
|
|
10
|
+
import { readFileSync, existsSync } from "node:fs";
|
|
11
|
+
import { resolve, join } from "node:path";
|
|
12
|
+
import { globSync } from "glob";
|
|
13
|
+
import yaml from "js-yaml";
|
|
14
|
+
import { getLogger } from "./logger.js";
|
|
15
|
+
import { CommandToolExecutor } from "./executors/command.js";
|
|
16
|
+
import { McpProxyExecutor, BoundRemoteToolExecutor } from "./executors/mcp-proxy.js";
|
|
17
|
+
export class ToolRegistry {
|
|
18
|
+
toolsConfigDir;
|
|
19
|
+
config;
|
|
20
|
+
tools = new Map();
|
|
21
|
+
argPreprocessor;
|
|
22
|
+
constructor(toolsConfigDir, config) {
|
|
23
|
+
this.toolsConfigDir = resolve(toolsConfigDir);
|
|
24
|
+
this.config = config;
|
|
25
|
+
// Path normalization as a composable preprocessor.
|
|
26
|
+
// Converts devcontainer paths (e.g. /workspace/...) to container paths (/var/www/html/...).
|
|
27
|
+
const hostRoot = config.hostProjectRoot;
|
|
28
|
+
const containerRoot = config.containerProjectRoot;
|
|
29
|
+
this.argPreprocessor = (args) => this.normalizePaths(args, hostRoot, containerRoot);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Load all tools from YAML config files. Returns tool count.
|
|
33
|
+
*/
|
|
34
|
+
async loadTools() {
|
|
35
|
+
const log = getLogger();
|
|
36
|
+
if (!existsSync(this.toolsConfigDir)) {
|
|
37
|
+
log.error(`Tools config directory not found: ${this.toolsConfigDir}`);
|
|
38
|
+
return 0;
|
|
39
|
+
}
|
|
40
|
+
const configFiles = globSync("*.yml", { cwd: this.toolsConfigDir }).sort();
|
|
41
|
+
let loadedCount = 0;
|
|
42
|
+
for (const file of configFiles) {
|
|
43
|
+
const filePath = join(this.toolsConfigDir, file);
|
|
44
|
+
try {
|
|
45
|
+
const content = readFileSync(filePath, "utf-8");
|
|
46
|
+
const fileConfig = yaml.load(content);
|
|
47
|
+
if (!fileConfig) {
|
|
48
|
+
log.warn(`Empty config file: ${file}`);
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
if (!fileConfig.tools) {
|
|
52
|
+
log.error(`Missing 'tools' array: ${file}`);
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
for (const toolConfig of fileConfig.tools) {
|
|
56
|
+
loadedCount += await this.loadSingleTool(toolConfig);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
catch (e) {
|
|
60
|
+
log.error(`Error loading ${file}: ${e instanceof yaml.YAMLException ? e.message : e}`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
log.info(`Loaded ${loadedCount} tools`);
|
|
64
|
+
return loadedCount;
|
|
65
|
+
}
|
|
66
|
+
async loadSingleTool(toolConfig) {
|
|
67
|
+
const log = getLogger();
|
|
68
|
+
const name = toolConfig.name;
|
|
69
|
+
if (!name) {
|
|
70
|
+
log.warn("Tool config missing 'name'");
|
|
71
|
+
return 0;
|
|
72
|
+
}
|
|
73
|
+
if (toolConfig.enabled === false) {
|
|
74
|
+
log.info(`Tool disabled: ${name}`);
|
|
75
|
+
return 0;
|
|
76
|
+
}
|
|
77
|
+
const executor = this.createExecutor(toolConfig);
|
|
78
|
+
if (!executor) {
|
|
79
|
+
log.warn(`Failed to create executor: ${name}`);
|
|
80
|
+
return 0;
|
|
81
|
+
}
|
|
82
|
+
// MCP server with expose_remote_tools: register each remote tool individually.
|
|
83
|
+
if (toolConfig.type === "mcp_server" && toolConfig.expose_remote_tools) {
|
|
84
|
+
return this.loadRemoteMcpTools(toolConfig, executor);
|
|
85
|
+
}
|
|
86
|
+
this.tools.set(name, { config: toolConfig, executor });
|
|
87
|
+
log.info(`Loaded tool: ${name}`);
|
|
88
|
+
return 1;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Fetch remote tools and register each with a BoundRemoteToolExecutor.
|
|
92
|
+
* No "originalName" tracking needed — the binding is in the executor itself.
|
|
93
|
+
*/
|
|
94
|
+
async loadRemoteMcpTools(proxyConfig, proxy) {
|
|
95
|
+
const log = getLogger();
|
|
96
|
+
const proxyName = proxyConfig.name;
|
|
97
|
+
log.info(`Fetching remote tools from: ${proxyName}`);
|
|
98
|
+
try {
|
|
99
|
+
const initTimeout = proxyConfig.init_timeout ?? 30;
|
|
100
|
+
const remoteTools = await Promise.race([
|
|
101
|
+
proxy.fetchRemoteTools(),
|
|
102
|
+
new Promise((_, reject) => setTimeout(() => reject(new Error(`Timeout after ${initTimeout}s`)), initTimeout * 1000)),
|
|
103
|
+
]);
|
|
104
|
+
if (!remoteTools?.length) {
|
|
105
|
+
log.warn(`No tools from ${proxyName}`);
|
|
106
|
+
return 0;
|
|
107
|
+
}
|
|
108
|
+
const prefix = proxyConfig.tool_prefix ?? "";
|
|
109
|
+
let count = 0;
|
|
110
|
+
for (const remote of remoteTools) {
|
|
111
|
+
if (!remote.name)
|
|
112
|
+
continue;
|
|
113
|
+
const localName = prefix ? `${prefix}${remote.name}` : remote.name;
|
|
114
|
+
// Each remote tool gets its own bound executor — no special-casing in executeTool().
|
|
115
|
+
const boundExecutor = new BoundRemoteToolExecutor(proxy, remote.name);
|
|
116
|
+
const wrappedConfig = {
|
|
117
|
+
name: localName,
|
|
118
|
+
description: remote.description ?? "",
|
|
119
|
+
type: "mcp_server",
|
|
120
|
+
input_schema: remote.inputSchema,
|
|
121
|
+
server_url: proxyConfig.server_url,
|
|
122
|
+
};
|
|
123
|
+
this.tools.set(localName, { config: wrappedConfig, executor: boundExecutor });
|
|
124
|
+
log.info(`Loaded remote tool: ${localName} (from ${remote.name})`);
|
|
125
|
+
count++;
|
|
126
|
+
}
|
|
127
|
+
log.info(`Loaded ${count} tools from ${proxyName}`);
|
|
128
|
+
return count;
|
|
129
|
+
}
|
|
130
|
+
catch (e) {
|
|
131
|
+
log.error(`Failed to load remote tools from ${proxyName}: ${e}`);
|
|
132
|
+
return 0;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
interpolateContainerName(container) {
|
|
136
|
+
return container?.includes("{DDEV_PROJECT}")
|
|
137
|
+
? container.replace(/\{DDEV_PROJECT\}/g, this.config.ddevProject)
|
|
138
|
+
: container;
|
|
139
|
+
}
|
|
140
|
+
createExecutor(toolConfig) {
|
|
141
|
+
const log = getLogger();
|
|
142
|
+
const type = toolConfig.type ?? "command";
|
|
143
|
+
const name = toolConfig.name;
|
|
144
|
+
try {
|
|
145
|
+
if (type === "command") {
|
|
146
|
+
const cfg = toolConfig;
|
|
147
|
+
if (!cfg.command_template) {
|
|
148
|
+
log.error(`Tool ${name}: missing command_template`);
|
|
149
|
+
return null;
|
|
150
|
+
}
|
|
151
|
+
return new CommandToolExecutor({
|
|
152
|
+
commandTemplate: cfg.command_template,
|
|
153
|
+
container: this.interpolateContainerName(cfg.container),
|
|
154
|
+
ddevProject: this.config.ddevProject,
|
|
155
|
+
user: cfg.user,
|
|
156
|
+
shell: cfg.shell,
|
|
157
|
+
defaultArgs: cfg.default_args,
|
|
158
|
+
disallowedCommands: cfg.disallowed_commands,
|
|
159
|
+
validationRules: cfg.validation_rules,
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
if (type === "mcp_server") {
|
|
163
|
+
const cfg = toolConfig;
|
|
164
|
+
if (!cfg.server_url) {
|
|
165
|
+
log.error(`Tool ${name}: missing server_url`);
|
|
166
|
+
return null;
|
|
167
|
+
}
|
|
168
|
+
return new McpProxyExecutor({
|
|
169
|
+
serverUrl: cfg.server_url,
|
|
170
|
+
forwardArgs: cfg.forward_args,
|
|
171
|
+
timeout: cfg.timeout,
|
|
172
|
+
authUsername: cfg.auth_username,
|
|
173
|
+
authPassword: cfg.auth_password,
|
|
174
|
+
authToken: cfg.auth_token,
|
|
175
|
+
authTokenBasic: cfg.auth_token_basic,
|
|
176
|
+
verifySsl: cfg.verify_ssl,
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
log.error(`Unknown tool type: ${type}`);
|
|
180
|
+
return null;
|
|
181
|
+
}
|
|
182
|
+
catch (e) {
|
|
183
|
+
log.error(`Error creating executor for ${name}: ${e}`);
|
|
184
|
+
return null;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
// --- Public API ---
|
|
188
|
+
getToolNames() { return [...this.tools.keys()]; }
|
|
189
|
+
getTool(name) { return this.tools.get(name); }
|
|
190
|
+
getAllTools() { return this.tools; }
|
|
191
|
+
/**
|
|
192
|
+
* Execute a tool. Applies arg preprocessing (path normalization)
|
|
193
|
+
* then delegates to the executor. No special-casing needed.
|
|
194
|
+
*/
|
|
195
|
+
async executeTool(name, args) {
|
|
196
|
+
const log = getLogger();
|
|
197
|
+
const registered = this.tools.get(name);
|
|
198
|
+
if (!registered)
|
|
199
|
+
return { content: `Error: Unknown tool '${name}'`, isError: true };
|
|
200
|
+
const { executor } = registered;
|
|
201
|
+
try {
|
|
202
|
+
executor.validateArguments(args);
|
|
203
|
+
}
|
|
204
|
+
catch (e) {
|
|
205
|
+
return { content: `Validation error: ${e.message}`, isError: true };
|
|
206
|
+
}
|
|
207
|
+
// Apply preprocessor (path normalization).
|
|
208
|
+
const processedArgs = this.argPreprocessor(args);
|
|
209
|
+
try {
|
|
210
|
+
return await executor.execute(processedArgs);
|
|
211
|
+
}
|
|
212
|
+
catch (e) {
|
|
213
|
+
log.error(`Error executing ${name}: ${e}`);
|
|
214
|
+
return { content: `Error: ${e.message}`, isError: true };
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Recursively normalize devcontainer paths to container paths in argument values.
|
|
219
|
+
*/
|
|
220
|
+
normalizePaths(value, hostRoot, containerRoot) {
|
|
221
|
+
const normalize = (v) => {
|
|
222
|
+
if (typeof v === "string") {
|
|
223
|
+
return v.startsWith(hostRoot + "/")
|
|
224
|
+
? containerRoot + v.slice(hostRoot.length)
|
|
225
|
+
: v;
|
|
226
|
+
}
|
|
227
|
+
if (Array.isArray(v))
|
|
228
|
+
return v.map(normalize);
|
|
229
|
+
if (v !== null && typeof v === "object") {
|
|
230
|
+
const result = {};
|
|
231
|
+
for (const [k, val] of Object.entries(v))
|
|
232
|
+
result[k] = normalize(val);
|
|
233
|
+
return result;
|
|
234
|
+
}
|
|
235
|
+
return v;
|
|
236
|
+
};
|
|
237
|
+
return normalize(value);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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"}
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Server — registers tools from the ToolRegistry using the official SDK.
|
|
3
|
+
*
|
|
4
|
+
* Note: McpServer.registerTool() requires Zod schemas, so we convert the
|
|
5
|
+
* JSON Schema from YAML configs to Zod. This is the SDK's requirement —
|
|
6
|
+
* the low-level Server class is deprecated.
|
|
7
|
+
*/
|
|
8
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
9
|
+
import { ToolRegistry } from "./registry.js";
|
|
10
|
+
/** Create and configure the MCP server with all tools from the registry. */
|
|
11
|
+
export declare function createMcpServer(registry: ToolRegistry): McpServer;
|
|
12
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGpE,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAiC7C,4EAA4E;AAC5E,wBAAgB,eAAe,CAAC,QAAQ,EAAE,YAAY,GAAG,SAAS,CAsBjE"}
|
package/dist/server.js
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Server — registers tools from the ToolRegistry using the official SDK.
|
|
3
|
+
*
|
|
4
|
+
* Note: McpServer.registerTool() requires Zod schemas, so we convert the
|
|
5
|
+
* JSON Schema from YAML configs to Zod. This is the SDK's requirement —
|
|
6
|
+
* the low-level Server class is deprecated.
|
|
7
|
+
*/
|
|
8
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
9
|
+
import { z } from "zod";
|
|
10
|
+
import { getLogger } from "./logger.js";
|
|
11
|
+
/** Convert a JSON Schema property to a Zod schema. */
|
|
12
|
+
function toZod(prop) {
|
|
13
|
+
const base = (() => {
|
|
14
|
+
switch (prop.type) {
|
|
15
|
+
case "string": return prop.enum ? z.enum(prop.enum) : z.string();
|
|
16
|
+
case "number":
|
|
17
|
+
case "integer": return z.number();
|
|
18
|
+
case "boolean": return z.boolean();
|
|
19
|
+
case "array": return z.array(z.unknown());
|
|
20
|
+
case "object": return z.record(z.unknown());
|
|
21
|
+
default: return z.unknown();
|
|
22
|
+
}
|
|
23
|
+
})();
|
|
24
|
+
return prop.description ? base.describe(prop.description) : base;
|
|
25
|
+
}
|
|
26
|
+
/** Convert JSON Schema properties + required to a ZodRawShape. */
|
|
27
|
+
function toZodShape(schema) {
|
|
28
|
+
if (!schema?.properties)
|
|
29
|
+
return {};
|
|
30
|
+
const required = new Set(schema.required ?? []);
|
|
31
|
+
const shape = {};
|
|
32
|
+
for (const [key, prop] of Object.entries(schema.properties)) {
|
|
33
|
+
shape[key] = required.has(key) ? toZod(prop) : toZod(prop).optional();
|
|
34
|
+
}
|
|
35
|
+
return shape;
|
|
36
|
+
}
|
|
37
|
+
/** Create and configure the MCP server with all tools from the registry. */
|
|
38
|
+
export function createMcpServer(registry) {
|
|
39
|
+
const log = getLogger();
|
|
40
|
+
const server = new McpServer({ name: "wdrmcp", version: "0.1.0" });
|
|
41
|
+
for (const [toolName, { config }] of registry.getAllTools()) {
|
|
42
|
+
server.tool(toolName, config.description ?? "Tool with no description", toZodShape(config.input_schema), async (args) => {
|
|
43
|
+
log.info(`Calling tool: ${toolName}`);
|
|
44
|
+
const result = await registry.executeTool(toolName, args);
|
|
45
|
+
return {
|
|
46
|
+
content: [{ type: "text", text: result.content }],
|
|
47
|
+
isError: result.isError,
|
|
48
|
+
};
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
log.info(`MCP server configured with ${registry.getToolNames().length} tools`);
|
|
52
|
+
return server;
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core type definitions for WDRMCP.
|
|
3
|
+
*/
|
|
4
|
+
/** Supported tool types in YAML configuration. */
|
|
5
|
+
export type ToolType = "command" | "mcp_server";
|
|
6
|
+
/** A single validation rule for tool arguments. */
|
|
7
|
+
export interface ValidationRule {
|
|
8
|
+
pattern: string;
|
|
9
|
+
message: string;
|
|
10
|
+
}
|
|
11
|
+
/** Base tool configuration shared by all tool types. */
|
|
12
|
+
export interface BaseToolConfig {
|
|
13
|
+
name: string;
|
|
14
|
+
enabled?: boolean;
|
|
15
|
+
description: string;
|
|
16
|
+
type: ToolType;
|
|
17
|
+
input_schema?: JsonSchema;
|
|
18
|
+
}
|
|
19
|
+
/** JSON Schema definition used in YAML tool configs. */
|
|
20
|
+
export interface JsonSchema {
|
|
21
|
+
type: string;
|
|
22
|
+
properties?: Record<string, JsonSchemaProperty>;
|
|
23
|
+
required?: string[];
|
|
24
|
+
}
|
|
25
|
+
export interface JsonSchemaProperty {
|
|
26
|
+
type: string;
|
|
27
|
+
description?: string;
|
|
28
|
+
enum?: string[];
|
|
29
|
+
default?: unknown;
|
|
30
|
+
}
|
|
31
|
+
/** Configuration for a command-type tool (docker exec). */
|
|
32
|
+
export interface CommandToolConfig extends BaseToolConfig {
|
|
33
|
+
type: "command";
|
|
34
|
+
command_template: string;
|
|
35
|
+
container: string;
|
|
36
|
+
user?: string;
|
|
37
|
+
shell?: string;
|
|
38
|
+
default_args?: Record<string, string>;
|
|
39
|
+
disallowed_commands?: string[];
|
|
40
|
+
validation_rules?: ValidationRule[];
|
|
41
|
+
}
|
|
42
|
+
/** Configuration for an MCP server proxy tool. */
|
|
43
|
+
export interface McpServerToolConfig extends BaseToolConfig {
|
|
44
|
+
type: "mcp_server";
|
|
45
|
+
server_url: string;
|
|
46
|
+
forward_args?: boolean;
|
|
47
|
+
timeout?: number;
|
|
48
|
+
auth_username?: string;
|
|
49
|
+
auth_password?: string;
|
|
50
|
+
auth_token?: string;
|
|
51
|
+
auth_token_basic?: boolean;
|
|
52
|
+
verify_ssl?: boolean;
|
|
53
|
+
expose_remote_tools?: boolean;
|
|
54
|
+
tool_prefix?: string;
|
|
55
|
+
init_timeout?: number;
|
|
56
|
+
}
|
|
57
|
+
/** Union type for all tool configurations. */
|
|
58
|
+
export type ToolConfig = CommandToolConfig | McpServerToolConfig;
|
|
59
|
+
/** Top-level structure of a tools YAML file. */
|
|
60
|
+
export interface ToolsFileSchema {
|
|
61
|
+
tools: ToolConfig[];
|
|
62
|
+
}
|
|
63
|
+
/** Result of a tool execution. */
|
|
64
|
+
export interface ToolExecutionResult {
|
|
65
|
+
content: string;
|
|
66
|
+
isError?: boolean;
|
|
67
|
+
}
|
|
68
|
+
/** A registered tool with its executor. */
|
|
69
|
+
export interface RegisteredTool {
|
|
70
|
+
config: ToolConfig;
|
|
71
|
+
executor: ToolExecutor;
|
|
72
|
+
}
|
|
73
|
+
/** Interface that all executors must implement. */
|
|
74
|
+
export interface ToolExecutor {
|
|
75
|
+
execute(args: Record<string, unknown>): Promise<ToolExecutionResult>;
|
|
76
|
+
validateArguments(args: Record<string, unknown>): void;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Argument preprocessor — transforms args before they reach the executor.
|
|
80
|
+
* Used for path normalization, default merging, etc.
|
|
81
|
+
*/
|
|
82
|
+
export type ArgPreprocessor = (args: Record<string, unknown>) => Record<string, unknown>;
|
|
83
|
+
/** Bridge-level configuration. */
|
|
84
|
+
export interface BridgeConfig {
|
|
85
|
+
/** Path to the directory containing tools-config YAML files. */
|
|
86
|
+
toolsConfigPath: string;
|
|
87
|
+
/** DDEV project name (from DDEV_PROJECT env var). */
|
|
88
|
+
ddevProject: string;
|
|
89
|
+
/** Log level. */
|
|
90
|
+
logLevel: "debug" | "info" | "warn" | "error";
|
|
91
|
+
/** Optional log file path. */
|
|
92
|
+
logFile?: string;
|
|
93
|
+
/** Host project root for path normalization. */
|
|
94
|
+
hostProjectRoot: string;
|
|
95
|
+
/** Container project root for path normalization. */
|
|
96
|
+
containerProjectRoot: string;
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
package/package.json
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@wunderio/wdrmcp",
|
|
3
|
+
"mcpName": "io.github.wunderio/wdrmcp",
|
|
4
|
+
"version": "0.1.1",
|
|
5
|
+
"description": "A generic MCP server that dynamically loads tool definitions from YAML configuration files and executes them in Docker containers or proxies them to remote MCP servers.",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"bin": {
|
|
8
|
+
"wdrmcp": "dist/index.js"
|
|
9
|
+
},
|
|
10
|
+
"main": "./dist/server.js",
|
|
11
|
+
"types": "./dist/server.d.ts",
|
|
12
|
+
"files": [
|
|
13
|
+
"dist",
|
|
14
|
+
"README.md",
|
|
15
|
+
"LICENSE"
|
|
16
|
+
],
|
|
17
|
+
"scripts": {
|
|
18
|
+
"build": "tsc",
|
|
19
|
+
"dev": "tsc --watch",
|
|
20
|
+
"start": "node dist/index.js",
|
|
21
|
+
"prepublishOnly": "npm run build"
|
|
22
|
+
},
|
|
23
|
+
"keywords": [
|
|
24
|
+
"mcp",
|
|
25
|
+
"model-context-protocol",
|
|
26
|
+
"docker",
|
|
27
|
+
"ddev",
|
|
28
|
+
"ai-tools",
|
|
29
|
+
"copilot"
|
|
30
|
+
],
|
|
31
|
+
"author": "Wunder",
|
|
32
|
+
"license": "Apache-2.0",
|
|
33
|
+
"repository": {
|
|
34
|
+
"type": "git",
|
|
35
|
+
"url": "git+https://github.com/wunderio/wdrmcp.git"
|
|
36
|
+
},
|
|
37
|
+
"engines": {
|
|
38
|
+
"node": ">=18.0.0"
|
|
39
|
+
},
|
|
40
|
+
"dependencies": {
|
|
41
|
+
"@modelcontextprotocol/sdk": "^1.26.0",
|
|
42
|
+
"js-yaml": "^4.1.0",
|
|
43
|
+
"zod": "^3.25.0",
|
|
44
|
+
"glob": "^11.0.0"
|
|
45
|
+
},
|
|
46
|
+
"devDependencies": {
|
|
47
|
+
"@types/js-yaml": "^4.0.9",
|
|
48
|
+
"@types/node": "^22.0.0",
|
|
49
|
+
"typescript": "^5.7.0"
|
|
50
|
+
}
|
|
51
|
+
}
|