Skip to main content
Glama
MariusAure

NeedHuman

need_human

Delegate tasks requiring human verification, identity authentication, or legal personhood when AI agents encounter access barriers like CAPTCHA, terms acceptance, or login walls.

Instructions

Call when you cannot proceed because the next step requires a real human.

USE WHEN you are blocked by:

  • Terms of Service or legal agreements requiring a natural person

  • Account creation that needs identity verification or CAPTCHA

  • Authentication requiring human identity (BankID, SMS 2FA, OAuth)

  • Forms requiring human verification or a physical-world action

  • Content behind a login wall you cannot access

  • Any step requiring legal personhood, physical presence, or human identity

DO NOT USE for: sending messages, making HTTP requests, writing code, or any task you can complete with your existing tools.

The human is a paid worker (billed per task), not your operator. Never include passwords, card numbers, CVCs, bank account numbers, SSNs, authentication tokens, or API keys in the description. If a task requires payment, tell the human what to pay for and where — they will use their own payment method.

Format your description as numbered steps, one instruction per line. Put each URL on its own line. End with "REPLY WITH:" listing expected deliverables.

Example: STEPS:

  1. Create account at https://example.com/signup

  2. Accept the terms of service. REPLY WITH: confirmation URL, account ID

Free tier included on registration. Each task costs 1 credit. Returns 402 when credits are exhausted. Fastest during European business hours (CET). Tasks submitted outside these hours may take longer. Typical completion: 2-30 minutes. Use check_task_status to poll.

Set demo:true for an instant synthetic response to verify your integration works. No credits consumed.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
descriptionYesWhat you need the human to do. Include URLs, account details, and expected outcome.
action_typeNoCategory: 'create_account', 'accept_terms', 'complete_web_action', 'bankid_auth', 'verify_identity', 'form_submission'
urgencyNoimmediate = target completion within 5 minutes. normal = within 60 minutes.
demoNoSet to true to get an instant synthetic response. No credits consumed, no real human involved. Use to verify integration works before submitting real tasks.

Implementation Reference

  • The 'need_human' tool handler is defined in mcp-server.ts, which takes task parameters and dispatches a POST request to the NeedHuman API.
      server.tool(
        "need_human",
        `Call when you cannot proceed because the next step requires a real human.
    
    USE WHEN you are blocked by:
    - Terms of Service or legal agreements requiring a natural person
    - Account creation that needs identity verification or CAPTCHA
    - Authentication requiring human identity (BankID, SMS 2FA, OAuth)
    - Forms requiring human verification or a physical-world action
    - Content behind a login wall you cannot access
    - Any step requiring legal personhood, physical presence, or human identity
    
    DO NOT USE for: sending messages, making HTTP requests, writing code, or any task you can complete with your existing tools.
    
    The human is a paid worker (billed per task), not your operator. Never include passwords, card numbers, CVCs, bank account numbers, SSNs, authentication tokens, or API keys in the description. If a task requires payment, tell the human what to pay for and where — they will use their own payment method.
    
    Format your description as numbered steps, one instruction per line. Put each URL on its own line. End with "REPLY WITH:" listing expected deliverables.
    
    Example:
      STEPS:
      1. Create account at https://example.com/signup
      2. Accept the terms of service.
      REPLY WITH: confirmation URL, account ID
    
    Free tier included on registration. Each task costs 1 credit. Returns 402 when credits are exhausted.
    Fastest during European business hours (CET). Tasks submitted outside these hours may take longer. Typical completion: 2-30 minutes. Use check_task_status to poll.
    
    Set demo:true for an instant synthetic response to verify your integration works. No credits consumed.`,
        {
          description: z
            .string()
            .describe(
              "What you need the human to do. Include URLs, account details, and expected outcome."
            ),
          action_type: z
            .string()
            .optional()
            .describe(
              "Category: 'create_account', 'accept_terms', 'complete_web_action', 'bankid_auth', 'verify_identity', 'form_submission'"
            ),
          urgency: z
            .enum(["immediate", "normal"])
            .optional()
            .describe(
              "immediate = target completion within 5 minutes. normal = within 60 minutes."
            ),
          demo: z
            .boolean()
            .optional()
            .describe(
              "Set to true to get an instant synthetic response. No credits consumed, no real human involved. Use to verify integration works before submitting real tasks."
            ),
        },
        async ({ description, action_type, urgency, demo }) => {
          try {
            const res = await fetch(`${API_URL}/api/v1/tasks`, {
              method: "POST",
              headers: {
                ...apiHeaders(),
                ...(demo ? {} : { "Idempotency-Key": crypto.randomUUID() }),
              },
              body: JSON.stringify({ description, action_type, urgency, ...(demo ? { demo: true } : {}) }),
            });
    
            if (!res.ok) {
              const err = await res.text();
              return {
                content: [
                  {
                    type: "text" as const,
                    text: `Failed to create task: ${res.status} ${err}`,
                  },
                ],
                isError: true,
              };
            }
    
            const task = await res.json();
    
            // Demo mode: return the completed result directly
            if (task.demo) {
              return {
                content: [
                  {
                    type: "text" as const,
                    text: JSON.stringify(
                      {
                        task_id: task.id,
                        status: task.status,
                        result: task.result,
                        demo: true,
                        message: "Demo response. No credits consumed. Submit without demo:true for a real human worker.",
                      },
                      null,
                      2
                    ),
                  },
                ],
              };
            }
    
            return {
              content: [
                {
                  type: "text" as const,
                  text: JSON.stringify(
                    {
                      task_id: task.id,
                      status: task.status,
                      created_at: task.created_at,
                      estimated_completion_minutes: task.estimated_completion_minutes,
                      message:
                        task.estimated_completion_minutes != null
                          ? `Task dispatched to human worker. Estimated completion: ~${task.estimated_completion_minutes} minutes. Use check_task_status to poll.`
                          : "Task dispatched to human worker. Use check_task_status to poll for the result.",
                      formatting_tip:
                        "For best results: numbered steps, one instruction per line. URLs on their own line (worker reads on phone). End with a REPLY WITH: section listing expected deliverables.",
                    },
                    null,
                    2
                  ),
                },
              ],
            };
          } catch (e) {
            return {
              content: [
                {
                  type: "text" as const,
                  text: `Could not reach API at ${API_URL}. ${e instanceof Error ? e.message : "Unknown error."}`,
                },
              ],
              isError: true,
            };
          }
        }
      );
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It thoroughly describes key traits: the human is a paid worker (billed per task), security warnings (never include sensitive data), cost details (1 credit per task, free tier), performance (2-30 minutes, faster in CET hours), error handling (returns 402 when credits exhausted), and demo mode for testing. This adds significant value beyond basic functionality.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear sections (purpose, usage guidelines, formatting, example, operational details) and uses bullet points and examples effectively. While comprehensive, some sentences could be more concise (e.g., the security warning is verbose), but overall it's front-loaded with critical information and avoids unnecessary repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (human-in-the-loop tasks) and lack of annotations/output schema, the description is highly complete. It covers purpose, usage, behavioral traits, parameter guidance, security, costs, performance, error handling, and integration with sibling tools. No significant gaps remain for an agent to understand and invoke the tool correctly in context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description adds meaningful context: it explains the 'description' parameter with formatting guidelines (numbered steps, URLs on separate lines) and an example, clarifies 'demo' parameter usage ('instant synthetic response'), and implies urgency context without repeating schema details. This enhances understanding beyond the schema's technical definitions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states the tool's purpose: 'Call when you cannot proceed because the next step requires a real human.' It provides specific scenarios (e.g., legal agreements, authentication, forms) and distinguishes it from sibling tools by emphasizing human-only tasks versus automated ones. This is a clear, specific verb+resource+scope definition.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description includes explicit 'USE WHEN' and 'DO NOT USE' sections, listing specific blocking scenarios (e.g., CAPTCHA, OAuth) and exclusions (e.g., sending messages, HTTP requests). It also references sibling tools ('Use check_task_status to poll'), providing clear alternatives and context for when to use this tool versus others.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Install Server

Other Tools

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/MariusAure/need-human'

If you have feedback or need assistance with the MCP directory API, please join our Discord server