handsforagents-mcp 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +15 -14
- package/index.js +12 -9
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
|
|
5
5
|
Your agent can call an API for almost anything except the physical world. This is the physical world: FDM 3D printing in-house, CNC / sheet metal / laser / welding through Czech subcontractors, assembly and commissioning of hardware, dimensional inspection, human testing of a device, on-site verification anywhere in the Czech Republic, and receive-repack-ship with customs paperwork. Every task ends with an evidence package — timestamped photos, a measurement report with the instrument and its resolution, a test log, a tracking number, and the name of the person who did the work.
|
|
6
6
|
|
|
7
|
-
- **MCP endpoint:** `https://handsforagents.com/mcp` (Streamable HTTP)
|
|
8
|
-
- **REST:** `https://handsforagents.com/v1/services`
|
|
7
|
+
- **MCP endpoint:** `https://mcp.handsforagents.com/mcp` (Streamable HTTP)
|
|
8
|
+
- **REST:** `https://api.handsforagents.com/v1/services`
|
|
9
9
|
- **Everything machine-readable:** [llms.txt](https://handsforagents.com/llms.txt) · [services.json](https://handsforagents.com/services.json) · [openapi.yaml](https://handsforagents.com/openapi.yaml)
|
|
10
10
|
|
|
11
11
|
## Install
|
|
@@ -17,7 +17,7 @@ Point any client that supports remote MCP servers straight at the endpoint:
|
|
|
17
17
|
"mcpServers": {
|
|
18
18
|
"handsforagents": {
|
|
19
19
|
"type": "http",
|
|
20
|
-
"url": "https://handsforagents.com/mcp"
|
|
20
|
+
"url": "https://mcp.handsforagents.com/mcp"
|
|
21
21
|
}
|
|
22
22
|
}
|
|
23
23
|
}
|
|
@@ -36,40 +36,41 @@ For a client that only speaks stdio, this package bridges to the same endpoint a
|
|
|
36
36
|
}
|
|
37
37
|
```
|
|
38
38
|
|
|
39
|
-
No API key, no account, no registration. `list_services` and `request_quote` are open;
|
|
39
|
+
No API key, no account, no registration. `list_services` and `request_quote` are open; the other tools need the `access_token` that `request_quote` handed you.
|
|
40
40
|
|
|
41
41
|
## Tools
|
|
42
42
|
|
|
43
43
|
| Tool | What it does |
|
|
44
44
|
| --- | --- |
|
|
45
45
|
| `list_services` | The seven services, the refused categories, seven example prices, the payment rules and the key contract terms. Byte for byte the same document as `/services.json`. |
|
|
46
|
-
| `request_quote` | Sends a task to a human for screening and a fixed-price quote. Not an order, not binding, nothing charged. Returns `quote_id`, `access_token`, `response_due_at` and `nda_url`. A human answers
|
|
47
|
-
| `
|
|
46
|
+
| `request_quote` | Sends a task to a human for screening and a fixed-price quote. Not an order, not binding, nothing charged. Returns `quote_id`, `access_token`, `response_due_at` and `nda_url`. A human answers within 24 hours. |
|
|
47
|
+
| `create_task` | Accepts a quote and the terms of service. Returns `task_id` and a Stripe Checkout URL for the first payment: the full price or a card hold (tasks up to 150 EUR), or the deposit (tasks above). |
|
|
48
|
+
| `get_status` | Reads a quote or a task back: the quote with its payment schedule or the refusal reason, later the task status, payments, evidence files and tracking numbers, and the Checkout URL for the balance when it is due. |
|
|
49
|
+
| `confirm_delivery` | `accepted=true` closes the task; `accepted=false` with a reason opens a dispute, answered by a human within 2 business days. Without either, the task counts as accepted 7 days after delivery. |
|
|
48
50
|
|
|
49
|
-
|
|
51
|
+
The same five operations are available over REST, described in [openapi.yaml](https://handsforagents.com/openapi.yaml).
|
|
50
52
|
|
|
51
53
|
## Try it without installing anything
|
|
52
54
|
|
|
53
55
|
```bash
|
|
54
|
-
curl -
|
|
56
|
+
curl -sL https://mcp.handsforagents.com/mcp \
|
|
55
57
|
-H 'Content-Type: application/json' \
|
|
56
|
-
-H '
|
|
57
|
-
-H '
|
|
58
|
-
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list",
|
|
59
|
-
"params":{"_meta":{"io.modelcontextprotocol/protocolVersion":"2026-07-28"}}}'
|
|
58
|
+
-H 'Accept: application/json, text/event-stream' \
|
|
59
|
+
-H 'MCP-Protocol-Version: 2025-11-25' \
|
|
60
|
+
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}'
|
|
60
61
|
```
|
|
61
62
|
|
|
62
63
|
Or without MCP at all:
|
|
63
64
|
|
|
64
65
|
```bash
|
|
65
|
-
curl -s https://handsforagents.com/v1/services | head -40
|
|
66
|
+
curl -s https://api.handsforagents.com/v1/services | head -40
|
|
66
67
|
```
|
|
67
68
|
|
|
68
69
|
## What it costs
|
|
69
70
|
|
|
70
71
|
There is no catalogue. A human quotes every task as one fixed total in EUR or USD, built from **45 EUR/hour** plus materials, subcontractors and carrier cost at cost. Minimum 45 EUR. Seven worked examples are in `list_services` — a printed PETG bracket checked with calipers and shipped tracked to Germany comes to 70 EUR, on-site verification of a business address with ten geotagged photos to 105 EUR.
|
|
71
72
|
|
|
72
|
-
Payment is by card through Stripe Checkout, in full up to 150 EUR, deposit plus balance above it, with the balance due after you have seen the evidence package and before the item ships. **No cryptocurrency, no cash, no anonymous payment of any kind** — deliberately, so that every client is identifiable and every task has an invoice.
|
|
73
|
+
Payment is by card through Stripe Checkout, in full (or as a card hold for short tasks) up to 150 EUR, deposit plus balance above it, with the balance due after you have seen the evidence package and before the item ships. **No cryptocurrency, no cash, no anonymous payment of any kind** — deliberately, so that every client is identifiable and every task has an invoice.
|
|
73
74
|
|
|
74
75
|
## What it will not do
|
|
75
76
|
|
package/index.js
CHANGED
|
@@ -2,13 +2,13 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* handsforagents-mcp — stdio bridge to the Hands for Agents MCP server.
|
|
4
4
|
*
|
|
5
|
-
* The real server is remote (https://handsforagents.com/mcp, Streamable HTTP).
|
|
5
|
+
* The real server is remote (https://mcp.handsforagents.com/mcp, Streamable HTTP).
|
|
6
6
|
* This package exists for clients that only speak stdio, and so that the server
|
|
7
7
|
* is findable on npm. It adds nothing of its own: every tools/list and
|
|
8
8
|
* tools/call is forwarded to the remote endpoint unchanged.
|
|
9
9
|
*
|
|
10
10
|
* If your client supports remote MCP servers, point it straight at
|
|
11
|
-
* https://handsforagents.com/mcp and skip this package.
|
|
11
|
+
* https://mcp.handsforagents.com/mcp and skip this package.
|
|
12
12
|
*
|
|
13
13
|
* Usage:
|
|
14
14
|
* npx handsforagents-mcp
|
|
@@ -19,10 +19,12 @@
|
|
|
19
19
|
|
|
20
20
|
import process from "node:process";
|
|
21
21
|
|
|
22
|
-
const REMOTE = process.env.HANDSFORAGENTS_URL || "https://handsforagents.com/mcp";
|
|
22
|
+
const REMOTE = process.env.HANDSFORAGENTS_URL || "https://mcp.handsforagents.com/mcp";
|
|
23
23
|
const MODERN = "2026-07-28";
|
|
24
24
|
const LEGACY_FALLBACK = "2025-06-18";
|
|
25
|
-
|
|
25
|
+
// Version sent to the remote server; it must be one the server supports.
|
|
26
|
+
const REMOTE_PROTOCOL = "2025-11-25";
|
|
27
|
+
const PKG_VERSION = "0.2.0";
|
|
26
28
|
const TIMEOUT_MS = Number(process.env.HANDSFORAGENTS_TIMEOUT_MS || 30000);
|
|
27
29
|
|
|
28
30
|
const SERVER_INFO = { name: "handsforagents", title: "Hands for Agents", version: PKG_VERSION };
|
|
@@ -31,9 +33,10 @@ const INSTRUCTIONS =
|
|
|
31
33
|
"Human-operated physical-world service for AI agents, run by a registered Czech (EU) company. " +
|
|
32
34
|
"A person designs, makes, assembles, measures, tests, verifies on site, receives and ships physical " +
|
|
33
35
|
"things, and documents the work with evidence. Call list_services first: it carries the refused " +
|
|
34
|
-
"categories, the prices and the contract terms.
|
|
35
|
-
"
|
|
36
|
-
"
|
|
36
|
+
"categories, the prices and the contract terms. Flow: request_quote (returns quote_id and access_token; " +
|
|
37
|
+
"a human answers within 24 hours) -> get_status until quoted or refused -> create_task -> pay the " +
|
|
38
|
+
"Stripe Checkout URL -> get_status -> confirm_delivery. Keep the access_token: it is the only key to " +
|
|
39
|
+
"the quote and the task. Payment is by card in EUR or USD; no cryptocurrency. " +
|
|
37
40
|
"The contract is with the operator of the agent, not the agent.";
|
|
38
41
|
|
|
39
42
|
// --------------------------------------------------------------------------
|
|
@@ -72,7 +75,7 @@ async function callRemote(method, params, name) {
|
|
|
72
75
|
...params,
|
|
73
76
|
_meta: {
|
|
74
77
|
...(params._meta || {}),
|
|
75
|
-
"io.modelcontextprotocol/protocolVersion":
|
|
78
|
+
"io.modelcontextprotocol/protocolVersion": REMOTE_PROTOCOL,
|
|
76
79
|
"io.modelcontextprotocol/clientInfo": { name: "handsforagents-mcp", version: PKG_VERSION },
|
|
77
80
|
"io.modelcontextprotocol/clientCapabilities": {},
|
|
78
81
|
},
|
|
@@ -83,7 +86,7 @@ async function callRemote(method, params, name) {
|
|
|
83
86
|
"Content-Type": "application/json",
|
|
84
87
|
Accept: "application/json, text/event-stream",
|
|
85
88
|
"User-Agent": `handsforagents-mcp/${PKG_VERSION} (+https://handsforagents.com)`,
|
|
86
|
-
"MCP-Protocol-Version":
|
|
89
|
+
"MCP-Protocol-Version": REMOTE_PROTOCOL,
|
|
87
90
|
"Mcp-Method": method,
|
|
88
91
|
};
|
|
89
92
|
if (name !== undefined) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "handsforagents-mcp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"mcpName": "com.handsforagents/hands",
|
|
5
5
|
"description": "MCP server for Hands for Agents: a human in the EU makes, assembles, measures, verifies and ships physical things for your agent.",
|
|
6
6
|
"keywords": [
|