Human For AI
Measured conclusion: Alive, not deep-tested. L2 outcome: not_attempted.
Hire a real human for real-world verification, product testing, AI output review, and errands.
| Author | dev.humanforai |
|---|---|
| Access | mixed |
| Publisher key required | No |
| Measured state | Alive, not deep-tested |
| L1 liveness | alive |
| L1 latency | 2392 ms |
| Last measured | 2026-10-26 |
Add to your agent
Copy this into your MCP client config:
{
"mcpServers": {
"Human For AI": {
"url": "https://humanforai.dev/mcp",
"transport": "streamable-http"
}
}
}
Measured tools (6)
get_human_servicesread-onlyFetch the Human For AI manifest: available services, operator profile (location, languages, working hours), response times, accepted and rejected task types, and trust & safety policy. Call this first to decide whether and how to hire the human. The catalog is examples, not limits — unlisted needs are welcome as custom_human_in_the_loop.
Hints: read-only yes · destructive not declared · idempotent not declared · open-world yes
submit_human_taskSubmit a task for the human operator to perform in the real world. Returns a task_id immediately; the human reviews every task before accepting it (this is not instant execution). The operator is push-notified on submission; check_task_status shows seen_by_operator_at once a human has seen the task. Free during the pilot. contact_email must be a real mailbox (MX-checked) — it is how the deliverable reaches you. No mailbox? Set delivery to 'status_poll' instead: the deliverable arrives as text in operator_notes via check_task_status (limited to 1 such task per client per day). In hosts that support MCP Apps the result also renders as a task status card with a Refresh button; the JSON result carries the same data.
Parameters:
task_type(required) — string — Service category — see get_human_services for descriptions. The list is not exhaustive: use custom_human_in_the_loop for anything that fits no other categorydescription(required) — string — What to do, where, and what success looks like. Specific, self-contained tasks are accepted faster.deadline— string — ISO 8601 datetime, e.g. 2026-07-10T12:00:00+03:00delivery— string — How the deliverable reaches you. 'email' (default) needs contact_email. 'status_poll' is the no-mailbox path for autonomous agents: the result arrives as text in operator_notes via check_task_status — keep the task_id, it is your only key. Budget: 1 status_poll task per client per day.requester— string — Your agent or system identifier, e.g. my-agent/1.0contact_email— string — Where the deliverable and clarifying questions are sent. Required unless delivery is 'status_poll'. Must be a real, reachable mailbox — placeholder domains are rejected and the domain is MX-checked.output_format— string — text_report (default), text_report_with_photos, structured_json, annotated_screenshots, or videolocation_detail— string — City, address, or area — required in practice when location_required is truelocation_required— boolean — true if the task needs physical presence (coverage is confirmed at review)
Hints: read-only no · destructive no · idempotent no · open-world yes
check_task_statusread-onlyLook up a submitted task by its task_id. Returns current status (submitted → accepted → delivered, or rejected), status history with timestamps, seen_by_operator_at (the moment a human actually saw the task — usually well before the first status change), eta (operator-set delivery estimate, once accepted), and any operator notes. Once delivered, the response also carries receipt (a signed JWS binding the deliverable's sha256 to the lifecycle timestamps) and deliverable_sha256 — verify offline against https://humanforai.dev/.well-known/jwks.json. In hosts that support MCP Apps the result also renders as a task status card (timeline, seen-by-human moment, ETA, operator notes, receipt) with a Refresh button; the JSON result carries the same data.
Parameters:
task_id(required) — string — Task ID returned by submit_human_task, e.g. HFAI-2026-A1B2C3D4E5F60718
Hints: read-only yes · destructive not declared · idempotent not declared · open-world yes
message_human_operatorSend a free-form message to the human operator — questions, scoping, custom or recurring projects, anything that is not yet a ready-made task. reply_to is REQUIRED: an email a human can read (MX-checked), or an https URL to receive the reply as a signed webhook push. The response also carries thread_url + access_token — every message is a pollable thread, so you can read the reply with check_message_thread even without a mailbox. Keep the token: it is shown only once.
Parameters:
message(required) — string — The message. Plain language, English.reply_to(required) — string — REQUIRED. Email address for the reply (real, reachable, MX-checked) — or an https webhook URL for a signed push.from— string — Your agent or system identifiersubject— string — Short subject line
Hints: read-only no · destructive no · idempotent no · open-world yes
check_message_threadread-onlyRead the thread for a message you sent: the original text, every reply oldest-first, and whether the operator has answered. Needs the message_id and the access_token from the submission response. An empty replies list means no answer yet — the operator works at human speed, so poll occasionally rather than in a loop.
Parameters:
message_id(required) — string — The message id from message_human_operator, e.g. MSG-2026-1A2B3C4Daccess_token(required) — string — The access_token returned once at submission — the only key to the thread.
Hints: read-only yes · destructive not declared · idempotent not declared · open-world not declared
reply_in_message_threadAdd a follow-up to a thread you opened — answer a question the operator asked, add detail, correct yourself, or withdraw the request. Prefer this over sending a brand-new message about the same subject. Needs the message_id and access_token from the submission response.
Parameters:
message_id(required) — string — The message id from message_human_operatoraccess_token(required) — string — The access_token returned once at submissionmessage(required) — string — The follow-up text
Hints: read-only no · destructive no · idempotent no · open-world yes
Measured by MCPYP probing. Untested fields are omitted, never estimated. Listing is always free; MCPYP never proxies calls or stores user tokens.