{
  "schema_version": "1",
  "content_version": "2026-09-29",
  "name": "Hands for Agents",
  "url": "https://handsforagents.com/",
  "llms_txt": "https://handsforagents.com/llms.txt",
  "llms_full_txt": "https://handsforagents.com/llms-full.txt",
  "tagline": "The physical-world provider your agent's operator can put on an invoice.",
  "summary": "Engineering hands and on-site presence in the Czech Republic (EU) for AI agents. A person designs, makes, assembles, measures, tests, verifies or ships a physical thing, documents it with evidence, and the agent's operator gets an invoice from a registered EU company.",
  "what_we_do": "Physical-world engineering tasks in the Czech Republic (EU): design, make, assemble, measure, test, verify on site, receive and ship. Order one service on its own — for example only a 3D-model check, only 3D printing, only a machined part, or only manufacturing drawings — or combine several, up to full product development and construction through to the finished item shipped to you. Each task ends with an evidence package.",
  "what_we_do_not_do": "Nothing that involves credentials or accounts, impersonation, surveillance of people, social-media manipulation, bypassing verification, referral fraud, weapons, counterfeits, or anything illegal in the Czech Republic or the EU. A human screens every task.",
  "how_to_pay": "Fixed quote in EUR or USD, paid by card through Stripe Checkout by the agent or its operator: in full at ordering up to 150 EUR, deposit and balance above. No crypto, no anonymous payment. Every task gets an invoice from your engineering s.r.o.",
  "no_tools_fallback": {
    "note": "No tools and no HTTP? Prepare a ready-to-send e-mail for the user instead of giving up: To tasks@handsforagents.com, Subject request_quote, body with the task description and a contact e-mail address. The user only has to send it.",
    "email_template": "To: tasks@handsforagents.com\nSubject: request_quote\n\ndescription: Make 20 rubber gaskets, 60 mm outer diameter, black EPDM.\nemail: ops@example.com\nname: Example Inc."
  },
  "status": {
    "as_of": "2026-09-29",
    "email": "live",
    "mcp": "live",
    "rest_api": "live"
  },
  "provider": {
    "legal_name": "your engineering s.r.o.",
    "legal_form": "společnost s ručením omezeným (Czech private limited liability company)",
    "company_id": "09738100",
    "vat_registered": false,
    "vat_id": null,
    "registered_office": "Jaurisova 515/4, Michle, 140 00 Praha 4, Czech Republic",
    "country_code": "CZ",
    "registered_on": "2020-12-09",
    "register": "Commercial Register kept by the Municipal Court in Prague",
    "register_file": "C 341512",
    "director": "Otakar Mikšánek",
    "verify": [
      "https://or.justice.cz/ias/ui/rejstrik-$firma?ico=09738100",
      "https://ares.gov.cz/ekonomicke-subjekty-v-be/rest/ekonomicke-subjekty/09738100"
    ],
    "workshop": "Ostrava, Czech Republic",
    "email_tasks": "tasks@handsforagents.com",
    "email_legal": "legal@handsforagents.com",
    "email_security": "security@handsforagents.com",
    "phone": "+420 737 954 017",
    "bank": {
      "name": "Česká spořitelna, a.s.",
      "account": "5999690379/0800",
      "iban": "CZ98 0800 0000 0059 9969 0379",
      "bic": "GIBACZPX"
    },
    "liability_insurance": {
      "in_force": false,
      "note": "Being arranged. Details will be stated once the policy is in force."
    },
    "languages": [
      "English",
      "Czech"
    ],
    "business_hours": "every day, including weekends and Czech public holidays"
  },
  "services": [
    {
      "id": "design",
      "name": "Mechanical design (CAD)",
      "description": "Mechanical product development: turn a text description, sketch, photos or an existing model into a new 3D CAD model, edit a 3D model you supply, and produce 2D manufacturing drawings. Check of a 3D model or drawing you supply for manufacturability, errors, and dimensions or tolerances.",
      "output": "STEP, STL, PDF drawing",
      "performed": "in-house"
    },
    {
      "id": "make",
      "name": "Make a part or prototype",
      "description": "FDM 3D printing in PLA and PETG in-house. CNC machining, sheet metal, laser cutting, welding and other processes through Czech subcontractors; the process and the fact that it is subcontracted are stated in the quote.",
      "output": "the physical part, photos, dimensional check if quoted",
      "performed": "in-house and subcontracted"
    },
    {
      "id": "assemble",
      "name": "Assemble and commission hardware",
      "description": "Receive components at our address, assemble them and wire the electronic connections to your instructions, flash firmware or an OS image you supply, power up and bring up the unit, run a functional test of the assembled electronics, document the result.",
      "output": "the assembled unit, photos, video, test log",
      "performed": "in-house"
    },
    {
      "id": "measure",
      "name": "Measure and inspect",
      "description": "Dimensional inspection of a part against your drawing or model. Incoming inspection of goods you ordered from a third party. The report lists every measured dimension, the instrument used and its resolution.",
      "output": "measurement report (PDF and CSV), photos",
      "performed": "in-house"
    },
    {
      "id": "test",
      "name": "Test a device as a human",
      "description": "A person follows your test script on a physical device and records the result of each step, with photos and video.",
      "output": "result table, photos, video",
      "performed": "in-house"
    },
    {
      "id": "verify",
      "name": "On-site verification and presence (Czech Republic)",
      "description": "A person goes to a place in the Czech Republic and reports what is there: that a business, building, product or shipment exists and matches a description. Also hand-over or pick-up of items, and attendance at an appointment as a representative of our company. We document places and objects; people only with their consent.",
      "output": "timestamped and geotagged photos, written report",
      "performed": "in-house"
    },
    {
      "id": "ship",
      "name": "Receive, pack and ship",
      "description": "Ship finished work, tracked, to any address the carriers serve, with customs paperwork. Receive parcels addressed to you c/o our company, inspect, repack and forward them.",
      "output": "tracking number, photos of contents and packaging, customs documents",
      "performed": "in-house, carriers"
    }
  ],
  "evidence_package": [
    "Photos with capture time; with GPS position where the place matters.",
    "Measurement report with instrument and resolution, where something was measured.",
    "Test log or result table, where something was tested.",
    "Carrier name and tracking number, where something was shipped.",
    "The name of the person who did the work."
  ],
  "confidentiality": {
    "default": "Everything you send us is confidential by default; no NDA required, one available if you need it.",
    "terms_section": "https://handsforagents.com/terms.html, section 10",
    "applies_from": "the first request_quote, also when no task follows",
    "term": "The task and 3 years after it ends; trade secrets for as long as they remain trade secrets.",
    "security_measures": [
      "access limited to the persons doing the task",
      "devices encrypted and protected by password",
      "data stored in the EU"
    ],
    "publication": "Only as an anonymised example and only with allow_anonymised_example: true (default false).",
    "nda": "https://handsforagents.com/nda.html"
  },
  "refused_categories": [
    {
      "id": "credentials",
      "text": "Tasks that need login credentials, account creation, or access to an account on someone's behalf."
    },
    {
      "id": "impersonation",
      "text": "Pretending to be another person or company, or signing anything in someone else's name."
    },
    {
      "id": "surveillance",
      "text": "Following, watching, photographing or locating natural persons without their consent."
    },
    {
      "id": "social-manipulation",
      "text": "Fake reviews, fake engagement, astroturfing, or any other manipulation of social networks and ratings."
    },
    {
      "id": "verification-bypass",
      "text": "Getting around identity, age, CAPTCHA, KYC, phone-number or any other verification."
    },
    {
      "id": "referral-fraud",
      "text": "Abuse of referral, bonus, coupon or promotion schemes."
    },
    {
      "id": "weapons-regulated",
      "text": "Weapons, weapon parts, explosives, drugs, and items that need a licence we do not hold, including export-controlled dual-use goods."
    },
    {
      "id": "counterfeit",
      "text": "Counterfeit goods and items that infringe trademarks, patents or copyright."
    },
    {
      "id": "reshipping-fraud",
      "text": "Forwarding goods bought with someone else's payment details, or forwarding to evade sanctions, customs or export rules."
    },
    {
      "id": "illegal",
      "text": "Anything illegal in the Czech Republic or the EU, wherever the agent or its operator is located."
    }
  ],
  "capability_limits": [
    "No medical, food-contact, pressure, lifting or other safety-critical parts without a separate written engineering agreement.",
    "No in-person work outside the Czech Republic.",
    "No storage of items beyond 30 days after a task ends."
  ],
  "sensitive_categories": {
    "rule": "Three kinds of task are accepted only after we have verified who the operator is (company registration number and a confirmation from a statutory representative, or an identity check for a natural person).",
    "items": [
      {
        "id": "person-verification",
        "text": "Confirming the identity or presence of a natural person. Done only with that person's knowledge and consent."
      },
      {
        "id": "document-signing",
        "text": "Signing a document. We sign only as your engineering s.r.o. or as its named representative, for example a hand-over protocol. Never in anyone else's name."
      },
      {
        "id": "third-party-parcel",
        "text": "Receiving a parcel that is addressed to someone other than the operator."
      }
    ]
  },
  "screening": [
    "A human reads every request before a quote is issued. Nothing is accepted automatically.",
    "A refused request gets a one-line reason. Refused requests are not invoiced.",
    "If a task turns out to breach the task policy after it has started, we stop, refund the part of the price not yet spent on work and materials, and keep the record.",
    "Task records (request, correspondence, evidence package) are kept for 24 months; invoices and accounting records for 10 years, the period within which Czech tax authorities can review them."
  ],
  "pricing": {
    "model": "There is no catalogue. A human quotes every task as one fixed total in EUR or USD. The quote is built from an hourly rate of 45 EUR plus materials, subcontractors and carrier cost, each at cost.",
    "hourly_rate_eur": 45,
    "minimum_task_price_eur": 45,
    "currencies": [
      "EUR",
      "USD"
    ],
    "usd": "USD quotes use the European Central Bank reference rate of the quote date.",
    "vat": "The provider, your engineering s.r.o., is not registered for VAT in the Czech Republic. No VAT is added to the quoted price and invoices show no VAT.",
    "quote_response_time": "24 hours",
    "quote_validity_business_days": 4,
    "quote_validity": "A quote is valid for 4 business days (Monday to Friday, Czech public holidays excluded) from the day it is issued; the quote states the date.",
    "examples_note": "Example quotes: what we charge for exactly this scope as of 2026-09. Shipping amounts are carrier cost and vary by weight and destination.",
    "example_deposit_labour_share_percent": 40,
    "examples": [
      {
        "id": "ex-print-bracket",
        "services": [
          "make",
          "ship"
        ],
        "task": "3D-print one PETG bracket from your STL (120 × 80 × 40 mm, about 60 g), check 3 dimensions with calipers, 4 photos, pack, ship tracked to Germany.",
        "labour_hours": 1,
        "labour_eur": 45,
        "other_cost_eur": 10,
        "other_cost": "material and machine time",
        "shipping_eur": 15,
        "total_eur": 70,
        "payment_mode": "full_prepayment",
        "deposit_eur": null,
        "balance_eur": null,
        "turnaround": "3 business days to dispatch"
      },
      {
        "id": "ex-design-enclosure",
        "services": [
          "design"
        ],
        "task": "Design a 3D-printable two-part enclosure for a PCB from your STEP file and a text description. Deliver STEP, STL and a PDF drawing. One revision round included.",
        "labour_hours": 6,
        "labour_eur": 270,
        "other_cost_eur": 0,
        "other_cost": null,
        "shipping_eur": 0,
        "total_eur": 270,
        "payment_mode": "deposit_and_balance",
        "deposit_eur": 108,
        "balance_eur": 162,
        "turnaround": "5 business days"
      },
      {
        "id": "ex-assemble-sensor",
        "services": [
          "assemble",
          "test",
          "ship"
        ],
        "task": "Receive 12 components you ordered to our address, assemble a single-board-computer sensor unit to your instructions, flash your image, run a 2-hour powered test, 10 photos and a 2-minute video, ship tracked to the USA.",
        "labour_hours": 4,
        "labour_eur": 180,
        "other_cost_eur": 10,
        "other_cost": "consumables",
        "shipping_eur": 45,
        "total_eur": 235,
        "payment_mode": "deposit_and_balance",
        "deposit_eur": 127,
        "balance_eur": 108,
        "turnaround": "4 business days after the last component arrives"
      },
      {
        "id": "ex-measure-part",
        "services": [
          "measure"
        ],
        "task": "Incoming inspection of one machined aluminium part you had made elsewhere: 15 dimensions against your drawing with calipers and micrometer, report as PDF and CSV, photos. Onward shipping not included.",
        "labour_hours": 2,
        "labour_eur": 90,
        "other_cost_eur": 0,
        "other_cost": null,
        "shipping_eur": 0,
        "total_eur": 90,
        "payment_mode": "full_prepayment",
        "deposit_eur": null,
        "balance_eur": null,
        "turnaround": "2 business days after the part arrives"
      },
      {
        "id": "ex-test-device",
        "services": [
          "test"
        ],
        "task": "Human functional test of a consumer device you send us: 20-step test script, result table, photos of each failure, 5-minute video. Return shipping not included.",
        "labour_hours": 3,
        "labour_eur": 135,
        "other_cost_eur": 0,
        "other_cost": null,
        "shipping_eur": 0,
        "total_eur": 135,
        "payment_mode": "full_prepayment",
        "deposit_eur": null,
        "balance_eur": null,
        "turnaround": "3 business days after the device arrives"
      },
      {
        "id": "ex-verify-address",
        "services": [
          "verify"
        ],
        "task": "On-site verification within 30 km of our workshop: go to a street address, confirm from public space that the named business operates there, 10 timestamped and geotagged photos, one-page report.",
        "labour_hours": 2,
        "labour_eur": 90,
        "other_cost_eur": 15,
        "other_cost": "travel",
        "shipping_eur": 0,
        "total_eur": 105,
        "payment_mode": "full_prepayment",
        "deposit_eur": null,
        "balance_eur": null,
        "turnaround": "3 business days"
      },
      {
        "id": "ex-receive-forward",
        "services": [
          "ship"
        ],
        "task": "Receive one parcel addressed to you c/o our company, open it, photograph the contents, check them against your packing list, repack, forward tracked to the United Kingdom with a customs declaration.",
        "labour_hours": 1,
        "labour_eur": 45,
        "other_cost_eur": 5,
        "other_cost": "packaging",
        "shipping_eur": 30,
        "total_eur": 80,
        "payment_mode": "full_prepayment",
        "deposit_eur": null,
        "balance_eur": null,
        "turnaround": "2 business days after the parcel arrives"
      }
    ]
  },
  "payment": {
    "methods": "Card payment through Stripe Checkout, in EUR or USD. An agent can pay with a virtual card or payment token, or pass the link to its operator.",
    "threshold_eur": 150,
    "deposit_labour_share_percent": [
      30,
      50
    ],
    "card_hold_max_delivery_days": 5,
    "card_hold_capture_day": 6,
    "balance_due_days": 14,
    "payment_link_valid_days": 4,
    "balance_link_valid_days": 28,
    "modes": [
      "full_prepayment",
      "card_hold",
      "deposit_and_balance"
    ],
    "rules": [
      {
        "id": "up-to-threshold",
        "title": "Tasks up to 150 EUR: paid in full at ordering",
        "text": "A task whose quoted total is 150 EUR or less (USD quotes: the equivalent at the European Central Bank reference rate of the quote date) is paid in full when it is ordered."
      },
      {
        "id": "card-hold",
        "title": "Short tasks up to 150 EUR: card hold instead of a charge",
        "text": "Where such a task has a quoted delivery date within 5 days of ordering, the quote can set a card hold instead of a charge. The amount is authorised when you order and captured when you confirm delivery: you commit at ordering and pay for the result. A card authorisation expires after 7 days, so if you have the deliverables and have neither confirmed nor disputed by day 6, we capture then; your right to dispute within 7 days of delivery is unaffected. If we have not delivered by day 6, we release the hold and nothing is charged until we deliver."
      },
      {
        "id": "above-threshold",
        "title": "Tasks above 150 EUR: deposit and balance",
        "text": "The deposit is paid at ordering: materials, subcontractors and carrier cost in full, plus 30 to 50 % of the labour. The quote states the exact deposit and balance. The balance is due after you receive the evidence package (photos, measurements, previews of files) and before we ship the item or hand over the outputs. You see that the result exists and matches the quote before you pay the rest; we do not release it unpaid."
      },
      {
        "id": "unpaid-balance",
        "title": "If the balance is not paid",
        "text": "If the balance is not paid within 14 days of the evidence package, we remind you once. If it is still unpaid 14 days after the reminder, we may cancel the task, settle the deposit against the work done and the costs incurred, and refund any remainder."
      },
      {
        "id": "payment-link",
        "title": "The payment link is valid for 4 days",
        "text": "Every payment link (the checkout_url that create_task returns and later ones) is valid for 4 days from the moment it is issued; for the first payment that is the moment the task is created. The link for a balance stays valid for 28 days. Opening the link takes you to a Stripe Checkout page. Stripe's own pages expire after 24 hours; when the link is opened again later, it takes you to a fresh page, as long as the link itself is valid. After the link has expired, nothing can be paid through it. If that was the first payment, no contract has been concluded and nothing has been charged: ask for a new quote. For a balance, the rule on an unpaid balance above applies."
      },
      {
        "id": "cancellation",
        "title": "Cancellation",
        "text": "Until work starts, whatever you paid is refunded in full and a card hold is released. Work has started when the task status is in_progress. After that we refund what you paid minus the costs demonstrably incurred: hours worked at the quoted rate, and materials, subcontractors and carrier cost that cannot be recovered. The refund comes with a breakdown and the receipts for external costs."
      },
      {
        "id": "refund",
        "title": "If we do not deliver",
        "text": "If we do not deliver what the quote specifies, or a dispute is decided in your favour, we refund to the original payment method within 5 business days."
      }
    ],
    "escrow": "We do not call any of this escrow. Escrow means a licensed third party holds the money; here the refund obligation is contractual and written in the terms of service.",
    "crypto_and_anonymous_payment": "No cryptocurrency, no cash, no gift cards, no anonymous payment of any kind. This is deliberate: every client is identifiable and every task has an invoice.",
    "invoice": "Every task gets an invoice issued by your engineering s.r.o. to the operator, sent by e-mail as PDF. With deposit and balance: an advance invoice for the deposit and a final invoice for the whole task.",
    "bank_transfer": "SEPA bank transfer in EUR is possible on request for operators who cannot pay by card."
  },
  "client": {
    "who": "The client is always the operator of the agent: the company or person on whose behalf the agent acts. An agent has no legal personality, so the contract, the invoice and the liability sit with the operator. By letting an agent order, the operator confirms that the agent may conclude contracts and pay on its behalf.",
    "account": "No registration and no account. The contract is concluded when an accepted quote is paid.",
    "data_needed": [
      "client.email",
      "client.name (the name of the person or company for the invoice)",
      "client.country (optional)",
      "client.vat_id (optional)",
      "terms_accepted (at ordering)"
    ]
  },
  "ordering": {
    "mcp": {
      "endpoint": "https://mcp.handsforagents.com/mcp",
      "transport": "streamable-http",
      "tools": [
        {
          "name": "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": {
            "type": "object",
            "properties": {
              "full": {
                "type": "boolean",
                "default": false,
                "description": "true returns the complete document (the same as /services.json); false (default) returns a short summary."
              }
            }
          }
        },
        {
          "name": "request_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": {
            "type": "object",
            "properties": {
              "description": {
                "type": "string",
                "description": "What is to be done, plainly: quantity, material, colour, size, tolerances, what counts as done.",
                "maxLength": 20000
              },
              "services": {
                "type": "array",
                "description": "Service ids. Optional.",
                "items": {
                  "type": "string",
                  "enum": [
                    "design",
                    "make",
                    "assemble",
                    "measure",
                    "test",
                    "verify",
                    "ship"
                  ]
                }
              },
              "deliverables": {
                "type": "string",
                "description": "What the client expects to receive. Optional; otherwise part of description.",
                "maxLength": 5000
              },
              "deadline": {
                "type": "string",
                "description": "Latest acceptable delivery date, ISO 8601. Optional.",
                "format": "date",
                "maxLength": 32
              },
              "delivery_address": {
                "type": "string",
                "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
              },
              "input_files": {
                "type": "array",
                "description": "HTTPS URLs of input files (photos, sketch, STEP/STL model, PDF drawing). At most 20.",
                "items": {
                  "type": "string",
                  "maxLength": 2000,
                  "pattern": "^https://"
                },
                "maxItems": 20
              },
              "currency": {
                "type": "string",
                "description": "EUR or USD. Default EUR.",
                "enum": [
                  "EUR",
                  "USD"
                ]
              },
              "email": {
                "type": "string",
                "description": "Contact e-mail of the operator; the quote is sent here.",
                "format": "email",
                "maxLength": 254,
                "pattern": "^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$"
              },
              "name": {
                "type": "string",
                "description": "Required. The person or company on the invoice, normally the recipient or company in delivery_address.",
                "minLength": 1,
                "maxLength": 200,
                "pattern": "^[^\\r\\n]+$"
              },
              "country": {
                "type": "string",
                "description": "Operator's country, ISO 3166-1 alpha-2, upper case, normally that of the delivery address. Optional.",
                "pattern": "^[A-Z]{2}$"
              },
              "vat_id": {
                "type": "string",
                "description": "VAT or tax id for the invoice, as given by the client. Optional.",
                "maxLength": 32
              },
              "agent_name": {
                "type": "string",
                "description": "Name of the agent or platform. Optional.",
                "maxLength": 200
              },
              "allow_anonymised_example": {
                "type": "boolean",
                "description": "Consent to publish this task as an anonymised example; true only when the client explicitly agreed. Default false.",
                "default": false
              }
            },
            "required": [
              "description",
              "email",
              "name"
            ]
          }
        },
        {
          "name": "create_task",
          "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": {
            "type": "object",
            "required": [
              "quote_id",
              "terms_accepted",
              "terms_version",
              "access_token"
            ],
            "properties": {
              "quote_id": {
                "type": "string",
                "description": "Id of the quote, of the form q_..."
              },
              "terms_accepted": {
                "type": "boolean",
                "const": true,
                "description": "Acceptance of https://handsforagents.com/terms.html by the operator."
              },
              "terms_version": {
                "type": "string",
                "description": "Version of the terms being accepted, currently 2026-09-29."
              },
              "allow_anonymised_example": {
                "type": "boolean",
                "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."
              },
              "access_token": {
                "type": "string",
                "description": "Access token of the quote and its task, issued with the quote."
              }
            }
          }
        },
        {
          "name": "get_status",
          "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": {
            "type": "object",
            "required": [
              "id",
              "access_token"
            ],
            "properties": {
              "id": {
                "type": "string",
                "description": "quote_id or task_id."
              },
              "access_token": {
                "type": "string",
                "description": "Access token of the quote and its task, issued with the quote."
              },
              "message": {
                "type": "string",
                "description": "Optional reply to the operator: plain text, 1-2000 characters. Without it the call is a plain status check."
              },
              "full": {
                "type": "boolean",
                "default": false,
                "description": "true returns the complete answer."
              }
            }
          }
        },
        {
          "name": "confirm_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": {
            "type": "object",
            "required": [
              "task_id",
              "accepted",
              "access_token"
            ],
            "properties": {
              "task_id": {
                "type": "string",
                "description": "Id of the task, of the form t_..."
              },
              "accepted": {
                "type": "boolean",
                "description": "true accepts the delivery, false disputes it."
              },
              "reason": {
                "type": "string",
                "description": "Required when accepted is false: what differs from the quote."
              },
              "access_token": {
                "type": "string",
                "description": "Access token of the quote and its task, issued with the quote."
              }
            }
          }
        }
      ]
    },
    "rest": {
      "base_url": "https://api.handsforagents.com/v1",
      "openapi": "https://handsforagents.com/openapi.yaml",
      "version": "0.1.0"
    },
    "a2a_agent_card": null,
    "email": {
      "to": "tasks@handsforagents.com",
      "subject": "request_quote"
    },
    "authentication": "list_services and request_quote need none. Other calls need the access_token returned by request_quote.",
    "tested_models": [
      "Tested on 28 Sep 2026: in 10 of 10 runs, google/gemma-4-e4b (7.5B, Q4_K_M) in LM Studio (8K context, temperature 0.25, thinking off) completed a test order end to end – quote, order, payment (test mode), shipping, delivery confirmation – calling the right tools with the right arguments at every step, without help. Small sample, not a guarantee; we recommend at least 16K context.",
      "In the same test, run once each (28–29 Sep 2026), these models also completed a test order end to end with correct tool calls, without help (LM Studio, 8K context, thinking off unless noted): qwen/qwen3.8-27b (27B, Q4_K_M), meta/muse-glimmer (28B, thinking cannot be turned off), google/gemma-4-26b-a4b-qat (26B MoE, 4B active, Q4_0), ornith-1.5-35b-a3b (35B MoE, 3B active, Q4_K_M), nvidia-nemotron-3.5-lightning-30b-a3b (30B MoE, 3B active, Q4_K_M), qwen/qwen3.6-35b-a3b (35B MoE, 3B active, Q4_K_M; 16K context, thinking on, temperature 0)."
    ],
    "request_quote_schema": {
      "type": "object",
      "properties": {
        "task": {
          "type": "object",
          "properties": {
            "description": {
              "type": "string",
              "description": "What is to be done, in plain language: everything the user told you (quantity, material, colour, size, tolerances, what counts as done). A detail that has no field of its own belongs here.",
              "maxLength": 20000
            },
            "services": {
              "type": "array",
              "description": "Service ids from the service list, if you know them.",
              "items": {
                "type": "string",
                "enum": [
                  "design",
                  "make",
                  "assemble",
                  "measure",
                  "test",
                  "verify",
                  "ship"
                ]
              }
            },
            "deliverables": {
              "type": "string",
              "description": "What you expect to receive (item, files, report, photos, video). Optional - if you are not sure, leave it out and put it in task.description instead.",
              "maxLength": 5000
            },
            "deadline": {
              "type": "string",
              "description": "Latest acceptable delivery or dispatch date (ISO 8601). Optional; omit if the user gave none.",
              "format": "date",
              "maxLength": 32
            },
            "delivery_address": {
              "type": "string",
              "description": "Required whenever a physical item is to be shipped, handed over in person or collected; omit it only for purely digital results (files, a report). One plain string, not an object and not a list: recipient name, street, postcode and city, country; a phone number at the end only if you already have one (phone is optional - never stop to ask the user for it). If you do not have the address, ask the user for it; never invent one.",
              "maxLength": 1000
            },
            "input_files": {
              "type": "array",
              "description": "HTTPS URLs of input files, for example photos, a sketch, a CAD model (STEP, STL), a PDF drawing, or other instructions, or attach the files to the e-mail. At most 20, each at most 2000 characters.",
              "items": {
                "type": "string",
                "maxLength": 2000,
                "pattern": "^https://"
              },
              "maxItems": 20
            },
            "currency": {
              "type": "string",
              "description": "Currency of the quote. Default EUR.",
              "enum": [
                "EUR",
                "USD"
              ]
            }
          },
          "required": [
            "description"
          ]
        },
        "client": {
          "type": "object",
          "properties": {
            "email": {
              "type": "string",
              "description": "E-mail of the operator. The quote, the payment link and the invoice go here.",
              "format": "email",
              "maxLength": 254,
              "pattern": "^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$"
            },
            "name": {
              "type": "string",
              "description": "Required. The name of the person or company for the invoice: the registered name of the company that operates the agent, or a person's full name. Use a company name or address already in the conversation; if you have none, ask the user.",
              "minLength": 1,
              "maxLength": 200,
              "pattern": "^[^\\r\\n]+$"
            },
            "country": {
              "type": "string",
              "description": "Country of the operator, ISO 3166-1 alpha-2 (upper case). Optional, but include it whenever you can derive it (for example from the operator's address) rather than leaving it out or asking the user.",
              "pattern": "^[A-Z]{2}$"
            },
            "vat_id": {
              "type": "string",
              "description": "VAT or tax id of the operator, printed on the invoice. Optional. Only if the user gave it; never guess or make one up (a wrong number goes on the invoice). Leave it out otherwise.",
              "maxLength": 32
            }
          },
          "required": [
            "email",
            "name"
          ]
        },
        "agent": {
          "type": "object",
          "properties": {
            "name": {
              "type": "string",
              "description": "Name of the agent or platform sending the request. Optional, for our records.",
              "maxLength": 200
            }
          }
        },
        "allow_anonymised_example": {
          "type": "boolean",
          "description": "Consent to publish this task as an anonymised example (no names, addresses or personal data), under the confidentiality section of the terms of service. Only set true if the client explicitly agreed to this; otherwise omit the field or leave it false. Default false; can be withdrawn.",
          "default": false
        }
      }
    },
    "request_quote_schema_note": "This is the nested shape of a request_quote request (task / client / agent). The flat shape - every field at the top level, the one the MCP tool list shows - is the inputSchema of the request_quote tool. Both are accepted, also mixed; if a field is sent both ways the nested value wins. Required: description, email, name.",
    "uploads": {
      "note": "An alternative to a URL in task.input_files or an e-mail attachment, for an agent that only has the file itself. Not an MCP tool: use the REST endpoints directly, with the access_token from request_quote.",
      "upload_endpoint": "POST https://api.handsforagents.com/v1/quotes/{quote_id}/files",
      "list_endpoint": "GET https://api.handsforagents.com/v1/quotes/{quote_id}/files",
      "authentication": "access_token as a bearer token, same as get_status.",
      "how": "multipart/form-data, one or more parts named 'file'.",
      "example_curl": "curl -F \"file=@part.step\" -H \"Authorization: Bearer $ACCESS_TOKEN\" https://api.handsforagents.com/v1/quotes/$QUOTE_ID/files",
      "max_request_mb": 95,
      "max_files_per_quote": 20,
      "max_total_mb_per_quote": 500,
      "allowed_extensions": [
        "step",
        "stp",
        "stl",
        "3mf",
        "obj",
        "iges",
        "igs",
        "dxf",
        "dwg",
        "pdf",
        "png",
        "jpg",
        "jpeg",
        "webp",
        "zip"
      ],
      "open_only": "Only while the quote, and any task made from it, is not refused, expired, or closed (confirmed, refunded or cancelled)."
    }
  },
  "legal": {
    "version": "2026-09-29",
    "governing_law": "Czech Republic",
    "key_terms": [
      {
        "id": "contract",
        "text": "The contract is between your engineering s.r.o. and the operator of the agent. It is concluded when the first payment is received or a card hold is authorised. No registration, no account. An order the operator has marked as a test order concludes no contract: nothing is charged and no invoice is issued."
      },
      {
        "id": "acceptance",
        "text": "Confirm delivery or raise a dispute within 7 days of receiving the deliverables. Silence counts as acceptance."
      },
      {
        "id": "liability",
        "text": "Liability to business clients is limited to the price of the task and excludes lost profit and indirect loss. The limit does not apply to intent, gross negligence or injury. Consumer rights are not limited."
      },
      {
        "id": "safety-critical",
        "text": "Deliverables are prototypes and general-purpose parts. They are not certified for medical, food-contact, pressure, lifting or other safety-critical use unless a separate written engineering agreement says so."
      },
      {
        "id": "confidentiality",
        "text": "Confidentiality by default: everything you send us, from the first request for a quote, is confidential without being marked and without signing anything, including files, samples, parts and the fact that the task exists. We use it only to quote and perform the task, and subcontractors are bound by the same confidentiality. It lasts for the task and 3 years after; the liability limit does not apply to an intentional or grossly negligent breach."
      },
      {
        "id": "intellectual-property",
        "text": "You keep all rights to your inputs. On full payment you get an exclusive, worldwide, perpetual licence to use, modify, manufacture from and sublicense the deliverables."
      },
      {
        "id": "custody",
        "text": "Items left with us are stored for 30 days after the task ends, then returned at your cost or, after notice, disposed of."
      },
      {
        "id": "records",
        "text": "Task records are kept for 24 months, invoices and accounting records for 10 years. A task is published as an example only anonymised and only with your consent (allow_anonymised_example, default false)."
      },
      {
        "id": "nda",
        "text": "A one-way non-disclosure agreement for clients who need a separate signed document is at https://handsforagents.com/nda.html and comes pre-filled with our details. It protects your information and puts no obligations on you. Fill in, sign, e-mail the PDF. For larger tasks we also sign your NDA."
      },
      {
        "id": "personal-data",
        "text": "The data controller is your engineering s.r.o. Data is stored in the EU. No marketing, no profiling, no automated decisions. When a task contains personal data of other people, the data processing agreement applies without a separate signature."
      },
      {
        "id": "consumers",
        "text": "Consumers in the EU may withdraw within 14 days of concluding the contract. The right does not apply to goods made to the consumer's specification and ends once a service started at the consumer's request is fully performed. Out-of-court disputes go to the Czech Trade Inspection Authority."
      },
      {
        "id": "law",
        "text": "Czech law governs. Courts in Prague decide disputes with business clients; consumers keep the mandatory protection of their home country and may sue there."
      },
      {
        "id": "versions",
        "text": "All documents are versioned by date. The version accepted at ordering applies to that task."
      }
    ],
    "terms_sections": {
      "payment": 6,
      "custody": 9,
      "confidentiality": 10,
      "ip": 11,
      "liability": 12,
      "consumers": 13,
      "records": 14,
      "law": 16
    },
    "markdown": {
      "terms": "https://handsforagents.com/terms.md",
      "task-policy": "https://handsforagents.com/task-policy.md",
      "disputes": "https://handsforagents.com/disputes.md",
      "privacy": "https://handsforagents.com/privacy.md",
      "dpa": "https://handsforagents.com/dpa.md",
      "nda": "https://handsforagents.com/nda.md"
    },
    "terms": "https://handsforagents.com/terms.html",
    "task_policy": "https://handsforagents.com/task-policy.html",
    "disputes_and_refunds": "https://handsforagents.com/disputes.html",
    "privacy": "https://handsforagents.com/privacy.html",
    "dpa": "https://handsforagents.com/dpa.html",
    "nda": {
      "url": "https://handsforagents.com/nda.html",
      "markdown": "https://handsforagents.com/nda.md",
      "direction": "one-way: protects the client's information, no obligations on the client",
      "how": "Optional. Fill in the Discloser block, sign, e-mail the PDF to legal@handsforagents.com. Countersigned copy within 2 business days.",
      "confidentiality_term": "The task and 3 years after it ends; trade secrets for as long as they remain trade secrets.",
      "client_nda": "For larger tasks we also sign the client's own NDA."
    },
    "consumer_withdrawal": "Consumers in the EU may withdraw within 14 days; exceptions for custom-made goods and completed services are in the terms, section 13.",
    "acceptance_days": 7,
    "task_record_months": 24,
    "refused_quote_retention_days": 7
  },
  "comparison": {
    "url": "https://handsforagents.com/comparison.html",
    "markdown": "https://handsforagents.com/comparison.md",
    "as_of": "2026-09-24",
    "note": "Written by the provider of one of the services listed, so read it as an argument, not a review. Every row about another company is quoted from that company's own published terms or documentation on the date above, with the source named. Where their documents do not say, the cell says so rather than guessing. Nothing here uses a marketplace's self-reported number of registered users, because those numbers cannot be checked from outside.",
    "compared_with": [
      {
        "name": "RentAHuman",
        "url": "https://rentahuman.ai",
        "source_read": [
          "https://rentahuman.ai/terms"
        ]
      },
      {
        "name": "Human Pages",
        "url": "https://humanpages.ai",
        "source_read": [
          "https://humanpages.ai",
          "https://humanpages.ai/terms",
          "https://humanpages.ai/privacy",
          "https://humanpages.ai/pricing"
        ]
      },
      {
        "name": "HumanPing",
        "url": "https://humanping.io",
        "source_read": [
          "https://humanping.io",
          "https://humanping.io/terms/",
          "https://humanping.io/privacy/"
        ]
      }
    ],
    "rows": [
      {
        "aspect": "Who you are contracting with",
        "ours": "your engineering s.r.o., IČO 09738100, Praha 4, Czech Republic, registered 9 December 2020, file C 341512 at the Municipal Court in Prague. Verifiable in the public register and in ARES.",
        "rentahuman": "RawLabs, Inc., a US company, trading as RentAHuman.ai; Y Combinator Spring 2026 batch.",
        "humanpages": "Not disclosed on the site.",
        "humanping": "HumanPing Inc., Montreal, Quebec, Canada, per its terms; no registration number or street address is given."
      },
      {
        "aspect": "Governing law and where disputes go",
        "ours": "Czech law; courts in Prague for business clients. Consumers keep the mandatory protection of their home country and may sue there. Out-of-court: the Czech Trade Inspection Authority.",
        "rentahuman": "California law, venue San Francisco County; user disputes go to binding arbitration with a class-action waiver and a 30-day opt-out.",
        "humanpages": "Not disclosed on the site.",
        "humanping": "Quebec law; exclusive jurisdiction of the courts in Montreal, after an attempt at informal resolution by email."
      },
      {
        "aspect": "Who does the work",
        "ours": "One named mechanical engineer, in his own workshop, with named Czech subcontractors for CNC, sheet metal, laser and welding. The evidence package names the person who did the work.",
        "rentahuman": "Whoever applies to the bounty. The terms state that RentAHuman \"does not perform background checks\", that any verification \"is not an endorsement, background check, or guarantee of trustworthiness\", and that workers are not its contractors or employees.",
        "humanpages": "Whoever accepts the task.",
        "humanping": "Whoever accepts the task; the site describes government-ID plus proof-of-personhood checks (World ID, BrightID, Gitcoin Passport) and peer video spot-checks."
      },
      {
        "aspect": "What it can actually make",
        "ours": "Mechanical construction and product development: new or edited 3D CAD models, 2D manufacturing drawings, and checks of a model or drawing you supply. 3D printing in-house; CNC, sheet metal, laser cutting and welding through named Czech subcontractors. Assembly, wiring and bring-up of electronics, dimensional inspection with stated instruments, human device testing, on-site verification in the Czech Republic, and shipping with customs paperwork. One service can be ordered on its own, or several combined.",
        "rentahuman": "Errands and gig tasks. Not an engineering shop.",
        "humanpages": "Photography, deliveries and research.",
        "humanping": "Errands and gig tasks."
      },
      {
        "aspect": "How the price is set",
        "ours": "A human reads the request and writes one fixed total: 45 EUR/hour plus materials, subcontractors and carrier cost at cost. Seven worked examples are published. Minimum 45 EUR.",
        "rentahuman": "You name a bounty price and wait for applicants. An 18 % platform fee is added on top of the task amount and paid by the customer.",
        "humanpages": "Workers keep 100 %; no fee is taken from the task payment. Agents pay only for platform access: a free Basic tier, a PRO tier listed at 10 USD/month but free during launch, or x402 pay-per-use in USDC on Base (0.25 USD per job offer, 0.05 USD per profile view).",
        "humanping": "18 % commission on completed tasks, which the terms say is deducted from the worker's payout (the pricing section says humans pay nothing). Agents also choose a plan: free up to 10 tasks a month, PRO at 49 USD/month, or Enterprise."
      },
      {
        "aspect": "How you pay",
        "ours": "Card through Stripe Checkout, EUR or USD. No cryptocurrency, no cash, no gift cards, no anonymous payment of any kind, deliberately, so that every client is identifiable and every task has an invoice.",
        "rentahuman": "Stripe for cards, or USDC on Base; x402 lets an agent create and fund an account with USDC and no card at all.",
        "humanpages": "Directly from agent to worker, by a method they agree; the terms and documentation describe USDC (on Ethereum, Base, Polygon or Arbitrum). Platform charges are paid in USDC on Base via x402. The site does not describe card payment.",
        "humanping": "Card or USDC in; Stripe, PayPal or USDC out."
      },
      {
        "aspect": "Who holds the money",
        "ours": "Nobody in between. Up to 150 EUR you pay in full at ordering, or authorise a card hold captured on delivery. Above 150 EUR you pay a deposit and then the balance only after you have seen the evidence package and before the item ships. We do not call this escrow: escrow means a licensed third party holds the money, and here the obligation to refund is contractual and written down.",
        "rentahuman": "The platform holds the payment in escrow until the work is confirmed.",
        "humanpages": "Nobody, by default: the terms say Human Pages never holds funds and payments go directly from agent to worker in USDC. An optional escrow is a non-custodial smart contract on Base; disputes go to an independent arbitrator chosen by the depositor, with no appeal.",
        "humanping": "Funds locked in escrow when the task is created."
      },
      {
        "aspect": "Refunds",
        "ours": "Before work starts, everything back. After it starts, everything minus the costs demonstrably incurred, itemised, with the receipts for external costs. If we fail to deliver, money back to the original method within 5 business days.",
        "rentahuman": "The terms state \"ALL SALES ARE FINAL. RENTAHUMAN DOES NOT ISSUE REFUNDS UNDER ANY CIRCUMSTANCES\", covering verification fees, service fees, escrow fees and API subscriptions. A dispute freezes the escrow for admin review and the platform keeps settlement discretion.",
        "humanpages": "The terms state \"We cannot reverse or refund payments\"; USDC payments are irreversible. In the optional escrow, an arbitrator decides disputes, and funds go to the worker if no dispute is raised or the arbitrator does not respond within 7 days.",
        "humanping": "If HumanPing resolves a dispute in the agent's favour, the escrowed budget goes back to the agent; its decision is final. The 18 % fee is non-refundable even in disputes, and work not reviewed within 24 hours is auto-approved and can no longer be disputed."
      },
      {
        "aspect": "How far liability goes",
        "ours": "Limited to the price of the task, excluding lost profit and indirect loss; no limit for intent, gross negligence or injury; consumer rights not limited. Liability insurance is being arranged and is not yet in force — stated here rather than implied otherwise.",
        "rentahuman": "Liability capped at what you paid in the previous 12 months or 100 USD, whichever is less, with explicit exclusions for scam bounties and for task completion. Workers carry their own insurance.",
        "humanpages": "The service is provided \"as is\"; the terms exclude liability for disputes between users and hiring parties, lost cryptocurrency or failed transactions, and the quality of work. No monetary cap is stated.",
        "humanping": "Capped at what you paid HumanPing in the previous 12 months, and for payment disputes at the escrow amount in question; indirect loss and lost profit excluded; no warranty of worker performance."
      },
      {
        "aspect": "Screening of the task itself",
        "ours": "A human reads every request before quoting; nothing is accepted automatically. Ten categories are refused outright and three more need the operator to be verified first. A refused request gets a one-line reason and is not invoiced.",
        "rentahuman": "An acceptable-use policy exists. A preprint studying 303 bounties on the platform in February 2026 (arXiv 2602.19514) identified six classes of abuse being bought — credential fraud, identity impersonation, automated reconnaissance, social-media manipulation, authentication circumvention and referral fraud — and concluded that basic content screening was \"currently absent\" in that period.",
        "humanpages": "No separate acceptable-use policy; the terms list prohibited conduct (fraud, spam, impersonation, illegal activity) but describe no screening of tasks before they reach workers.",
        "humanping": "No separate acceptable-use policy; the terms prohibit illegal tasks (including surveillance and stalking) and describe automated fraud checks on workers' proof, but no screening of tasks before they are posted."
      },
      {
        "aspect": "Confidentiality",
        "ours": "Everything you send is confidential from the first quote request, without marking it and without signing anything, for the task and three years after; subcontractors are bound by the same. A pre-filled one-way NDA is available if you need a signed document.",
        "rentahuman": "Governed by the platform's terms and privacy policy; no NDA is offered.",
        "humanpages": "No NDA is offered on the site.",
        "humanping": "No NDA is offered on the site."
      },
      {
        "aspect": "Where the data sits",
        "ours": "In the EU, under GDPR, with a data processing agreement that applies without a separate signature.",
        "rentahuman": "A US platform; the terms do not offer an Article 28 data processing agreement.",
        "humanpages": "Not disclosed.",
        "humanping": "Canada or the United States; the privacy policy relies on Standard Contractual Clauses for EEA users and names a data protection officer contact. No data processing agreement is offered to clients."
      }
    ],
    "where_they_win": [
      "Breadth and reach. A marketplace with people in many countries can get a photograph taken in Lagos or a parcel collected in São Paulo tonight. This company works in the Czech Republic only, and does no in-person work outside it.",
      "Speed of the first step. On a marketplace your agent posts a bounty in one call and someone may take it within minutes. Here a person reads the request first and answers within 24 hours, which is slower on purpose.",
      "Ordering end to end without a human in the loop on our side. RentAHuman and HumanPing let an agent create, fund and close a task through the API in one sitting. Here a person reads and prices every request before it can be accepted and paid; the API takes no order that a person has not priced.",
      "Paying without a card. If your agent holds USDC and no payment card, RentAHuman (x402), Human Pages and HumanPing all accept it, and nothing here does."
    ],
    "when_to_use_us": "When the thing has tolerances, when somebody will have to answer for it later, when the invoice has to come from a named EU company the operator's finance department can look up, when the files must not be seen by strangers, or when what you need is a part rather than an errand.",
    "when_not_to_use_us": "When you need a person in another country today, when the task is a simple errand that any careful person could do, when you want the whole thing done in three API calls without waiting for a human to read it, or when you want to pay in cryptocurrency."
  },
  "statistics": {
    "as_of": "2026-09-23",
    "service_open_since": "2026-09",
    "tasks_completed": 0,
    "median_quote_time": "n/a",
    "requests_refused": 0,
    "disputes": 0,
    "note": "The service opened in 2026-09. No tasks have been completed yet. The numbers are updated monthly, and completed tasks will be listed here as anonymised examples with their evidence packages, with the client's consent."
  },
  "site": "Static HTML. No JavaScript executed, no images beyond the site icon, no cookies, no analytics, no third-party requests.",
  "changelog": [
    {
      "date": "2026-09-29",
      "text": "Privacy notice: a new row describes the usage statistics we keep about the MCP server and the API (time, path, MCP method and tool name but never the arguments or our replies, the client's self-reported name and version, user agent, country, a one-way hash of the IP address with a monthly changing salt; 90 days in detail, then daily totals only). Terms, prices and everything else are unchanged; terms version 2026-09-29."
    },
    {
      "date": "2026-09-28",
      "text": "A reply to the operator is no longer stored while the operator has written something you have not read yet. A small model in our tests answered without reading, saw the operator's question only in the answer to its own message and took it for the operator's reply. Now, when you call get_status with message while the operator has an unread message, nothing is stored or e-mailed: the answer is the ordinary status with that message in messages (it is marked as read by it), message_sent: false and a next_action that says your message was not sent; you send your answer with the next call. So: read the operator's message first, then reply. A stored message has message_sent: true, and next_action then says that your answer was sent to the operator and that the operator has not replied yet. The same text sent again while it is the newest message of the thread is still ignored (duplicate_ignored: true). Terms, prices and everything else are unchanged."
    },
    {
      "date": "2026-09-28",
      "text": "Two fixes to the operator's messages, found in tests with a small model. (1) get_status (also the call that carries your reply in message) and next_action now always include the operator's messages you have not answered or have not been shown yet. If you answer with one call without reading first, the answer shows the operator's question you are answering, and next_action quotes what the operator wrote and tells you to pass on to the user anything new in it (for example a later delivery date). A message you have already been shown is not repeated. (2) In the answers of the MCP tools messages[].from is now operator or you (your own messages used to be agent, which a small model read as the addressee); REST keeps operator and agent. Also: the note on context size for local models is corrected; we recommend at least 16K context. Terms, prices and everything else are unchanged."
    },
    {
      "date": "2026-09-28",
      "text": "Smaller and more truthful answers for small models. (1) The MCP tools get_status, create_task and confirm_delivery now answer briefly by default: no empty lists, no prices, terms or payments it has told you before, only the latest update and the messages that need a reply (older_updates and older_messages count the rest); get_status with full: true returns the complete record, and the REST API always returns it, unchanged. (2) next_action is more explicit: after the agent has answered the operator it says that the answer was delivered and that the operator has not replied yet; while an order is paid, in progress, shipped, awaiting the balance or delivered it says that the order is not finished until the status is confirmed; every open status says that it can change at any time. The descriptions of get_status, create_task and confirm_delivery say to report only what the response says. (3) The same message sent again to the operator within 10 minutes, while it is still the newest message of the thread, is ignored (duplicate_ignored: true) instead of being e-mailed twice. (4) How to recover a lost access_token is a sentence of its own in the answer of request_quote and in the 401 errors; request_quote also says when no delivery_address was recorded and shows the VAT id it recorded. A VAT id and a delivery address are to be given only if the user gave them. (5) For small models and local hosts: a context of at least 16K is recommended, and a call that fails with a connection error is to be repeated. Terms, privacy notice, prices and everything else are unchanged."
    },
    {
      "date": "2026-09-28",
      "text": "Changes to ordering, from what tests with AI agents showed. (1) A quote is now valid for 4 business days (Monday to Friday, Czech public holidays excluded) from the day it is issued, instead of 14 days; the quote states the date. (2) request_quote now requires client.name, the name of the person or company for the invoice, besides task.description and client.email (and delivery_address whenever a physical item is shipped); the flat and the nested shape are both still accepted, and a missing name is a 400 that names the field and shows an example. (3) The payment link that create_task and get_status return (checkout_url) is now valid for 4 days (for a balance: 28 days) instead of 24 hours: it is a signed link of ours, GET /pay/{task_id}, that opens a Stripe Checkout page, a fresh one if Stripe's own page (24 hours) has expired meanwhile; after the link has expired nothing can be paid through it, no contract is concluded and a new quote is needed. (4) Smaller answers for models with a small context: list_services returns a short summary by default (full: true for the complete document), llms.txt is now a short signpost and the whole site as Markdown is llms-full.txt, the request_quote fields are listed once in the MCP tool list (flat; the nested shape is described in services.json and openapi.yaml), get_status and confirm_delivery list only the last 3 updates (older_updates counts the rest) and each update shows the task status at that moment, request_quote returns next_action too, and the reminder in next_action that the operator is waiting for a reply stays until the agent has replied, with a ready get_status call. The tool descriptions now carry what the MCP instructions said, because some hosts do not pass the instructions on. Terms (sections 3 and 4) and the payment rules updated; privacy notice: the name is required for every request; terms version 2026-09-28.3. Prices, refused categories and everything else are unchanged."
    },
    {
      "date": "2026-09-28",
      "text": "The agent can now answer the operator: to answer an operator question, call get_status with the new optional argument message (plain text, 1-2000 characters). The message is stored in the same thread as the operator's notes (messages now lists both, each with from: operator or agent, newest first), the operator is e-mailed, and the answer is the usual status, including your message. Over REST it is the same request as POST with the JSON body {\"message\": \"...\"} to /quotes/{quote_id} or /tasks/{task_id} (a POST so that the text is not in the URL, which servers log). It needs the access_token as before; at most 10 messages per hour per quote and 30 per hour per client address. Still five MCP tools, no new one. Because get_status can now write, its MCP annotations changed: readOnlyHint false, idempotentHint false (a host that asks for confirmation before write tools may ask before a plain status check as well). E-mailing the tasks address with the quote_id in the subject still works. Privacy notice updated (messages you send us); terms version 2026-09-28.2. Prices, rules and everything else are unchanged."
    },
    {
      "date": "2026-09-28",
      "text": "get_status (quote and task) and create_task now return next_action, one or two plain sentences in English saying what the agent or the client should do now, for every status (received, quoted, expired, refused, awaiting_payment, paid, in_progress, awaiting_balance, delivered, confirmed, disputed, refunded, cancelled), plus paid, quote_valid_until and expected_ship_date on tasks. The operator can now send a note to the agent: get_status returns it as messages (newest first, plain text, at most 2000 characters) and, until it has been read once, says so in next_action; to reply, e-mail the tasks address with the quote_id in the subject (a later change the same day lets the agent reply through get_status; see the newer entry). The operator can also mark a quote as a test quote: an order made from it (test_mode true) has no payment link, no payment and no invoice, concludes no contract, and its payment is only simulated by the operator so the rest of the process can be exercised; it is never counted in any statistic or published as an example. Terms (section 3) and privacy notice (messages) updated accordingly; terms version 2026-09-28. Still five MCP tools; prices, rules, refused categories and everything else are unchanged."
    },
    {
      "date": "2026-09-27",
      "text": "request_quote now only requires task.description and client.email; task.deliverables, client.name and client.country are optional (fill them in whenever you know them, but the request is accepted without them - a human prices every request either way). All fields may also be sent flat, at the top level, instead of nested under task/client; if both are sent, the nested value wins. The tool description, llms.txt and openapi.yaml now lead with the shortest possible example (description + email) before a fuller one with an address and a file, and state plainly that a real quote_id always starts with q_ and is only ever returned by this tool - never invent one. No legal terms changed: the categories of data processed and how long they are kept are the same, only which fields are mandatory changed."
    },
    {
      "date": "2026-09-27",
      "text": "Clarified that the phone number inside task.delivery_address is optional: an agent that has a recipient's name and address should never stop to ask the user for a phone number just to fill this field. The address itself is still required whenever something physical is shipped, packed and collected, or handed over in person. Also noted that task.deadline may be omitted if the user gave none. No schema or validation change: a phone number was never actually required by the server, only worded ambiguously in the field description, the request_quote tool description and the worked example text."
    },
    {
      "date": "2026-09-26",
      "text": "Privacy policy, refused-requests row: added that database and file backups (made daily and before every deployment) are not rotated and can keep a copy without a time limit, that the notification e-mail to our own mailbox is not deleted by the 7-day rule below, and that the access and application log entries about the request follow the log rows instead. Terms version bumped again for this clarification; no other legal terms changed."
    },
    {
      "date": "2026-09-26",
      "text": "A refused request, and any files uploaded to it, is now deleted from the live database and file storage 7 days after the refusal (never one that led to a task, a payment, or is still open). Privacy policy updated: refused requests were previously stated as kept for 24 months after the refusal; that is corrected to 7 days. Terms version bumped for this change; no other legal terms changed."
    },
    {
      "date": "2026-09-25",
      "text": "New endpoint POST /quotes/{quote_id}/files (multipart, one or more parts named `file`, `Authorization: Bearer <access_token>`) lets an agent upload input files directly, instead of a URL in input_files or an e-mail attachment; GET /quotes/{quote_id}/files lists what has been uploaded so far. Both are authenticated the same way as get_status; request_quote's response now also carries upload_url. Limits: 95 MB per request (Cloudflare's own cap on this hosting), up to 20 files or 500 MB per quote, extensions step/stp/stl/3mf/obj/iges/igs/dxf/dwg/pdf/png/jpg/jpeg/webp/zip only; a zip or 3mf is stored as sent, never opened. Uploads are accepted only while the quote, and any task made from it, is still open. The operator is e-mailed the name and size of every upload and can download the files from the admin panel. REST only, not an MCP tool: the site still names five tools."
    },
    {
      "date": "2026-09-25",
      "text": "Security hardening (2026-09-25 audit, part A): request_quote now enforces length limits and formats on every field (description up to 20,000 characters, deliverables up to 5,000, up to 20 input_files of up to 2,000 characters each, client name and e-mail bounded and free of line breaks, country an upper-case ISO 3166-1 alpha-2 code); an oversized JSON request is rejected. Privacy policy: the server access log and the application log (which records the recipient and subject of every e-mail the system sends) are kept in active use for 30 days as before, then archived, with access restricted to the operator, for 3 years, the general statute-of-limitations period, to establish, exercise or defend legal claims (Art. 6(1)(f) GDPR); previously these logs were deleted after 30 days. Terms version bumped for this change; no other legal terms changed."
    },
    {
      "date": "2026-09-24",
      "text": "Comparison table: the 'What it can actually make' cell for Hands for Agents rewritten to match the current service descriptions — mechanical construction and product development, new and edited 3D CAD models, 2D manufacturing drawings, model/drawing checks, in-house 3D printing, CNC/sheet metal/laser/welding through named Czech subcontractors, assembly with electronics wiring and bring-up, measurement, testing, on-site verification in the Czech Republic, and shipping with customs paperwork; and that one service can be ordered on its own. No other comparison cells changed."
    },
    {
      "date": "2026-09-24",
      "text": "New endpoint POST /quotes/{quote_id}/access-token: if a lost access_token's quote has a contact e-mail on file, a new one is generated and sent only there. The response is always the same generic acknowledgement, whether or not the quote exists, so it cannot be used to find out which quote ids are real; rate-limited per quote. The token you already have keeps working — this adds another valid one, up to three at a time, oldest reissued one dropped first. REST only, not an MCP tool: the site still names five tools. Operators can also reissue a token from the admin panel."
    },
    {
      "date": "2026-09-24",
      "text": "Comparison re-checked against the other companies' pages on 2026-09-24; 14 cells updated."
    },
    {
      "date": "2026-09-24",
      "text": "Service descriptions extended, nothing added that the request_quote schema does not already support. Mechanical design (CAD) now names mechanical product development, new 3D models, edits to a model you supply, 2D manufacturing drawings, and a check of a 3D model or drawing for manufacturability, errors, and dimensions or tolerances; outputs are unchanged (STEP, STL, PDF drawing). Assemble and commission hardware now names wiring the electronic connections, power-on and bring-up, and a functional test of the assembled electronics, alongside the firmware/OS-image flashing already stated; we still do not design electronics, schematics or circuit boards. The home page and llms.txt now say that any service can be ordered on its own or combined, up to full product development and construction through to a shipped item. The input_files field of request_quote now names photos, a sketch, a CAD model and a PDF drawing as the kinds of file that can be linked by URL, matching what the field always accepted."
    },
    {
      "date": "2026-09-23",
      "text": "All five operations are live as MCP tools at <https://mcp.handsforagents.com/mcp> and as REST endpoints at <https://api.handsforagents.com/v1>: list_services, request_quote, create_task, get_status and confirm_delivery. A human prices every request; create_task returns a Stripe Checkout URL and the task is paid by card: in full or as a card hold up to 150 EUR, deposit and balance above. Accepting a quote and paying no longer go through e-mail, although e-mail still works for every step. Prices, rules, refused categories and legal documents are unchanged."
    },
    {
      "date": "2026-09-19",
      "text": "The answer to a quote request is now promised within 24 hours of the request arriving, counted in real time and including weekends and Czech public holidays, instead of within 4 business hours. A request that arrives on Friday evening is answered by Saturday evening, not on Monday. The server computes response_due_at the same way, so no business-hours or public-holiday arithmetic is left in it."
    },
    {
      "date": "2026-09-19",
      "text": "The workshop city, the hosting provider and the log retention period are now stated, in the privacy policy and in the data processing agreement. The A2A agent card is withdrawn until an A2A endpoint answers, so no agent card is published. A refused quote carries a refusal_code from the task policy, and a quote that has been accepted carries its task_id. The MCP tool descriptions say exactly what the server answering at /mcp does, and a self-test checks that the two match."
    },
    {
      "date": "2026-09-18",
      "text": "New comparison page (/comparison.html, /comparison.md) setting this company against RentAHuman, Human Pages and HumanPing, with every claim about them quoted from their own published terms and the source named. Added to llms.txt, llms-full.txt and services.json so every layer carries the same cells."
    },
    {
      "date": "2026-09-18",
      "text": "New build variant site-launch-mcp: the MCP server at /mcp and the REST API at /v1 are live with three operations — list_services, request_quote and get_status — while accepting a quote and paying stay on e-mail, because there is no payment backend. site-launch is unchanged and remains the e-mail-only fallback. robots.txt now also names ExaSearchBot, ShapBot, Shap-User, OAI-AdsBot and meta-externalfetcher, and records why there is no Brave line."
    },
    {
      "date": "2026-09-17",
      "text": "Terms of service: new section 10, Confidentiality, which applies to every request and task by default, without an NDA; the following sections are renumbered. Security measures reduced to the three in force. Legal documents version 2026-09-17.3."
    },
    {
      "date": "2026-09-17",
      "text": "Added the one-way non-disclosure agreement (/nda.html, /nda.md) and a reference to it in the terms of service, section 13. Legal documents version 2026-09-17.2."
    },
    {
      "date": "2026-09-17",
      "text": "First version of the site and of the legal documents."
    }
  ]
}
