@grackle-ai/mcp-stdio 0.110.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/README.md ADDED
@@ -0,0 +1,79 @@
1
+ # @grackle-ai/mcp-stdio
2
+
3
+ <p align="center">
4
+ <a href="https://www.npmjs.com/package/@grackle-ai/mcp-stdio"><img src="https://img.shields.io/npm/v/@grackle-ai/mcp-stdio.svg" alt="npm version" /></a>
5
+ <a href="https://github.com/nick-pape/grackle/actions/workflows/ci.yml"><img src="https://github.com/nick-pape/grackle/actions/workflows/ci.yml/badge.svg?branch=main" alt="CI" /></a>
6
+ <a href="https://opensource.org/licenses/MIT"><img src="https://img.shields.io/badge/License-MIT-yellow.svg" alt="License: MIT" /></a>
7
+ </p>
8
+
9
+ <p align="center">
10
+ <img src="https://raw.githubusercontent.com/nick-pape/grackle/main/apps/docs-site/static/img/grackle-logo.png" alt="Grackle" width="200" />
11
+ </p>
12
+
13
+ stdio-to-HTTP MCP proxy for [Grackle](https://github.com/nick-pape/grackle). Bridges MCP clients that only speak stdio (Claude Desktop, Codex CLI, Clawpilot) to a running Grackle HTTP MCP server using static API-key auth — no OAuth flow required.
14
+
15
+ ## Quick Start
16
+
17
+ Add to your MCP client config:
18
+
19
+ ```json
20
+ {
21
+ "grackle": {
22
+ "command": "npx",
23
+ "args": ["-y", "@grackle-ai/mcp-stdio"],
24
+ "env": {
25
+ "GRACKLE_URL": "http://127.0.0.1:7435/mcp",
26
+ "GRACKLE_API_KEY": "<your-api-key>"
27
+ }
28
+ }
29
+ }
30
+ ```
31
+
32
+ Or run directly:
33
+
34
+ ```bash
35
+ GRACKLE_URL=http://127.0.0.1:7435/mcp GRACKLE_API_KEY=<key> npx @grackle-ai/mcp-stdio
36
+ ```
37
+
38
+ Requires **Node.js >= 22**.
39
+
40
+ ## Configuration
41
+
42
+ | Variable | Description | Default |
43
+ | --- | --- | --- |
44
+ | `GRACKLE_URL` | Full URL of the Grackle MCP HTTP endpoint | `http://127.0.0.1:7435/mcp` |
45
+ | `GRACKLE_API_KEY` | API key for authenticating with the Grackle server. **Required** — the proxy exits with an error if not set. | *(none)* |
46
+
47
+ The API key is the 64-character hex token stored in `~/.grackle/api-key` on the machine running the Grackle server. For a Docker deployment, see the section below.
48
+
49
+ ---
50
+
51
+ ## Docker Quick Start
52
+
53
+ The published Grackle image exposes the MCP port (7435) by default when using the provided `docker-compose.yml`:
54
+
55
+ ```bash
56
+ # Start Grackle
57
+ docker compose up -d
58
+
59
+ # Read the API key from the container's volume
60
+ docker exec grackle cat /data/.grackle/api-key
61
+ ```
62
+
63
+ Then use the key in your MCP client config as shown above, with `GRACKLE_URL=http://127.0.0.1:7435/mcp`.
64
+
65
+ > **Multi-tenant hosts:** The default `docker-compose.yml` binding exposes port 7435 on all interfaces. To restrict to loopback, change the port mapping to `"127.0.0.1:7435:7435"` in your compose file.
66
+
67
+ ---
68
+
69
+ ## How It Works
70
+
71
+ `@grackle-ai/mcp-stdio` spawns a local stdio MCP server that forwards every `tools/list` and `tools/call` request to the Grackle HTTP MCP server over Streamable HTTP. Tool discovery is fully dynamic — the proxy calls `listTools` upstream on every request so new Grackle tools are automatically available without updating the proxy.
72
+
73
+ On any network error the proxy reconnects once before propagating the failure. No OAuth flow, no token expiry.
74
+
75
+ ---
76
+
77
+ ## License
78
+
79
+ MIT
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env node
2
+ import { main } from "./proxy.js";
3
+ main().catch((err) => {
4
+ process.stderr.write(`Fatal: ${err instanceof Error ? err.message : String(err)}\n`);
5
+ process.exit(1);
6
+ });
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAElC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;IAC5B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACrF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,32 @@
1
+ import { Client } from "@modelcontextprotocol/sdk/client/index.js";
2
+ import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
3
+ import { Server } from "@modelcontextprotocol/sdk/server/index.js";
4
+ /** Create a fresh upstream transport pointing at the Grackle HTTP MCP server. */
5
+ export declare function newTransport(grackleUrl: string, apiKey: string): StreamableHTTPClientTransport;
6
+ /** Manages the upstream client as a promise to avoid async assignment races. */
7
+ export interface ClientManager {
8
+ getClient: () => Promise<Client>;
9
+ resetClient: () => void;
10
+ }
11
+ /** Create a ClientManager that lazily connects and reconnects on demand. */
12
+ export declare function createClientManager(grackleUrl: string, apiKey: string): ClientManager;
13
+ /**
14
+ * Returns true for errors that indicate a transient transport or connectivity
15
+ * failure and are safe to retry without risk of duplicating side effects.
16
+ * Application-level errors (e.g. invalid tool arguments) are not transport
17
+ * errors and should propagate immediately without a retry.
18
+ * Exported for testability.
19
+ */
20
+ export declare function isTransportError(err: unknown): boolean;
21
+ /**
22
+ * Call `fn` with the upstream client, reconnecting once on transient transport
23
+ * errors. Non-transport errors (application errors, tool errors) propagate
24
+ * immediately without retry to avoid duplicating side effects.
25
+ * Exported for testability.
26
+ */
27
+ export declare function withReconnect<T>(manager: ClientManager, fn: (c: Client) => Promise<T>): Promise<T>;
28
+ /** Create the stdio MCP server that proxies all requests to the Grackle HTTP MCP server. */
29
+ export declare function createProxyServer(grackleUrl: string, apiKey: string): Server;
30
+ /** Start the proxy: connect upstream, then attach to stdio and serve. */
31
+ export declare function main(): Promise<void>;
32
+ //# sourceMappingURL=proxy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../src/proxy.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAC;AACnG,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAcnE,iFAAiF;AACjF,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,6BAA6B,CAI9F;AAWD,gFAAgF;AAChF,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACjC,WAAW,EAAE,MAAM,IAAI,CAAC;CACzB;AAED,4EAA4E;AAC5E,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,aAAa,CAsBrF;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAiBtD;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CAAC,CAAC,EACnC,OAAO,EAAE,aAAa,EACtB,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,GAC5B,OAAO,CAAC,CAAC,CAAC,CAYZ;AAED,4FAA4F;AAC5F,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAsB5E;AAED,yEAAyE;AACzE,wBAAsB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAiB1C"}
package/dist/proxy.js ADDED
@@ -0,0 +1,117 @@
1
+ import { createRequire } from "node:module";
2
+ import { Client } from "@modelcontextprotocol/sdk/client/index.js";
3
+ import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
4
+ import { Server } from "@modelcontextprotocol/sdk/server/index.js";
5
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
6
+ import { ListToolsRequestSchema, CallToolRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
7
+ const esmRequire = createRequire(import.meta.url);
8
+ const { version } = esmRequire("../package.json");
9
+ /** Default MCP HTTP endpoint when GRACKLE_URL is not set. */
10
+ const DEFAULT_GRACKLE_URL = "http://127.0.0.1:7435/mcp";
11
+ /** Create a fresh upstream transport pointing at the Grackle HTTP MCP server. */
12
+ export function newTransport(grackleUrl, apiKey) {
13
+ return new StreamableHTTPClientTransport(new URL(grackleUrl), {
14
+ requestInit: { headers: { Authorization: `Bearer ${apiKey}` } },
15
+ });
16
+ }
17
+ /** Create and connect a new upstream MCP client. */
18
+ function connect(grackleUrl, apiKey) {
19
+ const c = new Client({ name: "grackle-mcp-stdio", version }, { capabilities: {} });
20
+ return c.connect(newTransport(grackleUrl, apiKey)).then(() => c);
21
+ }
22
+ /** Create a ClientManager that lazily connects and reconnects on demand. */
23
+ export function createClientManager(grackleUrl, apiKey) {
24
+ let upstreamPromise;
25
+ function getClient() {
26
+ if (!upstreamPromise) {
27
+ // Assign synchronously so concurrent callers share the same promise.
28
+ // On failure, clear so the next call retries.
29
+ upstreamPromise = connect(grackleUrl, apiKey).catch((err) => {
30
+ upstreamPromise = undefined;
31
+ throw err;
32
+ });
33
+ }
34
+ return upstreamPromise;
35
+ }
36
+ function resetClient() {
37
+ const old = upstreamPromise;
38
+ upstreamPromise = undefined;
39
+ old?.then((c) => c.close()).catch(() => { });
40
+ }
41
+ return { getClient, resetClient };
42
+ }
43
+ /**
44
+ * Returns true for errors that indicate a transient transport or connectivity
45
+ * failure and are safe to retry without risk of duplicating side effects.
46
+ * Application-level errors (e.g. invalid tool arguments) are not transport
47
+ * errors and should propagate immediately without a retry.
48
+ * Exported for testability.
49
+ */
50
+ export function isTransportError(err) {
51
+ if (err instanceof TypeError) {
52
+ return true;
53
+ }
54
+ if (err instanceof Error) {
55
+ const msg = err.message;
56
+ return (msg.includes("ECONNREFUSED") ||
57
+ msg.includes("ECONNRESET") ||
58
+ msg.includes("ENOTFOUND") ||
59
+ msg.includes("fetch failed") ||
60
+ msg.includes("Failed to fetch") ||
61
+ msg.includes("socket hang up") ||
62
+ msg.includes("network"));
63
+ }
64
+ return false;
65
+ }
66
+ /**
67
+ * Call `fn` with the upstream client, reconnecting once on transient transport
68
+ * errors. Non-transport errors (application errors, tool errors) propagate
69
+ * immediately without retry to avoid duplicating side effects.
70
+ * Exported for testability.
71
+ */
72
+ export async function withReconnect(manager, fn) {
73
+ try {
74
+ return await fn(await manager.getClient());
75
+ }
76
+ catch (err) {
77
+ if (!isTransportError(err)) {
78
+ throw err;
79
+ }
80
+ const msg = err instanceof Error ? err.message : String(err);
81
+ process.stderr.write(`Reconnecting upstream: ${msg}\n`);
82
+ manager.resetClient();
83
+ return fn(await manager.getClient());
84
+ }
85
+ }
86
+ /** Create the stdio MCP server that proxies all requests to the Grackle HTTP MCP server. */
87
+ export function createProxyServer(grackleUrl, apiKey) {
88
+ const manager = createClientManager(grackleUrl, apiKey);
89
+ const server = new Server({ name: "grackle-mcp-stdio", version }, { capabilities: { tools: {} } });
90
+ server.setRequestHandler(ListToolsRequestSchema, async () => {
91
+ const result = await withReconnect(manager, (c) => c.listTools());
92
+ return { tools: result.tools };
93
+ });
94
+ server.setRequestHandler(CallToolRequestSchema, async (req) => {
95
+ const { name, arguments: args } = req.params;
96
+ return withReconnect(manager, (c) => c.callTool({ name, arguments: args }));
97
+ });
98
+ return server;
99
+ }
100
+ /** Start the proxy: connect upstream, then attach to stdio and serve. */
101
+ export async function main() {
102
+ const grackleUrl = process.env.GRACKLE_URL ?? DEFAULT_GRACKLE_URL;
103
+ const apiKey = process.env.GRACKLE_API_KEY;
104
+ if (!apiKey) {
105
+ process.stderr.write("ERROR: GRACKLE_API_KEY is not set\n");
106
+ process.exit(1);
107
+ }
108
+ const server = createProxyServer(grackleUrl, apiKey);
109
+ await server.connect(new StdioServerTransport());
110
+ process.stderr.write(`grackle-mcp-stdio ready (upstream: ${grackleUrl})\n`);
111
+ function shutdown() {
112
+ process.exit(0);
113
+ }
114
+ process.on("SIGINT", shutdown);
115
+ process.on("SIGTERM", shutdown);
116
+ }
117
+ //# sourceMappingURL=proxy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxy.js","sourceRoot":"","sources":["../src/proxy.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,52 @@
1
+ {
2
+ "name": "@grackle-ai/mcp-stdio",
3
+ "version": "0.110.1",
4
+ "description": "stdio-to-HTTP MCP proxy for Grackle — bridges stdio-only MCP clients (Claude Desktop, Codex CLI, Clawpilot) to a Grackle HTTP MCP server using static API-key auth",
5
+ "license": "MIT",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "https://github.com/nick-pape/grackle.git",
9
+ "directory": "packages/mcp-stdio"
10
+ },
11
+ "keywords": [
12
+ "grackle",
13
+ "mcp",
14
+ "model-context-protocol",
15
+ "stdio",
16
+ "proxy",
17
+ "ai-agents"
18
+ ],
19
+ "homepage": "https://github.com/nick-pape/grackle#readme",
20
+ "bugs": {
21
+ "url": "https://github.com/nick-pape/grackle/issues"
22
+ },
23
+ "engines": {
24
+ "node": ">=22.0.0 <24.0.0"
25
+ },
26
+ "type": "module",
27
+ "main": "dist/index.js",
28
+ "types": "dist/index.d.ts",
29
+ "bin": {
30
+ "grackle-mcp-stdio": "dist/index.js"
31
+ },
32
+ "files": [
33
+ "dist/"
34
+ ],
35
+ "dependencies": {
36
+ "@modelcontextprotocol/sdk": "^1.27.0"
37
+ },
38
+ "devDependencies": {
39
+ "@rushstack/heft": "1.2.7",
40
+ "@types/node": "^22.0.0",
41
+ "vitest": "^3.1.1",
42
+ "@grackle-ai/heft-rig": "0.0.1"
43
+ },
44
+ "scripts": {
45
+ "build": "heft build --clean",
46
+ "start": "node dist/index.js",
47
+ "test": "vitest run",
48
+ "clean": "heft clean",
49
+ "_phase:build": "heft run --only build -- --clean",
50
+ "_phase:test": "vitest run"
51
+ }
52
+ }