GetABrainπ§ | Live Human-in-the-Loop MCP for AI Agents
<p align="center">
<img src="./logo.png" alt="GetABrain" width="128" height="128" />
</p>
# @getabrain/mcp-server
MCP server for [GetABrain.ai](https://getabrain.ai) β give your AI agent real human judgment as native tools.
## Use with Claude Desktop / Cursor
Add to your MCP client config (e.g. `claude_desktop_config.json`):
```json
{
"mcpServers": {
"getabrain": {
"command": "npx",
"args": ["-y", "@getabrain/mcp-server"],
"env": {
"GETABRAIN_API_KEY": "gab_k_β¦",
"GETABRAIN_API_SECRET": "gab_s_β¦"
}
}
}
}
```
Get your API key by signing up at https://getabrain.ai.
## Remote (hosted) MCP server -- no install
Prefer not to run anything locally? GetABrain also hosts this same server over Streamable HTTP at
`https://www.getabrain.ai/api/mcp`. Point any MCP client that supports remote servers at that URL and
pass your key pair as headers instead of env vars:
```json
{
"mcpServers": {
"getabrain": {
"url": "https://www.getabrain.ai/api/mcp",
"headers": {
"X-API-Key": "gab_k_β¦",
"X-API-Secret": "gab_s_β¦"
}
}
}
}
```
Same 7 tools, same schemas, same test-mode support -- see `docs/deploy/remote-mcp.md` in this repo for
details (Smithery-style clients, auth requirements, etc).
## Test mode
Test mode is a flag on the key, not a different key format. When you mint an API key β via
`POST /api/v1/requestor/keys` with `{"mode":"test"}`, or by choosing "test" in the dashboard β you get
back a completely normal `gab_k_β¦` / `gab_s_β¦` key pair. There's no `_test_` in the string; the
test-ness lives in the database as an `is_test` flag on that key. No funding or card required.
Point `GETABRAIN_API_KEY` / `GETABRAIN_API_SECRET` at a test-mode key and the server behaves identically, except:
- `submit_query` never touches your balance β no charge, no `insufficient_balance` errors.
- Responses come back synthetic and are always marked **`simulated: true`**, so your pipeline (submit β
wait/poll β rate) can be built and exercised end-to-end before any real human worker or real money is
involved.
- `get_balance` reports `mode: "test"` so the agent/human can tell at a glance which environment it's in.
When you're ready to go live: mint a **live-mode key** (same call, `{"mode":"live"}` or the dashboard
default), fund the account with `create_topup_link` (works with either key type β a test-mode agent can
generate the link, a human completes checkout to add real funds), and swap the env vars. `get_balance`
then reports `mode: "live"`, and `submit_query` starts spending real balance and dispatching to real paid
workers.
## Tools
- `get_balance` β read-only: prepaid balance (cents), `mode` (`"test"`/`"live"`), and `auto_reload_enabled`
(with a setup link + hint when it's off and would otherwise stall a live account at zero balance).
- `create_topup_link` β mints a Stripe Checkout URL to add funds (min $5); a human opens it in a browser to
pay β the agent cannot complete payment itself.
- `submit_query` β ask real humans a question (16 query types: A/B test, rating, ranking, sentiment, yes/no,
image/video/audio review, voice/video/photo capture, β¦). Returns a `query_id`. Spends balance on a live
key; free and `simulated: true` on a test key.
- `get_responses` β one-shot, read-only: current status + whatever responses exist right now, no waiting.
- `wait_for_responses` β bounded polling (up to `max_wait_seconds`, default/max 50s); returns `ready` with
responses once enough arrive, or `pending` β call again to keep waiting. Use this instead of `get_responses`
when you want the tool call itself to wait.
- `list_queries` β read-only: your recent queries, optionally filtered by `status`.
- `rate_response` β rate a worker's answer 1β5 (optional `feedback_text`); feeds the worker quality system.
## Example agent flow
1. `get_balance` β confirm funds (or `mode: "test"` for a free sandbox run).
2. If funds are short on a live key: `create_topup_link` β human completes checkout β `get_balance` again.
3. `submit_query` β get `query_id`.
4. `wait_for_responses` (repeat while `pending`) β read the human (or simulated, in test mode) answers.
5. `rate_response` β optionally rate each response to improve future worker matching.
Full API docs: https://getabrain.ai/docs/api
TDQS
Scored across 7 tools
Each tool has a clear, distinct purpose: topup link generation, balance checking, response retrieval (one-shot vs. waiting), query listing, response rating, and query submission. The descriptions explicitly differentiate overlapping tools like get_responses and wait_for_responses.
All tool names follow a consistent verb_noun pattern in snake_case (e.g., create_topup_link, get_balance, list_queries). The verbs are descriptive and the naming convention is uniform.
With 7 tools, the server covers the essential operations for a human-in-the-loop system: balance management, query lifecycle (submit, wait, check), listing, and rating. The count feels well-scoped without unnecessary bloat or gaps.
The tool set covers the core workflow (submit, wait, get, rate, fund). However, there are minor gaps: no tool to cancel or delete a query, and no ability to manage balance history or refunds. These are not critical but slightly reduce completeness.