MeatSpace

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.

VerifiedStreamable HTTPWeb executableProductivity & WorkflowCommunication & Collaboration

Overview

AI-generated overview

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.

What you can do
  • Check service availability and get guidance on when to escalate a decision to a human
  • Submit a title, optional content and 2–4 labeled choices to a human reviewer and receive the selected option
  • Wait briefly for the answer, then get a pending status with a review link and a poll link if nobody has responded
  • Mint a new API key without authentication, subject to a per-email limit
When to use it
Useful when an assistant reaches a subjective, ambiguous or high-consequence decision — approval before deploys, deletes or payments, taste-based choices, or tie-breaks below a confidence threshold. It is not meant for deterministic, verifiable or easily reversible tasks.
Requirements
A remote Streamable HTTP endpoint; no local install. The ask_human tool needs an Authorization Bearer token, which can be created through the unauthenticated provisioning tool or the REST key endpoint. Network access to the service is required.
Before you install
The provisioning tool creates a real API key without authentication, so anyone who can reach the endpoint can mint one; keys are limited per email address. Requests send your title, content and choices to a third-party service and to a human reviewer, so avoid confidential material. The tool can block for up to about 20 seconds and may return pending rather than a decision.

Installation

In SourceWeft

  1. Open MeatSpace in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Web executable via Streamable HTTP. Remote servers run from the web runtime once configured in a workspace.

Use with an agent

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.

Read the install guide the agent follows

Other MCP clients

Add this to your client's mcpServers config.

{
  "mcpServers": {
    "meatspace": {
      "type": "http",
      "url": "https://meatspace.run/api/mcp"
    }
  }
}

README

MeatSpace

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

What it does

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:

  • Approval gates before destructive or irreversible actions (deploys, deletes, payments).
  • Subjective tie-breaks where the model is below its confidence threshold.
  • Tasteful judgment calls — copy choices, design preferences, ranking ties.
  • Escalation when an agent has run out of deterministic checks.

Don't use it when the task is deterministic, automatically verifiable, or low-stakes and easily reversible.

Three integration methods

MethodEndpointBest for
REST APIPOST /api/requestsAny HTTP client, custom agent frameworks, server-to-server.
MCPPOST /api/mcp (Streamable HTTP)Claude, Claude Code, MCP-compatible clients.
Browser SDK/sdk/meatspace.jsAgents running in a browser tab.

All three sit on the same backing API and accept the same Bearer token.

Zero-setup self-service flow

A new agent can fully onboard itself in three calls — no signup page, no approval queue, no human in the setup loop:

  1. POST /api/keys with {"name": "your-agent", "email": "[email protected]"} → returns an API key instantly. Rate-limited to 5 keys per email.
  2. POST /api/requests with the Bearer token, your title, and choices → creates the review request.
  3. 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.

REST quickstart

Provision a key:

bash
curl -X POST https://meatspace.run/api/keys \  -H "Content-Type: application/json" \  -d '{"name": "my-agent", "email": "[email protected]"}'

The response includes api_key — shown once, save it. All subsequent calls use Authorization: Bearer <token>.

Create a request:

bash
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"  }'

Response:

json
{  "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"  }}

Long-poll for the result:

bash
curl https://meatspace.run/api/requests/{id}/wait?timeout=25000 \  -H "Authorization: Bearer $MEATSPACE_API_KEY"

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).

MCP

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:

json
{  "mcpServers": {    "meatspace": {      "type": "url",      "url": "https://meatspace.run/api/mcp",      "headers": {        "Authorization": "Bearer <your-api-key>"      }    }  }}

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).

Browser SDK

For agents running in browser contexts:

html
<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>

Methods: getKey(), createRequest(), pollResult(), waitForResult(), ask() (create + wait).

Webhooks

If callback_url is set on the request, MeatSpace POSTs the result when the human responds:

json
{  "event": "request.completed",  "request_id": "uuid",  "selected": "ship",  "selected_label": "Ship it",  "responded_at": "2026-04-23T18:10:00.000Z",  "metadata": {}}

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.

Discovery endpoints

PathFormatPurpose
/.well-known/mcp.jsonJSONMCP server manifest
/.well-known/agent.jsonJSONA2A Agent Card
/api/openapiJSONOpenAPI 3.1 spec
/api/mcp (GET)JSONMCP server info, no auth
/api/statusJSONHealth check + agent guidance
/sdk/meatspace.jsJavaScriptBrowser SDK
/llms.txtTextLLM-readable summary
/llms-full.txtTextFull API documentation
/agents.mdMarkdownFull integration guide
/sitemap.xmlXMLSitemap
/robots.txtTextCrawler directives + discovery pointers

Errors

All errors return:

json
{  "success": false,  "error": "Human-readable message",  "code": "machine_readable_code"}

Common codes: agent_name_required, invalid_choice_count, content_too_large, callback_url_not_allowed, request_create_failed.

Local development

This repo is a Next.js 14 app deployed on Cloudflare Pages.

bash
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

Supabase is the system of record for keys and requests; Resend handles transactional email.

License

MIT

Source: README.md at commit ae06995

Tools

3

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.

ask_human

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.

Parameterstitlerequiredrun_idchoicesrequiredcontentmetadatatrace_idagent_namerequiredconfidencecallback_urlcontent_typedecision_reasontimeout_seconds+2 more

provision_api_key

Create 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.

Parametersnamerequiredemailrequired

Version history

1
  1. v0.1.0LatestSep 16, 2026

Score

90% 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.

  • Reached in the last 30 daysRequired25 pts
  • Auth declaredRequired10 pts
  • Tools listedRequired15 pts
  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts

    Declare a license in the repository or the registry entry.