For agents: machine-readable entry points
All of them carry the same content as this page.
- /llms.txt: a short signpost for agents: what this is, how to order (MCP, REST, e-mail), a minimal request and links to everything below.
- /llms-full.txt: this site as Markdown: services, prices, rules, key terms, contacts and how to order, followed by the complete legal documents.
- /services.json: services, refused categories, example prices, payment and ordering rules as JSON. Identical to the output of the MCP tool
list_serviceswithfull: true; without it the tool returns a short summary. - /comparison.md: this company set against RentAHuman, Human Pages and HumanPing, quoted from their own terms.
- MCP server (Streamable HTTP):
https://mcp.handsforagents.com/mcp. Live tools:list_services,request_quote,create_task,get_status,confirm_delivery. - REST API:
https://api.handsforagents.com/v1, specification /openapi.yaml (OpenAPI 3.1, version 0.1.0). - Order flow:
request_quote→ a human answers within 24 hours with one fixed total or a refusal, readable withget_status→create_taskwithterms_accepted: trueand theterms_versionstated in the quote returns a payment link (checkout_url, valid 4 days) to Stripe Checkout → pay by card → follow the task withget_status→confirm_delivery. Up to 150 EUR: payment in full or a card hold; above: deposit and balance. Details in How to order and How to pay. - Authentication:
list_servicesandrequest_quoteneed none. The other calls need theaccess_tokenreturned byrequest_quote, sent asAuthorization: Bearer <token>. Store it: it is kept only as a hash. Lost it?POST /quotes/{quote_id}/access-tokensends a new one to the contact e-mail given in the original request; the old one keeps working too. - Small models, local hosts: 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). The MCP answers are short by default (
get_statuswithfull: truereturns everything); if a call fails with a connection error, repeat it. - E-mail works too: tasks@handsforagents.com.
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.
- Mechanical design (CAD)
design - 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.
- Make a part or prototype
make - 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.
- Assemble and commission hardware
assemble - 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.
- Measure and inspect
measure - 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.
- Test a device as a human
test - 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.
- On-site verification and presence (Czech Republic)
verify - 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.
- Receive, pack and ship
ship - 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.
Everything you send us is confidential by default; no NDA required, one available if you need it. Details: terms of service, section 10; the one-way NDA.
Evidence package
Every task ends with proof that it was done:
- 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.
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.
Refused categories
credentials: Tasks that need login credentials, account creation, or access to an account on someone's behalf.impersonation: Pretending to be another person or company, or signing anything in someone else's name.surveillance: Following, watching, photographing or locating natural persons without their consent.social-manipulation: Fake reviews, fake engagement, astroturfing, or any other manipulation of social networks and ratings.verification-bypass: Getting around identity, age, CAPTCHA, KYC, phone-number or any other verification.referral-fraud: Abuse of referral, bonus, coupon or promotion schemes.weapons-regulated: Weapons, weapon parts, explosives, drugs, and items that need a licence we do not hold, including export-controlled dual-use goods.counterfeit: Counterfeit goods and items that infringe trademarks, patents or copyright.reshipping-fraud: Forwarding goods bought with someone else's payment details, or forwarding to evade sanctions, customs or export rules.illegal: Anything illegal in the Czech Republic or the EU, wherever the agent or its operator is located.
Limits of what we can do
- 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: verified operators only
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).
person-verification: Confirming the identity or presence of a natural person. Done only with that person's knowledge and consent.document-signing: 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.third-party-parcel: 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.
Full text: task policy.
How to order
No registration and no account. The contract is concluded when an accepted quote is paid. A human answers every request within 24 hours (every day, including weekends and Czech public holidays).
| MCP tool | REST | What it does |
|---|---|---|
list_services | GET /services | Services, refused categories, example prices. Same as /services.json. |
request_quote | POST /quotes | Sends the request to a human. Returns a quote_id, an access_token for this quote and task, response_due_at and the nda_url. |
get_status | GET /quotes/{quote_id}GET /tasks/{task_id}with a message: POST to the same URL | Returns the quote (fixed total, scope, date, evidence list) or the refusal with its reason; later the task status, payments, updates, evidence files and tracking numbers. While a payment is due (awaiting_payment, awaiting_balance) it returns the payment link as checkout_url, with checkout_expires_at. updates lists the last 3 status changes, oldest first, each with the task status at that moment; older_updates counts the earlier ones (every status change is also e-mailed to the contact address). The MCP tool answers briefly by default (no empty lists, no prices or terms it has told you before, the latest update, the messages that need a reply and any operator message you have not been shown yet; older_updates and older_messages count the rest); with full: true it returns the complete record, which REST always returns. Every answer has next_action (one or two sentences: what to do now), paid, quote_valid_until, expected_ship_date and messages (the thread with the operator, newest first, each with from: operator or, in the MCP answers, you for your own messages; REST keeps agent). To answer an operator question, call get_status with message (MCP argument message; over REST the same request as POST with the JSON body {"message": "..."}, so the text is not in the URL): plain text, 1-2000 characters, stored in the same thread and e-mailed to the operator; the answer is the usual status, including your message, with message_sent: true. Read the operator's message first, then reply: while the operator has written something you have not read yet, your message is NOT stored; the answer is the usual status with that message in messages, message_sent: false and a next_action that says so, and you send your answer with the next call. Tell the user what the operator said. Send it once and only with what the user told you (the same text again within 10 minutes, while it is still the newest message of the thread, is ignored and the answer has duplicate_ignored: true; limits: 10 per hour per quote, 30 per hour per address). A status can change at any time: call get_status again whenever the user asks about it, never answer from memory, and report to the user only what the response says, without conclusions of your own. E-mail to tasks@handsforagents.com with the quote_id in the subject still works. Because get_status can now write, its MCP annotations are readOnlyHint: false and idempotentHint: false; a host that asks for confirmation before write tools may ask before a plain status check too. test_mode: true marks a test order: no payment link, no payment, no invoice. |
create_task | POST /tasks | Accepts a quote with terms_accepted: true. Returns a task_id and checkout_url, the payment link for the full price, the card hold or the deposit, as the quote states; it is valid for 4 days and opens a Stripe Checkout page. The contract is concluded when that payment is received or authorised. The answer has next_action too; report to the user only what the response says, without conclusions of your own. In a test order (test_mode: true) there is no payment link: the operator will simulate the payment AFTER you order, so right now nothing has been paid or simulated. Task statuses: awaiting_payment, paid, in_progress, delivered, confirmed (also awaiting_balance, disputed, refunded, cancelled); there are no others. Accept delivery (confirm_delivery with accepted: true) only when the status is delivered, which only the operator sets. |
| — (REST only) | GET /pay/{task_id}?p=…&exp=…&sig=… | The payment link itself: you receive it as checkout_url and never build it. It redirects (303) to the Stripe Checkout page of the payment; if Stripe's own page (24 hours) has expired meanwhile, it opens a fresh one, and a page that is still open is reused, never duplicated. After the link's own expiry (4 days from when the payment was created, 28 for a balance) it shows a short page saying so (HTTP 410); nothing is charged. |
confirm_delivery | POST /tasks/{task_id}/delivery-confirmation | accepted: true closes the task. accepted: false with a reason opens a dispute; a human answers within 2 business days. Report to the user only what the response says, without conclusions of your own. |
| — (REST only) | POST /quotes/{quote_id}/access-token | Lost your access_token? Sends a new one to the contact e-mail given in the original request, if the quote has one. Always the same generic response, whether or not the quote exists; the old token keeps working too. |
| — (REST only) | POST /quotes/{quote_id}/files | Upload one or more input files (multipart, part(s) named file) — an alternative to a URL in input_files or an e-mail attachment. Up to 95 MB per request, 20 files or 500 MB per quote, extensions step, stp, stl, 3mf, obj, iges, igs, dxf, dwg, pdf, png, jpg, jpeg, webp, zip only. Only while the quote, and any task made from it, is open. |
| — (REST only) | GET /quotes/{quote_id}/files | Lists the files uploaded so far: name, size, sha256 and when. |
MCP endpoint: https://mcp.handsforagents.com/mcp (Streamable HTTP). REST base URL: https://api.handsforagents.com/v1. list_services and request_quote need no authentication. The other calls need the access_token returned by request_quote, sent as Authorization: Bearer <token>. The same request by e-mail to tasks@handsforagents.com (subject request_quote) is read by a human, who enters it the same way.
Add to your app
One click adds the server to an app on your computer; the app asks you to confirm, and there is nothing to sign in to. These are plain links to the app, nothing is loaded from other sites.
By hand: in mcp.json of Cursor or LM Studio
{
"mcpServers": {
"handsforagents": {
"url": "https://mcp.handsforagents.com/mcp"
}
}
}
in .vscode/mcp.json of VS Code
{
"servers": {
"handsforagents": {
"type": "http",
"url": "https://mcp.handsforagents.com/mcp"
}
}
}
Fields of request_quote
| Field | Required | Meaning |
|---|---|---|
task.description | yes | 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. |
task.services | no | Service ids from the service list, if you know them. |
task.deliverables | no | 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. |
task.deadline | no | Latest acceptable delivery or dispatch date (ISO 8601). Optional; omit if the user gave none. |
task.delivery_address | no | 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. |
task.input_files | no | 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. |
task.currency | no | Currency of the quote. Default EUR. |
client.email | yes | E-mail of the operator. The quote, the payment link and the invoice go here. |
client.name | yes | 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. |
client.country | no | 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. |
client.vat_id | no | 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. |
agent.name | no | Name of the agent or platform sending the request. Optional, for our records. |
allow_anonymised_example | no | 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. |
Required: description, email and name (the name of the person or company for the invoice; use the company or person from the shipping address, do not ask the user for it; ask only if there is neither), and delivery_address whenever a physical item is shipped, handed over or collected; everything else is optional — a detail that has no field of its own belongs in description. Every field can be sent flat, at the top level, as in the two examples below, or nested under task/… and client/… as in the field table above; if a field is sent both ways, the nested value wins. Never invent a quote_id or a status: a real quote_id always starts with q_ and is returned only by request_quote itself.
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 (every field is a plain string or a list of strings, never an object; delivery_address is one string with name, street, city, postcode and country, plus phone only if you already have it — phone is optional, never ask the user for one — required whenever the deliverable is physical):
{
"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"
]
}
No tools and no HTTP at all? Send this e-mail instead — a human reads tasks@handsforagents.com and enters it the same way:
To: tasks@handsforagents.com
Subject: request_quote
description: Make 20 rubber gaskets, 60 mm outer diameter, black EPDM.
email: ops@example.com
name: Example Inc.
Steps
- Request a quote. It binds nobody.
- A human screens the request against the task policy and answers within 24 hours: a quote valid for 4 business days (Monday to Friday, Czech public holidays excluded; the quote states the date), or a refusal with a reason.
- Accept the quote and the terms of service (version 2026-09-29). You get a payment link (
checkout_url, valid 4 days) that opens Stripe Checkout: for the full price or a card hold up to 150 EUR, for the deposit above. See How to pay. - Pay. The contract is concluded, the invoice is sent, work starts.
- We report every status change:
paid,in_progress,awaiting_balance,delivered. - Tasks above 150 EUR: you receive the evidence package and a link for the balance. When the balance is paid, we ship the item or hand over the outputs.
- You receive the deliverables, and confirm delivery or raise a dispute within 7 days.
Need an NDA before you send files? Everything you send is confidential under section 10 of the terms of service without one, from the first request. If the operator's legal department needs a signed document, the one-way non-disclosure agreement is pre-filled: fill in the operator's details, sign, e-mail the PDF to legal@handsforagents.com. Every answer to request_quote carries its address as nda_url.
Only have the file, not a URL? request_quote's response also carries upload_url; POST the file there instead of putting a link in input_files or attaching it to an e-mail: curl -F "file=@part.step" -H "Authorization: Bearer $ACCESS_TOKEN" https://api.handsforagents.com/v1/quotes/$QUOTE_ID/files. Repeat the -F "file=@..." flag for more than one file in the same request.
Prices
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. Minimum task price: 45 EUR. USD quotes use the European Central Bank reference rate of the quote date.
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.
Example quotes: what we charge for exactly this scope as of 2026-09. Shipping amounts are carrier cost and vary by weight and destination.
| Task | Labour | Other cost | Shipping | Total | Payment | Turnaround |
|---|---|---|---|---|---|---|
| 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. | 1 h = 45 | 10 (material and machine time) | 15 | 70 EUR | 70 in full at ordering | 3 business days to dispatch |
| 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. | 6 h = 270 | 0 | 0 | 270 EUR | deposit 108 (costs + 40 % of labour), balance 162 | 5 business days |
| 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. | 4 h = 180 | 10 (consumables) | 45 | 235 EUR | deposit 127 (costs + 40 % of labour), balance 108 | 4 business days after the last component arrives |
| 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. | 2 h = 90 | 0 | 0 | 90 EUR | 90 in full at ordering | 2 business days after the part arrives |
| 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. | 3 h = 135 | 0 | 0 | 135 EUR | 135 in full at ordering | 3 business days after the device arrives |
| 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. | 2 h = 90 | 15 (travel) | 0 | 105 EUR | 105 in full at ordering | 3 business days |
| 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. | 1 h = 45 | 5 (packaging) | 30 | 80 EUR | 80 in full at ordering | 2 business days after the parcel arrives |
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.
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.
Payment rules
- Tasks up to 150 EUR: paid in full at ordering
- 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.
- Short tasks up to 150 EUR: card hold instead of a charge
- 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.
- Tasks above 150 EUR: deposit and balance
- 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.
- If the balance is not paid
- 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.
- The payment link is valid for 4 days
- 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.
- Cancellation
- 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.
- If we do not deliver
- 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.
What we do not accept, and what this is not
- 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.
- 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.
Invoices
- 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.
- SEPA bank transfer in EUR is possible on request for operators who cannot pay by card.
Cancellations, refunds and disputes: dispute and refund policy.
Who the client is, and what data we need
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.
Data we need: a description of the task, the operator's e-mail and the name of the person or company for the invoice, plus a delivery address when something physical is shipped; that is all that is required. Country, a VAT or tax id for the invoice, and everything else are optional — give them whenever you know them (acceptance of the terms comes later, at ordering). Nothing else is asked for, except for the three sensitive categories. What we do with what you send: privacy notice.
Who we are
The company data below can be checked in the public registers linked under Verify.
- Legal name
- your engineering s.r.o.
- Legal form
- společnost s ručením omezeným (Czech private limited liability company)
- Company ID (IČO)
- 09738100
- VAT
- Not registered for VAT in the Czech Republic. No VAT number, not listed in VIES.
- Registered office
- Jaurisova 515/4, Michle, 140 00 Praha 4, Czech Republic
- Registered
- , Commercial Register kept by the Municipal Court in Prague, file C 341512
- Managing director (jednatel)
- Otakar Mikšánek
- Verify
- Czech Commercial Register (justice.cz)
ARES, Czech Ministry of Finance register (JSON) - Workshop
- Ostrava, Czech Republic. The address for inbound parcels is given in the accepted quote.
- Tasks: tasks@handsforagents.com
Legal and data protection: legal@handsforagents.com
Security: security@handsforagents.com - Phone
- +420 737 954 017
- Bank
- Česká spořitelna, a.s., account 5999690379/0800, IBAN CZ98 0800 0000 0059 9969 0379, BIC GIBACZPX
- Liability insurance
- Not in force on 2026-09-29. Being arranged; insurer, policy number and limit will be stated here once the policy is in force.
- Languages
- English, Czech
- When requests are answered
- every day, including weekends and Czech public holidays
Track record
As of :
- Service open since
- 2026-09
- Tasks completed
- 0
- Median time from request to quote
- n/a
- Requests refused
- 0
- Disputes
- 0
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.
There are no ratings, badges or testimonials on this site. Nothing here is meant to be taken on trust; check the registers.
Legal
Version of all documents: 2026-09-29. Key terms:
contract: 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.acceptance: Confirm delivery or raise a dispute within 7 days of receiving the deliverables. Silence counts as acceptance.liability: 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.safety-critical: 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.confidentiality: 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.intellectual-property: 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.custody: Items left with us are stored for 30 days after the task ends, then returned at your cost or, after notice, disposed of.records: 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).nda: 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.personal-data: 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.consumers: 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.law: Czech law governs. Courts in Prague decide disputes with business clients; consumers keep the mandatory protection of their home country and may sue there.versions: All documents are versioned by date. The version accepted at ordering applies to that task.
Legal documents
- Terms of service (Markdown): Contract terms between your engineering s.r.o. and the operator of an AI agent.
- Task policy (Markdown): Which tasks are accepted, which are refused, and how every request is screened by a human.
- Dispute and refund policy (Markdown): Cancellation, refunds and how a dispute about a delivered task is decided.
- Privacy notice (GDPR) (Markdown): What personal data is processed, why, where and for how long.
- Data processing agreement (Markdown): Article 28 GDPR agreement for clients whose tasks contain personal data.
- Non-disclosure agreement (one-way) (Markdown): Pre-filled one-way NDA that protects the client's information: fill in, sign, e-mail the PDF.
This site
Static HTML. No JavaScript is executed (the one script element is a JSON-LD data block), no images beyond the site icon, no cookies, no analytics, no third-party requests. Crawlers and AI user agents are allowed in /robots.txt. Security contact: /.well-known/security.txt.
Changelog
- : 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.
- : 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.
- : 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.
- : 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.
- : 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.
- : 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.
- : 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.
- : 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.
- : 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.
- : 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.
- : 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.
- : 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.
- : 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.
- : 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.
- : 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.
- : Comparison re-checked against the other companies' pages on 2026-09-24; 14 cells updated.
- : 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.
- : 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.
- : 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.
- : 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.
- : 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.
- : 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.
- : 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.
- : 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.
- : First version of the site and of the legal documents.