@agiflowai/one-mcp 0.3.11 → 0.3.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +136 -200
- package/dist/cli.cjs +251 -98
- package/dist/cli.mjs +250 -97
- package/dist/{http-pwzeCOpM.cjs → http-SFQFxDCq.cjs} +1079 -450
- package/dist/{http-BDeLFFzK.mjs → http-_ThlSpST.mjs} +1049 -444
- package/dist/index.cjs +3 -1
- package/dist/index.d.cts +156 -22
- package/dist/index.d.mts +156 -22
- package/dist/index.mjs +2 -2
- package/package.json +2 -2
package/dist/cli.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import {
|
|
2
|
+
import { a as version, d as DefinitionsCacheService, f as generateServerId, i as createServer, l as SkillService, m as ConfigFetcherService, n as SseTransportHandler, p as findConfigFile, r as StdioTransportHandler, s as SearchListToolsTool, t as HttpTransportHandler, u as McpClientManagerService } from "./http-_ThlSpST.mjs";
|
|
3
3
|
import { writeFile } from "node:fs/promises";
|
|
4
4
|
import { resolve } from "node:path";
|
|
5
5
|
import { Liquid } from "liquidjs";
|
|
@@ -125,6 +125,9 @@ const TRANSPORT_MODE = {
|
|
|
125
125
|
function isValidTransportType(type) {
|
|
126
126
|
return type === "stdio" || type === "http" || type === "sse";
|
|
127
127
|
}
|
|
128
|
+
function isValidProxyMode(mode) {
|
|
129
|
+
return mode === "meta" || mode === "flat" || mode === "search";
|
|
130
|
+
}
|
|
128
131
|
/**
|
|
129
132
|
* Start MCP server with given transport handler
|
|
130
133
|
* @param handler - The transport handler to start
|
|
@@ -147,17 +150,24 @@ async function startServer(handler) {
|
|
|
147
150
|
/**
|
|
148
151
|
* MCP Serve command
|
|
149
152
|
*/
|
|
150
|
-
const mcpServeCommand = new Command("mcp-serve").description("Start MCP server with specified transport").option("-t, --type <type>", "Transport type: stdio, http, or sse", "stdio").option("-p, --port <port>", "Port to listen on (http/sse only)", (val) => parseInt(val, 10), 3e3).option("--host <host>", "Host to bind to (http/sse only)", "localhost").option("-c, --config <path>", "Path to MCP server configuration file").option("--no-cache", "Disable configuration caching, always reload from config file").option("--id <id>", "Unique server identifier (overrides config file id, auto-generated if not provided)").action(async (options) => {
|
|
153
|
+
const mcpServeCommand = new Command("mcp-serve").description("Start MCP server with specified transport").option("-t, --type <type>", "Transport type: stdio, http, or sse", "stdio").option("-p, --port <port>", "Port to listen on (http/sse only)", (val) => parseInt(val, 10), 3e3).option("--host <host>", "Host to bind to (http/sse only)", "localhost").option("-c, --config <path>", "Path to MCP server configuration file").option("--no-cache", "Disable configuration caching, always reload from config file").option("--definitions-cache <path>", "Path to prefetched tool/prompt/skill definitions cache file").option("--clear-definitions-cache", "Delete definitions cache before startup", false).option("--proxy-mode <mode>", "How one-mcp exposes downstream tools: meta, flat, or search", "meta").option("--id <id>", "Unique server identifier (overrides config file id, auto-generated if not provided)").action(async (options) => {
|
|
151
154
|
const transportType = options.type.toLowerCase();
|
|
152
155
|
if (!isValidTransportType(transportType)) {
|
|
153
156
|
console.error(`Unknown transport type: '${transportType}'. Valid options: stdio, http, sse`);
|
|
154
157
|
process.exit(1);
|
|
155
158
|
}
|
|
159
|
+
if (!isValidProxyMode(options.proxyMode)) {
|
|
160
|
+
console.error(`Unknown proxy mode: '${options.proxyMode}'. Valid options: meta, flat, search`);
|
|
161
|
+
process.exit(1);
|
|
162
|
+
}
|
|
156
163
|
try {
|
|
157
164
|
const serverOptions = {
|
|
158
165
|
configFilePath: options.config || findConfigFile() || void 0,
|
|
159
166
|
noCache: options.cache === false,
|
|
160
|
-
serverId: options.id
|
|
167
|
+
serverId: options.id,
|
|
168
|
+
definitionsCachePath: options.definitionsCache,
|
|
169
|
+
clearDefinitionsCache: options.clearDefinitionsCache,
|
|
170
|
+
proxyMode: options.proxyMode
|
|
161
171
|
};
|
|
162
172
|
if (transportType === "stdio") await startServer(new StdioTransportHandler(await createServer(serverOptions)));
|
|
163
173
|
else if (transportType === "http") await startServer(new HttpTransportHandler(await createServer(serverOptions), {
|
|
@@ -577,85 +587,62 @@ var PrefetchService = class {
|
|
|
577
587
|
* - Hardcoded values (use options or environment variables)
|
|
578
588
|
* - Not exiting with appropriate exit codes on errors
|
|
579
589
|
*/
|
|
580
|
-
function toErrorMessage$
|
|
590
|
+
function toErrorMessage$4(error) {
|
|
581
591
|
return error instanceof Error ? error.message : String(error);
|
|
582
592
|
}
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
593
|
+
function printSearchResults(result) {
|
|
594
|
+
for (const server of result.servers) {
|
|
595
|
+
console.log(`\n${server.server}:`);
|
|
596
|
+
if (server.capabilities && server.capabilities.length > 0) console.log(` capabilities: ${server.capabilities.join(", ")}`);
|
|
597
|
+
if (server.summary) console.log(` summary: ${server.summary}`);
|
|
598
|
+
if (server.tools.length === 0) {
|
|
599
|
+
console.log(" no tools");
|
|
600
|
+
continue;
|
|
601
|
+
}
|
|
602
|
+
for (const tool of server.tools) {
|
|
603
|
+
const capabilitySummary = tool.capabilities && tool.capabilities.length > 0 ? ` [${tool.capabilities.join(", ")}]` : "";
|
|
604
|
+
console.log(` - ${tool.name}${capabilitySummary}`);
|
|
605
|
+
if (tool.description) console.log(` ${tool.description}`);
|
|
606
|
+
}
|
|
607
|
+
}
|
|
608
|
+
}
|
|
609
|
+
const searchToolsCommand = new Command("search-tools").description("Search proxied MCP tools by capability or server").option("-c, --config <path>", "Path to MCP server configuration file").option("-s, --server <name>", "Filter by server name").option("--capability <name>", "Filter by capability tag, summary, tool name, or description").option("--definitions-cache <path>", "Path to definitions cache file").option("-j, --json", "Output as JSON", false).action(async (options) => {
|
|
587
610
|
try {
|
|
588
611
|
const configFilePath = options.config || findConfigFile();
|
|
589
612
|
if (!configFilePath) throw new Error("No config file found. Use --config or create mcp-config.yaml");
|
|
590
613
|
const config = await new ConfigFetcherService({ configFilePath }).fetchConfiguration();
|
|
591
614
|
const clientManager = new McpClientManagerService();
|
|
615
|
+
clientManager.registerServerConfigs(config.mcpServers);
|
|
592
616
|
const connectionPromises = Object.entries(config.mcpServers).map(async ([serverName, serverConfig]) => {
|
|
593
617
|
try {
|
|
594
618
|
await clientManager.connectToServer(serverName, serverConfig);
|
|
595
619
|
if (!options.json) console.error(`✓ Connected to ${serverName}`);
|
|
596
620
|
} catch (error) {
|
|
597
|
-
if (!options.json) console.error(`✗ Failed to connect to ${serverName}: ${toErrorMessage$
|
|
621
|
+
if (!options.json) console.error(`✗ Failed to connect to ${serverName}: ${toErrorMessage$4(error)}`);
|
|
598
622
|
}
|
|
599
623
|
});
|
|
600
624
|
await Promise.all(connectionPromises);
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
const filteredTools = tools.filter((t) => !blacklist.has(t.name));
|
|
609
|
-
return {
|
|
610
|
-
serverName: client.serverName,
|
|
611
|
-
tools: filteredTools,
|
|
612
|
-
error: null
|
|
613
|
-
};
|
|
614
|
-
} catch (error) {
|
|
615
|
-
return {
|
|
616
|
-
serverName: client.serverName,
|
|
617
|
-
tools: [],
|
|
618
|
-
error
|
|
619
|
-
};
|
|
620
|
-
}
|
|
621
|
-
}));
|
|
622
|
-
for (const { serverName, tools, error } of toolResults) {
|
|
623
|
-
if (error && !options.json) console.error(`Failed to list tools from ${serverName}: ${toErrorMessage$2(error)}`);
|
|
624
|
-
toolsByServer[serverName] = tools;
|
|
625
|
+
if (clientManager.getAllClients().length === 0) throw new Error("No MCP servers connected");
|
|
626
|
+
const cachePath = options.definitionsCache || DefinitionsCacheService.getDefaultCachePath(configFilePath);
|
|
627
|
+
let cacheData;
|
|
628
|
+
try {
|
|
629
|
+
cacheData = await DefinitionsCacheService.readFromFile(cachePath);
|
|
630
|
+
} catch {
|
|
631
|
+
cacheData = void 0;
|
|
625
632
|
}
|
|
626
|
-
const
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
const output = { ...toolsByServer };
|
|
636
|
-
if (skills.length > 0) output.__skills__ = skills.map((s) => ({
|
|
637
|
-
name: s.name,
|
|
638
|
-
description: s.description
|
|
639
|
-
}));
|
|
640
|
-
console.log(JSON.stringify(output, null, 2));
|
|
641
|
-
} else {
|
|
642
|
-
for (const [serverName, tools] of Object.entries(toolsByServer)) {
|
|
643
|
-
const omitDescription = clients.find((c) => c.serverName === serverName)?.omitToolDescription || false;
|
|
644
|
-
console.log(`\n${serverName}:`);
|
|
645
|
-
if (tools.length === 0) console.log(" No tools available");
|
|
646
|
-
else if (omitDescription) {
|
|
647
|
-
const toolNames = tools.map((t) => t.name).join(", ");
|
|
648
|
-
console.log(` ${toolNames}`);
|
|
649
|
-
} else for (const tool of tools) console.log(` - ${tool.name}: ${tool.description || "No description"}`);
|
|
650
|
-
}
|
|
651
|
-
if (skills.length > 0) {
|
|
652
|
-
console.log("\nskills:");
|
|
653
|
-
for (const skill of skills) console.log(` - ${skill.name}: ${skill.description}`);
|
|
654
|
-
}
|
|
633
|
+
const textBlock = (await new SearchListToolsTool(clientManager, new DefinitionsCacheService(clientManager, void 0, { cacheData })).execute({
|
|
634
|
+
capability: options.capability,
|
|
635
|
+
serverName: options.server
|
|
636
|
+
})).content.find((content) => content.type === "text");
|
|
637
|
+
const parsed = textBlock?.type === "text" ? JSON.parse(textBlock.text) : { servers: [] };
|
|
638
|
+
if (options.json) console.log(JSON.stringify(parsed, null, 2));
|
|
639
|
+
else {
|
|
640
|
+
if (!parsed.servers || parsed.servers.length === 0) throw new Error("No tools matched the requested filters");
|
|
641
|
+
printSearchResults(parsed);
|
|
655
642
|
}
|
|
656
643
|
await clientManager.disconnectAll();
|
|
657
644
|
} catch (error) {
|
|
658
|
-
console.error(`Error executing
|
|
645
|
+
console.error(`Error executing search-tools: ${toErrorMessage$4(error)}`);
|
|
659
646
|
process.exit(1);
|
|
660
647
|
}
|
|
661
648
|
});
|
|
@@ -1014,7 +1001,7 @@ const useToolCommand = new Command("use-tool").description("Execute an MCP tool
|
|
|
1014
1001
|
* - Hardcoded values (use options or environment variables)
|
|
1015
1002
|
* - Not exiting with appropriate exit codes on errors
|
|
1016
1003
|
*/
|
|
1017
|
-
function toErrorMessage$
|
|
1004
|
+
function toErrorMessage$3(error) {
|
|
1018
1005
|
return error instanceof Error ? error.message : String(error);
|
|
1019
1006
|
}
|
|
1020
1007
|
/**
|
|
@@ -1031,7 +1018,7 @@ const listResourcesCommand = new Command("list-resources").description("List all
|
|
|
1031
1018
|
await clientManager.connectToServer(serverName, serverConfig);
|
|
1032
1019
|
if (!options.json) console.error(`✓ Connected to ${serverName}`);
|
|
1033
1020
|
} catch (error) {
|
|
1034
|
-
if (!options.json) console.error(`✗ Failed to connect to ${serverName}: ${toErrorMessage$
|
|
1021
|
+
if (!options.json) console.error(`✗ Failed to connect to ${serverName}: ${toErrorMessage$3(error)}`);
|
|
1035
1022
|
}
|
|
1036
1023
|
}));
|
|
1037
1024
|
const clients = options.server ? [clientManager.getClient(options.server)].filter((c) => c !== void 0) : clientManager.getAllClients();
|
|
@@ -1054,7 +1041,7 @@ const listResourcesCommand = new Command("list-resources").description("List all
|
|
|
1054
1041
|
}
|
|
1055
1042
|
}));
|
|
1056
1043
|
for (const { serverName, resources, error } of resourceResults) {
|
|
1057
|
-
if (error && !options.json) console.error(`Failed to list resources from ${serverName}: ${toErrorMessage$
|
|
1044
|
+
if (error && !options.json) console.error(`Failed to list resources from ${serverName}: ${toErrorMessage$3(error)}`);
|
|
1058
1045
|
resourcesByServer[serverName] = resources;
|
|
1059
1046
|
}
|
|
1060
1047
|
if (options.json) console.log(JSON.stringify(resourcesByServer, null, 2));
|
|
@@ -1068,7 +1055,7 @@ const listResourcesCommand = new Command("list-resources").description("List all
|
|
|
1068
1055
|
}
|
|
1069
1056
|
await clientManager.disconnectAll();
|
|
1070
1057
|
} catch (error) {
|
|
1071
|
-
console.error(`Error executing list-resources: ${toErrorMessage$
|
|
1058
|
+
console.error(`Error executing list-resources: ${toErrorMessage$3(error)}`);
|
|
1072
1059
|
process.exit(1);
|
|
1073
1060
|
}
|
|
1074
1061
|
});
|
|
@@ -1096,7 +1083,7 @@ const listResourcesCommand = new Command("list-resources").description("List all
|
|
|
1096
1083
|
* - Hardcoded values (use options or environment variables)
|
|
1097
1084
|
* - Not exiting with appropriate exit codes on errors
|
|
1098
1085
|
*/
|
|
1099
|
-
function toErrorMessage(error) {
|
|
1086
|
+
function toErrorMessage$2(error) {
|
|
1100
1087
|
return error instanceof Error ? error.message : String(error);
|
|
1101
1088
|
}
|
|
1102
1089
|
/**
|
|
@@ -1113,7 +1100,7 @@ const readResourceCommand = new Command("read-resource").description("Read a res
|
|
|
1113
1100
|
await clientManager.connectToServer(serverName, serverConfig);
|
|
1114
1101
|
if (!options.json) console.error(`✓ Connected to ${serverName}`);
|
|
1115
1102
|
} catch (error) {
|
|
1116
|
-
console.error(`✗ Failed to connect to ${serverName}: ${toErrorMessage(error)}`);
|
|
1103
|
+
console.error(`✗ Failed to connect to ${serverName}: ${toErrorMessage$2(error)}`);
|
|
1117
1104
|
}
|
|
1118
1105
|
}));
|
|
1119
1106
|
const clients = clientManager.getAllClients();
|
|
@@ -1148,7 +1135,7 @@ const readResourceCommand = new Command("read-resource").description("Read a res
|
|
|
1148
1135
|
const matchingServers = [];
|
|
1149
1136
|
for (const { serverName, hasResource, error } of searchResults) {
|
|
1150
1137
|
if (error) {
|
|
1151
|
-
console.error(`Failed to list resources from ${serverName}: ${toErrorMessage(error)}`);
|
|
1138
|
+
console.error(`Failed to list resources from ${serverName}: ${toErrorMessage$2(error)}`);
|
|
1152
1139
|
continue;
|
|
1153
1140
|
}
|
|
1154
1141
|
if (hasResource) matchingServers.push(serverName);
|
|
@@ -1165,7 +1152,125 @@ const readResourceCommand = new Command("read-resource").description("Read a res
|
|
|
1165
1152
|
else console.log(JSON.stringify(content, null, 2));
|
|
1166
1153
|
await clientManager.disconnectAll();
|
|
1167
1154
|
} catch (error) {
|
|
1168
|
-
console.error(`Error executing read-resource: ${toErrorMessage(error)}`);
|
|
1155
|
+
console.error(`Error executing read-resource: ${toErrorMessage$2(error)}`);
|
|
1156
|
+
process.exit(1);
|
|
1157
|
+
}
|
|
1158
|
+
});
|
|
1159
|
+
|
|
1160
|
+
//#endregion
|
|
1161
|
+
//#region src/commands/list-prompts.ts
|
|
1162
|
+
function toErrorMessage$1(error) {
|
|
1163
|
+
return error instanceof Error ? error.message : String(error);
|
|
1164
|
+
}
|
|
1165
|
+
const listPromptsCommand = new Command("list-prompts").description("List all available prompts from connected MCP servers").option("-c, --config <path>", "Path to MCP server configuration file").option("-s, --server <name>", "Filter by server name").option("-j, --json", "Output as JSON", false).action(async (options) => {
|
|
1166
|
+
try {
|
|
1167
|
+
const configFilePath = options.config || findConfigFile();
|
|
1168
|
+
if (!configFilePath) throw new Error("No config file found. Use --config or create mcp-config.yaml");
|
|
1169
|
+
const config = await new ConfigFetcherService({ configFilePath }).fetchConfiguration();
|
|
1170
|
+
const clientManager = new McpClientManagerService();
|
|
1171
|
+
await Promise.all(Object.entries(config.mcpServers).map(async ([serverName, serverConfig]) => {
|
|
1172
|
+
try {
|
|
1173
|
+
await clientManager.connectToServer(serverName, serverConfig);
|
|
1174
|
+
if (!options.json) console.error(`✓ Connected to ${serverName}`);
|
|
1175
|
+
} catch (error) {
|
|
1176
|
+
if (!options.json) console.error(`✗ Failed to connect to ${serverName}: ${toErrorMessage$1(error)}`);
|
|
1177
|
+
}
|
|
1178
|
+
}));
|
|
1179
|
+
const clients = options.server ? [clientManager.getClient(options.server)].filter((client) => client !== void 0) : clientManager.getAllClients();
|
|
1180
|
+
if (clients.length === 0) throw new Error("No MCP servers connected");
|
|
1181
|
+
const promptsByServer = {};
|
|
1182
|
+
await Promise.all(clients.map(async (client) => {
|
|
1183
|
+
try {
|
|
1184
|
+
promptsByServer[client.serverName] = await client.listPrompts();
|
|
1185
|
+
} catch (error) {
|
|
1186
|
+
promptsByServer[client.serverName] = [];
|
|
1187
|
+
if (!options.json) console.error(`Failed to list prompts from ${client.serverName}: ${toErrorMessage$1(error)}`);
|
|
1188
|
+
}
|
|
1189
|
+
}));
|
|
1190
|
+
if (options.json) console.log(JSON.stringify(promptsByServer, null, 2));
|
|
1191
|
+
else for (const [serverName, prompts] of Object.entries(promptsByServer)) {
|
|
1192
|
+
console.log(`\n${serverName}:`);
|
|
1193
|
+
if (prompts.length === 0) {
|
|
1194
|
+
console.log(" No prompts available");
|
|
1195
|
+
continue;
|
|
1196
|
+
}
|
|
1197
|
+
for (const prompt of prompts) {
|
|
1198
|
+
console.log(` - ${prompt.name}: ${prompt.description || "No description"}`);
|
|
1199
|
+
if (prompt.arguments && prompt.arguments.length > 0) {
|
|
1200
|
+
const args = prompt.arguments.map((arg) => `${arg.name}${arg.required ? " (required)" : ""}`).join(", ");
|
|
1201
|
+
console.log(` args: ${args}`);
|
|
1202
|
+
}
|
|
1203
|
+
}
|
|
1204
|
+
}
|
|
1205
|
+
await clientManager.disconnectAll();
|
|
1206
|
+
} catch (error) {
|
|
1207
|
+
console.error(`Error executing list-prompts: ${toErrorMessage$1(error)}`);
|
|
1208
|
+
process.exit(1);
|
|
1209
|
+
}
|
|
1210
|
+
});
|
|
1211
|
+
|
|
1212
|
+
//#endregion
|
|
1213
|
+
//#region src/commands/get-prompt.ts
|
|
1214
|
+
function toErrorMessage(error) {
|
|
1215
|
+
return error instanceof Error ? error.message : String(error);
|
|
1216
|
+
}
|
|
1217
|
+
const getPromptCommand = new Command("get-prompt").description("Get a prompt by name from a connected MCP server").argument("<promptName>", "Prompt name to fetch").option("-c, --config <path>", "Path to MCP server configuration file").option("-s, --server <name>", "Server name (required if prompt exists on multiple servers)").option("-a, --args <json>", "Prompt arguments as JSON string", "{}").option("-j, --json", "Output as JSON", false).action(async (promptName, options) => {
|
|
1218
|
+
try {
|
|
1219
|
+
const configFilePath = options.config || findConfigFile();
|
|
1220
|
+
if (!configFilePath) throw new Error("No config file found. Use --config or create mcp-config.yaml");
|
|
1221
|
+
let promptArgs = {};
|
|
1222
|
+
try {
|
|
1223
|
+
promptArgs = JSON.parse(options.args);
|
|
1224
|
+
} catch {
|
|
1225
|
+
throw new Error("Invalid JSON in --args");
|
|
1226
|
+
}
|
|
1227
|
+
const config = await new ConfigFetcherService({ configFilePath }).fetchConfiguration();
|
|
1228
|
+
const clientManager = new McpClientManagerService();
|
|
1229
|
+
await Promise.all(Object.entries(config.mcpServers).map(async ([serverName, serverConfig]) => {
|
|
1230
|
+
try {
|
|
1231
|
+
await clientManager.connectToServer(serverName, serverConfig);
|
|
1232
|
+
if (!options.json) console.error(`✓ Connected to ${serverName}`);
|
|
1233
|
+
} catch (error) {
|
|
1234
|
+
if (!options.json) console.error(`✗ Failed to connect to ${serverName}: ${toErrorMessage(error)}`);
|
|
1235
|
+
}
|
|
1236
|
+
}));
|
|
1237
|
+
const clients = clientManager.getAllClients();
|
|
1238
|
+
if (clients.length === 0) throw new Error("No MCP servers connected");
|
|
1239
|
+
if (options.server) {
|
|
1240
|
+
const client$1 = clientManager.getClient(options.server);
|
|
1241
|
+
if (!client$1) throw new Error(`Server "${options.server}" not found`);
|
|
1242
|
+
const prompt$1 = await client$1.getPrompt(promptName, promptArgs);
|
|
1243
|
+
if (options.json) console.log(JSON.stringify(prompt$1, null, 2));
|
|
1244
|
+
else for (const message of prompt$1.messages) {
|
|
1245
|
+
const content = message.content;
|
|
1246
|
+
if (typeof content === "object" && content && "text" in content) console.log(content.text);
|
|
1247
|
+
else console.log(JSON.stringify(message, null, 2));
|
|
1248
|
+
}
|
|
1249
|
+
await clientManager.disconnectAll();
|
|
1250
|
+
return;
|
|
1251
|
+
}
|
|
1252
|
+
const matchingServers = [];
|
|
1253
|
+
await Promise.all(clients.map(async (client$1) => {
|
|
1254
|
+
try {
|
|
1255
|
+
if ((await client$1.listPrompts()).some((prompt$1) => prompt$1.name === promptName)) matchingServers.push(client$1.serverName);
|
|
1256
|
+
} catch (error) {
|
|
1257
|
+
if (!options.json) console.error(`Failed to list prompts from ${client$1.serverName}: ${toErrorMessage(error)}`);
|
|
1258
|
+
}
|
|
1259
|
+
}));
|
|
1260
|
+
if (matchingServers.length === 0) throw new Error(`Prompt "${promptName}" not found on any connected server`);
|
|
1261
|
+
if (matchingServers.length > 1) throw new Error(`Prompt "${promptName}" found on multiple servers: ${matchingServers.join(", ")}. Use --server to disambiguate`);
|
|
1262
|
+
const client = clientManager.getClient(matchingServers[0]);
|
|
1263
|
+
if (!client) throw new Error(`Internal error: Server "${matchingServers[0]}" not connected`);
|
|
1264
|
+
const prompt = await client.getPrompt(promptName, promptArgs);
|
|
1265
|
+
if (options.json) console.log(JSON.stringify(prompt, null, 2));
|
|
1266
|
+
else for (const message of prompt.messages) {
|
|
1267
|
+
const content = message.content;
|
|
1268
|
+
if (typeof content === "object" && content && "text" in content) console.log(content.text);
|
|
1269
|
+
else console.log(JSON.stringify(message, null, 2));
|
|
1270
|
+
}
|
|
1271
|
+
await clientManager.disconnectAll();
|
|
1272
|
+
} catch (error) {
|
|
1273
|
+
console.error(`Error executing get-prompt: ${toErrorMessage(error)}`);
|
|
1169
1274
|
process.exit(1);
|
|
1170
1275
|
}
|
|
1171
1276
|
});
|
|
@@ -1196,7 +1301,7 @@ const readResourceCommand = new Command("read-resource").description("Read a res
|
|
|
1196
1301
|
/**
|
|
1197
1302
|
* Pre-download packages used by MCP servers (npx, pnpx, uvx, uv)
|
|
1198
1303
|
*/
|
|
1199
|
-
const prefetchCommand = new Command("prefetch").description("Pre-download packages used by MCP servers (npx, pnpx, uvx, uv)").option("-c, --config <path>", "Path to MCP server configuration file").option("-p, --parallel", "Run prefetch commands in parallel", false).option("-d, --dry-run", "Show what would be prefetched without executing", false).option("-f, --filter <type>", "Filter by package manager type: npx, pnpx, uvx, or uv").action(async (options) => {
|
|
1304
|
+
const prefetchCommand = new Command("prefetch").description("Pre-download packages used by MCP servers (npx, pnpx, uvx, uv)").option("-c, --config <path>", "Path to MCP server configuration file").option("-p, --parallel", "Run prefetch commands in parallel", false).option("-d, --dry-run", "Show what would be prefetched without executing", false).option("-f, --filter <type>", "Filter by package manager type: npx, pnpx, uvx, or uv").option("--definitions-out <path>", "Write discovered definitions to a JSON or YAML cache file").option("--skip-packages", "Skip package prefetch and only build definitions cache", false).option("--clear-definitions-cache", "Delete the definitions cache file before continuing", false).action(async (options) => {
|
|
1200
1305
|
try {
|
|
1201
1306
|
const configFilePath = options.config || findConfigFile();
|
|
1202
1307
|
if (!configFilePath) {
|
|
@@ -1205,50 +1310,96 @@ const prefetchCommand = new Command("prefetch").description("Pre-download packag
|
|
|
1205
1310
|
process.exit(1);
|
|
1206
1311
|
}
|
|
1207
1312
|
print.info(`Loading configuration from: ${configFilePath}`);
|
|
1313
|
+
const mcpConfig = await new ConfigFetcherService({
|
|
1314
|
+
configFilePath,
|
|
1315
|
+
useCache: false
|
|
1316
|
+
}).fetchConfiguration(true);
|
|
1317
|
+
const serverId = mcpConfig.id || generateServerId();
|
|
1318
|
+
const configHash = DefinitionsCacheService.generateConfigHash(mcpConfig);
|
|
1319
|
+
const effectiveDefinitionsPath = options.definitionsOut || DefinitionsCacheService.getDefaultCachePath(configFilePath);
|
|
1208
1320
|
const prefetchService = new PrefetchService({
|
|
1209
|
-
mcpConfig
|
|
1210
|
-
configFilePath,
|
|
1211
|
-
useCache: false
|
|
1212
|
-
}).fetchConfiguration(true),
|
|
1321
|
+
mcpConfig,
|
|
1213
1322
|
filter: options.filter,
|
|
1214
1323
|
parallel: options.parallel
|
|
1215
1324
|
});
|
|
1216
1325
|
const packages = prefetchService.extractPackages();
|
|
1217
|
-
|
|
1326
|
+
const shouldPrefetchPackages = !options.skipPackages;
|
|
1327
|
+
const shouldWriteDefinitions = Boolean(options.definitionsOut);
|
|
1328
|
+
if (options.clearDefinitionsCache) if (options.dryRun) print.info(`Would clear definitions cache: ${effectiveDefinitionsPath}`);
|
|
1329
|
+
else {
|
|
1330
|
+
await DefinitionsCacheService.clearFile(effectiveDefinitionsPath);
|
|
1331
|
+
print.success(`Cleared definitions cache: ${effectiveDefinitionsPath}`);
|
|
1332
|
+
}
|
|
1333
|
+
if (shouldPrefetchPackages) if (packages.length === 0) {
|
|
1218
1334
|
print.warning("No packages found to prefetch.");
|
|
1219
1335
|
print.info("Prefetch supports: npx, pnpx, uvx, and uv run commands");
|
|
1336
|
+
} else {
|
|
1337
|
+
print.info(`Found ${packages.length} package(s) to prefetch:`);
|
|
1338
|
+
for (const pkg of packages) print.item(`${pkg.serverName}: ${pkg.packageManager} ${pkg.packageName}`);
|
|
1339
|
+
}
|
|
1340
|
+
if (!shouldPrefetchPackages && !shouldWriteDefinitions) {
|
|
1341
|
+
print.warning("Nothing to do. Use package prefetch or provide --definitions-out.");
|
|
1220
1342
|
return;
|
|
1221
1343
|
}
|
|
1222
|
-
print.info(`Found ${packages.length} package(s) to prefetch:`);
|
|
1223
|
-
for (const pkg of packages) print.item(`${pkg.serverName}: ${pkg.packageManager} ${pkg.packageName}`);
|
|
1224
1344
|
if (options.dryRun) {
|
|
1225
|
-
|
|
1226
|
-
|
|
1227
|
-
|
|
1345
|
+
if (shouldPrefetchPackages && packages.length > 0) {
|
|
1346
|
+
print.newline();
|
|
1347
|
+
print.header("Dry run mode - commands that would be executed:");
|
|
1348
|
+
for (const pkg of packages) print.indent(pkg.fullCommand.join(" "));
|
|
1349
|
+
}
|
|
1350
|
+
if (shouldWriteDefinitions) {
|
|
1351
|
+
print.newline();
|
|
1352
|
+
print.info(`Would write definitions cache to: ${effectiveDefinitionsPath}`);
|
|
1353
|
+
}
|
|
1228
1354
|
return;
|
|
1229
1355
|
}
|
|
1230
|
-
|
|
1231
|
-
|
|
1232
|
-
const summary = await prefetchService.prefetch();
|
|
1233
|
-
print.newline();
|
|
1234
|
-
if (summary.failed === 0) print.success(`Prefetch complete: ${summary.successful} succeeded, ${summary.failed} failed`);
|
|
1235
|
-
else print.warning(`Prefetch complete: ${summary.successful} succeeded, ${summary.failed} failed`);
|
|
1236
|
-
if (summary.failed > 0) {
|
|
1356
|
+
let packagePrefetchFailed = false;
|
|
1357
|
+
if (shouldPrefetchPackages && packages.length > 0) {
|
|
1237
1358
|
print.newline();
|
|
1238
|
-
print.
|
|
1239
|
-
|
|
1240
|
-
|
|
1359
|
+
print.info("Prefetching packages...");
|
|
1360
|
+
const summary = await prefetchService.prefetch();
|
|
1361
|
+
print.newline();
|
|
1362
|
+
if (summary.failed === 0) print.success(`Package prefetch complete: ${summary.successful} succeeded, ${summary.failed} failed`);
|
|
1363
|
+
else print.warning(`Package prefetch complete: ${summary.successful} succeeded, ${summary.failed} failed`);
|
|
1364
|
+
if (summary.failed > 0) {
|
|
1365
|
+
packagePrefetchFailed = true;
|
|
1366
|
+
print.newline();
|
|
1367
|
+
print.error("Failed packages:");
|
|
1368
|
+
for (const result of summary.results.filter((r) => !r.success)) print.item(`${result.package.serverName} (${result.package.packageName}): ${result.output.trim()}`);
|
|
1369
|
+
}
|
|
1241
1370
|
}
|
|
1371
|
+
if (shouldWriteDefinitions) {
|
|
1372
|
+
print.newline();
|
|
1373
|
+
print.info("Collecting definitions cache...");
|
|
1374
|
+
const clientManager = new McpClientManagerService();
|
|
1375
|
+
const skillPaths = mcpConfig.skills?.paths || [];
|
|
1376
|
+
const definitionsCacheService = new DefinitionsCacheService(clientManager, skillPaths.length > 0 ? new SkillService(process.cwd(), skillPaths) : void 0);
|
|
1377
|
+
await Promise.all(Object.entries(mcpConfig.mcpServers).map(async ([serverName, serverConfig]) => {
|
|
1378
|
+
try {
|
|
1379
|
+
await clientManager.connectToServer(serverName, serverConfig);
|
|
1380
|
+
print.item(`Connected for definitions: ${serverName}`);
|
|
1381
|
+
} catch (error) {
|
|
1382
|
+
print.warning(`Failed to connect for definitions: ${serverName} (${error instanceof Error ? error.message : String(error)})`);
|
|
1383
|
+
}
|
|
1384
|
+
}));
|
|
1385
|
+
const definitionsCache = await definitionsCacheService.collectForCache({
|
|
1386
|
+
configPath: configFilePath,
|
|
1387
|
+
configHash,
|
|
1388
|
+
oneMcpVersion: version,
|
|
1389
|
+
serverId
|
|
1390
|
+
});
|
|
1391
|
+
await DefinitionsCacheService.writeToFile(effectiveDefinitionsPath, definitionsCache);
|
|
1392
|
+
print.success(`Definitions cache written: ${effectiveDefinitionsPath} (${Object.keys(definitionsCache.servers).length} servers, ${definitionsCache.skills.length} skills)`);
|
|
1393
|
+
if (definitionsCache.failures.length > 0) print.warning(`Definitions cache completed with ${definitionsCache.failures.length} server failure(s)`);
|
|
1394
|
+
await clientManager.disconnectAll();
|
|
1395
|
+
}
|
|
1396
|
+
if (packagePrefetchFailed) process.exit(1);
|
|
1242
1397
|
} catch (error) {
|
|
1243
1398
|
print.error("Error executing prefetch:", error instanceof Error ? error.message : String(error));
|
|
1244
1399
|
process.exit(1);
|
|
1245
1400
|
}
|
|
1246
1401
|
});
|
|
1247
1402
|
|
|
1248
|
-
//#endregion
|
|
1249
|
-
//#region package.json
|
|
1250
|
-
var version = "0.3.10";
|
|
1251
|
-
|
|
1252
1403
|
//#endregion
|
|
1253
1404
|
//#region src/cli.ts
|
|
1254
1405
|
/**
|
|
@@ -1278,11 +1429,13 @@ async function main() {
|
|
|
1278
1429
|
program.name("one-mcp").description("One MCP server package").version(version);
|
|
1279
1430
|
program.addCommand(initCommand);
|
|
1280
1431
|
program.addCommand(mcpServeCommand);
|
|
1281
|
-
program.addCommand(
|
|
1432
|
+
program.addCommand(searchToolsCommand);
|
|
1282
1433
|
program.addCommand(describeToolsCommand);
|
|
1283
1434
|
program.addCommand(useToolCommand);
|
|
1284
1435
|
program.addCommand(listResourcesCommand);
|
|
1285
1436
|
program.addCommand(readResourceCommand);
|
|
1437
|
+
program.addCommand(listPromptsCommand);
|
|
1438
|
+
program.addCommand(getPromptCommand);
|
|
1286
1439
|
program.addCommand(prefetchCommand);
|
|
1287
1440
|
await program.parseAsync(process.argv);
|
|
1288
1441
|
} catch (error) {
|