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 afail. - 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
authorizationand its value must include theBearerprefix. 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_waitkeeps returningrunning— normal for research-class jobs; keep looping, or checklast_text.409on result — the job is not finished yet.