{
  "markdown": "# ActionForge MCP server\n\n[![npm](https://img.shields.io/npm/v/actionforge-mcp)](https://www.npmjs.com/package/actionforge-mcp)\n\nPublishes an [ActionForge](https://pritas.github.io/actionforge_ui/) account's\ntools to any MCP client — Claude Desktop, Claude Code, or anything else speaking\nthe Model Context Protocol.\n\n**ActionForge** turns a description and a pair of JSON Schemas into a hosted API\nendpoint. You describe the function you need; it generates the implementation,\ndeploys it as a serverless function, and returns a validated URL. Every tool is\na pure function of its input — generated code is scanned before deploy and\nrefused if it reaches the network or executes code built at runtime.\n\nThis package is the MCP bridge: your endpoints become tools Claude can call\ndirectly. It has **no runtime dependencies** — stdio, `fetch`, and about 500\nlines.\n\nGet an API key at\n[pritas.github.io/actionforge_ui](https://pritas.github.io/actionforge_ui/#start).\n\nThe mapping is close to one-to-one, which is why this wrapper is thin: an\nActionForge tool already *is* an MCP tool — a name, a description, a JSON Schema\nfor input, and one for output. `tools/list` reads `GET /api/tools`;\n`tools/call` posts to the tool's proxy URL.\n\nImplemented directly against the 2025-06-18 protocol schema rather than via the\nSDK. That keeps the install to a single package with nothing beneath it, and\nevery branch stays exercisable offline — `npm run smoke` drives the compiled\nserver over stdio against a closed port, so the handshake, the silence expected\nof a notification, and transport-failure handling are all checked without an\naccount.\n\n## Install\n\n```bash\nnpx actionforge-mcp\n```\n\nZero runtime dependencies — the whole server is stdio, `fetch`, and about 500\nlines. Nothing to install beyond Node 20.12+.\n\nFrom a checkout of this repo instead:\n\n```bash\nnpm install\nnpm run build\nnode dist/server.js\n```\n\n## Configure\n\n```bash\nexport ACTIONFORGE_URL=https://your-deployment.example.com\nexport ACTIONFORGE_API_KEY=af_...        # from POST /api/signup, or npm run keygen\nnpx actionforge-mcp\n```\n\nEverything published is scoped to that key's account. Point it at a different\nkey and it publishes a different tenant's tools — the API enforces the scoping,\nso the MCP server cannot see past it.\n\nTransport is stdio with newline-delimited JSON. **stdout carries protocol\nframes only**; all logging goes to stderr, because anything else corrupts the\nstream a client is parsing.\n\n## Claude Desktop\n\n`claude_desktop_config.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"actionforge\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"actionforge-mcp\"],\n      \"env\": {\n        \"ACTIONFORGE_URL\": \"https://your-deployment.example.com\",\n        \"ACTIONFORGE_API_KEY\": \"af_...\"\n      }\n    }\n  }\n}\n```\n\n## Claude Code\n\n```bash\nclaude mcp add actionforge \\\n  --env ACTIONFORGE_URL=https://your-deployment.example.com \\\n  --env ACTIONFORGE_API_KEY=af_... \\\n  -- npx -y actionforge-mcp\n```\n\n## How failures are reported\n\nThe protocol draws a line this server follows exactly, because it decides\nwhether a model can recover on its own:\n\n| Situation | Reported as | Why |\n|---|---|---|\n| Arguments fail the tool's `input_schema` (400) | result with `isError: true` | The model can read the validation detail and fix the call |\n| Tool not ready yet (503) | result with `isError: true` | Transient — retry shortly |\n| Rate limited (429) | result with `isError: true` | Includes how long to wait |\n| Tool ran but broke its own `output_schema` (502) | result with `isError: true`, named as a fault in the tool | Not the model's arguments |\n| Tool does not exist (404), or an unknown tool name | JSON-RPC error | Nothing the model can correct; the client should re-list |\n| ActionForge unreachable | JSON-RPC error `-32603` | Transport failure, not a tool result |\n\nAnything the model could act on stays inside the result where it can see it.\nOnly genuinely exceptional conditions become protocol errors.\n\n## Caching\n\nThe tool list is cached for 30 seconds, and the cache is dropped immediately\nwhen a tool turns out to be gone — so a deleted tool disappears on the next\nlisting rather than lingering until the TTL expires.\n\n## Publishing\n\n```bash\nnpm run build && npm run smoke\nnpm publish --access public\n```\n\n`dist/` is gitignored — it is a build artifact, rebuilt by `prepublishOnly`, so\nwhat npm receives is always compiled from the committed source.\n\nBump `version` before each publish; npm refuses to overwrite a released\nversion.\n",
  "bytes": 4506,
  "sha": "757b12d7125e78baf79a5f73cc59f7e783a196f4877301738708514f6b1172ef",
  "repo_slug": "pritas/actionforge-mcp",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_pritas_actionforge_1adc5cc3/readme"
}