handsforagents-mcp 0.1.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/LICENSE +21 -0
- package/README.md +100 -0
- package/index.js +257 -0
- package/package.json +48 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 your engineering s.r.o.
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
# Hands for Agents — MCP server
|
|
2
|
+
|
|
3
|
+
**A person in the Czech Republic (EU) makes, assembles, measures, verifies and ships physical things for your agent, and sends the operator an invoice.**
|
|
4
|
+
|
|
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
|
+
|
|
7
|
+
- **MCP endpoint:** `https://handsforagents.com/mcp` (Streamable HTTP)
|
|
8
|
+
- **REST:** `https://handsforagents.com/v1/services`
|
|
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
|
+
|
|
11
|
+
## Install
|
|
12
|
+
|
|
13
|
+
Point any client that supports remote MCP servers straight at the endpoint:
|
|
14
|
+
|
|
15
|
+
```json
|
|
16
|
+
{
|
|
17
|
+
"mcpServers": {
|
|
18
|
+
"handsforagents": {
|
|
19
|
+
"type": "http",
|
|
20
|
+
"url": "https://handsforagents.com/mcp"
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
For a client that only speaks stdio, this package bridges to the same endpoint and adds nothing of its own:
|
|
27
|
+
|
|
28
|
+
```json
|
|
29
|
+
{
|
|
30
|
+
"mcpServers": {
|
|
31
|
+
"handsforagents": {
|
|
32
|
+
"command": "npx",
|
|
33
|
+
"args": ["-y", "handsforagents-mcp"]
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
```
|
|
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.
|
|
40
|
+
|
|
41
|
+
## Tools
|
|
42
|
+
|
|
43
|
+
| Tool | What it does |
|
|
44
|
+
| --- | --- |
|
|
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`. |
|
|
48
|
+
|
|
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`.
|
|
50
|
+
|
|
51
|
+
## Try it without installing anything
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
curl -s https://handsforagents.com/mcp \
|
|
55
|
+
-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"}}}'
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
Or without MCP at all:
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
curl -s https://handsforagents.com/v1/services | head -40
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
## What it costs
|
|
69
|
+
|
|
70
|
+
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
|
+
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
|
+
|
|
74
|
+
## What it will not do
|
|
75
|
+
|
|
76
|
+
A human reads every request before a quote is issued; nothing is accepted automatically. Refused outright: anything needing login credentials or account access, impersonation, surveillance of people, fake reviews and engagement, getting around identity/age/CAPTCHA/KYC verification, referral and coupon fraud, weapons and export-controlled dual-use goods, counterfeits, reshipping goods bought with someone else's card, and anything illegal in the Czech Republic or the EU. Three further categories — confirming a person's identity, signing a document, receiving a parcel addressed to a third party — are accepted only after the operator has been verified.
|
|
77
|
+
|
|
78
|
+
Also outside the capability: safety-critical parts (medical, food-contact, pressure, lifting) without a separate written engineering agreement, in-person work outside the Czech Republic, and storage beyond 30 days.
|
|
79
|
+
|
|
80
|
+
## Who you are contracting with
|
|
81
|
+
|
|
82
|
+
`your engineering s.r.o.`, company ID (IČO) 09738100, Jaurisova 515/4, Michle, 140 00 Praha 4, Czech Republic. Registered 9 December 2020, file C 341512 at the Municipal Court in Prague. Verify it yourself: [justice.cz](https://or.justice.cz/ias/ui/rejstrik-$firma?ico=09738100) · [ARES, as JSON](https://ares.gov.cz/ekonomicke-subjekty-v-be/rest/ekonomicke-subjekty/09738100).
|
|
83
|
+
|
|
84
|
+
The contract is with the **operator** of the agent — the company or person on whose behalf it acts — because an agent has no legal personality. Czech law, courts in Prague for business clients, consumers keep their home protections.
|
|
85
|
+
|
|
86
|
+
Everything you send is **confidential by default** from the first `request_quote`, without marking anything and without signing anything, for the task and three years after. A pre-filled one-way [NDA](https://handsforagents.com/nda.html) is there if you need a signed document.
|
|
87
|
+
|
|
88
|
+
Full terms: [terms](https://handsforagents.com/terms.html) · [task policy](https://handsforagents.com/task-policy.html) · [disputes and refunds](https://handsforagents.com/disputes.html) · [privacy](https://handsforagents.com/privacy.html) · [DPA](https://handsforagents.com/dpa.html)
|
|
89
|
+
|
|
90
|
+
## Honest status
|
|
91
|
+
|
|
92
|
+
The service opened in September 2026 and **no tasks have been completed yet**; the statistics on the site say so and will be updated monthly. Liability insurance is being arranged and is not yet in force — the site says that too, rather than implying otherwise. Completed tasks will be published here as anonymised examples with their evidence packages, with the client's consent.
|
|
93
|
+
|
|
94
|
+
## Security
|
|
95
|
+
|
|
96
|
+
Found something? `security@handsforagents.com`, or see [security.txt](https://handsforagents.com/.well-known/security.txt).
|
|
97
|
+
|
|
98
|
+
## Licence
|
|
99
|
+
|
|
100
|
+
MIT for this bridge package. The service itself is governed by the terms of service linked above.
|
package/index.js
ADDED
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* handsforagents-mcp — stdio bridge to the Hands for Agents MCP server.
|
|
4
|
+
*
|
|
5
|
+
* The real server is remote (https://handsforagents.com/mcp, Streamable HTTP).
|
|
6
|
+
* This package exists for clients that only speak stdio, and so that the server
|
|
7
|
+
* is findable on npm. It adds nothing of its own: every tools/list and
|
|
8
|
+
* tools/call is forwarded to the remote endpoint unchanged.
|
|
9
|
+
*
|
|
10
|
+
* If your client supports remote MCP servers, point it straight at
|
|
11
|
+
* https://handsforagents.com/mcp and skip this package.
|
|
12
|
+
*
|
|
13
|
+
* Usage:
|
|
14
|
+
* npx handsforagents-mcp
|
|
15
|
+
* HANDSFORAGENTS_URL=https://staging.example.com/mcp npx handsforagents-mcp
|
|
16
|
+
*
|
|
17
|
+
* No dependencies. Node 18+ (for global fetch).
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
import process from "node:process";
|
|
21
|
+
|
|
22
|
+
const REMOTE = process.env.HANDSFORAGENTS_URL || "https://handsforagents.com/mcp";
|
|
23
|
+
const MODERN = "2026-07-28";
|
|
24
|
+
const LEGACY_FALLBACK = "2025-06-18";
|
|
25
|
+
const PKG_VERSION = "0.1.0";
|
|
26
|
+
const TIMEOUT_MS = Number(process.env.HANDSFORAGENTS_TIMEOUT_MS || 30000);
|
|
27
|
+
|
|
28
|
+
const SERVER_INFO = { name: "handsforagents", title: "Hands for Agents", version: PKG_VERSION };
|
|
29
|
+
|
|
30
|
+
const INSTRUCTIONS =
|
|
31
|
+
"Human-operated physical-world service for AI agents, run by a registered Czech (EU) company. " +
|
|
32
|
+
"A person designs, makes, assembles, measures, tests, verifies on site, receives and ships physical " +
|
|
33
|
+
"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. " +
|
|
37
|
+
"The contract is with the operator of the agent, not the agent.";
|
|
38
|
+
|
|
39
|
+
// --------------------------------------------------------------------------
|
|
40
|
+
// stdio framing: newline-delimited JSON, as the MCP stdio transport defines
|
|
41
|
+
// --------------------------------------------------------------------------
|
|
42
|
+
|
|
43
|
+
function write(message) {
|
|
44
|
+
process.stdout.write(JSON.stringify(message) + "\n");
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function result(id, value) {
|
|
48
|
+
write({ jsonrpc: "2.0", id, result: value });
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function failure(id, code, message, data) {
|
|
52
|
+
const error = { code, message };
|
|
53
|
+
if (data !== undefined) error.data = data;
|
|
54
|
+
write({ jsonrpc: "2.0", id, error });
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/** Log to stderr only. Anything on stdout that is not JSON-RPC breaks the client. */
|
|
58
|
+
function note(...args) {
|
|
59
|
+
if (process.env.HANDSFORAGENTS_DEBUG) console.error("[handsforagents-mcp]", ...args);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// --------------------------------------------------------------------------
|
|
63
|
+
// Remote call
|
|
64
|
+
// --------------------------------------------------------------------------
|
|
65
|
+
|
|
66
|
+
async function callRemote(method, params, name) {
|
|
67
|
+
const body = {
|
|
68
|
+
jsonrpc: "2.0",
|
|
69
|
+
id: Math.floor(Math.random() * 1e9),
|
|
70
|
+
method,
|
|
71
|
+
params: {
|
|
72
|
+
...params,
|
|
73
|
+
_meta: {
|
|
74
|
+
...(params._meta || {}),
|
|
75
|
+
"io.modelcontextprotocol/protocolVersion": MODERN,
|
|
76
|
+
"io.modelcontextprotocol/clientInfo": { name: "handsforagents-mcp", version: PKG_VERSION },
|
|
77
|
+
"io.modelcontextprotocol/clientCapabilities": {},
|
|
78
|
+
},
|
|
79
|
+
},
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
const headers = {
|
|
83
|
+
"Content-Type": "application/json",
|
|
84
|
+
Accept: "application/json, text/event-stream",
|
|
85
|
+
"User-Agent": `handsforagents-mcp/${PKG_VERSION} (+https://handsforagents.com)`,
|
|
86
|
+
"MCP-Protocol-Version": MODERN,
|
|
87
|
+
"Mcp-Method": method,
|
|
88
|
+
};
|
|
89
|
+
if (name !== undefined) {
|
|
90
|
+
// The spec's Base64 sentinel, for a name that is not plain ASCII.
|
|
91
|
+
headers["Mcp-Name"] = /^[\x21-\x7e]+$/.test(name)
|
|
92
|
+
? name
|
|
93
|
+
: `=?base64?${Buffer.from(name, "utf8").toString("base64")}?=`;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
const controller = new AbortController();
|
|
97
|
+
const timer = setTimeout(() => controller.abort(), TIMEOUT_MS);
|
|
98
|
+
try {
|
|
99
|
+
const response = await fetch(REMOTE, {
|
|
100
|
+
method: "POST",
|
|
101
|
+
headers,
|
|
102
|
+
body: JSON.stringify(body),
|
|
103
|
+
signal: controller.signal,
|
|
104
|
+
});
|
|
105
|
+
const text = await response.text();
|
|
106
|
+
let parsed;
|
|
107
|
+
try {
|
|
108
|
+
parsed = JSON.parse(text);
|
|
109
|
+
} catch {
|
|
110
|
+
throw new Error(`${REMOTE} returned ${response.status} and a body that is not JSON: ${text.slice(0, 200)}`);
|
|
111
|
+
}
|
|
112
|
+
if (parsed.error) {
|
|
113
|
+
const e = new Error(parsed.error.message || "Remote error");
|
|
114
|
+
e.rpc = parsed.error;
|
|
115
|
+
throw e;
|
|
116
|
+
}
|
|
117
|
+
return parsed.result;
|
|
118
|
+
} finally {
|
|
119
|
+
clearTimeout(timer);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// --------------------------------------------------------------------------
|
|
124
|
+
// Request handling
|
|
125
|
+
// --------------------------------------------------------------------------
|
|
126
|
+
|
|
127
|
+
async function handle(message) {
|
|
128
|
+
const { id, method, params = {} } = message;
|
|
129
|
+
|
|
130
|
+
// Notifications get no reply.
|
|
131
|
+
if (id === undefined || id === null) {
|
|
132
|
+
note("notification", method);
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
try {
|
|
137
|
+
switch (method) {
|
|
138
|
+
// Legacy era: a stdio client that opens with initialize.
|
|
139
|
+
case "initialize": {
|
|
140
|
+
const wanted = typeof params.protocolVersion === "string" ? params.protocolVersion : null;
|
|
141
|
+
const known = [MODERN, "2025-11-25", "2025-06-18", "2025-03-26"];
|
|
142
|
+
result(id, {
|
|
143
|
+
protocolVersion: wanted && known.includes(wanted) ? wanted : LEGACY_FALLBACK,
|
|
144
|
+
capabilities: { tools: { listChanged: false } },
|
|
145
|
+
serverInfo: SERVER_INFO,
|
|
146
|
+
instructions: INSTRUCTIONS,
|
|
147
|
+
});
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// Modern era: the stdio backward-compatibility probe.
|
|
152
|
+
case "server/discover": {
|
|
153
|
+
const remote = await callRemote("server/discover", {});
|
|
154
|
+
result(id, remote);
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
case "ping":
|
|
159
|
+
result(id, {});
|
|
160
|
+
return;
|
|
161
|
+
|
|
162
|
+
case "tools/list": {
|
|
163
|
+
const remote = await callRemote("tools/list", params);
|
|
164
|
+
// Hand the client only what its own era understands.
|
|
165
|
+
result(id, { tools: remote.tools || [] });
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
case "tools/call": {
|
|
170
|
+
const remote = await callRemote("tools/call", params, params.name);
|
|
171
|
+
const out = { content: remote.content || [], isError: Boolean(remote.isError) };
|
|
172
|
+
if (remote.structuredContent !== undefined) out.structuredContent = remote.structuredContent;
|
|
173
|
+
result(id, out);
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
case "resources/list":
|
|
178
|
+
result(id, { resources: [] });
|
|
179
|
+
return;
|
|
180
|
+
|
|
181
|
+
case "prompts/list":
|
|
182
|
+
result(id, { prompts: [] });
|
|
183
|
+
return;
|
|
184
|
+
|
|
185
|
+
default:
|
|
186
|
+
failure(id, -32601, `Method not found: ${method}`);
|
|
187
|
+
}
|
|
188
|
+
} catch (err) {
|
|
189
|
+
if (err.rpc) {
|
|
190
|
+
failure(id, err.rpc.code ?? -32603, err.rpc.message, err.rpc.data);
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
const reason =
|
|
194
|
+
err.name === "AbortError"
|
|
195
|
+
? `No answer from ${REMOTE} within ${TIMEOUT_MS} ms.`
|
|
196
|
+
: `Cannot reach ${REMOTE}: ${err.message}`;
|
|
197
|
+
// A tool call fails as a tool error so the model can react; everything else
|
|
198
|
+
// is a protocol error.
|
|
199
|
+
if (method === "tools/call") {
|
|
200
|
+
result(id, { content: [{ type: "text", text: reason }], isError: true });
|
|
201
|
+
} else {
|
|
202
|
+
failure(id, -32603, reason);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
// --------------------------------------------------------------------------
|
|
208
|
+
// Read stdin line by line
|
|
209
|
+
// --------------------------------------------------------------------------
|
|
210
|
+
|
|
211
|
+
let buffer = "";
|
|
212
|
+
let inFlight = 0;
|
|
213
|
+
let stdinEnded = false;
|
|
214
|
+
|
|
215
|
+
function maybeExit() {
|
|
216
|
+
if (stdinEnded && inFlight === 0) process.exit(0);
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
process.stdin.setEncoding("utf8");
|
|
220
|
+
process.stdin.on("data", (chunk) => {
|
|
221
|
+
buffer += chunk;
|
|
222
|
+
let newline;
|
|
223
|
+
while ((newline = buffer.indexOf("\n")) !== -1) {
|
|
224
|
+
const line = buffer.slice(0, newline).trim();
|
|
225
|
+
buffer = buffer.slice(newline + 1);
|
|
226
|
+
if (!line) continue;
|
|
227
|
+
let message;
|
|
228
|
+
try {
|
|
229
|
+
message = JSON.parse(line);
|
|
230
|
+
} catch {
|
|
231
|
+
failure(null, -32700, "Parse error: the line is not valid JSON.");
|
|
232
|
+
continue;
|
|
233
|
+
}
|
|
234
|
+
if (Array.isArray(message)) {
|
|
235
|
+
failure(null, -32600, "Batches are not supported. Send one JSON-RPC message per line.");
|
|
236
|
+
continue;
|
|
237
|
+
}
|
|
238
|
+
inFlight++;
|
|
239
|
+
handle(message)
|
|
240
|
+
.catch((err) => note("unhandled", err))
|
|
241
|
+
.finally(() => {
|
|
242
|
+
inFlight--;
|
|
243
|
+
maybeExit();
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
});
|
|
247
|
+
|
|
248
|
+
// Do not exit while a forwarded request is still in the air: a client that
|
|
249
|
+
// closes stdin immediately after writing would otherwise lose the answers.
|
|
250
|
+
process.stdin.on("end", () => {
|
|
251
|
+
stdinEnded = true;
|
|
252
|
+
maybeExit();
|
|
253
|
+
});
|
|
254
|
+
process.on("SIGINT", () => process.exit(0));
|
|
255
|
+
process.on("SIGTERM", () => process.exit(0));
|
|
256
|
+
|
|
257
|
+
note("bridging stdio to", REMOTE);
|
package/package.json
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "handsforagents-mcp",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"mcpName": "com.handsforagents/hands",
|
|
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
|
+
"keywords": [
|
|
7
|
+
"mcp",
|
|
8
|
+
"mcp-server",
|
|
9
|
+
"model-context-protocol",
|
|
10
|
+
"modelcontextprotocol",
|
|
11
|
+
"agent",
|
|
12
|
+
"agents",
|
|
13
|
+
"physical-world",
|
|
14
|
+
"manufacturing",
|
|
15
|
+
"3d-printing",
|
|
16
|
+
"human-in-the-loop",
|
|
17
|
+
"fulfilment",
|
|
18
|
+
"europe"
|
|
19
|
+
],
|
|
20
|
+
"homepage": "https://handsforagents.com",
|
|
21
|
+
"bugs": {
|
|
22
|
+
"url": "https://github.com/handsforagents/handsforagents-mcp/issues",
|
|
23
|
+
"email": "security@handsforagents.com"
|
|
24
|
+
},
|
|
25
|
+
"repository": {
|
|
26
|
+
"type": "git",
|
|
27
|
+
"url": "git+https://github.com/handsforagents/handsforagents-mcp.git"
|
|
28
|
+
},
|
|
29
|
+
"license": "MIT",
|
|
30
|
+
"author": "your engineering s.r.o. (https://handsforagents.com)",
|
|
31
|
+
"type": "module",
|
|
32
|
+
"bin": {
|
|
33
|
+
"handsforagents-mcp": "./index.js"
|
|
34
|
+
},
|
|
35
|
+
"main": "./index.js",
|
|
36
|
+
"files": [
|
|
37
|
+
"index.js",
|
|
38
|
+
"README.md",
|
|
39
|
+
"LICENSE"
|
|
40
|
+
],
|
|
41
|
+
"engines": {
|
|
42
|
+
"node": ">=18.0.0"
|
|
43
|
+
},
|
|
44
|
+
"dependencies": {},
|
|
45
|
+
"publishConfig": {
|
|
46
|
+
"access": "public"
|
|
47
|
+
}
|
|
48
|
+
}
|