nuwax-mcp-stdio-proxy 1.4.1 → 1.4.3
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/dist/index.js +17 -5
- package/dist/modes/stdio.js +16 -3
- package/dist/types.d.ts +12 -0
- package/dist/types.js +5 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -6809,7 +6809,9 @@ var logError = (msg) => log("ERROR", msg);
|
|
|
6809
6809
|
|
|
6810
6810
|
// src/types.ts
|
|
6811
6811
|
function isSseEntry(entry) {
|
|
6812
|
-
|
|
6812
|
+
if (!("url" in entry)) return false;
|
|
6813
|
+
const e = entry;
|
|
6814
|
+
return e.transport === "sse" || !e.transport && /\/sse(?:\?|$)/i.test(e.url);
|
|
6813
6815
|
}
|
|
6814
6816
|
function isStreamableEntry(entry) {
|
|
6815
6817
|
return "url" in entry && typeof entry.url === "string" && !isSseEntry(entry);
|
|
@@ -23761,7 +23763,7 @@ var StdioServerTransport = class {
|
|
|
23761
23763
|
|
|
23762
23764
|
// src/constants.ts
|
|
23763
23765
|
var PKG_NAME = "nuwax-mcp-stdio-proxy";
|
|
23764
|
-
var PKG_VERSION = "1.4.
|
|
23766
|
+
var PKG_VERSION = "1.4.3";
|
|
23765
23767
|
|
|
23766
23768
|
// src/shared.ts
|
|
23767
23769
|
async function discoverTools(client) {
|
|
@@ -23865,11 +23867,21 @@ async function runStdio(config2, allowTools, denyTools) {
|
|
|
23865
23867
|
const { client, cleanup } = connected;
|
|
23866
23868
|
clients.set(id, client);
|
|
23867
23869
|
cleanups.set(id, cleanup);
|
|
23868
|
-
|
|
23870
|
+
let serverTools = await discoverTools(client);
|
|
23871
|
+
if (entry.allowTools || entry.denyTools) {
|
|
23872
|
+
const perFilter = {};
|
|
23873
|
+
if (entry.allowTools) perFilter.allowTools = new Set(entry.allowTools);
|
|
23874
|
+
if (entry.denyTools) perFilter.denyTools = new Set(entry.denyTools);
|
|
23875
|
+
const before = serverTools.length;
|
|
23876
|
+
serverTools = filterTools(serverTools, perFilter);
|
|
23877
|
+
if (serverTools.length !== before) {
|
|
23878
|
+
logInfo(`Server "${id}": filtered ${before} \u2192 ${serverTools.length} tool(s)`);
|
|
23879
|
+
}
|
|
23880
|
+
}
|
|
23869
23881
|
logInfo(
|
|
23870
|
-
`Server "${id}": ${
|
|
23882
|
+
`Server "${id}": ${serverTools.length} tool(s)${serverTools.length > 0 ? " \u2014 " + serverTools.map((t) => t.name).join(", ") : ""}`
|
|
23871
23883
|
);
|
|
23872
|
-
for (const tool of
|
|
23884
|
+
for (const tool of serverTools) {
|
|
23873
23885
|
if (toolToClient.has(tool.name)) {
|
|
23874
23886
|
logWarn(
|
|
23875
23887
|
`Tool "${tool.name}" from "${id}" shadows existing tool from "${toolToServer.get(tool.name)}"`
|
package/dist/modes/stdio.js
CHANGED
|
@@ -38,9 +38,22 @@ export async function runStdio(config, allowTools, denyTools) {
|
|
|
38
38
|
const { client, cleanup } = connected;
|
|
39
39
|
clients.set(id, client);
|
|
40
40
|
cleanups.set(id, cleanup);
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
41
|
+
let serverTools = await discoverTools(client);
|
|
42
|
+
// Per-server tool filtering (allowTools/denyTools in config entry)
|
|
43
|
+
if (entry.allowTools || entry.denyTools) {
|
|
44
|
+
const perFilter = {};
|
|
45
|
+
if (entry.allowTools)
|
|
46
|
+
perFilter.allowTools = new Set(entry.allowTools);
|
|
47
|
+
if (entry.denyTools)
|
|
48
|
+
perFilter.denyTools = new Set(entry.denyTools);
|
|
49
|
+
const before = serverTools.length;
|
|
50
|
+
serverTools = filterTools(serverTools, perFilter);
|
|
51
|
+
if (serverTools.length !== before) {
|
|
52
|
+
logInfo(`Server "${id}": filtered ${before} → ${serverTools.length} tool(s)`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
logInfo(`Server "${id}": ${serverTools.length} tool(s)${serverTools.length > 0 ? ' — ' + serverTools.map((t) => t.name).join(', ') : ''}`);
|
|
56
|
+
for (const tool of serverTools) {
|
|
44
57
|
if (toolToClient.has(tool.name)) {
|
|
45
58
|
logWarn(`Tool "${tool.name}" from "${id}" shadows existing tool from "${toolToServer.get(tool.name)}"`);
|
|
46
59
|
}
|
package/dist/types.d.ts
CHANGED
|
@@ -6,6 +6,10 @@ export interface StdioServerEntry {
|
|
|
6
6
|
command: string;
|
|
7
7
|
args?: string[];
|
|
8
8
|
env?: Record<string, string>;
|
|
9
|
+
/** 工具白名单(只暴露指定工具) */
|
|
10
|
+
allowTools?: string[];
|
|
11
|
+
/** 工具黑名单(排除指定工具) */
|
|
12
|
+
denyTools?: string[];
|
|
9
13
|
}
|
|
10
14
|
/**
|
|
11
15
|
* Streamable HTTP 类型: 连接远程 MCP server (Streamable HTTP)
|
|
@@ -18,6 +22,10 @@ export interface StreamableServerEntry {
|
|
|
18
22
|
transport?: 'streamable-http';
|
|
19
23
|
headers?: Record<string, string>;
|
|
20
24
|
authToken?: string;
|
|
25
|
+
/** 工具白名单(只暴露指定工具) */
|
|
26
|
+
allowTools?: string[];
|
|
27
|
+
/** 工具黑名单(排除指定工具) */
|
|
28
|
+
denyTools?: string[];
|
|
21
29
|
}
|
|
22
30
|
/**
|
|
23
31
|
* SSE 类型: 连接远程 MCP server (Server-Sent Events)
|
|
@@ -29,6 +37,10 @@ export interface SseServerEntry {
|
|
|
29
37
|
transport: 'sse';
|
|
30
38
|
headers?: Record<string, string>;
|
|
31
39
|
authToken?: string;
|
|
40
|
+
/** 工具白名单(只暴露指定工具) */
|
|
41
|
+
allowTools?: string[];
|
|
42
|
+
/** 工具黑名单(排除指定工具) */
|
|
43
|
+
denyTools?: string[];
|
|
32
44
|
}
|
|
33
45
|
export type McpServerEntry = StdioServerEntry | StreamableServerEntry | SseServerEntry;
|
|
34
46
|
export declare function isSseEntry(entry: McpServerEntry): entry is SseServerEntry;
|
package/dist/types.js
CHANGED
|
@@ -2,7 +2,11 @@
|
|
|
2
2
|
* Types for MCP server configuration
|
|
3
3
|
*/
|
|
4
4
|
export function isSseEntry(entry) {
|
|
5
|
-
|
|
5
|
+
if (!('url' in entry))
|
|
6
|
+
return false;
|
|
7
|
+
const e = entry;
|
|
8
|
+
// Explicit transport: 'sse' or URL path contains /sse (auto-detect)
|
|
9
|
+
return e.transport === 'sse' || (!e.transport && /\/sse(?:\?|$)/i.test(e.url));
|
|
6
10
|
}
|
|
7
11
|
export function isStreamableEntry(entry) {
|
|
8
12
|
return ('url' in entry &&
|
package/package.json
CHANGED