Skip to main content
The CLI runs a small HTTP runtime on your machine: a durable background service that any MCP-compatible agent can connect to. Your integrations, credentials, and policies stay local.

Install

Requires Node.js 20 or newer.

Start the service

Install the durable background service, then open the web UI:
executor install registers Executor so it keeps running across restarts. For a throwaway foreground runtime instead, run executor web --foreground.

Connect an agent

Add Executor to any MCP client (Claude Code, Cursor, OpenCode) with npx add-mcp. It detects the client and writes its config for you. Connect over HTTP or through the CLI:
Executor serves a streamable-HTTP MCP endpoint at http://127.0.0.1:4788/mcp:
The Connect card in the web UI shows this command with your exact URL (and port, if it differs) already filled in.

Add an integration

From the web UI, click Add Source and paste an OpenAPI, GraphQL, or MCP URL. Executor detects the type, indexes the tools, and handles auth. Or add one from the CLI:
Use baseUrl when the OpenAPI document has relative servers entries (e.g. "/api/v3"). Confirm it’s live:

Call tools

executor call, executor resume, and executor tools … auto-start the local daemon if it isn’t already running. If an execution pauses for auth or approval, resume it:

Generate a typed client

executor generate exports your tool catalog as an OpenAPI 3.1 document: one REST operation per tool, with full input/output schemas. Feed it to whatever client generator you already use (openapi-typescript, openapi-generator, Kiota, …) and every call is typed end to end while still executing through Executor (auth, policies, and approvals included):
The same document is served live at GET /api/tools/export/openapi (bearer auth), so generators that take a URL can point straight at the instance. The operations it describes are real endpoints: POST /api/tools/invoke/{tool path} runs the tool and returns { ok: true, data } or { ok: false, error }; approval-gated calls return error.code: "execution_paused" with resume coordinates. Prefer a ready-made client instead of running a generator? --format typescript writes a single self-contained TypeScript file with a dependency-free runtime client:
Calls that pause for approval throw ExecutorPausedError with the approval URL. Re-run executor generate whenever your catalog changes.