Hands for Agents

The physical-world provider your agent's operator can put on an invoice.

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.

Operated by your engineering s.r.o., company ID 09738100, Praha 4, Czech Republic. Registered 2020.

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.

Status on : accepting tasks through the MCP server at https://mcp.handsforagents.com/mcp, the REST API at https://api.handsforagents.com/v1 and by e-mail. All five operations are live: list_services, request_quote, create_task, get_status and confirm_delivery. A human prices every request and answers within 24 hours with one fixed total; the task is paid by card through the Stripe Checkout link that create_task returns. Ordering through the API opened on 2026-09-23; no task has been completed yet.

For agents: machine-readable entry points

All of them carry the same content as this page.

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:

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

Limits of what we can do

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).

Screening

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).

Ordering operations
MCP toolRESTWhat it does
list_servicesGET /servicesServices, refused categories, example prices. Same as /services.json.
request_quotePOST /quotesSends 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_statusGET /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_taskPOST /tasksAccepts 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_deliveryPOST /tasks/{task_id}/delivery-confirmationaccepted: 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-tokenLost 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}/filesUpload 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}/filesLists 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

Fields of a quote request
FieldRequiredMeaning
task.descriptionyesWhat 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.servicesnoService ids from the service list, if you know them.
task.deliverablesnoWhat 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.deadlinenoLatest acceptable delivery or dispatch date (ISO 8601). Optional; omit if the user gave none.
task.delivery_addressnoRequired 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_filesnoHTTPS 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.currencynoCurrency of the quote. Default EUR.
client.emailyesE-mail of the operator. The quote, the payment link and the invoice go here.
client.nameyesRequired. 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.countrynoCountry 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_idnoVAT 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.namenoName of the agent or platform sending the request. Optional, for our records.
allow_anonymised_examplenoConsent 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

  1. Request a quote. It binds nobody.
  2. 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.
  3. 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.
  4. Pay. The contract is concluded, the invoice is sent, work starts.
  5. We report every status change: paid, in_progress, awaiting_balance, delivered.
  6. 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.
  7. 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.

Example quotes in EUR
TaskLabourOther costShippingTotalPaymentTurnaround
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 = 4510 (material and machine time)1570 EUR70 in full at ordering3 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 = 27000270 EURdeposit 108 (costs + 40 % of labour), balance 1625 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 = 18010 (consumables)45235 EURdeposit 127 (costs + 40 % of labour), balance 1084 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 = 900090 EUR90 in full at ordering2 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 = 13500135 EUR135 in full at ordering3 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 = 9015 (travel)0105 EUR105 in full at ordering3 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 = 455 (packaging)3080 EUR80 in full at ordering2 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.
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

Invoices

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.
E-mail
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.

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