protogrid

Search / com.handsforagents/hands

Hands for Agents

R0· no sign-in

Human-operated physical world in the EU: make, assemble, measure, verify, ship.

v0.2.0 · active · repository · website · descriptor JSON · versions

An agent can connect right now, no human step.Remote endpoint, no authentication, reachable on the last probe.
Quality77good
Trust100of 100
Uptime, 30 days97%
Latency p50623 ms

Connect

8 clients · secrets stay placeholders
{
  "mcpServers": {
    "hands": {
      "type": "http",
      "url": "https://mcp.handsforagents.com/mcp"
    }
  }
}
claude mcp add --transport http hands https://mcp.handsforagents.com/mcp
[mcp_servers.hands]
url = "https://mcp.handsforagents.com/mcp"
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "hands": {
      "type": "remote",
      "url": "https://mcp.handsforagents.com/mcp",
      "enabled": true
    }
  }
}
{
  "mcpServers": {
    "hands": {
      "type": "http",
      "url": "https://mcp.handsforagents.com/mcp"
    }
  },
  "deeplink": "cursor://anysphere.cursor-deeplink/mcp/install?name=hands&config=eyJ0eXBlIjoiaHR0cCIsInVybCI6Imh0dHBzOi8vbWNwLmhhbmRzZm9yYWdlbnRzLmNvbS9tY3AifQ%3D%3D"
}
{
  "servers": {
    "hands": {
      "type": "http",
      "url": "https://mcp.handsforagents.com/mcp"
    }
  }
}
{
  "mcpServers": {
    "hands": {
      "httpUrl": "https://mcp.handsforagents.com/mcp"
    }
  }
}
extensions:
  "hands":
    enabled: true
    name: "hands"
    type: streamable_http
    uri: "https://mcp.handsforagents.com/mcp"
    timeout: 300

Quality 77 / 100good

protocol75 · weight 25
  • warn
    protocol.modernnewest supported version is 2025-11-25; 2026-07-28 not supported, older versions are deprecated until 2027-07-28
  • n/a
    protocol.statelessonly applies to 2026-07-28 servers
  • pass
    protocol.transportstreamable HTTP
  • n/a
    protocol.list_ttlonly applies to 2026-07-28 servers
authorizationn/a · weight 15
  • n/a
    auth.prm, auth.as_metadata, auth.cimdno remote uses OAuth
  • n/a
    auth.secret_in_urlno templated URL
tool hygiene93 · weight 30
  • pass
    tools.descriptionsevery tool has a description
  • warn
    tools.description_length1 tools have descriptions over 1,024 characters, which crowds the context
  • pass
    tools.schemasevery tool has an object input schema
  • pass
    tools.annotations5 of 5 tools declare readOnlyHint or destructiveHint
  • pass
    tools.directory_hintsevery tool declares readOnlyHint, destructiveHint, idempotentHint and openWorldHint
  • pass
    tools.token_costabout 2,061 tokens to load every tool
  • pass
    tools.api_dumptools are not a one-to-one API dump
stability25 · weight 15
  • warn
    stability.changes31 tool changes in 30 days
  • fail
    stability.rug_pull5 tools kept their name but changed most of their description in 30 days; review before trusting them
dependencies100 · weight 15
  • pass
    deps.known_vulnsno known advisory in 1 resolved packages
  • n/a
    deps.mcp_sdk_versionthe official MCP SDK is not in the dependency graph
  • pass
    deps.resolvable[email protected] resolved: 1 packages

5 tools, about 2,061 tokens to load them all · tool set 63e3581c7e31 · tools last changed 2026-10-02 · checked 2026-10-20 06:17 UTC

Tool changes

  • confirm_deliverychangeddescription, input schema
    before

    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 can be used 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. Report to the user only what this response says; do not add conclusions.

    after · 64% of words in common

    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.

  • get_statuschangeddescription, input schema
    before

    Status of a quote (id = quote_id) or a task (id = task_id). Call it after request_quote until the status is quoted or refused, after create_task to follow the task, and every time the user asks about the status or about messages from the service: earlier answers are outdated, never answer from memory. Read next_action: what to do now. Report to the user only what this response says; do not add conclusions. The answer is short (older_updates and older_messages count what is left out; messages are newest first, from operator or you); full=true returns everything. To answer an operator question, call get_status with message, once and only with what the user told you. Read the operator's message first, then reply: while it is unread, your message is NOT stored (message_sent: false) and the answer shows it; otherwise message_sent is true. The same text again within 10 minutes is ignored (duplicate_ignored: true). test_mode true marks a test order: nothing is paid or invoiced.

    after · 50% of words in common

    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.

  • create_taskchangeddescription, input schema
    before

    Accept a quote and the terms of service (quote_id, access_token, terms_accepted=true, terms_version as stated in the quote). 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). Give it to the user or the operator to pay by card (Stripe Checkout); it 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: the operator will simulate the payment AFTER you order; right now nothing is paid or simulated. Then follow the task with get_status(id=task_id); keep the access_token. Report to the user only what this response says; do not add conclusions.

    after · 61% of words in common

    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.

  • request_quotechangeddescription, input schema
    before

    Ask a human for a fixed-price quote. Not binding, nothing is charged. Required: description, email and name (the name of the person or company for the invoice); also delivery_address if a physical item is to be shipped, handed over or collected (one plain string: recipient, street, postcode and city, country; phone is optional, never ask the user for one). Put everything the user told you (quantity, material, colour, size, address) into the fields or into description and nothing else (no invented file names or checks); ask the user for what is missing. Send the fields flat, as in the examples. For name use the company or person from the shipping address (or the company the user gave); do not ask the user for it, ask only if there is neither. If the user gave an address, its country is the country (ISO 3166-1 alpha-2). A VAT id only if the user gave one: never guess or make one up. Never invent a quote_id or a status: a real quote_id starts with q_ and comes only from this tool's own response. Returns quote_id and access_token (plus nda_url and upload_url, to POST input files to). Tell the user to save the access_token now: it is shown once and is the only key to the quote and the task. If the access_token is lost: POST https://api.handsforagents.com/v1/quotes/{quote_id}/access-token (REST only, not a tool); a new one is sent to the contact e-mail. get_status cannot recover it. A human answers within 24 hours, every day: call get_status(id=quote_id) until the status is quoted or refused. No authentication. Shortest possible request: {"description":"Make 20 rubber gaskets, 60 mm outer diameter, black EPDM.","email":"[email protected]","name":"Example Inc."}. With a delivery address and an input file: {"description":"Make 20 rubber gaskets, 60 mm outer diameter, black EPDM.","email":"[email protected]","name":"Example Inc.","delivery_address":"Example GmbH, Musterstr. 1, 10115 Berlin, DE, +49 30 000000","input_files":["https://example.com/gasket-drawing.pdf"]}

    after · 60% of words in common

    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":"[email protected]","name":"Example Inc."}. With a delivery address and an input file: {"description":"Make 20 rubber gaskets, 60 mm outer diameter, black EPDM.","email":"[email protected]","name":"Example Inc.","delivery_address":"Example GmbH, Musterstr. 1, 10115 Berlin, DE, +49 30 000000","input_files":["https://example.com/gasket-drawing.pdf"]}

  • list_serviceschangeddescription, input schema
    before

    What we do and do not do, refused categories, prices and how to pay, as a short summary. No authentication. Pass full=true only if you need the worked price examples, the full legal text or the marketplace comparison: it is many times larger.

    after · 69% of words in common

    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.

  • confirm_deliverychangedtitle, annotations
  • get_statuschangedtitle, annotations
  • create_taskchangedtitle, annotations
  • request_quotechangedtitle, annotations
  • list_serviceschangedtitle, annotations

Showing the latest 10. Full history: list_changes · trend: quality JSON.

Checks run on what our credential-free, read-only probes observe; tools are never called and no code audit is performed. How it is computed.

Trust 100 / 100

provenance100
liveness99
freshness100
hygiene100

+repository +namespace-matches-repo +dns-namespace +website +reachable +uptime-97% +updated-27d-ago

Derived from observable signals (official registry feed and our own credential-free probes); no code audit performed. How it is computed.

Dependencies

[email protected] npm0 dependencies, resolved · advisories checked 2026-10-19

No known advisory affects this dependency graph.

Dependency graphs from deps.dev; advisories from OSV.dev, including the GitHub Advisory Database and the PyPI Advisory Database; all CC BY 4.0. The graph is what a clean install of this version resolves today; nothing was installed or run. How it is checked.

Endpoints

remoteauthreachableuptime 30dp50protocollast ok
https://mcp.handsforagents.com/mcp streamable-httpnoneyes97%623 ms2025-11-252026-10-20
packageregistryversionruntimesecrets
handsforagents-mcpnpm0.2.0–

Tools (5)

confirm_deliverydestructiveAccepts 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.
create_taskAccepts 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.
get_statusReturns 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.
list_servicesread-onlyReturns 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.
request_quoteCreates 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":"[email protected]","name":"Example Inc."}. With a delivery address and an input file: {"description":"Make 20 rubber gaskets, 60 mm outer diameter, black EPDM.","email":"[email protected]","name":"Example Inc.","delivery_address":"Example GmbH, Musterstr. 1, 10115 Berlin, DE, +49 30 000000","input_files":["https://example.com/gasket-drawing.pdf"]}

Schemas: list_tools.

Similar MCP servers

Official server.json
{
  "name": "com.handsforagents/hands",
  "title": "Hands for Agents",
  "$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
  "remotes": [
    {
      "url": "https://mcp.handsforagents.com/mcp",
      "type": "streamable-http"
    }
  ],
  "version": "0.2.0",
  "packages": [
    {
      "version": "0.2.0",
      "transport": {
        "type": "stdio"
      },
      "identifier": "handsforagents-mcp",
      "registryType": "npm",
      "registryBaseUrl": "https://registry.npmjs.org"
    }
  ],
  "repository": {
    "url": "https://github.com/handsforagents/handsforagents-mcp",
    "source": "github"
  },
  "websiteUrl": "https://handsforagents.com",
  "description": "Human-operated physical world in the EU: make, assemble, measure, verify, ship."
}