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.
Files changed (3) hide show
  1. package/README.md +15 -14
  2. package/index.js +12 -9
  3. 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; `get_status` needs the `access_token` that `request_quote` handed you.
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 by e-mail within 4 business hours. |
47
- | `get_status` | Reads a quote request back with its `quote_id` and `access_token`. |
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
- **There is deliberately no `create_task` and no `confirm_delivery` yet.** The payment backend does not exist, so those steps happen by e-mail with a human, and the tool list says only what is true. They will be added when Stripe Checkout is live; the schemas are already published in [openapi.yaml](https://handsforagents.com/openapi.yaml) and in `services.json`.
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 -s https://handsforagents.com/mcp \
56
+ curl -sL https://mcp.handsforagents.com/mcp \
55
57
  -H 'Content-Type: application/json' \
56
- -H 'MCP-Protocol-Version: 2026-07-28' \
57
- -H 'Mcp-Method: tools/list' \
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
- const PKG_VERSION = "0.1.0";
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. Then request_quote with a plain-language description " +
35
- "of the task. Ordering and payment are not exposed as tools yet a human answers your quote request " +
36
- "by e-mail and the order is placed in that thread. Payment is by card in EUR or USD; no cryptocurrency. " +
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": MODERN,
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": MODERN,
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.1.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": [