tabductor
Developer docs

Automate Tabductor over MCP

Everything you can do with a workflow from code goes through one endpoint: a Model Context Protocol server at http://staging.tabductor.com/api/mcp. Any MCP client — an AI agent, an IDE, or a plain HTTP request — can create workflows from a prompt, run them, poll for the structured result, and schedule them.

Authentication

Create an API key under Settings → Developer. The key is shown once; store it as a secret. Send it on every request:

Authorization: Bearer <your key>

A key acts as your account: workflows it creates are yours, and its usage draws from your prepaid balance. Revoke a key on the same page and it stops working immediately. Requests without a valid key are rejected with 401.

Connect an MCP client

The server speaks streamable HTTP and is stateless, so no session setup is required. In Claude Code:

claude mcp add --transport http tabductor http://staging.tabductor.com/api/mcp \
  --header "Authorization: Bearer $TABDUCTOR_KEY"

Clients that take a JSON configuration use the same URL and header:

{
  "mcpServers": {
    "tabductor": {
      "type": "http",
      "url": "http://staging.tabductor.com/api/mcp",
      "headers": {
        "Authorization": "Bearer ${TABDUCTOR_KEY}"
      }
    }
  }
}

Call it over plain HTTP

Each request is a JSON-RPC 2.0 message; responses come back as JSON. Send both content types in Accept.

curl -s http://staging.tabductor.com/api/mcp \
  -H "Authorization: Bearer $TABDUCTOR_KEY" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"curl","version":"1"}}}'
curl -s http://staging.tabductor.com/api/mcp \
  -H "Authorization: Bearer $TABDUCTOR_KEY" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"workflow_publish","arguments":{"prompt":"Every morning, collect the top 10 Hacker News stories with title and URL."}}}'

A tool's output is in result.structuredContent (and, as text, in result.content[0].text).

The execution flow

  1. Publish — workflow_publish with a directing prompt and, optionally, a JSON Schema for the final result. Returns the workflowId.
  2. Trigger — workflow_trigger starts the workflow. Pass inputs for $variable references and a request_id you can reuse when retrying a request whose response you didn't receive. Returns an executionId.
  3. Poll — workflow_status with both IDs until finished is true. Back off between polls; runs take seconds to minutes.
  4. Read the result — when resultReady is true, result holds the JSON that matches your schema. Failed or cancelled executions carry errors.

To change what a workflow does, call workflow_update with a new prompt; to run it on a timetable, workflow_schedule with a cron expression and time zone. See the tool reference for every parameter.

Usage and billing

There are no plans or seats. Work started through the API — managed browser time, proxy traffic and AI model usage — is paid as you go from your prepaid balance, at the same rates as in the app (see Pricing). When the balance runs out, new paid work is refused until you top up.