⚗ ScientistWorkbench

Documentation

MCP server

The same service as the HTTP API, exposed as a Model Context Protocol server so agent frameworks and coding assistants can submit science jobs and read results without HTTP glue.

Endpoint: https://api.scientistworkbench.com/mcp (streamable HTTP). Auth: Authorization: Bearer wb_….

Connect

Claude Code

claude mcp add -s user --transport http science https://api.scientistworkbench.com/mcp --header "Authorization: Bearer wb_…"

Claude, Claude Desktop and Claude Cowork (custom connector — added once, available on every surface you sign in to) 1. Customize → Connectors → Add custom connector. On Team/Enterprise an owner adds it under Organization settings → Connectors → Add → Custom → Web, and members then click Connect. 2. Name it ScientistWorkbench; MCP server URL https://api.scientistworkbench.com/mcp. 3. Authentication: No sign-in, then under Request headers add authorization with the value Bearer wb_… — type the Bearer prefix followed by your key. Claude sends the value exactly as entered. 4. Add, then enable the connector per conversation from the + menu → Connectors.

Request-header auth is rolling out gradually; if the dialog shows no Request headers section, that organisation cannot pass an API key yet. Jobs take 5–40 minutes: tell Claude to keep calling science_wait until the job is terminal, then read science_result and relay the reviewer findings.

Cursor / other MCP clients (.cursor/mcp.json or equivalent)

{"mcpServers": {"science": {"url": "https://api.scientistworkbench.com/mcp",
                            "headers": {"Authorization": "Bearer wb_…"}}}}

claude.ai / Claude desktop custom connector (no header field) Custom connectors cannot send an Authorization header, so put the key in the URL instead:

https://api.scientistworkbench.com/mcp/k/wb_…

Settings → Connectors → Add custom connector → paste that URL, no authentication. Issue a dedicated key labelled "claude.ai" for it so you can revoke it on its own; the key is visible in your connector settings, and our access logs redact it. Run science_test in a new chat to confirm.

Python (mcp ≥ 2)

from mcp import ClientSession
from mcp.client.streamable_http import streamable_http_client
from mcp.shared._httpx_utils import create_mcp_http_client

http = create_mcp_http_client(headers={"Authorization": "Bearer wb_…"})
async with streamable_http_client("https://api.scientistworkbench.com/mcp", http_client=http) as streams:
    async with ClientSession(streams[0], streams[1]) as s:
        await s.initialize()
        r = await s.call_tool("science_submit", {"prompt": "…", "inputs": [{"name": "plate.xlsx", "base64": "…"}]})

Tools

tool arguments returns
science_submit prompt, company?, job_class="specialist", entity_id?, entity_type?, inputs=[{name, base64|url}], source_refs, metric_keys, entity_hints, evidence_date?, caller {job_id, status:"queued"} immediately
science_wait job_id, seconds=300 (5–600) the full result when terminal, else {status, status_description, last_text}
science_status job_id job status
science_result job_id, include_figures=true result JSON plus image blocks for figures (≤ 2 MB each)
science_artifact job_id, filename, max_chars=20000 text artifacts as text, images as image blocks, other binaries as a science:// resource pointer
science_cancel job_id {job_id, status}
science_jobs company?, limit=20 your recent jobs
science_test — connection test: service reachable, key accepted, workspace, balance. Call this first
science_health — service health and job classes

Resources: science://{job_id}/{filename} (any artifact) and science://{job_id}/result.

Attaching data

  • inputs[].base64 — inline, ≤ 20 MB. Best for spreadsheets, CSVs, small FASTA.
  • inputs[].url — public https URL, fetched server-side, ≤ 500 MB. Best for large downloads.
  • Files are mounted read-only into the job sandbox under /workspace/inputs/; the agent sees only the names you give.

The loop

science_test() -> connected: true (run once after setup)
science_submit(prompt, inputs) -> job_id
repeat: science_wait(job_id, 300) until status in done|failed|cancelled|timed_out
science_result(job_id) -> summary_md, artifacts, reviewer_findings, billing
science_artifact(job_id, "summary.md") for the report; figures come back inline

Typical jobs take 5–40 minutes. science_wait returns early on completion.

Guidance for agents

  • One question per job; put deliverables and thresholds in the prompt.
  • Quote numbers from artifacts, not from memory; cite the science: reference.
  • Always relay reviewer_findings; never drop a fail.
  • Jobs are never stopped for budget; usage is debited when the job ends (billing.tokens_debited).

Troubleshooting

  • Custom connector added but no tools appear — the header name must be authorization and its value must include the Bearer prefix. The connector reaches us from Claude's cloud rather than your machine; our endpoint is public, so there is nothing to allowlist.
  • 401 — bad or revoked key. 402 — out of tokens; top up in the dashboard. 429 — two jobs already running.
  • science_wait keeps returning running — normal for research-class jobs; keep looping, or check last_text.
  • 409 on result — the job is not finished yet.