@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 +79 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/proxy.d.ts +32 -0
- package/dist/proxy.d.ts.map +1 -0
- package/dist/proxy.js +117 -0
- package/dist/proxy.js.map +1 -0
- package/package.json +52 -0
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
|
package/dist/index.d.ts
ADDED
|
@@ -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 @@
|
|
|
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"}
|
package/dist/proxy.d.ts
ADDED
|
@@ -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
|
+
}
|