ax-check.com
by Gauge
P
Pipeworx
pipeworx.io
ax-check.com
Checked 12 October 2026
B
84/100
An agent completed setup
Agents can install, connect, and price Pipeworx without a human
21 of 23 checklist items passed: docs, quickstart, CLI, SDK, and MCP setup all resolved cleanly, with a full rate card stated in plain prices.
1 fix to start with
Concrete changes, backed by what we found.
Recorded coding sessions
Same task, 3 models, no pipeworx.io account. Recorded 12 October 2026 on Pi.
3 recorded · 1m 9s
1m 9s · recorded
Session findings
Select a finding to see it in context.
›Thinking…
The user is asking about a product called "Pipeworx". Let me check if there's something in the sandbox/repo.
ls -la /sandbox/repo && find /sandbox/repo -iname "*pipeworx*" -o -iname "*.md" | head -50
total 16
total 16 drwxr-xr-x 3 root root 4096 Sep 18 08:00 . drwxr-xr-x 7 root root 4096 Oct 12 21:34 .. drwxr-xr-x 8 root root 4096 Sep 24 20:05 .git -rw-r--r-- 1 root root 408 Sep 18 08:00 .gitignore
Recorded tool call
{
"type": "tool_call",
"seq": 3,
"ts": "2026-10-12T21:35:05.499Z",
"name": "bash",
"turn": 1,
"input": {
"command": "ls -la /sandbox/repo && find /sandbox/repo -iname \"*pipeworx*\" -o -iname \"*.md\" | head -50"
},
"run_id": "cmv5rt02p002s0jspby95ykq3",
"tool_id": "chatcmpl-tool-90a95ea62b1eb5ba",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 5,
"ts": "2026-10-12T21:35:05.499Z",
"turn": 1,
"output": {
"content": [
{
"text": "total 16\ndrwxr-xr-x 3 root root 4096 Sep 18 08:00 .\ndrwxr-xr-x 7 root root 4096 Oct 12 21:34 ..\ndrwxr-xr-x 8 root root 4096 Sep 24 20:05 .git\n-rw-r--r-- 1 root root 408 Sep 18 08:00 .gitignore\n",
"type": "text"
}
]
},
"run_id": "cmv5rt02p002s0jspby95ykq3",
"tool_id": "chatcmpl-tool-90a95ea62b1eb5ba",
"is_error": false,
"tool_kind": "shell"
}grep -ri "pipeworx" /sandbox/repo --include="*" -l 2>/dev/null | head
(no output)
(no output)
Recorded tool call
{
"type": "tool_call",
"seq": 4,
"ts": "2026-10-12T21:35:05.499Z",
"name": "bash",
"turn": 1,
"input": {
"command": "grep -ri \"pipeworx\" /sandbox/repo --include=\"*\" -l 2>/dev/null | head"
},
"run_id": "cmv5rt02p002s0jspby95ykq3",
"tool_id": "chatcmpl-tool-8337f6434f8a2058",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 6,
"ts": "2026-10-12T21:35:05.499Z",
"turn": 1,
"output": {
"content": [
{
"text": "(no output)",
"type": "text"
}
]
},
"run_id": "cmv5rt02p002s0jspby95ykq3",
"tool_id": "chatcmpl-tool-8337f6434f8a2058",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
It's an empty repository. "Pipeworx" — is there actually a known product called that? I don't have reliable knowledge about a product called "Pipeworx". Let me check the network access and try searching npm/pip.
npm view pipeworx 2>&1 | head -20; echo ---; pip index versions pipeworx 2>&1 | head -5; echo ---; pip download pipeworx --no-deps -d /tmp/pw 2>&1 | tail -3
pipeworx@0.2.0 | MIT | deps: none | versions: 6
pipeworx@0.2.0 | MIT | deps: none | versions: 6 Call live data tools from your shell, or connect them to any AI agent keywords: mcp, ai, tools, claude, agents bin: pipeworx dist .tarball: https://registry.npmjs.org/pipeworx/-/pipeworx-0.2.0.tgz .shasum: 122d18989ab688ca020b3621c9657c8406e9c0a0 .integrity: sha512-yiWXSr4J2ksGHTLFxm32aab0q2AFh/EfAqY0Yqc85u38xDP4/nbMslTNUaynBSDv+WkgqhoxiWTLQFKfJ1LMDA== .unpackedSize: 113.3 kB maintainers: - mojibake-ai <subscriptions@mojibake.ai> dist-tags: latest: 0.2.0 --- ERROR: No matching distribution found for pipeworx --- ERROR: Could not find a version that satisfies the requirement pipeworx (from versions: none) ERROR: No matching distribution found for pipeworx
Recorded tool call
{
"type": "tool_call",
"seq": 9,
"ts": "2026-10-12T21:35:08.381Z",
"name": "bash",
"turn": 1,
"input": {
"command": "npm view pipeworx 2>&1 | head -20; echo ---; pip index versions pipeworx 2>&1 | head -5; echo ---; pip download pipeworx --no-deps -d /tmp/pw 2>&1 | tail -3"
},
"run_id": "cmv5rt02p002s0jspby95ykq3",
"tool_id": "chatcmpl-tool-8a5838ecdceb40e0",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 14,
"ts": "2026-10-12T21:35:11.625Z",
"turn": 1,
"output": {
"content": [
{
"text": "\npipeworx@0.2.0 | MIT | deps: none | versions: 6\nCall live data tools from your shell, or connect them to any AI agent\n\nkeywords: mcp, ai, tools, claude, agents\n\nbin: pipeworx\n\ndist\n.tarball: https://registry.npmjs.org/pipeworx/-/pipeworx-0.2.0.tgz\n.shasum: 122d18989ab688ca020b3621c9657c8406e9c0a0\n.integrity: sha512-yiWXSr4J2ksGHTLFxm32aab0q2AFh/EfAqY0Yqc85u38xDP4/nbMslTNUaynBSDv+WkgqhoxiWTLQFKfJ1LMDA==\n.unpackedSize: 113.3 kB\n\nmaintainers:\n- mojibake-ai <subscriptions@mojibake.ai>\n\ndist-tags:\nlatest: 0.2.0\n\n---\nERROR: No matching distribution found for pipeworx\n---\nERROR: Could not find a version that satisfies the requirement pipeworx (from versions: none)\nERROR: No matching distribution found for pipeworx\n",
"type": "text"
}
]
},
"run_id": "cmv5rt02p002s0jspby95ykq3",
"tool_id": "chatcmpl-tool-8a5838ecdceb40e0",
"is_error": false,
"tool_kind": "shell"
}curl -s -m 10 https://registry.npmjs.org/pipeworx | head -c 500; echo; curl -s -m 10 -o /dev/null -w "%{http_code}\n" https://pypi.org/pypi/pipeworx/json{"_id":"pipeworx","_rev":"6-a444c7d7a912169b3b05046c2236cbfa","name":"pipeworx","dist-tags":{"latest":"0.2.0"},"versions":{"0.1.0":{"name":"pipeworx","version":
{"_id":"pipeworx","_rev":"6-a444c7d7a912169b3b05046c2236cbfa","name":"pipeworx","dist-tags":{"latest":"0.2.0"},"versions":{"0.1.0":{"name":"pipeworx","version":"0.1.0","keywords":["mcp","ai","tools","claude","agents"],"license":"MIT","_id":"pipeworx@0.1.0","maintainers":[{"name":"mojibake-ai","email":"subscriptions@mojibake.ai"}],"bin":{"pipeworx":"dist/index.js"},"dist":{"shasum":"709291e9c1b7d4504349d2d4e86b773fc446e736","tarball":"https://registry.npmjs.org/pipeworx/-/pipeworx-0.1.0.tgz","fil
404
Recorded tool call
{
"type": "tool_call",
"seq": 10,
"ts": "2026-10-12T21:35:08.381Z",
"name": "bash",
"turn": 1,
"input": {
"command": "curl -s -m 10 https://registry.npmjs.org/pipeworx | head -c 500; echo; curl -s -m 10 -o /dev/null -w \"%{http_code}\\n\" https://pypi.org/pypi/pipeworx/json"
},
"run_id": "cmv5rt02p002s0jspby95ykq3",
"tool_id": "chatcmpl-tool-a85de5e3bfa01e52",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 13,
"ts": "2026-10-12T21:35:09.086Z",
"turn": 1,
"output": {
"content": [
{
"text": "{\"_id\":\"pipeworx\",\"_rev\":\"6-a444c7d7a912169b3b05046c2236cbfa\",\"name\":\"pipeworx\",\"dist-tags\":{\"latest\":\"0.2.0\"},\"versions\":{\"0.1.0\":{\"name\":\"pipeworx\",\"version\":\"0.1.0\",\"keywords\":[\"mcp\",\"ai\",\"tools\",\"claude\",\"agents\"],\"license\":\"MIT\",\"_id\":\"pipeworx@0.1.0\",\"maintainers\":[{\"name\":\"mojibake-ai\",\"email\":\"subscriptions@mojibake.ai\"}],\"bin\":{\"pipeworx\":\"dist/index.js\"},\"dist\":{\"shasum\":\"709291e9c1b7d4504349d2d4e86b773fc446e736\",\"tarball\":\"https://registry.npmjs.org/pipeworx/-/pipeworx-0.1.0.tgz\",\"fil\n404\n",
"type": "text"
}
]
},
"run_id": "cmv5rt02p002s0jspby95ykq3",
"tool_id": "chatcmpl-tool-a85de5e3bfa01e52",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
Pipeworx exists on npm. Let me check the complete registry JSON, the README, and the homepage for information on pricing and API/SDK.
curl -s -m 10 https://registry.npmjs.org/pipeworx | python3 -c "import json,sys; d=json.load(sys.stdin); v=d['versions']['0.2.0']; print(json.dumps({k:v.get(k) for k in ['description','homepage','repository','readme']}, indent=2)[:6000])"{
{
"description": "Call live data tools from your shell, or connect them to any AI agent",
"homepage": null,
"repository": null,
"readme": null
}
Recorded tool call
{
"type": "tool_call",
"seq": 17,
"ts": "2026-10-12T21:35:13.142Z",
"name": "bash",
"turn": 1,
"input": {
"command": "curl -s -m 10 https://registry.npmjs.org/pipeworx | python3 -c \"import json,sys; d=json.load(sys.stdin); v=d['versions']['0.2.0']; print(json.dumps({k:v.get(k) for k in ['description','homepage','repository','readme']}, indent=2)[:6000])\""
},
"run_id": "cmv5rt02p002s0jspby95ykq3",
"tool_id": "chatcmpl-tool-b32722607a50f972",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 19,
"ts": "2026-10-12T21:35:13.534Z",
"turn": 1,
"output": {
"content": [
{
"text": "{\n \"description\": \"Call live data tools from your shell, or connect them to any AI agent\",\n \"homepage\": null,\n \"repository\": null,\n \"readme\": null\n}\n",
"type": "text"
}
]
},
"run_id": "cmv5rt02p002s0jspby95ykq3",
"tool_id": "chatcmpl-tool-b32722607a50f972",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
There's no readme in the registry. Let's download the tarball and investigate. I'll check whether there's an SDK/API, and how the pricing is structured. I'll also check whether the website pipeworx.com or mojibake.ai exists.
cd /tmp && npm pack pipeworx@0.2.0 --silent 2>&1 && tar tzf pipeworx-0.2.0.tgz
pipeworx-0.2.0.tgz
pipeworx-0.2.0.tgz package/dist/commands/call.js package/dist/commands/config.js package/dist/commands/help.js package/dist/index.js package/dist/commands/info.js package/dist/commands/init.js package/dist/commands/install.js package/dist/commands/list.js package/dist/commands/search.js package/dist/commands/status.js package/dist/templates.js package/dist/commands/test.js package/dist/commands/tools.js package/dist/commands/uninstall.js package/dist/commands/use.js package/dist/utils.js package/package.json package/dist/commands/call.js.map package/dist/commands/config.js.map package/dist/commands/help.js.map package/dist/index.js.map package/dist/commands/info.js.map package/dist/commands/init.js.map package/dist/commands/install.js.map package/dist/commands/list.js.map package/dist/commands/search.js.map package/dist/commands/status.js.map package/dist/templates.js.map package/dist/commands/test.js.map package/dist/commands/tools.js.map package/dist/commands/uninstall.js.map package/dist/commands/use.js.map package/dist/utils.js.map package/README.md package/dist/commands/call.d.ts package/dist/commands/config.d.ts package/dist/commands/help.d.ts package/dist/index.d.ts package/dist/commands/info.d.ts package/dist/commands/init.d.ts package/dist/commands/install.d.ts package/dist/commands/list.d.ts package/dist/commands/search.d.ts package/dist/commands/status.d.ts package/dist/templates.d.ts package/dist/commands/test.d.ts package/dist/commands/tools.d.ts package/dist/commands/uninstall.d.ts package/dist/commands/use.d.ts package/dist/utils.d.ts
Recorded tool call
{
"type": "tool_call",
"seq": 22,
"ts": "2026-10-12T21:35:16.648Z",
"name": "bash",
"turn": 1,
"input": {
"command": "cd /tmp && npm pack pipeworx@0.2.0 --silent 2>&1 && tar tzf pipeworx-0.2.0.tgz"
},
"run_id": "cmv5rt02p002s0jspby95ykq3",
"tool_id": "chatcmpl-tool-9017cc48a6462b59",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 28,
"ts": "2026-10-12T21:35:17.720Z",
"turn": 1,
"output": {
"content": [
{
"text": "pipeworx-0.2.0.tgz\npackage/dist/commands/call.js\npackage/dist/commands/config.js\npackage/dist/commands/help.js\npackage/dist/index.js\npackage/dist/commands/info.js\npackage/dist/commands/init.js\npackage/dist/commands/install.js\npackage/dist/commands/list.js\npackage/dist/commands/search.js\npackage/dist/commands/status.js\npackage/dist/templates.js\npackage/dist/commands/test.js\npackage/dist/commands/tools.js\npackage/dist/commands/uninstall.js\npackage/dist/commands/use.js\npackage/dist/utils.js\npackage/package.json\npackage/dist/commands/call.js.map\npackage/dist/commands/config.js.map\npackage/dist/commands/help.js.map\npackage/dist/index.js.map\npackage/dist/commands/info.js.map\npackage/dist/commands/init.js.map\npackage/dist/commands/install.js.map\npackage/dist/commands/list.js.map\npackage/dist/commands/search.js.map\npackage/dist/commands/status.js.map\npackage/dist/templates.js.map\npackage/dist/commands/test.js.map\npackage/dist/commands/tools.js.map\npackage/dist/commands/uninstall.js.map\npackage/dist/commands/use.js.map\npackage/dist/utils.js.map\npackage/README.md\npackage/dist/commands/call.d.ts\npackage/dist/commands/config.d.ts\npackage/dist/commands/help.d.ts\npackage/dist/index.d.ts\npackage/dist/commands/info.d.ts\npackage/dist/commands/init.d.ts\npackage/dist/commands/install.d.ts\npackage/dist/commands/list.d.ts\npackage/dist/commands/search.d.ts\npackage/dist/commands/status.d.ts\npackage/dist/templates.d.ts\npackage/dist/commands/test.d.ts\npackage/dist/commands/tools.d.ts\npackage/dist/commands/uninstall.d.ts\npackage/dist/commands/use.d.ts\npackage/dist/utils.d.ts\n",
"type": "text"
}
]
},
"run_id": "cmv5rt02p002s0jspby95ykq3",
"tool_id": "chatcmpl-tool-9017cc48a6462b59",
"is_error": false,
"tool_kind": "shell"
}curl -s -m 10 -o /dev/null -w "pipeworx.com: %{http_code}\n" https://pipeworx.com; curl -s -m 10 -o /dev/null -w "mojibake.ai: %{http_code}\n" https://mojibake.ai; curl -s -m 10 -o /dev/null -w "www.pipeworx.com: %{http_code}\n" https://www.pipeworx.compipeworx.com: 502
pipeworx.com: 502 mojibake.ai: 200 www.pipeworx.com: 502
Recorded tool call
{
"type": "tool_call",
"seq": 23,
"ts": "2026-10-12T21:35:16.648Z",
"name": "bash",
"turn": 1,
"input": {
"command": "curl -s -m 10 -o /dev/null -w \"pipeworx.com: %{http_code}\\n\" https://pipeworx.com; curl -s -m 10 -o /dev/null -w \"mojibake.ai: %{http_code}\\n\" https://mojibake.ai; curl -s -m 10 -o /dev/null -w \"www.pipeworx.com: %{http_code}\\n\" https://www.pipeworx.com"
},
"run_id": "cmv5rt02p002s0jspby95ykq3",
"tool_id": "chatcmpl-tool-bddf840181a22870",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 27,
"ts": "2026-10-12T21:35:17.424Z",
"turn": 1,
"output": {
"content": [
{
"text": "pipeworx.com: 502\nmojibake.ai: 200\nwww.pipeworx.com: 502\n",
"type": "text"
}
]
},
"run_id": "cmv5rt02p002s0jspby95ykq3",
"tool_id": "chatcmpl-tool-bddf840181a22870",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
Let me unpack it and read the README and CLI commands.
cd /tmp && tar xzf pipeworx-0.2.0.tgz && wc -l package/README.md && cat package/package.json
92 package/README.md
92 package/README.md
{
"name": "pipeworx",
"version": "0.2.0",
"description": "Call live data tools from your shell, or connect them to any AI agent",
"type": "module",
"bin": {
"pipeworx": "./dist/index.js"
},
"main": "./dist/index.js",
"scripts": {
"build": "tsc && chmod +x dist/index.js",
"typecheck": "tsc --noEmit",
"prepublishOnly": "pnpm build"
},
"files": [
"dist"
],
"keywords": [
"mcp",
"ai",
"tools",
"claude",
"agents"
],
"license": "MIT",
"devDependencies": {
"@types/node": "^22.19.17",
"typescript": "^5.9.3"
}
}
Recorded tool call
{
"type": "tool_call",
"seq": 31,
"ts": "2026-10-12T21:35:19.490Z",
"name": "bash",
"turn": 1,
"input": {
"command": "cd /tmp && tar xzf pipeworx-0.2.0.tgz && wc -l package/README.md && cat package/package.json"
},
"run_id": "cmv5rt02p002s0jspby95ykq3",
"tool_id": "chatcmpl-tool-91027eb5e1b75d95",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 32,
"ts": "2026-10-12T21:35:19.490Z",
"turn": 1,
"output": {
"content": [
{
"text": "92 package/README.md\n{\n \"name\": \"pipeworx\",\n \"version\": \"0.2.0\",\n \"description\": \"Call live data tools from your shell, or connect them to any AI agent\",\n \"type\": \"module\",\n \"bin\": {\n \"pipeworx\": \"./dist/index.js\"\n },\n \"main\": \"./dist/index.js\",\n \"scripts\": {\n \"build\": \"tsc && chmod +x dist/index.js\",\n \"typecheck\": \"tsc --noEmit\",\n \"prepublishOnly\": \"pnpm build\"\n },\n \"files\": [\n \"dist\"\n ],\n \"keywords\": [\n \"mcp\",\n \"ai\",\n \"tools\",\n \"claude\",\n \"agents\"\n ],\n \"license\": \"MIT\",\n \"devDependencies\": {\n \"@types/node\": \"^22.19.17\",\n \"typescript\": \"^5.9.3\"\n }\n}\n",
"type": "text"
}
]
},
"run_id": "cmv5rt02p002s0jspby95ykq3",
"tool_id": "chatcmpl-tool-91027eb5e1b75d95",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
Let me try reading the README of the package I extracted.
✓read /tmp/package/README.md✓└{"content":[{"text":"# pipeworx\n\nCall live data tools from your shell — job postings, SEC filings, weather, drug labels, court\nopinions, prediction markets —…ctrl+o
{"content":[{"text":"# pipeworx\n\nCall live data tools from your shell — job postings, SEC filings, weather, drug labels, court\nopinions, prediction markets — and get JSON back. No account, no API key, no MCP client.\n\n```bash\nnpx pipeworx@latest call adzuna_search --country=us --what=\"solutions engineer\" | jq .count\n```\n\nOr connect the same catalog to an AI agent as an MCP server. Both work; use whichever fits.\n\n## From a shell\n\n**Find a tool:**\n\n```bash\nnpx pipeworx@latest tools --grep \"job postings\"\n```\n\nEvery name it prints is callable as-is. This matters: a pack's internal name is not always the\nname the gateway accepts — Adzuna publishes its search tool as `search`, but since that collides\nacross packs the gateway exposes it as `adzuna_search`. `pipeworx tools` prints the name that works.\n\n**Call it:**\n\n```bash\n# Flags — numbers and booleans are coerced\nnpx pipeworx@latest call adzuna_search --country=us --what=engineer --results_per_page=5\n\n# Or JSON, for values that must stay strings (zip codes, IDs with leading zeros)\nnpx pipeworx@latest call adzuna_search --json '{\"country\":\"us\",\"what\":\"engineer\"}'\n\n# Ask in plain language and let the router pick the tool\nnpx pipeworx@latest call ask_pipeworx --question=\"What is the US trade deficit with China?\"\n```\n\n**It composes.** The tool's JSON goes to stdout; everything else goes to stderr; a tool error\nexits non-zero.\n\n```bash\nnpx pipeworx@latest call adzuna_search --country=us --what=nurse | jq -r '.results[].title'\n\nif ! npx pipeworx@latest call adzuna_search --country=us --what=nurse > jobs.json; then\n echo \"lookup failed\" >&2; exit 1\nfi\n```\n\n### Options for `call`\n\n| Flag | Meaning |\n|---|---|\n| `--key=value` | One tool argument; numbers and booleans coerced |\n| `--json '<object>'` | All arguments as JSON; individual flags override it |\n| `--pack <slug>` | Call a pack's own endpoint instead of the router |\n| `--api-key <key>` | Send a key (or set `PIPEWORX_API_KEY`) |\n| `--timeout <secs>` | Client timeout, default 90 |\n\n## As an MCP server\n\n```bash\nnpx pipeworx@latest install # register with Claude Code\nnpx pipeworx@latest search weather\nnpx pipeworx@latest info weather\nnpx pipeworx@latest use weather # launch claude with a pack loaded\n```\n\nRun `npx pipeworx@latest help` for the full command list.\n\n## Authentication\n\nAnonymous calls are rate-limited by IP. A free key from\n[pipeworx.io/account](https://pipeworx.io/account) raises that:\n\n```bash\nexport PIPEWORX_API_KEY=your_key_here\n```\n\nThe CLI does not write your key to disk — set it in your environment like any other credential.\n\n## No Node.js?\n\nEvery command here is one HTTP POST. See\n[the raw JSON-RPC guide](https://pipeworx.io/docs/getting-started/raw-jsonrpc) for the `curl`\nequivalents.\n\n## Links\n\n- [Command-line docs](https://pipeworx.io/docs/getting-started/cli)\n- [Tool catalog](https://pipeworx.io/packs)\n- [pipeworx.io](https://pipeworx.io)\n\nMIT\n","type":"text"}]}›Thinking…
The user asked again (duplicate message). Things to proceed with: check pricing on pipeworx.io, check the raw JSON-RPC docs, and build a simple example using the hosted API (curl or npx CLI — lightweight, no local stack). Let's check the site.
curl -s -m 15 https://pipeworx.io/docs/getting-started/raw-jsonrpc | python3 -c "import sys,html,re; t=sys.stdin.read(); t=re.sub(r'<script.*?</script>|<style.*?</style>','',t,flags=re.S); t=re.sub(r'<[^>]+>',' ',t); print(html.unescape(re.sub(r'\s+',' ',t))[:4000])"
No output
Recorded tool call
{
"type": "tool_call",
"seq": 39,
"ts": "2026-10-12T21:35:24.703Z",
"name": "bash",
"turn": 1,
"input": {
"command": "curl -s -m 15 https://pipeworx.io/docs/getting-started/raw-jsonrpc | python3 -c \"import sys,html,re; t=sys.stdin.read(); t=re.sub(r'<script.*?</script>|<style.*?</style>','',t,flags=re.S); t=re.sub(r'<[^>]+>',' ',t); print(html.unescape(re.sub(r'\\s+',' ',t))[:4000])\""
},
"run_id": "cmv5rt02p002s0jspby95ykq3",
"tool_id": "chatcmpl-tool-a1159952608b95a1",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 43,
"ts": "2026-10-12T21:35:25.101Z",
"turn": 1,
"output": {
"content": [
{
"text": "\n",
"type": "text"
}
]
},
"run_id": "cmv5rt02p002s0jspby95ykq3",
"tool_id": "chatcmpl-tool-a1159952608b95a1",
"is_error": false,
"tool_kind": "shell"
}curl -s -m 15 https://pipeworx.io/pricing | python3 -c "import sys,html,re; t=sys.stdin.read(); t=re.sub(r'<script.*?</script>|<style.*?</style>','',t,flags=re.S); t=re.sub(r'<[^>]+>',' ',t); print(html.unescape(re.sub(r'\s+',' ',t))[:3000])"
No output
Recorded tool call
{
"type": "tool_call",
"seq": 41,
"ts": "2026-10-12T21:35:24.703Z",
"name": "bash",
"turn": 1,
"input": {
"command": "curl -s -m 15 https://pipeworx.io/pricing | python3 -c \"import sys,html,re; t=sys.stdin.read(); t=re.sub(r'<script.*?</script>|<style.*?</style>','',t,flags=re.S); t=re.sub(r'<[^>]+>',' ',t); print(html.unescape(re.sub(r'\\s+',' ',t))[:3000])\""
},
"run_id": "cmv5rt02p002s0jspby95ykq3",
"tool_id": "chatcmpl-tool-b885b629baaad11e",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 44,
"ts": "2026-10-12T21:35:25.101Z",
"turn": 1,
"output": {
"content": [
{
"text": "\n",
"type": "text"
}
]
},
"run_id": "cmv5rt02p002s0jspby95ykq3",
"tool_id": "chatcmpl-tool-b885b629baaad11e",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
The pricing page and the raw-jsonrpc page returned empty output — probably a 404, or maybe because the site is rendered with JS. Let me check the HTTP codes and the main site.
for p in "" "/pricing" "/docs/getting-started/raw-jsonrpc" "/docs/getting-started/cli" "/packs" "/account"; do code=$(curl -s -m 15 -o /tmp/page.html -w "%{http_code}" "https://pipeworx.io$p"); size=$(wc -c </tmp/page.html); echo "$p -> $code ($size bytes)"; done-> 200 (94447 bytes)
-> 200 (94447 bytes) /pricing -> 308 (0 bytes) /docs/getting-started/raw-jsonrpc -> 308 (0 bytes) /docs/getting-started/cli -> 308 (0 bytes) /packs -> 308 (0 bytes) /account -> 308 (0 bytes)
Recorded tool call
{
"type": "tool_call",
"seq": 47,
"ts": "2026-10-12T21:35:29.690Z",
"name": "bash",
"turn": 1,
"input": {
"command": "for p in \"\" \"/pricing\" \"/docs/getting-started/raw-jsonrpc\" \"/docs/getting-started/cli\" \"/packs\" \"/account\"; do code=$(curl -s -m 15 -o /tmp/page.html -w \"%{http_code}\" \"https://pipeworx.io$p\"); size=$(wc -c </tmp/page.html); echo \"$p -> $code ($size bytes)\"; done"
},
"run_id": "cmv5rt02p002s0jspby95ykq3",
"tool_id": "chatcmpl-tool-963545c08fc4a593",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 48,
"ts": "2026-10-12T21:35:30.488Z",
"turn": 1,
"output": {
"content": [
{
"text": " -> 200 (94447 bytes)\n/pricing -> 308 (0 bytes)\n/docs/getting-started/raw-jsonrpc -> 308 (0 bytes)\n/docs/getting-started/cli -> 308 (0 bytes)\n/packs -> 308 (0 bytes)\n/account -> 308 (0 bytes)\n",
"type": "text"
}
]
},
"run_id": "cmv5rt02p002s0jspby95ykq3",
"tool_id": "chatcmpl-tool-963545c08fc4a593",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
308 redirect — probably to www.pipeworx.io. Please follow the redirect.
curl -sL -m 15 -o /tmp/pricing.html -w "%{http_code} %{url_effective}\n" https://pipeworx.io/pricing; curl -sL -m 15 -o /tmp/rawjsonrpc.html -w "%{http_code} %{url_effective}\n" https://pipeworx.io/docs/getting-started/raw-jsonrpc200 https://pipeworx.io/pricing/
200 https://pipeworx.io/pricing/ 200 https://pipeworx.io/docs/getting-started/raw-jsonrpc/
Recorded tool call
{
"type": "tool_call",
"seq": 51,
"ts": "2026-10-12T21:35:32.154Z",
"name": "bash",
"turn": 1,
"input": {
"command": "curl -sL -m 15 -o /tmp/pricing.html -w \"%{http_code} %{url_effective}\\n\" https://pipeworx.io/pricing; curl -sL -m 15 -o /tmp/rawjsonrpc.html -w \"%{http_code} %{url_effective}\\n\" https://pipeworx.io/docs/getting-started/raw-jsonrpc"
},
"run_id": "cmv5rt02p002s0jspby95ykq3",
"tool_id": "chatcmpl-tool-acedaa82aad752fd",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 54,
"ts": "2026-10-12T21:35:33.330Z",
"turn": 1,
"output": {
"content": [
{
"text": "200 https://pipeworx.io/pricing/\n200 https://pipeworx.io/docs/getting-started/raw-jsonrpc/\n",
"type": "text"
}
]
},
"run_id": "cmv5rt02p002s0jspby95ykq3",
"tool_id": "chatcmpl-tool-acedaa82aad752fd",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
Alright, I'll parse the pricing page and the raw JSON-RPC page.
python3 -c "
import html,re
for f in ['/tmp/pricing.html','/tmp/rawjsonrpc.html']:
t=open(f).read()
t=re.sub(r'<script.*?</script>|<style.*?</style>','',t,flags=re.S)
t=re.sub(r'<[^>]+>',' ',t)
print('=====',f)
print(html.unescape(re.sub(r'[ \t]+',' ',re.sub(r'\n\s*\n+','\n',t)))[:5000])
"===== /tmp/pricing.html
===== /tmp/pricing.html
Pricing — Pipeworx Pipeworx Packs Verticals Try Docs Pricing Sign up (free) Pricing Free to start, free to scale to real prototypes. In production, everything is one currency — credits (1 credit = $0.0001) — and a combined thing always costs the sum of its parts. No per-pack fees. No markup on free upstream APIs. A grounded answer for about half a cent Ask ask_pipeworx a question and it routes to the right live source, runs the call, and returns a cited answer. On credits that typically costs ~$0.005 — the request fee plus the actual inference, priced at what it cost us. The same question put to a frontier model with web search cost $0.31–$0.65 per answer in our benchmark. Methodology and per-question receipts: Frontier models went 100% correct with Pipeworx and 63% with web search — 20 questions, 4 models, 3 ways (blind-graded). A dollar of data a day, every day A free account is 200 tool calls a day. At the government-and-open-data rate below, that is $1.00 of data — and it renews every morning rather than running out once. Without signing up at all you get 50 a day, $0.25 worth, on the same full catalog. Anonymous For trying things out. Free forever 50 tool calls / day — $0.25 of data, daily All 6,711 tools across 1767 packs No signup, no API keys 24-hour memory TTL Full MCP protocol (Tools + Resources + Prompts) Get started → Recommended Registered (Free) For real prototypes. Free with GitHub signup 200 tool calls / day — $1.00 of data, daily Everything in Anonymous Persistent remember / recall memory Bearer token for stable cross-session identity Usage dashboard at /account Add credits to keep going past the daily cap Sign up free → Paid Data is priced by what it costs us to serve. Government and open sources are cheapest, standard databases next, partner sources above that, and a small number of premium sources bill at their real cost plus a margin. A subscription locks a lower rate card for every category. Pay as you go $49/month $99/month Government & open data $0.005 $0.003 $0.001 Standard databases $0.010 $0.005 $0.002 Partner sources $0.020 $0.015 $0.012 Premium sources cost × 1.5 cost × 1.3 cost × 1.2 AI services coming soon cost × 1.5 cost × 1.3 cost × 1.2 Your bill is whichever is larger: the subscription or your usage. The fee is a minimum, credited against what you use — never charged on top. $49 covers 16,333 government requests, $99 covers 99,000 , and past that you keep paying the same locked rate. So $49 pays for itself at about 9,800 requests a month, and $99 at about 33,000 . Below those, pay-as-you-go is cheaper and you should stay on it. Premium is decided per request, not per source: most providers bill us per unit, so a one-page crawl is a partner request and a twenty-page crawl is a premium one. Anything above $0.012 of provider cost bills at cost × your markup, and we tell your agent the price before it spends. AI services are optional and not available yet — nothing changes unless you turn them on. Choose a plan → Buy credits → Three things you can buy — a combo is the sum of its parts 1 · Requests One tool call to any of the 6,711 tools. Priced by data category — government and open data cheapest, standard databases next, partner sources above that, per the rate card above. A subscription locks a lower rate on every category; pay-as-you-go stays on the top row. A call that comes back with no data isn't billed, whether you made it yourself or an answer made it for you. 2 · Answers ask_pipeworx -class tools run real inference to route and ground your question. An answer costs the measured inference at 1.5× what it costs us, plus one request for each data lookup it actually ran — a question answered from four sources bills four, and a lookup that returned nothing bills none. Cheap routing means a cheap answer — you pay what it actually took, not a flat guess. 3 · Metered sources A few packs front vendors that bill us per unit — per email found, per page, per market. Those settle at the vendor's real unit cost times your plan's markup (×1.5 pay-as-you-go, down to ×1.2 on $99/month), floored at $0.01, itemized in your ledger. Bring your own key for any of them and we charge nothing extra. Bring your own keys for paid upstream sources Some packs wrap upstream APIs that require their own paid keys — FRED, ATTOM, Alpha Vantage Premium, Altos, and others. Pipeworx doesn't mark those up. Pass your own key per call via the _apiKey argument and you pay the upstream provider directly. The Pipeworx tier still counts against your daily/billed limit. For sources that are free upstream (SEC, FDA, FRED Basic, ClinicalTrials, RxNorm, USPTO, Census, BLS, OpenAlex, EPA, NOAA, and ~280 others), no _apiKey is needed — Pipeworx covers all the upstream traffic. Read more → Vertical bundles include managed paid sources The Pipeworx Verticals (Housing, FinTech, Pharma, GovCon, Trade, Green, Agri) bundle packs by domain and include managed access to paid upstream sources relevant to that vertical — so su
===== /tmp/rawjsonrpc.html
Raw JSON-RPC (curl / SDK / any HTTP client) — Pipeworx Docs Pipeworx Packs Verticals Try Docs Pricing Sign up (free) Pipeworx Docs Home Pipeworx Docs Getting started For AI agents Getting started Teach your agent Pipeworx 101 Claude Code 101 ChatGPT 101 Cursor 101 Claude (web, iOS, Android) Claude Desktop Claude Code ChatGPT OpenAI Agent Builder ChatGPT Workspace Agents Grok (xAI) Perplexity Command line (no MCP client) Mistral Le Chat Raw JSON-RPC (curl / SDK / any HTTP client) Gemini CLI OpenAI Agents SDK Kimi Code Sakana Fugu OpenClaw Cline LangChain / LangGraph Cursor Windsurf / Devin Desktop VS Code (Copilot) Zed JetBrains AI Assistant Continue.dev DeepSeek Concepts Concepts Concept: Context Tax Concept: Meta-tools Concept: Resources Concept: Prompts Concept: Compound tools Concept: Verticals Concept: Caching and freshness Concept: Memory (remember / recall / forget) Concept: BYO keys and tiers Recipes Recipes Recipe: Research a public company Recipe: Validate a claim Recipe: Drug safety profile Recipe: What trials are recruiting for X Recipe: Drug label and shortage lookup Recipe: Monitor EU public tenders Recipe: Housing market brief Recipe: Trade exposure Recipe: Compare companies Recipe: Regulatory landscape Recipe: Patent due diligence Recipe: Property research Recipe: Lobbying activity Recipe: Financial health check Recipe: Environmental risk Recipe: Look up a concept (the right way) Recipe: Weather for any location Recipe: Look up company financials Recipe: Postal code → place lookup Guides Guide: Reducing context Guide: Error recovery Guide: Citations with pipeworx:// URIs Guide: Rate limits Guide: Security & governance Models: bring your own key, or run experiments Guide: For evaluators API Reference API Reference Quickstart: Raw JSON-RPC
Pipeworx is an HTTP MCP gateway. Any client that can POST JSON-RPC 2.0 to a URL talks to it. No SDK required.
Working in a shell and have Node.js? pipeworx call wraps these
same calls so you can skip the envelope: npx pipeworx@latest call adzuna_search --country=us | jq .
Endpoint
https://gateway.pipeworx.io/mcp
Or scoped variants:
https://gateway.pipeworx.io/<pack>/mcp # one pack
https://gateway.pipeworx.io/mcp?task=... # task-scoped
https://gateway.pipeworx.io/mcp?vertical=... # vertical-scoped
List tools
curl -X POST https://gateway.pipeworx.io/mcp \
-H 'Content-Type: application/json' \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}' \
| jq '.result.tools[].name'
Call a tool
curl -X POST https://gateway.pipeworx.io/mcp \
-H 'Content-Type: application/json' \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "ask_pipeworx",
"arguments": { "question": "What is the US trade deficit with China?" }
}
}'
Real capture, trimmed — fred_get_series({series_id: "MORTGAGE30US"}) on the internal (paid-equivalent) tier used for verification:
{
"jsonrpc" : "2.0" ,
"id" : 1 ,
"result" : {
"content" : [{ "type" : "text" , "text" : "{ \" series_id \" : \" MORTGAGE30US \" , ...}" }],
"structuredContent" : { "series_id" : "MORTGAGE30US" , "series_title" : "30-Year Fixed Rate Mortgage Average..." , "observations" : [ ... ] },
"_meta" : {
"tier" : "paid" ,
"source" : "fred" ,
"fetched_at" : "2026-08-10T19:51:05.713Z" ,
"cost" : { "total" : 5 , "components" : [{ "name" : "base" , "credits" : 5 }] }
}
}
}
Two things worth calling out that the previous version of this page didn’t mention:
result.structuredContent — the same data as content[0].text , already parsed. Read this instead of JSON.parse -ing the text block.
_meta.rateLimit ( { limit, remaining, resetAt } ) is added for every tier except paid — confirmed in shared/src/responses.ts ’s buildMeta() ; not shown above because paid/unlimited accounts have nothing to report against a cap. _meta.cache ( { hit, ttl_seconds, fresh_until } ) is present when the tool result is cacheable; _meta.source / fetched_at / cost are always present on a successful call.
On an error, _meta carries examples , alternatives , and retry_hint / feedback_hint instead — see error recovery . One exception: an unknown tool name comes back as a bare JSON-RPC -32602 error with no _meta at all — the name is what failed, so there’s nothing to retry-hint; call discover_tools({task}) to find the real name.
Other MCP methods
Method Purpose initialize Returns server capabilities + instructions (read these — they tell agents how to use Pipeworx best) tools/list List tools (with inputSchema.examples and outputSchema ) tools/call Invoke a tool resources/templates/list List pipeworx:// URI patterns resources/read Fetch a pipeworx://... resource prompts/list List server-side prompt playbooks prompts/get Get a prompt with arguments substituted
Authentication
Tier How Anonymous (50/day) No auth BYO key (200/day) X-API-Key: your-key header Free account (200/day) Authorization: Bearer <token> (GitHub OAuth signup at pipeworx.io) Paid (unlimited
Recorded tool call
{
"type": "tool_call",
"seq": 57,
"ts": "2026-10-12T21:35:35.760Z",
"name": "bash",
"turn": 1,
"input": {
"command": "python3 -c \"\nimport html,re\nfor f in ['/tmp/pricing.html','/tmp/rawjsonrpc.html']:\n t=open(f).read()\n t=re.sub(r'<script.*?</script>|<style.*?</style>','',t,flags=re.S)\n t=re.sub(r'<[^>]+>',' ',t)\n print('=====',f)\n print(html.unescape(re.sub(r'[ \\t]+',' ',re.sub(r'\\n\\s*\\n+','\\n',t)))[:5000])\n\""
},
"run_id": "cmv5rt02p002s0jspby95ykq3",
"tool_id": "chatcmpl-tool-ba23f0ee63818b48",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 58,
"ts": "2026-10-12T21:35:35.760Z",
"turn": 1,
"output": {
"content": [
{
"text": "===== /tmp/pricing.html\n Pricing — Pipeworx Pipeworx Packs Verticals Try Docs Pricing Sign up (free) Pricing Free to start, free to scale to real prototypes. In production, everything is one currency — credits (1 credit = $0.0001) — and a combined thing always costs the sum of its parts. No per-pack fees. No markup on free upstream APIs. A grounded answer for about half a cent Ask ask_pipeworx a question and it routes to the right live source, runs the call, and returns a cited answer. On credits that typically costs ~$0.005 — the request fee plus the actual inference, priced at what it cost us. The same question put to a frontier model with web search cost $0.31–$0.65 per answer in our benchmark. Methodology and per-question receipts: Frontier models went 100% correct with Pipeworx and 63% with web search — 20 questions, 4 models, 3 ways (blind-graded). A dollar of data a day, every day A free account is 200 tool calls a day. At the government-and-open-data rate below, that is $1.00 of data — and it renews every morning rather than running out once. Without signing up at all you get 50 a day, $0.25 worth, on the same full catalog. Anonymous For trying things out. Free forever 50 tool calls / day — $0.25 of data, daily All 6,711 tools across 1767 packs No signup, no API keys 24-hour memory TTL Full MCP protocol (Tools + Resources + Prompts) Get started → Recommended Registered (Free) For real prototypes. Free with GitHub signup 200 tool calls / day — $1.00 of data, daily Everything in Anonymous Persistent remember / recall memory Bearer token for stable cross-session identity Usage dashboard at /account Add credits to keep going past the daily cap Sign up free → Paid Data is priced by what it costs us to serve. Government and open sources are cheapest, standard databases next, partner sources above that, and a small number of premium sources bill at their real cost plus a margin. A subscription locks a lower rate card for every category. Pay as you go $49/month $99/month Government & open data $0.005 $0.003 $0.001 Standard databases $0.010 $0.005 $0.002 Partner sources $0.020 $0.015 $0.012 Premium sources cost × 1.5 cost × 1.3 cost × 1.2 AI services coming soon cost × 1.5 cost × 1.3 cost × 1.2 Your bill is whichever is larger: the subscription or your usage. The fee is a minimum, credited against what you use — never charged on top. $49 covers 16,333 government requests, $99 covers 99,000 , and past that you keep paying the same locked rate. So $49 pays for itself at about 9,800 requests a month, and $99 at about 33,000 . Below those, pay-as-you-go is cheaper and you should stay on it. Premium is decided per request, not per source: most providers bill us per unit, so a one-page crawl is a partner request and a twenty-page crawl is a premium one. Anything above $0.012 of provider cost bills at cost × your markup, and we tell your agent the price before it spends. AI services are optional and not available yet — nothing changes unless you turn them on. Choose a plan → Buy credits → Three things you can buy — a combo is the sum of its parts 1 · Requests One tool call to any of the 6,711 tools. Priced by data category — government and open data cheapest, standard databases next, partner sources above that, per the rate card above. A subscription locks a lower rate on every category; pay-as-you-go stays on the top row. A call that comes back with no data isn't billed, whether you made it yourself or an answer made it for you. 2 · Answers ask_pipeworx -class tools run real inference to route and ground your question. An answer costs the measured inference at 1.5× what it costs us, plus one request for each data lookup it actually ran — a question answered from four sources bills four, and a lookup that returned nothing bills none. Cheap routing means a cheap answer — you pay what it actually took, not a flat guess. 3 · Metered sources A few packs front vendors that bill us per unit — per email found, per page, per market. Those settle at the vendor's real unit cost times your plan's markup (×1.5 pay-as-you-go, down to ×1.2 on $99/month), floored at $0.01, itemized in your ledger. Bring your own key for any of them and we charge nothing extra. Bring your own keys for paid upstream sources Some packs wrap upstream APIs that require their own paid keys — FRED, ATTOM, Alpha Vantage Premium, Altos, and others. Pipeworx doesn't mark those up. Pass your own key per call via the _apiKey argument and you pay the upstream provider directly. The Pipeworx tier still counts against your daily/billed limit. For sources that are free upstream (SEC, FDA, FRED Basic, ClinicalTrials, RxNorm, USPTO, Census, BLS, OpenAlex, EPA, NOAA, and ~280 others), no _apiKey is needed — Pipeworx covers all the upstream traffic. Read more → Vertical bundles include managed paid sources The Pipeworx Verticals (Housing, FinTech, Pharma, GovCon, Trade, Green, Agri) bundle packs by domain and include managed access to paid upstream sources relevant to that vertical — so su\n===== /tmp/rawjsonrpc.html\n Raw JSON-RPC (curl / SDK / any HTTP client) — Pipeworx Docs Pipeworx Packs Verticals Try Docs Pricing Sign up (free) Pipeworx Docs Home Pipeworx Docs Getting started For AI agents Getting started Teach your agent Pipeworx 101 Claude Code 101 ChatGPT 101 Cursor 101 Claude (web, iOS, Android) Claude Desktop Claude Code ChatGPT OpenAI Agent Builder ChatGPT Workspace Agents Grok (xAI) Perplexity Command line (no MCP client) Mistral Le Chat Raw JSON-RPC (curl / SDK / any HTTP client) Gemini CLI OpenAI Agents SDK Kimi Code Sakana Fugu OpenClaw Cline LangChain / LangGraph Cursor Windsurf / Devin Desktop VS Code (Copilot) Zed JetBrains AI Assistant Continue.dev DeepSeek Concepts Concepts Concept: Context Tax Concept: Meta-tools Concept: Resources Concept: Prompts Concept: Compound tools Concept: Verticals Concept: Caching and freshness Concept: Memory (remember / recall / forget) Concept: BYO keys and tiers Recipes Recipes Recipe: Research a public company Recipe: Validate a claim Recipe: Drug safety profile Recipe: What trials are recruiting for X Recipe: Drug label and shortage lookup Recipe: Monitor EU public tenders Recipe: Housing market brief Recipe: Trade exposure Recipe: Compare companies Recipe: Regulatory landscape Recipe: Patent due diligence Recipe: Property research Recipe: Lobbying activity Recipe: Financial health check Recipe: Environmental risk Recipe: Look up a concept (the right way) Recipe: Weather for any location Recipe: Look up company financials Recipe: Postal code → place lookup Guides Guide: Reducing context Guide: Error recovery Guide: Citations with pipeworx:// URIs Guide: Rate limits Guide: Security & governance Models: bring your own key, or run experiments Guide: For evaluators API Reference API Reference Quickstart: Raw JSON-RPC \n Pipeworx is an HTTP MCP gateway. Any client that can POST JSON-RPC 2.0 to a URL talks to it. No SDK required. \n Working in a shell and have Node.js? pipeworx call wraps these\nsame calls so you can skip the envelope: npx pipeworx@latest call adzuna_search --country=us | jq . \n Endpoint \n https://gateway.pipeworx.io/mcp \n Or scoped variants: \n https://gateway.pipeworx.io/<pack>/mcp # one pack \n https://gateway.pipeworx.io/mcp?task=... # task-scoped \n https://gateway.pipeworx.io/mcp?vertical=... # vertical-scoped \n List tools \n curl -X POST https://gateway.pipeworx.io/mcp \\ \n -H 'Content-Type: application/json' \\ \n -d '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"tools/list\"}' \\ \n | jq '.result.tools[].name' \n Call a tool \n curl -X POST https://gateway.pipeworx.io/mcp \\ \n -H 'Content-Type: application/json' \\ \n -d '{ \n \"jsonrpc\": \"2.0\", \n \"id\": 1, \n \"method\": \"tools/call\", \n \"params\": { \n \"name\": \"ask_pipeworx\", \n \"arguments\": { \"question\": \"What is the US trade deficit with China?\" } \n } \n }' \n Real capture, trimmed — fred_get_series({series_id: \"MORTGAGE30US\"}) on the internal (paid-equivalent) tier used for verification: \n { \n \"jsonrpc\" : \"2.0\" , \n \"id\" : 1 , \n \"result\" : { \n \"content\" : [{ \"type\" : \"text\" , \"text\" : \"{ \\\" series_id \\\" : \\\" MORTGAGE30US \\\" , ...}\" }], \n \"structuredContent\" : { \"series_id\" : \"MORTGAGE30US\" , \"series_title\" : \"30-Year Fixed Rate Mortgage Average...\" , \"observations\" : [ ... ] }, \n \"_meta\" : { \n \"tier\" : \"paid\" , \n \"source\" : \"fred\" , \n \"fetched_at\" : \"2026-08-10T19:51:05.713Z\" , \n \"cost\" : { \"total\" : 5 , \"components\" : [{ \"name\" : \"base\" , \"credits\" : 5 }] } \n } \n } \n } \n Two things worth calling out that the previous version of this page didn’t mention: \n result.structuredContent — the same data as content[0].text , already parsed. Read this instead of JSON.parse -ing the text block. \n _meta.rateLimit ( { limit, remaining, resetAt } ) is added for every tier except paid — confirmed in shared/src/responses.ts ’s buildMeta() ; not shown above because paid/unlimited accounts have nothing to report against a cap. _meta.cache ( { hit, ttl_seconds, fresh_until } ) is present when the tool result is cacheable; _meta.source / fetched_at / cost are always present on a successful call. \n On an error, _meta carries examples , alternatives , and retry_hint / feedback_hint instead — see error recovery . One exception: an unknown tool name comes back as a bare JSON-RPC -32602 error with no _meta at all — the name is what failed, so there’s nothing to retry-hint; call discover_tools({task}) to find the real name. \n Other MCP methods \n Method Purpose initialize Returns server capabilities + instructions (read these — they tell agents how to use Pipeworx best) tools/list List tools (with inputSchema.examples and outputSchema ) tools/call Invoke a tool resources/templates/list List pipeworx:// URI patterns resources/read Fetch a pipeworx://... resource prompts/list List server-side prompt playbooks prompts/get Get a prompt with arguments substituted \n Authentication \n Tier How Anonymous (50/day) No auth BYO key (200/day) X-API-Key: your-key header Free account (200/day) Authorization: Bearer <token> (GitHub OAuth signup at pipeworx.io) Paid (unlimited\n",
"type": "text"
}
]
},
"run_id": "cmv5rt02p002s0jspby95ykq3",
"tool_id": "chatcmpl-tool-ba23f0ee63818b48",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
Now I have both the pricing info and the API info. Plan: build a simple example. Keep it lightweight — use the hosted HTTP gateway via curl (anonymous, no key needed). What to do:
-
tools/list or tool search — actually the gateway's tools/list might return 6,711 tools. Might be better to use a scoped pack endpoint or the CLI's
tools --grep. Keep it light: do 1–2 curl calls. -
Build a small sample script in /sandbox/repo. For example, a bash or Python script that makes a raw JSON-RPC call. For instance, use fred_get_series with MORTGAGE30US, or use weather. Then run it once to verify it works (anonymous, rate limit is 50/day — no problem, just a few calls).
First let me test the gateway with curl.
Pipeworx is a real npm package with a hosted HTTP MCP gateway available. I'll test it anonymously and then create a minimal example.
curl -s -m 30 -X POST https://gateway.pipeworx.io/fred/mcp -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}' | python3 -c "import json,sys; d=json.load(sys.stdin); print([t['name'] for t in d.get('result',{}).get('tools',[])][:20])"['ask_pipeworx', 'ask_pipeworx_beta', 'ask_pipeworx_grounded', 'search_within', 'deep_research', 'discover_tools', 'resolve_entity', 'compare_entities', 'subscr
['ask_pipeworx', 'ask_pipeworx_beta', 'ask_pipeworx_grounded', 'search_within', 'deep_research', 'discover_tools', 'resolve_entity', 'compare_entities', 'subscribe', 'unsubscribe', 'list_subscriptions', 'recent_alerts', 'entity_profile', 'recent_changes', 'validate_claim', 'company_facts', 'scan_dependency', 'bet_research', 'polymarket_arbitrage', 'polymarket_edges']
Recorded tool call
{
"type": "tool_call",
"seq": 61,
"ts": "2026-10-12T21:35:39.569Z",
"name": "bash",
"turn": 1,
"input": {
"command": "curl -s -m 30 -X POST https://gateway.pipeworx.io/fred/mcp -H 'Content-Type: application/json' -d '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"tools/list\"}' | python3 -c \"import json,sys; d=json.load(sys.stdin); print([t['name'] for t in d.get('result',{}).get('tools',[])][:20])\""
},
"run_id": "cmv5rt02p002s0jspby95ykq3",
"tool_id": "chatcmpl-tool-b3d1b930d417c8ff",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 63,
"ts": "2026-10-12T21:35:42.145Z",
"turn": 1,
"output": {
"content": [
{
"text": "['ask_pipeworx', 'ask_pipeworx_beta', 'ask_pipeworx_grounded', 'search_within', 'deep_research', 'discover_tools', 'resolve_entity', 'compare_entities', 'subscribe', 'unsubscribe', 'list_subscriptions', 'recent_alerts', 'entity_profile', 'recent_changes', 'validate_claim', 'company_facts', 'scan_dependency', 'bet_research', 'polymarket_arbitrage', 'polymarket_edges']\n",
"type": "text"
}
]
},
"run_id": "cmv5rt02p002s0jspby95ykq3",
"tool_id": "chatcmpl-tool-b3d1b930d417c8ff",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
The scoped /fred/mcp endpoint returned meta-tools, but fred_get_series was not returned. The pack-scoped endpoint might need to list its own tools in a different way. For now, let me try calling fred_get_series directly on the main endpoint.
curl -s -m 60 -X POST https://gateway.pipeworx.io/mcp -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"fred_get_series","arguments":{"series_id":"MORTGAGE30US","limit":3}}}' | python3 -m json.tool | head -60{
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"content": [
{
"type": "text",
"text": "{\"series_id\":\"MORTGAGE30US\",\"series_title\":\"30-Year Fixed Rate Mortgage Average in the United States\",\"series_name\":\"30-Year Fixed Rate Mortgage Average in the United States\",\"source\":\"Federal Reserve Bank of St. Louis (FRED)\",\"statement\":\"FRED MORTGAGE30US (30-Year Fixed Rate Mortgage Average in the United States): Percent, Weekly, Ending Thursday, from the Federal Reserve Bank of St. Louis (FRED). 3 of 2898 observation(s) returned newest first, 2026-09-24 to 2026-10-08; latest 7.4 on 2026-10-08.\",\"units\":\"Percent\",\"frequency\":\"Weekly, Ending Thursday\",\"note\":\"Showing 3 of 2898 observations (newest first); raise `limit` for more.\",\"count\":2898,\"returned\":3,\"truncated\":true,\"observation_order\":\"newest_first\",\"observation_start\":\"1971-04-02\",\"observation_end\":\"2026-10-08\",\"observations\":[{\"date\":\"2026-10-08\",\"value\":\"7.4\"},{\"date\":\"2026-10-01\",\"value\":\"7.28\"},{\"date\":\"2026-09-24\",\"value\":\"7.03\"}]}"
}
],
"structuredContent": {
"series_id": "MORTGAGE30US",
"series_title": "30-Year Fixed Rate Mortgage Average in the United States",
"series_name": "30-Year Fixed Rate Mortgage Average in the United States",
"source": "Federal Reserve Bank of St. Louis (FRED)",
"statement": "FRED MORTGAGE30US (30-Year Fixed Rate Mortgage Average in the United States): Percent, Weekly, Ending Thursday, from the Federal Reserve Bank of St. Louis (FRED). 3 of 2898 observation(s) returned newest first, 2026-09-24 to 2026-10-08; latest 7.4 on 2026-10-08.",
"units": "Percent",
"frequency": "Weekly, Ending Thursday",
"note": "Showing 3 of 2898 observations (newest first); raise `limit` for more.",
"count": 2898,
"returned": 3,
"truncated": true,
"observation_order": "newest_first",
"observation_start": "1971-04-02",
"observation_end": "2026-10-08",
"observations": [
{
"date": "2026-10-08",
"value": "7.4"
},
{
"date": "2026-10-01",
"value": "7.28"
},
{
"date": "2026-09-24",
"value": "7.03"
}
]
},
"_meta": {
"tier": "anonymous",
"rateLimit": {
"limit": 50,
"remaining": 49,
"resetAt": "2026-10-13T00:00:00.000Z"
},
"source": "fred",
"fetched_at": "2026-10-12T21:35:44.194Z",
"provenance": {
"provenance_version": 1,
"source": {
"id": "stlouisfed.org",
"name": "Federal Reserve Bank of St. Louis (FRED)",
"type": "government",
"pack": "fred",
"observed": true
},
"upstream": {
"kind": "series_id",
Recorded tool call
{
"type": "tool_call",
"seq": 66,
"ts": "2026-10-12T21:35:43.783Z",
"name": "bash",
"turn": 1,
"input": {
"command": "curl -s -m 60 -X POST https://gateway.pipeworx.io/mcp -H 'Content-Type: application/json' -d '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"tools/call\",\"params\":{\"name\":\"fred_get_series\",\"arguments\":{\"series_id\":\"MORTGAGE30US\",\"limit\":3}}}' | python3 -m json.tool | head -60"
},
"run_id": "cmv5rt02p002s0jspby95ykq3",
"tool_id": "chatcmpl-tool-bcbc8d3225d8b9d0",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 68,
"ts": "2026-10-12T21:35:45.170Z",
"turn": 1,
"output": {
"content": [
{
"text": "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": {\n \"content\": [\n {\n \"type\": \"text\",\n \"text\": \"{\\\"series_id\\\":\\\"MORTGAGE30US\\\",\\\"series_title\\\":\\\"30-Year Fixed Rate Mortgage Average in the United States\\\",\\\"series_name\\\":\\\"30-Year Fixed Rate Mortgage Average in the United States\\\",\\\"source\\\":\\\"Federal Reserve Bank of St. Louis (FRED)\\\",\\\"statement\\\":\\\"FRED MORTGAGE30US (30-Year Fixed Rate Mortgage Average in the United States): Percent, Weekly, Ending Thursday, from the Federal Reserve Bank of St. Louis (FRED). 3 of 2898 observation(s) returned newest first, 2026-09-24 to 2026-10-08; latest 7.4 on 2026-10-08.\\\",\\\"units\\\":\\\"Percent\\\",\\\"frequency\\\":\\\"Weekly, Ending Thursday\\\",\\\"note\\\":\\\"Showing 3 of 2898 observations (newest first); raise `limit` for more.\\\",\\\"count\\\":2898,\\\"returned\\\":3,\\\"truncated\\\":true,\\\"observation_order\\\":\\\"newest_first\\\",\\\"observation_start\\\":\\\"1971-04-02\\\",\\\"observation_end\\\":\\\"2026-10-08\\\",\\\"observations\\\":[{\\\"date\\\":\\\"2026-10-08\\\",\\\"value\\\":\\\"7.4\\\"},{\\\"date\\\":\\\"2026-10-01\\\",\\\"value\\\":\\\"7.28\\\"},{\\\"date\\\":\\\"2026-09-24\\\",\\\"value\\\":\\\"7.03\\\"}]}\"\n }\n ],\n \"structuredContent\": {\n \"series_id\": \"MORTGAGE30US\",\n \"series_title\": \"30-Year Fixed Rate Mortgage Average in the United States\",\n \"series_name\": \"30-Year Fixed Rate Mortgage Average in the United States\",\n \"source\": \"Federal Reserve Bank of St. Louis (FRED)\",\n \"statement\": \"FRED MORTGAGE30US (30-Year Fixed Rate Mortgage Average in the United States): Percent, Weekly, Ending Thursday, from the Federal Reserve Bank of St. Louis (FRED). 3 of 2898 observation(s) returned newest first, 2026-09-24 to 2026-10-08; latest 7.4 on 2026-10-08.\",\n \"units\": \"Percent\",\n \"frequency\": \"Weekly, Ending Thursday\",\n \"note\": \"Showing 3 of 2898 observations (newest first); raise `limit` for more.\",\n \"count\": 2898,\n \"returned\": 3,\n \"truncated\": true,\n \"observation_order\": \"newest_first\",\n \"observation_start\": \"1971-04-02\",\n \"observation_end\": \"2026-10-08\",\n \"observations\": [\n {\n \"date\": \"2026-10-08\",\n \"value\": \"7.4\"\n },\n {\n \"date\": \"2026-10-01\",\n \"value\": \"7.28\"\n },\n {\n \"date\": \"2026-09-24\",\n \"value\": \"7.03\"\n }\n ]\n },\n \"_meta\": {\n \"tier\": \"anonymous\",\n \"rateLimit\": {\n \"limit\": 50,\n \"remaining\": 49,\n \"resetAt\": \"2026-10-13T00:00:00.000Z\"\n },\n \"source\": \"fred\",\n \"fetched_at\": \"2026-10-12T21:35:44.194Z\",\n \"provenance\": {\n \"provenance_version\": 1,\n \"source\": {\n \"id\": \"stlouisfed.org\",\n \"name\": \"Federal Reserve Bank of St. Louis (FRED)\",\n \"type\": \"government\",\n \"pack\": \"fred\",\n \"observed\": true\n },\n \"upstream\": {\n \"kind\": \"series_id\",\n",
"type": "text"
}
]
},
"run_id": "cmv5rt02p002s0jspby95ykq3",
"tool_id": "chatcmpl-tool-bcbc8d3225d8b9d0",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
The live anonymous call is working. Next, I'll write a simple sample into /sandbox/repo — a small Python script that wraps the raw JSON-RPC gateway (no SDK installation needed), and also add a README. I'll keep it lightweight. After that, I'll run it once to verify.
It works live. Now I'll write a small example into the repo.
File edits
1 file
Writtenpipeworx_example.pyView changes
/sandbox/repo/pipeworx_example.py
Written content · previous contents were not recorded
#!/usr/bin/env python3"""Minimal Pipeworx example — talks to the hosted MCP gateway over plain HTTP.No SDK, no account, no local services: just JSON-RPC 2.0 POSTs tohttps://gateway.pipeworx.io/mcp (anonymous tier = 50 calls/day).Set PIPEWORX_API_KEY in your environment to use a free/paid key (200+ calls/day).Usage:python3 pipeworx_example.py # 30-yr mortgage rate (FRED)python3 pipeworx_example.py fred_get_series '{"series_id":"CPIAUCSL","limit":3}'"""import jsonimport osimport sysimport urllib.requestGATEWAY = "https://gateway.pipeworx.io/mcp"def pipeworx_call(tool: str, arguments: dict) -> dict:"""Call one Pipeworx tool and return its structured result."""payload = {"jsonrpc": "2.0","id": 1,"method": "tools/call","params": {"name": tool, "arguments": arguments},}req = urllib.request.Request(GATEWAY,data=json.dumps(payload).encode(),headers={"Content-Type": "application/json"},method="POST",)api_key = os.environ.get("PIPEWORX_API_KEY")if api_key:req.add_header("X-API-Key", api_key)with urllib.request.urlopen(req, timeout=90) as resp:body = json.load(resp)if "error" in body:raise RuntimeError(f"JSON-RPC error: {body['error']}")result = body["result"]meta = result.get("_meta", {})rate = meta.get("rateLimit")if rate:print(f"[rate limit] {rate['remaining']}/{rate['limit']} calls left today",file=sys.stderr)# structuredContent is the same data as content[0].text, already parsedreturn result.get("structuredContent") or json.loads(result["content"][0]["text"])def main() -> None:tool = sys.argv[1] if len(sys.argv) > 1 else "fred_get_series"args = json.loads(sys.argv[2]) if len(sys.argv) > 2 else {"series_id": "MORTGAGE30US","limit": 3,}data = pipeworx_call(tool, args)print(f"{data.get('series_title', tool)}")for obs in data.get("observations", []):print(f" {obs['date']}: {obs['value']} {data.get('units', '')}".rstrip())print(json.dumps(data, indent=2)) # full JSON for piping into jq etc.if __name__ == "__main__":main()
Source: write · chatcmpl-tool-8e0808dd98eb7ff0
Recorded tool call
{
"type": "tool_call",
"seq": 72,
"ts": "2026-10-12T21:35:52.331Z",
"name": "write",
"turn": 1,
"input": {
"path": "/sandbox/repo/pipeworx_example.py",
"content": "#!/usr/bin/env python3\n\"\"\"Minimal Pipeworx example — talks to the hosted MCP gateway over plain HTTP.\n\nNo SDK, no account, no local services: just JSON-RPC 2.0 POSTs to\nhttps://gateway.pipeworx.io/mcp (anonymous tier = 50 calls/day).\n\nSet PIPEWORX_API_KEY in your environment to use a free/paid key (200+ calls/day).\n\nUsage:\n python3 pipeworx_example.py # 30-yr mortgage rate (FRED)\n python3 pipeworx_example.py fred_get_series '{\"series_id\":\"CPIAUCSL\",\"limit\":3}'\n\"\"\"\n\nimport json\nimport os\nimport sys\nimport urllib.request\n\nGATEWAY = \"https://gateway.pipeworx.io/mcp\"\n\n\ndef pipeworx_call(tool: str, arguments: dict) -> dict:\n \"\"\"Call one Pipeworx tool and return its structured result.\"\"\"\n payload = {\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"method\": \"tools/call\",\n \"params\": {\"name\": tool, \"arguments\": arguments},\n }\n req = urllib.request.Request(\n GATEWAY,\n data=json.dumps(payload).encode(),\n headers={\"Content-Type\": \"application/json\"},\n method=\"POST\",\n )\n api_key = os.environ.get(\"PIPEWORX_API_KEY\")\n if api_key:\n req.add_header(\"X-API-Key\", api_key)\n\n with urllib.request.urlopen(req, timeout=90) as resp:\n body = json.load(resp)\n\n if \"error\" in body:\n raise RuntimeError(f\"JSON-RPC error: {body['error']}\")\n\n result = body[\"result\"]\n meta = result.get(\"_meta\", {})\n rate = meta.get(\"rateLimit\")\n if rate:\n print(f\"[rate limit] {rate['remaining']}/{rate['limit']} calls left today\",\n file=sys.stderr)\n # structuredContent is the same data as content[0].text, already parsed\n return result.get(\"structuredContent\") or json.loads(result[\"content\"][0][\"text\"])\n\n\ndef main() -> None:\n tool = sys.argv[1] if len(sys.argv) > 1 else \"fred_get_series\"\n args = json.loads(sys.argv[2]) if len(sys.argv) > 2 else {\n \"series_id\": \"MORTGAGE30US\",\n \"limit\": 3,\n }\n\n data = pipeworx_call(tool, args)\n\n print(f\"{data.get('series_title', tool)}\")\n for obs in data.get(\"observations\", []):\n print(f\" {obs['date']}: {obs['value']} {data.get('units', '')}\".rstrip())\n print(json.dumps(data, indent=2)) # full JSON for piping into jq etc.\n\n\nif __name__ == \"__main__\":\n main()\n"
},
"run_id": "cmv5rt02p002s0jspby95ykq3",
"tool_id": "chatcmpl-tool-8e0808dd98eb7ff0",
"tool_kind": "file_edit"
}Recorded tool result
{
"type": "tool_result",
"seq": 73,
"ts": "2026-10-12T21:35:52.331Z",
"turn": 1,
"output": {
"content": [
{
"text": "Successfully wrote 2275 bytes to /sandbox/repo/pipeworx_example.py",
"type": "text"
}
]
},
"run_id": "cmv5rt02p002s0jspby95ykq3",
"tool_id": "chatcmpl-tool-8e0808dd98eb7ff0",
"is_error": false,
"tool_kind": "file_edit"
}›Thinking…
Run the sample and verify.
cd /sandbox/repo && python3 pipeworx_example.py 2>&1 | head -20
[rate limit] 49/50 calls left today
[rate limit] 49/50 calls left today
30-Year Fixed Rate Mortgage Average in the United States
2026-10-08: 7.4 Percent
2026-10-01: 7.28 Percent
2026-09-24: 7.03 Percent
{
"series_id": "MORTGAGE30US",
"series_title": "30-Year Fixed Rate Mortgage Average in the United States",
"series_name": "30-Year Fixed Rate Mortgage Average in the United States",
"source": "Federal Reserve Bank of St. Louis (FRED)",
"statement": "FRED MORTGAGE30US (30-Year Fixed Rate Mortgage Average in the United States): Percent, Weekly, Ending Thursday, from the Federal Reserve Bank of St. Louis (FRED). 3 of 2898 observation(s) returned newest first, 2026-09-24 to 2026-10-08; latest 7.4 on 2026-10-08.",
"units": "Percent",
"frequency": "Weekly, Ending Thursday",
"note": "Showing 3 of 2898 observations (newest first); raise `limit` for more.",
"count": 2898,
"returned": 3,
"truncated": true,
"observation_order": "newest_first",
"observation_start": "1971-04-02",
"observation_end": "2026-10-08",
Recorded tool call
{
"type": "tool_call",
"seq": 76,
"ts": "2026-10-12T21:35:53.996Z",
"name": "bash",
"turn": 1,
"input": {
"command": "cd /sandbox/repo && python3 pipeworx_example.py 2>&1 | head -20"
},
"run_id": "cmv5rt02p002s0jspby95ykq3",
"tool_id": "chatcmpl-tool-abac50ab34a99368",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 77,
"ts": "2026-10-12T21:35:55.244Z",
"turn": 1,
"output": {
"content": [
{
"text": "[rate limit] 49/50 calls left today\n30-Year Fixed Rate Mortgage Average in the United States\n 2026-10-08: 7.4 Percent\n 2026-10-01: 7.28 Percent\n 2026-09-24: 7.03 Percent\n{\n \"series_id\": \"MORTGAGE30US\",\n \"series_title\": \"30-Year Fixed Rate Mortgage Average in the United States\",\n \"series_name\": \"30-Year Fixed Rate Mortgage Average in the United States\",\n \"source\": \"Federal Reserve Bank of St. Louis (FRED)\",\n \"statement\": \"FRED MORTGAGE30US (30-Year Fixed Rate Mortgage Average in the United States): Percent, Weekly, Ending Thursday, from the Federal Reserve Bank of St. Louis (FRED). 3 of 2898 observation(s) returned newest first, 2026-09-24 to 2026-10-08; latest 7.4 on 2026-10-08.\",\n \"units\": \"Percent\",\n \"frequency\": \"Weekly, Ending Thursday\",\n \"note\": \"Showing 3 of 2898 observations (newest first); raise `limit` for more.\",\n \"count\": 2898,\n \"returned\": 3,\n \"truncated\": true,\n \"observation_order\": \"newest_first\",\n \"observation_start\": \"1971-04-02\",\n \"observation_end\": \"2026-10-08\",\n",
"type": "text"
}
]
},
"run_id": "cmv5rt02p002s0jspby95ykq3",
"tool_id": "chatcmpl-tool-abac50ab34a99368",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
Complete. Next, summarize: what Pipeworx is, how the pricing structure works, whether it's easy to manage, and that it's not blocked. Keep it concise.
Done — nothing blocked me. Here's the summary:
What I built
/sandbox/repo/pipeworx_example.py — a minimal, dependency-free example that talks to Pipeworx's hosted MCP gateway (https://gateway.pipeworx.io/mcp) via plain JSON-RPC 2.0 over HTTP. No SDK to install, no account, no local services. Verified live:
$ python3 pipeworx_example.py
[rate limit] 49/50 calls left today
30-Year Fixed Rate Mortgage Average in the United States
2026-10-08: 7.4 Percent
2026-10-01: 7.28 Percent
2026-09-24: 7.03 Percent
You can call any of their ~6,700 tools the same way: python3 pipeworx_example.py fred_get_series '{"series_id":"CPIAUCSL"}'. There's also an npm CLI (npx pipeworx@latest call <tool> --flag=value) wrapping the same gateway if you prefer shell one-liners.
How pricing works
- Currency: credits (1 credit = $0.0001). Combined operations cost the sum of their parts; no per-pack fees.
- Anonymous: free, 50 tool calls/day, no signup (what the example uses).
- Free account (GitHub signup): 200 calls/day, persistent memory, API token.
- Pay-as-you-go rate card by data category: government/open data $0.005/call, standard databases $0.01, partner sources $0.02; premium sources bill at provider cost × 1.5.
- Subscriptions ($49 or $99/mo) lock lower per-category rates; the fee is a minimum credited against usage, never charged on top. $49 pays for itself at ~9,800 requests/month.
ask_pipeworxanswers: measured inference at 1.5× cost + one request per data lookup actually run (~$0.005 typical). Calls that return no data aren't billed. BYO upstream keys (_apiKey) pay the provider directly with no Pipeworx markup.
Will it be easy for me to manage?
Yes, very. It's a stateless HTTP API — one POST per call, JSON in/out, structuredContent pre-parsed, and useful _meta (rate limits, cost, provenance, retry hints on errors). No infrastructure to run, no long-lived processes, no auth setup needed to start. The only things to watch are the anonymous 50/day cap (a free key raises it to 200/day) and the fact that tool names in the gateway can differ from pack-internal names (e.g. adzuna_search, discoverable via tools/list or discover_tools).
AX Fundamentals
23 checks. Open an area for details.
This check is a quick preview. Test more tasks and models with Gauge Agents.
Test your product with Gauge Agents