{
  "meta": {
    "attribution": "Anchor Terminal (https://www.anchorterminal.com)",
    "docs": "https://www.anchorterminal.com/docs/",
    "generatedAt": "2026-10-05",
    "license": "CC-BY-4.0",
    "method": "https://www.anchorterminal.com/benchmark/",
    "methodology": "0.3",
    "openapi": "https://www.anchorterminal.com/openapi.json",
    "preview": false,
    "run": "2026-10-01",
    "runLabel": "October 2026 research run"
  },
  "tool": {
    "category": "",
    "endpoint": "https://mcp.handsforagents.com/mcp",
    "jsonUrl": "https://www.anchorterminal.com/api/v1/tools/handsforagents-hands.json",
    "kind": "mcp",
    "listed": "indexed",
    "liveUrl": "https://www.anchorterminal.com/api/v1/live/handsforagents-hands.json",
    "markdownUrl": "https://www.anchorterminal.com/tools/handsforagents-hands.md",
    "mcpTools": {
      "check": {
        "checker": "anchor-check/1.0",
        "totalTokens": 2183,
        "counts": {
          "error": 0,
          "note": 1,
          "warn": 0
        },
        "findings": [
          {
            "rule": "TC24",
            "severity": "note",
            "message": "5 of 5 tools have no outputSchema",
            "fix": "Declare outputSchema for tools that return structured data, and return structuredContent that matches it."
          }
        ]
      },
      "checkedAt": "2026-10-04T22:23:00Z",
      "count": 5,
      "schemaTokens": 2183,
      "status": "ok",
      "tools": [
        {
          "name": "list_services",
          "title": "List services",
          "description": "Returns what the service does and does not do, the refused categories, prices and how to pay, as a short summary. No authentication. With full=true it returns the complete document (worked price examples, the full legal text, the marketplace comparison), which is many times larger.",
          "inputSchema": {
            "properties": {
              "full": {
                "default": false,
                "description": "true returns the complete document (the same as /services.json); false (default) returns a short summary.",
                "type": "boolean"
              }
            },
            "type": "object"
          },
          "annotations": {
            "destructiveHint": false,
            "idempotentHint": true,
            "openWorldHint": false,
            "readOnlyHint": true,
            "title": "List services"
          }
        },
        {
          "name": "request_quote",
          "title": "Request a quote",
          "description": "Creates a request for a fixed-price quote from a human. The request is not binding and nothing is charged. Required: description, email and name (the person or company on the invoice, normally the recipient or company in delivery_address). delivery_address is needed when a physical item is shipped, handed over or collected: one plain string with recipient, street, postcode and city, country; a phone number is optional. country is the ISO 3166-1 alpha-2 code of the address, vat_id only what the client provided. The fields are sent flat, as in the examples. Returns quote_id (of the form q_..., issued only in this response), access_token (shown once; the only key to the quote and its task), nda_url and upload_url (the address input files are POSTed to). A human answers within 24 hours, every day, with a quote or a refusal. No authentication. Shortest possible request: {\"description\":\"Make 20 rubber gaskets, 60 mm outer diameter, black EPDM.\",\"email\":\"ops@example.com\",\"name\":\"Example Inc.\"}. With a delivery address and an input file: {\"description\":\"Make 20 rubber gaskets, 60 mm outer diameter, black EPDM.\",\"email\":\"ops@example.com\",\"name\":\"Example Inc.\",\"delivery_address\":\"Example GmbH, Musterstr. 1, 10115 Berlin, DE, +49 30 000000\",\"input_files\":[\"https://example.com/gasket-drawing.pdf\"]}",
          "inputSchema": {
            "properties": {
              "agent_name": {
                "description": "Name of the agent or platform. Optional.",
                "maxLength": 200,
                "type": "string"
              },
              "allow_anonymised_example": {
                "default": false,
                "description": "Consent to publish this task as an anonymised example; true only when the client explicitly agreed. Default false.",
                "type": "boolean"
              },
              "country": {
                "description": "Operator's country, ISO 3166-1 alpha-2, upper case, normally that of the delivery address. Optional.",
                "pattern": "^[A-Z]{2}$",
                "type": "string"
              },
              "currency": {
                "description": "EUR or USD. Default EUR.",
                "enum": [
                  "EUR",
                  "USD"
                ],
                "type": "string"
              },
              "deadline": {
                "description": "Latest acceptable delivery date, ISO 8601. Optional.",
                "format": "date",
                "maxLength": 32,
                "type": "string"
              },
              "deliverables": {
                "description": "What the client expects to receive. Optional; otherwise part of description.",
                "maxLength": 5000,
                "type": "string"
              },
              "delivery_address": {
                "description": "Required for a physical shipment. One plain string: recipient, street, postcode and city, country, as given by the client; a phone number last is optional.",
                "maxLength": 1000,
                "type": "string"
              },
              "description": {
                "description": "What is to be done, plainly: quantity, material, colour, size, tolerances, what counts as done.",
                "maxLength": 20000,
                "type": "string"
              },
              "email": {
                "description": "Contact e-mail of the operator; the quote is sent here.",
                "format": "email",
                "maxLength": 254,
                "pattern": "^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$",
                "type": "string"
              },
              "input_files": {
                "description": "HTTPS URLs of input files (photos, sketch, STEP/STL model, PDF drawing). At most 20.",
                "items": {
                  "maxLength": 2000,
                  "pattern": "^https://",
                  "type": "string"
                },
                "maxItems": 20,
                "type": "array"
              },
              "name": {
                "description": "Required. The person or company on the invoice, normally the recipient or company in delivery_address.",
                "maxLength": 200,
                "minLength": 1,
                "pattern": "^[^\\r\\n]+$",
                "type": "string"
              },
              "services": {
                "description": "Service ids. Optional.",
                "items": {
                  "enum": [
                    "design",
                    "make",
                    "assemble",
                    "measure",
                    "test",
                    "verify",
                    "ship"
                  ],
                  "type": "string"
                },
                "type": "array"
              },
              "vat_id": {
                "description": "VAT or tax id for the invoice, as given by the client. Optional.",
                "maxLength": 32,
                "type": "string"
              }
            },
            "required": [
              "description",
              "email",
              "name"
            ],
            "type": "object"
          },
          "annotations": {
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": true,
            "readOnlyHint": false,
            "title": "Request a quote"
          }
        },
        {
          "name": "create_task",
          "title": "Accept quote, get payment link",
          "description": "Accepts a quote and the terms of service (quote_id, access_token, terms_accepted=true, terms_version as stated in the quote) and creates the task. Returns task_id and checkout_url, the payment link for the first payment (the full price or a card hold up to 150 EUR, the deposit above); the payment is made by card on a Stripe Checkout page and the link is valid for 4 days. The contract is concluded when the payment is received or the hold authorised. A test order (test_mode true) has no checkout_url and no payment link: its payment is simulated by the operator after the order, so the response shows nothing paid or simulated. A repeated call for the same quote returns the same task.",
          "inputSchema": {
            "properties": {
              "access_token": {
                "description": "Access token of the quote and its task, issued with the quote.",
                "type": "string"
              },
              "allow_anonymised_example": {
                "default": false,
                "description": "Optional. Consent to publish this task as an anonymised example (terms, section 10); true only when the client explicitly agreed. Default false.",
                "type": "boolean"
              },
              "quote_id": {
                "description": "Id of the quote, of the form q_...",
                "type": "string"
              },
              "terms_accepted": {
                "const": true,
                "description": "Acceptance of https://handsforagents.com/terms.html by the operator.",
                "type": "boolean"
              },
              "terms_version": {
                "description": "Version of the terms being accepted, currently 2026-09-29.",
                "type": "string"
              }
            },
            "required": [
              "quote_id",
              "terms_accepted",
              "terms_version",
              "access_token"
            ],
            "type": "object"
          },
          "annotations": {
            "destructiveHint": false,
            "idempotentHint": true,
            "openWorldHint": true,
            "readOnlyHint": false,
            "title": "Accept quote, get payment link"
          }
        },
        {
          "name": "get_status",
          "title": "Get status or answer operator",
          "description": "Returns the current status of a quote (id = quote_id) or a task (id = task_id): status, next_action (a short text on the next step), payments, updates, and messages with the operator (newest first, from operator or you). The answer is short: older_updates and older_messages count what is left out; full=true returns everything. With the optional message the call also stores a plain-text reply to the operator and e-mails it to the operator; message_sent is then true. While the operator has a message that has not been returned yet, the reply is not stored (message_sent: false) and the answer contains that message. The same text again within 10 minutes is ignored (duplicate_ignored: true). A status can change at any time; every call returns the state at that moment. test_mode true marks a test order: nothing is paid or invoiced.",
          "inputSchema": {
            "properties": {
              "access_token": {
                "description": "Access token of the quote and its task, issued with the quote.",
                "type": "string"
              },
              "full": {
                "default": false,
                "description": "true returns the complete answer.",
                "type": "boolean"
              },
              "id": {
                "description": "quote_id or task_id.",
                "type": "string"
              },
              "message": {
                "description": "Optional reply to the operator: plain text, 1-2000 characters. Without it the call is a plain status check.",
                "type": "string"
              }
            },
            "required": [
              "id",
              "access_token"
            ],
            "type": "object"
          },
          "annotations": {
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": true,
            "readOnlyHint": false,
            "title": "Get status or answer operator"
          }
        },
        {
          "name": "confirm_delivery",
          "title": "Confirm or dispute delivery",
          "description": "Accepts or disputes the delivery of a task. accepted=true closes the task and, for a card hold, captures it. accepted=false with a reason opens a dispute, answered by a human within 2 business days; it is possible at the evidence stage, before the balance is paid, as well as after delivery. Without either, the task counts as accepted 7 days after delivery. Returns the task status.",
          "inputSchema": {
            "properties": {
              "accepted": {
                "description": "true accepts the delivery, false disputes it.",
                "type": "boolean"
              },
              "access_token": {
                "description": "Access token of the quote and its task, issued with the quote.",
                "type": "string"
              },
              "reason": {
                "description": "Required when accepted is false: what differs from the quote.",
                "type": "string"
              },
              "task_id": {
                "description": "Id of the task, of the form t_...",
                "type": "string"
              }
            },
            "required": [
              "task_id",
              "accepted",
              "access_token"
            ],
            "type": "object"
          },
          "annotations": {
            "destructiveHint": true,
            "idempotentHint": false,
            "openWorldHint": true,
            "readOnlyHint": false,
            "title": "Confirm or dispute delivery"
          }
        }
      ]
    },
    "name": "Hands for Agents",
    "note": "Indexed from the official MCP registry: facts and our own checks, not reviewed, so no score, grade or rank.",
    "packages": [
      {
        "registryType": "npm",
        "identifier": "handsforagents-mcp",
        "version": "0.2.0",
        "transport": "stdio"
      }
    ],
    "pageJsonUrl": "https://www.anchorterminal.com/tools/handsforagents-hands.json",
    "popularity": {
      "githubStars": 0,
      "npmWeekly": 395
    },
    "registryName": "com.handsforagents/hands",
    "remotes": [
      {
        "type": "streamable-http",
        "url": "https://mcp.handsforagents.com/mcp"
      }
    ],
    "repository": "https://github.com/handsforagents/handsforagents-mcp",
    "reviewed": false,
    "slug": "handsforagents-hands",
    "source": "the official MCP registry",
    "sourceUrl": "https://registry.modelcontextprotocol.io/v0.1/servers?search=com.handsforagents/hands",
    "summary": "Human-operated physical world in the EU: make, assemble, measure, verify, ship.",
    "updatedAt": "2026-09-23T11:29:16Z",
    "url": "https://www.anchorterminal.com/tools/handsforagents-hands",
    "vendor": "handsforagents.com",
    "vendorUrl": "https://handsforagents.com",
    "version": "0.2.0",
    "websiteUrl": "https://handsforagents.com",
    "where": "both",
    "why": [
      "vendor"
    ]
  }
}
