get_service_status
Check whether MeatSpace is available and when to use a human. Call this when deciding whether to escalate a subjective or high-consequence choice.
Takes no parameters.
io.github.zmartenPublished by GitHub account zmartenv0.1.0Updated Oct 24, 2026
Human-in-the-loop for AI agents. Submit choices, get a human decision.
MeatSpace is a remote human-in-the-loop service that lets an assistant send a 2–4 option choice to a human reviewer and receive the selected answer.
Web executable via Streamable HTTP. Remote servers run from the web runtime once configured in a workspace.
Paste this prompt into Claude Code, Codex, Cursor or another agent — or into SourceWeft chat. The agent reads this server's install guide, shows you its publisher, endpoint and sign-in, and adds it to your client once you agree. Keys never go into a command.
Read https://sourceweft.com/mcp/io.github.zmarten%2Fmeatspace/install.md and connect the MCP server it describes to my client. Before changing any config, show me its publisher, endpoint and sign-in method and wait for my OK. Never put an API key in a command or in a file I would commit; ask me where it should come from.Add this to your client's mcpServers config.
{
"mcpServers": {
"meatspace": {
"type": "http",
"url": "https://meatspace.run/api/mcp"
}
}
}Human-in-the-loop service for AI agents. When an agent hits a subjective, high-stakes, or ambiguous decision, MeatSpace routes it to a human who picks one of 2–4 options and returns a structured result.
Live at meatspace.run
An agent posts a title, optional content (text, markdown, HTML, or an image), and 2–4 labeled choices. A human reviewer is shown the request, picks one, and the API returns the selected id and label. The agent waits via long-poll or webhook.
Typical use cases:
Don't use it when the task is deterministic, automatically verifiable, or low-stakes and easily reversible.
All three sit on the same backing API and accept the same Bearer token.
A new agent can fully onboard itself in three calls — no signup page, no approval queue, no human in the setup loop:
POST /api/keys with {"name": "your-agent", "email": "[email protected]"} → returns an API key instantly. Rate-limited to 5 keys per email.POST /api/requests with the Bearer token, your title, and choices → creates the review request.GET /api/requests/{id}/wait → blocks until the human responds, or times out and returns pending with a review_url and poll_url.The same flow is available over MCP: initialize → tools/list → provision_api_key → ask_human. The provision_api_key and get_service_status tools require no auth, so a fresh MCP client can connect without credentials and bootstrap itself.
Provision a key:
The response includes api_key — shown once, save it. All subsequent calls use Authorization: Bearer <token>.
Create a request:
Response:
Long-poll for the result:
Returns { status: "completed", selected, selected_label, responded_at } when the human responds, or 202 if still pending.
Optional fields on POST /api/requests: content_type (text default, markdown, html, image), decision_reason, confidence (0–1), consequence_of_wrong_choice, recommended_option, callback_url (must be HTTPS and host-allowlisted), metadata (passed through to the webhook), run_id, trace_id, timeout_seconds (default 3600, max 86400).
MeatSpace implements MCP over Streamable HTTP at https://meatspace.run/api/mcp. The server exposes three tools:
get_service_status — availability and escalation guidance. No auth.provision_api_key — mint a Bearer token. No auth, rate-limited.ask_human — submit a decision. Requires Bearer auth.Claude Code config:
ask_human long-polls for up to 20 seconds. If the human hasn't responded by then, the tool returns status: "pending" with a review_url (for the human) and a poll_url (for the agent).
For agents running in browser contexts:
Methods: getKey(), createRequest(), pollResult(), waitForResult(), ask() (create + wait).
If callback_url is set on the request, MeatSpace POSTs the result when the human responds:
callback_url must be https:// and the hostname must be explicitly allowlisted by the operator. If no allowlist is configured, request creation rejects callback URLs. Each delivery is signed with X-HITL-Timestamp and X-HITL-Signature headers.
All errors return:
Common codes: agent_name_required, invalid_choice_count, content_too_large, callback_url_not_allowed, request_create_failed.
This repo is a Next.js 14 app deployed on Cloudflare Pages.
Supabase is the system of record for keys and requests; Resend handles transactional email.
MIT
Source: README.md at commit ae06995
Check whether MeatSpace is available and when to use a human. Call this when deciding whether to escalate a subjective or high-consequence choice.
Takes no parameters.
Present content to a human and ask them to choose between options. Use this for subjective judgment, approval, preference, or tie-breaks. Avoid using it for deterministic checks or reversible low-stakes choices. The tool waits briefly for a result, then returns pending if the human has not responded yet.
titlerequiredrun_idchoicesrequiredcontentmetadatatrace_idagent_namerequiredconfidencecallback_urlcontent_typedecision_reasontimeout_seconds+2 moreCreate a MeatSpace API key instantly. No authentication required. Returns a Bearer token for use with the ask_human tool. Max 5 active keys per email address.
namerequiredemailrequired90% of the applicable checks met
How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.
Declare a license in the repository or the registry entry.
curl -X POST https://meatspace.run/api/keys \ -H "Content-Type: application/json" \ -d '{"name": "my-agent", "email": "[email protected]"}'curl -X POST https://meatspace.run/api/requests \ -H "Authorization: Bearer $MEATSPACE_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "agent_name": "my-agent", "title": "Ship v2.0 to production?", "content": "All tests pass. Staging looks good. 2 minor lint warnings.", "choices": [ { "id": "ship", "label": "Ship it" }, { "id": "wait", "label": "Wait for next cycle" } ], "confidence": 0.7, "consequence_of_wrong_choice": "Premature ship affects ~50k users" }'{ "success": true, "data": { "id": "uuid", "status": "pending", "review_url": "https://meatspace.run/review/uuid?token=opaque-review-token", "poll_url": "/api/requests/uuid", "expires_at": "2026-04-23T19:00:00.000Z" }}curl https://meatspace.run/api/requests/{id}/wait?timeout=25000 \ -H "Authorization: Bearer $MEATSPACE_API_KEY"{ "mcpServers": { "meatspace": { "type": "url", "url": "https://meatspace.run/api/mcp", "headers": { "Authorization": "Bearer <your-api-key>" } } }}<script type="module"> import { MeatSpace } from 'https://meatspace.run/sdk/meatspace.js';
const ms = new MeatSpace(); await ms.getKey({ name: 'browser-agent', email: '[email protected]' });
const result = await ms.ask({ agentName: 'browser-agent', title: 'Which option?', choices: [ { id: 'a', label: 'A' }, { id: 'b', label: 'B' }, ], }); console.log(result.selected);</script>{ "event": "request.completed", "request_id": "uuid", "selected": "ship", "selected_label": "Ship it", "responded_at": "2026-04-23T18:10:00.000Z", "metadata": {}}{ "success": false, "error": "Human-readable message", "code": "machine_readable_code"}npm installnpm run dev # local dev at http://localhost:3000npm run test # integration testsnpm run build:cf # build for Cloudflare Pagesnpm run deploy:cf # build and deploy