Spec Driven Development
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
Descripción del creador (original en inglés)
MCP server that dispatches physical-world tasks to humans through a unified API
Estos tres nunca se combinan en una sola puntuación: las opiniones, las mediciones y la popularidad son cosas distintas.
Todavía no escribimos un resumen sencillo para este. Abajo están los datos que leímos del registro.
Elige la app de IA que usas y copia la configuración.
RENTAHUMAN_API_KEY, MTURK_ACCESS_KEY_ID, MTURK_SECRET_ACCESS_KEY, MTURK_SANDBOX, MANUAL_WEBHOOK_URLLos valores marcados como secretos son llaves de tu cuenta. Nunca los compartas ni los pegues en un chat.
Necesitas
¿Qué app usas?
Elige tu app arriba. La recordamos, así que la próxima vez el botón dirá “Instalar en …”.
Abre Claude Desktop → Settings → Developer → Edit Config y pega esto en claude_desktop_config.json
{
"mcpServers": {
"human-dispatch": {
"command": "npx",
"args": [
"-y",
"human-dispatch-mcp"
],
"env": {
"RENTAHUMAN_API_KEY": "your-value",
"MTURK_ACCESS_KEY_ID": "your-value",
"MTURK_SECRET_ACCESS_KEY": "your-value",
"MTURK_SANDBOX": "your-value",
"MANUAL_WEBHOOK_URL": "your-value"
}
}
}
}Ejecuta esto en tu terminal
claude mcp add human-dispatch --env RENTAHUMAN_API_KEY=your-value --env MTURK_ACCESS_KEY_ID=your-value --env MTURK_SECRET_ACCESS_KEY=your-value --env MTURK_SANDBOX=your-value --env MANUAL_WEBHOOK_URL=your-value -- npx -y human-dispatch-mcpCompleta los valores vacíos antes de ejecutarlo.
Pégalo en .cursor/mcp.json de tu proyecto, o en ~/.cursor/mcp.json
{
"mcpServers": {
"human-dispatch": {
"command": "npx",
"args": [
"-y",
"human-dispatch-mcp"
],
"env": {
"RENTAHUMAN_API_KEY": "your-value",
"MTURK_ACCESS_KEY_ID": "your-value",
"MTURK_SECRET_ACCESS_KEY": "your-value",
"MTURK_SANDBOX": "your-value",
"MANUAL_WEBHOOK_URL": "your-value"
}
}
}
}Tu navegador te pide permiso para abrir la app; luego la app muestra la configuración y te pide confirmar. Los valores de las claves quedan vacíos para que los completes tú.
Pégalo en .vscode/mcp.json de tu proyecto
{
"servers": {
"human-dispatch": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"human-dispatch-mcp"
],
"env": {
"RENTAHUMAN_API_KEY": "your-value",
"MTURK_ACCESS_KEY_ID": "your-value",
"MTURK_SECRET_ACCESS_KEY": "your-value",
"MTURK_SANDBOX": "your-value",
"MANUAL_WEBHOOK_URL": "your-value"
}
}
}
}Tu navegador te pide permiso para abrir la app; luego la app muestra la configuración y te pide confirmar. Los valores de las claves quedan vacíos para que los completes tú.
Este se ejecuta en tu computadora, y ChatGPT solo puede conectarse a servidores en internet. Elige otra app.
Tu elección se guarda en una cookie en este dispositivo; no necesitas cuenta.
MTURK_SANDBOX envMANUAL_WEBHOOK_URL envEsta configuración se genera a partir de la ficha del creador en el registro. Si el README dice otra cosa, sigue el README.
Se ejecuta en tu computadora; la lista de herramientas aparece en tu app de IA después de instalarlo.
Revisamos información que cualquiera puede ver; no hemos leído el código. Las revisiones que no aplican no se cuentan. · Revisado el 7 nov 2026
El nombre en el registro se verificó con la cuenta de GitHub zyntarasystems, dueña del repo
Todavía no hemos leído este repo en GitHub
Todavía no hemos leído este repo en GitHub
Este se ejecuta en tu computadora; no hay endpoint en internet
Se ejecuta en tu computadora y usa ajustes locales en su lugar
Se ejecuta en tu computadora; solo podemos leer listas de herramientas de endpoints en internet
Comparado con todos los servidores activos de esta categoría en el registro. Las estrellas solo cuentan cuando quien lo publica es dueño del repo.
Superó 1 de 1 revisiones básicas aplicables. No hemos leído el código. Antes de agregar una clave o un token, revisa qué acceso pide el servidor y usa una clave que tenga solo los permisos que necesitas.
Debes completar: RENTAHUMAN_API_KEY, MTURK_ACCESS_KEY_ID, MTURK_SECRET_ACCESS_KEY
Se ejecuta en tu computadora. Tu app de IA lo inicia cuando hace falta, y los datos no pasan por los servidores del creador (a menos que el propio servidor llame a un servicio en línea).
El repo de GitHub cambió por última vez –, y la última versión (0.2.2) llegó al registro hace 7 meses.
Las apps compatibles con MCP, como Claude Desktop, Claude Code, Cursor y VS Code. También necesitas Node.js en tu computadora.
En la misma categoría: Spec Driven Development, Remote Desktop Commander, AvaHR
Servidores de la misma categoría hechos por otros creadores, ordenados por estrellas.
Cómo leer una tarjeta:★ Estrellas de GitHubiTres pilares: reseñas · revisiones · usoiActualizado = fecha en que se publicó la última versión en el registroi
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
Remote Desktop Commander: use files, terminal and processes on your own computers from any AI app.
Read hiring data and create inactive assessment and questionnaire drafts for human review.
Copiado tal cual del repo del creador. PopNx MCP no lo ha revisado ni lo respalda. Se quitaron HTML, imágenes y scripts. Los enlaces llevan fuera de este sitio.
🌐 [humandispatch.ai](https://humandispatch.ai) — Homepage & provider docs
A universal dispatch layer for AI-agent-to-human task routing — Any business (law firms, VA services, freelancers, agencies) can plug in via webhooks and start receiving AI-dispatched tasks in minutes.
Routes tasks to registered webhook providers with smart matching, fallback chains, and proof-of-completion tracking. Any service provider registers a webhook, and the router matches tasks to providers based on capabilities, region, and budget.
# Clone and install
git clone https://github.com/zyntarasystems/human-dispatch-mcp.git cd human-dispatch-mcp npm install
cp .env.example .env
npm run build node dist/index.js
The easiest way to verify the server is working:
npx @modelcontextprotocol/inspector node dist/index.js
Open http://localhost:5173, enter the proxy session token shown in your terminal, and click Connect.
human_list_backends to see webhook_provider and manualhuman_register_provider:{
"name": "Test Provider", "webhook_url": "https://webhook.site/your-uuid", "webhook_secret": "a-secret-that-is-at-least-32-chars-long!", "categories": ["digital_micro"], "task_types": ["digital"], "regions": ["*"], "min_budget_usd": 0, "max_budget_usd": 500, "max_concurrent_tasks": 10 }
human_dispatch_task with Raw JSON input mode:{
"description": "Test task — verify the MCP server is routing correctly", "category": "digital_micro", "task_type": "digital", "budget": { "max_usd": 5, "currency": "USD" }, "deadline": { "complete_by": "2026-04-10T18:00:00Z", "urgency": "low" }, "proof_required": ["text_report"], "quality_sla": "low", "callback_url": null }
The task should route to your registered provider. If no providers match, it falls through to the manual backend.
{
"mcpServers": { "human-dispatch": { "command": "npx", "args": ["human-dispatch-mcp"] } } }
Note: HTTP transport binds to
127.0.0.1only. For remote access, place a TLS-terminating reverse proxy (e.g. nginx, Caddy) in front of the server. Never expose the port directly.
Required: HTTP transport refuses to start without
MCP_AUTH_TOKENset. AllPOST /mcprequests must includeAuthorization: Bearer. The/callbacks/task/:taskIdendpoint uses HMAC-signature auth instead — providers do not see the bearer token.
{
"mcpServers": { "human-dispatch": { "command": "npx", "args": ["human-dispatch-mcp"], "env": { "TRANSPORT": "http", "PORT": "3000", "MCP_AUTH_TOKEN": "a-long-random-string-32-chars-or-more" } } } }
| Tool | Description |
|---|---|
human_dispatch_task | Submit a task to be completed by a human worker via the best matching provider |
human_get_task_status | Poll the current status, worker info, and proof submissions for a task |
human_cancel_task | Cancel a pending or in-progress task |
human_list_tasks | List tasks with filters (status, backend, category) and pagination |
human_list_backends | Show available backends, their configuration status, and capabilities |
human_register_provider | Register a webhook provider to receive dispatched tasks |
human_list_providers | List registered providers with stats and filters |
human_remove_provider | Deregister a webhook provider |
┌─────────────┐
│ AI Agent │ │ (Claude, etc)│ └──────┬───────┘ │ MCP Protocol (stdio or HTTP) ▼ ┌──────────────────────────────────────┐ │ human-dispatch-mcp Server │ │ │ │ ┌────────────┐ ┌────────────────┐ │ │ │ Task Store │ │ Provider │ │ │ │ (in-memory)│ │ Registry │ │ │ └────────────┘ └───────┬────────┘ │ │ │ │ │ ┌────────────┐ ┌───────▼────────┐ │ │ │ Router │──│ Webhook │ │ │ │ (scoring) │ │ Provider │ │ │ └──────┬─────┘ │ Adapter │ │ │ │ └───────┬────────┘ │ │ │ │ │ │ │ ┌───────────▼─────────┐ │ │ │ │ Provider A (law) │ │ │ │ │ Provider B (VA) │ │ │ │ │ Provider C (photos) │ │ │ │ └─────────────────────┘ │ │ ▼ │ │ ┌────────────┐ │ │ │ Manual │ (always-on fallback) │ │ │ Adapter │ │ │ └────────────┘ │ └──────────────────────────────────────┘
Any business can register as a provider to receive AI-dispatched tasks. Here's how:
Your endpoint receives POST requests with these headers:
| Header | Description |
|---|---|
x-dispatch-signature | sha256= — HMAC-SHA256 of the request body using your shared secret |
X-Dispatch-Event | Event type: task.new, task.cancel, or provider.verify |
X-Dispatch-TaskId | UUID of the task |
task.new eventsRequest body:
{
"payload_version": 1, "event": "task.new", "task_id": "uuid", "description": "What needs to be done", "category": "photo_video", "task_type": "physical", "location": { "address": "123 Main St", "region": "US" }, "budget": { "max_usd": 25, "currency": "USD" }, "deadline": { "complete_by": "2026-04-10T18:00:00Z", "urgency": "medium" }, "proof_required": ["photo", "gps_checkin"], "quality_sla": "medium" }
payload_version is the request-shape version; pin your parser to a known version and reject unknown ones. Today only 1 is sent.
Respond with:
{ "accepted": true, "external_id": "your-internal-id" }
Or reject:
{ "accepted": false, "reason": "Outside service area" }
provider.verify eventsWhen a provider is registered, the server immediately POSTs a provider.verify event to confirm the endpoint is reachable and willing. A 200 alone is not enough — your endpoint must return { "verified": true } in the JSON body. Anything else (missing field, false, non-JSON) marks verification as unreachable. This makes registration require explicit consent from your endpoint, not just URL reachability.
POST to http:// /callbacks/task/ with headers:
x-provider-id: Your provider UUIDx-dispatch-signature: sha256= of the body{
"status": "completed", "proof": [ { "type": "photo", "url": "https://...", "submitted_at": "2026-04-10T12:00:00Z" } ], "actual_cost_usd": 20, "notes": "Task completed successfully" }
Always verify incoming webhooks using your shared secret:
const crypto = require('crypto');
const expected = 'sha256=' + crypto.createHmac('sha256', secret).update(rawBody).digest('hex'); const valid = crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(signatureHeader));
HMAC canonicalization contract (load-bearing): the signature is computed over the exact bytes the request was POSTed with, not over a re-serialized JSON object. When you send a callback, sign the byte string you put on the wire — do not parse the body, re-stringify it, and sign that, because key ordering or whitespace may differ. Use JSON.stringify(payload) once, capture the resulting string, sign that string, send that string. The server applies the same rule on the receiving side: it captures the raw request body buffer before any JSON parser touches it.
The router automatically picks the best backend based on:
preferred_backends and fallback_chain are honored firstmanual backend is always available as the ultimate fallbackimport asyncio
from langchain_mcp_adapters.client import MultiServerMCPClient
async def dispatch_photo_task(): async with MultiServerMCPClient({ "human": { "command": "node", "args": ["path/to/human-dispatch-mcp/dist/index.js"], "transport": "stdio", } }) as client: tools = client.get_tools()
await client.call_tool("human_register_provider", { "name": "Photo Service Co", "webhook_url": "https://photos.example.com/webhook", "webhook_secret": "your-secret-that-is-at-least-32-characters", "categories": ["photo_video"], "task_types": ["physical"], "regions": ["US"], "min_budget_usd": 5, "max_budget_usd": 100, "max_concurrent_tasks": 20 })
result = await client.call_tool("human_dispatch_task", { "description": "Take a photo of the menu board at Starbucks on 5th Ave, NYC", "category": "photo_video", "task_type": "physical", "location": { "address": "5th Ave & 42nd St, New York, NY", "region": "US" }, "budget": {"max_usd": 15, "currency": "USD"}, "deadline": { "complete_by": "2026-01-15T18:00:00Z", "urgency": "medium" }, "proof_required": ["photo", "gps_checkin"], "quality_sla": "medium" }) print(result)
asyncio.run(dispatch_photo_task())
| Variable | Default | Description |
|---|---|---|
TRANSPORT | stdio | Transport mode: stdio or http |
PORT | 3000 | HTTP port (when TRANSPORT=http) |
MCP_AUTH_TOKEN | — | Bearer token required on every POST /mcp request when TRANSPORT=http. The HTTP transport refuses to start if unset. |
MANUAL_WEBHOOK_URL | — | Webhook URL for manual task notifications |
PROVIDERS_CONFIG | — | JSON array of provider objects to pre-seed on startup |
This server processes outbound HTTP requests on behalf of its callers and is intended to run inside trusted infrastructure. The relevant guarantees:
MCP_AUTH_TOKEN is mandatory; the server refuses to start without it. Bearer comparison is constant-time (timingSafeEqual).POST /mcp. The transport rejects requests whose Host header points at anything other than the configured loopback.MANUAL_WEBHOOK_URL, callback_url, proof URLs) goes through a structured validator: HTTPS only, no loopback, no RFC1918 / link-local / unique-local hosts, with a DNS resolution check at fetch time to defeat last-second rebinds. There is no opt-out — use a public tunnel (ngrok, cloudflared) for local testing.x-dispatch-signature over the raw request bytes before parsing JSON. A per-provider token bucket limits callback flood (30 burst, 5/sec sustained).completed, failed, or `caSolo se muestra el principio; lee el resto en el repo