@branch42-labs/netraptor-mcp 0.3.0 → 0.3.2
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/cli.d.ts +1 -1
- package/dist/cli.js +1 -43
- package/dist/cli.js.map +1 -1
- package/dist/main.d.ts +1 -0
- package/dist/main.js +64 -0
- package/dist/main.js.map +1 -0
- package/dist/mcp-server.js +6 -4
- package/dist/mcp-server.js.map +1 -1
- package/package.json +1 -1
package/dist/cli.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
export
|
|
2
|
+
export {};
|
package/dist/cli.js
CHANGED
|
@@ -1,47 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import {
|
|
3
|
-
import { ExtensionBridgeServer } from "./bridge-server.js";
|
|
4
|
-
import { createMcpServer } from "./mcp-server.js";
|
|
5
|
-
import { readPairingConfig, writePairingConfig } from "./pairing.js";
|
|
6
|
-
function usage() {
|
|
7
|
-
return `Netraptor local MCP server
|
|
8
|
-
|
|
9
|
-
Usage:
|
|
10
|
-
netraptor-mcp Start the stdio MCP server and localhost bridge
|
|
11
|
-
netraptor-mcp pair <CODE> Pair this computer with the Netraptor extension
|
|
12
|
-
netraptor-mcp --help Show this help
|
|
13
|
-
|
|
14
|
-
Environment:
|
|
15
|
-
NETRAPTOR_MCP_PORT WebSocket port (default: 47321)
|
|
16
|
-
NETRAPTOR_HOME Config directory override (tests/advanced use)`;
|
|
17
|
-
}
|
|
18
|
-
export async function main(argv = process.argv.slice(2)) {
|
|
19
|
-
if (argv[0] === "--help" || argv[0] === "-h" || argv[0] === "help") {
|
|
20
|
-
process.stdout.write(`${usage()}\n`);
|
|
21
|
-
return;
|
|
22
|
-
}
|
|
23
|
-
if (argv[0] === "pair") {
|
|
24
|
-
if (!argv[1])
|
|
25
|
-
throw new Error("Usage: netraptor-mcp pair <CODE>");
|
|
26
|
-
await writePairingConfig(argv.slice(1).join(""));
|
|
27
|
-
process.stdout.write("Paired with Netraptor.\n");
|
|
28
|
-
return;
|
|
29
|
-
}
|
|
30
|
-
if (argv.length > 0)
|
|
31
|
-
throw new Error(`Unknown command: ${argv[0]}\n\n${usage()}`);
|
|
32
|
-
const rawPort = process.env.NETRAPTOR_MCP_PORT ?? "47321";
|
|
33
|
-
const port = Number(rawPort);
|
|
34
|
-
if (!Number.isInteger(port) || port < 1 || port > 65535) {
|
|
35
|
-
throw new Error(`Invalid NETRAPTOR_MCP_PORT: ${rawPort}`);
|
|
36
|
-
}
|
|
37
|
-
const bridge = new ExtensionBridgeServer(await readPairingConfig(), "127.0.0.1", port, undefined, () => readPairingConfig());
|
|
38
|
-
await bridge.listen();
|
|
39
|
-
const mcp = createMcpServer(bridge);
|
|
40
|
-
await mcp.connect(new StdioServerTransport());
|
|
41
|
-
const shutdown = () => void bridge.close().finally(() => process.exit(0));
|
|
42
|
-
process.once("SIGINT", shutdown);
|
|
43
|
-
process.once("SIGTERM", shutdown);
|
|
44
|
-
}
|
|
2
|
+
import { main } from "./main.js";
|
|
45
3
|
main().catch((error) => {
|
|
46
4
|
process.stderr.write(`${error instanceof Error ? error.message : String(error)}\n`);
|
|
47
5
|
process.exitCode = 1;
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;IAC9B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACpF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC,CAAC,CAAC"}
|
package/dist/main.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function main(argv?: string[]): Promise<void>;
|
package/dist/main.js
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { StdioServerTransport } from "@modelcontextprotocol/server/stdio";
|
|
2
|
+
import { ExtensionBridgeServer } from "./bridge-server.js";
|
|
3
|
+
import { createMcpServer } from "./mcp-server.js";
|
|
4
|
+
import { readPairingConfig, writePairingConfig } from "./pairing.js";
|
|
5
|
+
function usage() {
|
|
6
|
+
return `Netraptor local MCP server
|
|
7
|
+
|
|
8
|
+
Usage:
|
|
9
|
+
netraptor-mcp Start the stdio MCP server and localhost bridge
|
|
10
|
+
netraptor-mcp pair <CODE> Pair this computer with the Netraptor extension
|
|
11
|
+
netraptor-mcp --help Show this help
|
|
12
|
+
|
|
13
|
+
Environment:
|
|
14
|
+
NETRAPTOR_MCP_PORT WebSocket port (default: 47321)
|
|
15
|
+
NETRAPTOR_HOME Config directory override (tests/advanced use)`;
|
|
16
|
+
}
|
|
17
|
+
export async function main(argv = process.argv.slice(2)) {
|
|
18
|
+
if (argv[0] === "--help" || argv[0] === "-h" || argv[0] === "help") {
|
|
19
|
+
process.stdout.write(`${usage()}\n`);
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
if (argv[0] === "pair") {
|
|
23
|
+
if (!argv[1])
|
|
24
|
+
throw new Error("Usage: netraptor-mcp pair <CODE>");
|
|
25
|
+
await writePairingConfig(argv.slice(1).join(""));
|
|
26
|
+
process.stdout.write("Paired with Netraptor.\n");
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
if (argv.length > 0)
|
|
30
|
+
throw new Error(`Unknown command: ${argv[0]}\n\n${usage()}`);
|
|
31
|
+
const rawPort = process.env.NETRAPTOR_MCP_PORT ?? "47321";
|
|
32
|
+
const port = Number(rawPort);
|
|
33
|
+
if (!Number.isInteger(port) || port < 1 || port > 65535) {
|
|
34
|
+
throw new Error(`Invalid NETRAPTOR_MCP_PORT: ${rawPort}`);
|
|
35
|
+
}
|
|
36
|
+
const bridge = new ExtensionBridgeServer(await readPairingConfig(), "127.0.0.1", port, undefined, () => readPairingConfig());
|
|
37
|
+
try {
|
|
38
|
+
await bridge.listen();
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
if (error instanceof Error && "code" in error && error.code === "EADDRINUSE") {
|
|
42
|
+
throw new Error(`Another netraptor-mcp is already listening on 127.0.0.1:${port} (possibly an orphaned instance). Stop it or set NETRAPTOR_MCP_PORT to a different port.`);
|
|
43
|
+
}
|
|
44
|
+
throw error;
|
|
45
|
+
}
|
|
46
|
+
const mcp = createMcpServer(bridge);
|
|
47
|
+
await mcp.connect(new StdioServerTransport());
|
|
48
|
+
let closing = false;
|
|
49
|
+
const shutdown = () => {
|
|
50
|
+
if (closing)
|
|
51
|
+
return;
|
|
52
|
+
closing = true;
|
|
53
|
+
void bridge.close().finally(() => process.exit(0));
|
|
54
|
+
};
|
|
55
|
+
const onclose = mcp.server.onclose;
|
|
56
|
+
mcp.server.onclose = () => {
|
|
57
|
+
onclose?.();
|
|
58
|
+
shutdown();
|
|
59
|
+
};
|
|
60
|
+
process.stdin.once("end", shutdown);
|
|
61
|
+
process.once("SIGINT", shutdown);
|
|
62
|
+
process.once("SIGTERM", shutdown);
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=main.js.map
|
package/dist/main.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp-server.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
|
+
import { createRequire } from "node:module";
|
|
1
2
|
import { McpServer } from "@modelcontextprotocol/server";
|
|
2
3
|
import * as z from "zod/v4";
|
|
4
|
+
const { version } = createRequire(import.meta.url)("../package.json");
|
|
3
5
|
function text(value) {
|
|
4
6
|
return {
|
|
5
7
|
content: [{
|
|
@@ -9,13 +11,13 @@ function text(value) {
|
|
|
9
11
|
};
|
|
10
12
|
}
|
|
11
13
|
export function createMcpServer(bridge) {
|
|
12
|
-
const server = new McpServer({ name: "netraptor", version
|
|
14
|
+
const server = new McpServer({ name: "netraptor", version });
|
|
13
15
|
const proxy = async (method, params) => {
|
|
14
16
|
try {
|
|
15
17
|
return text(await bridge.request(method, params));
|
|
16
18
|
}
|
|
17
19
|
catch (error) {
|
|
18
|
-
return text(error instanceof Error ? error.message : String(error));
|
|
20
|
+
return { ...text(error instanceof Error ? error.message : String(error)), isError: true };
|
|
19
21
|
}
|
|
20
22
|
};
|
|
21
23
|
server.registerTool("list_sessions", {
|
|
@@ -51,7 +53,7 @@ export function createMcpServer(bridge) {
|
|
|
51
53
|
}).refine(({ key, method, template }) => Boolean(key || (method && template)), { message: "Provide key, or both method and template." }),
|
|
52
54
|
}, (params) => proxy("get_endpoint", params));
|
|
53
55
|
server.registerTool("search", {
|
|
54
|
-
description: "Search captured endpoint templates, URLs, and GraphQL operation names. Returns compact results,
|
|
56
|
+
description: "Search captured endpoint templates, URLs, and GraphQL operation names. Returns compact results (key, method, template, GraphQL operation, calls, statuses; no params or URLs, use get_endpoint for those) and the total before limiting.",
|
|
55
57
|
inputSchema: z.object({
|
|
56
58
|
query: z.string().min(1).describe("Case-insensitive endpoint search text."),
|
|
57
59
|
limit: z.number().int().min(1).max(100).default(20)
|
|
@@ -59,7 +61,7 @@ export function createMcpServer(bridge) {
|
|
|
59
61
|
}),
|
|
60
62
|
}, (params) => proxy("search", params));
|
|
61
63
|
server.registerTool("get_request", {
|
|
62
|
-
description: "Get one captured request with sensitive headers, URL parameters, and top-level JSON fields redacted and bodies bounded. Netraptor records from inside the page, so requestHeaders only contains headers the site's code set (not browser-added ones like cookies or user-agent). status 0 comes with failure: network-error, aborted, timeout,
|
|
64
|
+
description: "Get one captured request with sensitive headers, URL parameters, and top-level JSON fields redacted and bodies bounded. Netraptor records from inside the page, so requestHeaders only contains headers the site's code set (not browser-added ones like cookies or user-agent). status 0 comes with failure: network-error, aborted, timeout, opaque (no-cors), or unknown (recorded before Netraptor tracked failures). bodyTruncated is true when either the capture or maxBodyChars cut a body.",
|
|
63
65
|
inputSchema: z.object({
|
|
64
66
|
id: z.number().int().positive().describe("Captured request ID."),
|
|
65
67
|
maxBodyChars: z.number().int().min(100).max(200_000).default(20_000)
|
package/dist/mcp-server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-server.js","sourceRoot":"","sources":["../src/mcp-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AACzD,OAAO,KAAK,CAAC,MAAM,QAAQ,CAAC;AAG5B,SAAS,IAAI,CAAC,KAAc;IAC1B,OAAO;QACL,OAAO,EAAE,CAAC;gBACR,IAAI,EAAE,MAAe;gBACrB,IAAI,EAAE,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;aACzE,CAAC;KACH,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,MAA8C;IAC5E,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"mcp-server.js","sourceRoot":"","sources":["../src/mcp-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AACzD,OAAO,KAAK,CAAC,MAAM,QAAQ,CAAC;AAG5B,MAAM,EAAE,OAAO,EAAE,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,iBAAiB,CAAwB,CAAC;AAE7F,SAAS,IAAI,CAAC,KAAc;IAC1B,OAAO;QACL,OAAO,EAAE,CAAC;gBACR,IAAI,EAAE,MAAe;gBACrB,IAAI,EAAE,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;aACzE,CAAC;KACH,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,MAA8C;IAC5E,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC;IAC7D,MAAM,KAAK,GAAG,KAAK,EAAE,MAAc,EAAE,MAA+B,EAAE,EAAE;QACtE,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;QACpD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC5F,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,CAAC,YAAY,CAAC,eAAe,EAAE;QACnC,WAAW,EAAE,2CAA2C;QACxD,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;KAC1B,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC,CAAC;IAErC,MAAM,CAAC,YAAY,CAAC,gBAAgB,EAAE;QACpC,WAAW,EAAE,4JAA4J;QACzK,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACpB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;iBAC9C,QAAQ,CAAC,sDAAsD,CAAC;YACnE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC;iBACnD,QAAQ,CAAC,+DAA+D,CAAC;SAC7E,CAAC;KACH,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,KAAK,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC,CAAC;IAEhD,MAAM,CAAC,YAAY,CAAC,cAAc,EAAE;QAClC,WAAW,EAAE,oNAAoN;QACjO,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACpB,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;iBAC9B,QAAQ,CAAC,2DAA2D,CAAC;YACxE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;iBACjC,QAAQ,CAAC,0DAA0D,CAAC;YACvE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;iBACnC,QAAQ,CAAC,mEAAmE,CAAC;YAChF,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;iBACxC,QAAQ,CAAC,uEAAuE,CAAC;YACpF,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;iBAC9C,QAAQ,CAAC,sDAAsD,CAAC;YACnE,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;iBACnD,QAAQ,CAAC,6DAA6D,CAAC;YAC1E,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;iBAC/D,QAAQ,CAAC,oFAAoF,CAAC;SAClG,CAAC,CAAC,MAAM,CACP,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,QAAQ,CAAC,CAAC,EACnE,EAAE,OAAO,EAAE,2CAA2C,EAAE,CACzD;KACF,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,KAAK,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC,CAAC;IAE9C,MAAM,CAAC,YAAY,CAAC,QAAQ,EAAE;QAC5B,WAAW,EAAE,0OAA0O;QACvP,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACpB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,wCAAwC,CAAC;YAC3E,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;iBAChD,QAAQ,CAAC,0DAA0D,CAAC;SACxE,CAAC;KACH,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;IAExC,MAAM,CAAC,YAAY,CAAC,aAAa,EAAE;QACjC,WAAW,EAAE,qeAAqe;QAClf,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACpB,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC;YAChE,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;iBACjE,QAAQ,CAAC,mFAAmF,CAAC;SACjG,CAAC;KACH,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,KAAK,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC;IAC7C,OAAO,MAAM,CAAC;AAChB,CAAC"}
|