tracepass-mcp-server 1.0.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/dist/tools.js ADDED
@@ -0,0 +1,386 @@
1
+ /**
2
+ * MCP tool definitions for the TracePass v1 API.
3
+ *
4
+ * The v1 surface has ~23 endpoints. Exposing 23 flat MCP tools would
5
+ * swamp the model's tool list and slow tool selection. Instead the
6
+ * surface is grouped into FIVE resource tools, each taking:
7
+ * - `action` — a required enum naming the operation;
8
+ * - `args` — an object whose required shape DEPENDS on `action`.
9
+ *
10
+ * MCP's `inputSchema` is one Zod shape per tool and can't natively
11
+ * branch on `action`. So `args` is declared permissively, and each
12
+ * handler validates `args` against the SPECIFIC per-action Zod
13
+ * schema — the per-action rigor is kept, it just lives in the
14
+ * handler. A model that omits a required arg gets a precise error
15
+ * (`ACTION_SCHEMAS` powers both the validation and the messages).
16
+ *
17
+ * Every tool's `description` documents each action and its `args`.
18
+ * `annotations` carry MCP hint flags at the tool level; per-action
19
+ * risk (billable / irreversible) is spelled out in the description
20
+ * so the model warns the user before a destructive action.
21
+ *
22
+ * Transport-agnostic: `buildTools(client)` binds the handlers to a
23
+ * `TracePassClient`; the server factory registers them.
24
+ */
25
+ import { z } from "zod";
26
+ import { apiResult, errorResult } from "./result.js";
27
+ /** Encode a path segment (serials may contain spaces / slashes). */
28
+ const seg = (s) => encodeURIComponent(s);
29
+ /** Build a query string from defined values only. */
30
+ function qs(params) {
31
+ const q = new URLSearchParams();
32
+ for (const [k, v] of Object.entries(params)) {
33
+ if (v !== undefined && v !== null && v !== "")
34
+ q.set(k, String(v));
35
+ }
36
+ const s = q.toString();
37
+ return s ? `?${s}` : "";
38
+ }
39
+ /**
40
+ * Validate an action's `args` against its per-action schema.
41
+ * Returns the parsed args, or an `errorResult` naming what's wrong —
42
+ * which the handler returns straight to the model.
43
+ */
44
+ function parseArgs(schema, args, tool, action) {
45
+ const r = schema.safeParse(args ?? {});
46
+ if (r.success)
47
+ return r.data;
48
+ const issues = r.error.issues
49
+ .map((i) => `${i.path.join(".") || "(root)"}: ${i.message}`)
50
+ .join("; ");
51
+ return errorResult(`Invalid args for ${tool} action "${action}": ${issues}. ` +
52
+ `Check the tool description for this action's required args.`);
53
+ }
54
+ /** Type guard — did parseArgs return an error result? */
55
+ function isErr(v) {
56
+ return typeof v === "object" && v !== null && "content" in v;
57
+ }
58
+ // ── Per-action arg schemas ──────────────────────────────────────
59
+ // Reused by the handlers as validators. Kept here, one per action,
60
+ // so the per-action contract is explicit and testable.
61
+ const partyRoleEnum = z.enum([
62
+ "manufacturer",
63
+ "importer",
64
+ "authorisedRepresentative",
65
+ "distributor",
66
+ "recycler",
67
+ "producerResponsibilityOrg",
68
+ ]);
69
+ const SCHEMAS = {
70
+ productList: z.object({
71
+ page: z.number().int().positive().optional(),
72
+ limit: z.number().int().positive().max(100).optional(),
73
+ category: z.string().optional(),
74
+ status: z.string().optional(),
75
+ search: z.string().optional(),
76
+ }),
77
+ productGet: z.object({ id: z.string().min(1) }),
78
+ productCreate: z.object({
79
+ name: z.string().min(1).max(200),
80
+ model: z.string().min(1).max(100),
81
+ category: z.string().min(1),
82
+ description: z.string().max(2000).optional(),
83
+ }),
84
+ productUpdate: z
85
+ .object({
86
+ id: z.string().min(1),
87
+ name: z.string().min(1).max(200).optional(),
88
+ model: z.string().min(1).max(100).optional(),
89
+ description: z.string().max(2000).optional(),
90
+ })
91
+ .refine((v) => v.name || v.model || v.description !== undefined, {
92
+ message: "pass at least one of name, model, description",
93
+ }),
94
+ passportList: z.object({
95
+ page: z.number().int().positive().optional(),
96
+ limit: z.number().int().positive().max(100).optional(),
97
+ productId: z.string().optional(),
98
+ status: z.string().optional(),
99
+ search: z.string().optional(),
100
+ }),
101
+ passportGet: z.object({
102
+ id: z.string().min(1),
103
+ format: z.enum(["summary", "full"]).optional(),
104
+ lang: z.string().optional(),
105
+ }),
106
+ passportGetBySerial: z.object({
107
+ serial: z.string().min(1),
108
+ format: z.enum(["summary", "full"]).optional(),
109
+ lang: z.string().optional(),
110
+ }),
111
+ passportCreate: z.object({
112
+ productId: z.string().min(1),
113
+ gtin: z.string().min(1),
114
+ serialNumber: z.string().min(1).max(100),
115
+ confirmOverage: z.boolean().optional(),
116
+ }),
117
+ passportId: z.object({ id: z.string().min(1) }),
118
+ passportQr: z.object({
119
+ id: z.string().min(1),
120
+ format: z.enum(["svg", "png"]).optional(),
121
+ }),
122
+ fieldUpdate: z.object({
123
+ id: z.string().min(1),
124
+ fieldKey: z.string().min(1),
125
+ value: z.unknown(),
126
+ }),
127
+ partySet: z.object({
128
+ id: z.string().min(1),
129
+ role: partyRoleEnum,
130
+ legalName: z.string().min(1),
131
+ gln: z.string().optional(),
132
+ country: z.string().optional(),
133
+ legacyOperatorId: z.string().optional(),
134
+ }),
135
+ partyRemove: z.object({ id: z.string().min(1), role: partyRoleEnum }),
136
+ epcisExport: z.object({ id: z.string().min(1) }),
137
+ epcisCapture: z.object({ events: z.unknown() }),
138
+ epcisCaptureJob: z.object({ jobId: z.string().min(1) }),
139
+ epcisQuery: z.object({ params: z.record(z.string(), z.string()).optional() }),
140
+ };
141
+ /**
142
+ * Build the 5 grouped tools, bound to a TracePass API client.
143
+ */
144
+ export function buildTools(client) {
145
+ // ─────────────────────────── products ────────────────────────
146
+ const productsTool = {
147
+ name: "tracepass_products",
148
+ title: "TracePass products",
149
+ description: "Manage the TracePass product catalogue. A product is the catalogue layer — one product can have many passports (one per serialised unit). Products are not billable on their own.\n\nActions (pass via `action`, with `args`):\n" +
150
+ "- list — args: { page?, limit? (≤100), category?, status?, search? }. Read-only.\n" +
151
+ "- get — args: { id }. Read-only.\n" +
152
+ "- create — args: { name, model, category, description? }. `category` is one of: battery, textile, electronics, construction, steel, chemicals, packaging, furniture, tyres, jewelry, toys, fmcg.\n" +
153
+ "- update — args: { id, name?, model?, description? }; pass at least one field to change.",
154
+ inputSchema: {
155
+ action: z.enum(["list", "get", "create", "update"]),
156
+ args: z.record(z.string(), z.unknown()).optional()
157
+ .describe("Action-specific arguments — see the description for each action's shape."),
158
+ },
159
+ annotations: { idempotentHint: false },
160
+ handler: async (a) => {
161
+ const action = String(a.action);
162
+ switch (action) {
163
+ case "list": {
164
+ const p = parseArgs(SCHEMAS.productList, a.args, "tracepass_products", action);
165
+ if (isErr(p))
166
+ return p;
167
+ return apiResult(await client.get(`/api/v1/products${qs(p)}`));
168
+ }
169
+ case "get": {
170
+ const p = parseArgs(SCHEMAS.productGet, a.args, "tracepass_products", action);
171
+ if (isErr(p))
172
+ return p;
173
+ return apiResult(await client.get(`/api/v1/products/${seg(p.id)}`));
174
+ }
175
+ case "create": {
176
+ const p = parseArgs(SCHEMAS.productCreate, a.args, "tracepass_products", action);
177
+ if (isErr(p))
178
+ return p;
179
+ return apiResult(await client.post("/api/v1/products", p));
180
+ }
181
+ case "update": {
182
+ const p = parseArgs(SCHEMAS.productUpdate, a.args, "tracepass_products", action);
183
+ if (isErr(p))
184
+ return p;
185
+ const { id, ...patch } = p;
186
+ return apiResult(await client.patch(`/api/v1/products/${seg(id)}`, patch));
187
+ }
188
+ default:
189
+ return errorResult(`Unknown action "${action}" for tracepass_products.`);
190
+ }
191
+ },
192
+ };
193
+ // ────────────────────────── passports ────────────────────────
194
+ const passportsTool = {
195
+ name: "tracepass_passports",
196
+ title: "TracePass passports",
197
+ description: "Manage Digital Product Passports — create, read, and run lifecycle actions.\n\n" +
198
+ "IMPORTANT: `create` consumes a DPP slot on the account's plan and IS BILLABLE. Creating a passport beyond the included quota incurs a per-passport overage charge; if over quota the tool returns a 402-style message — only re-run with args.confirmOverage=true after the user explicitly agrees to the charge. `archive` is IRREVERSIBLE (the public QR permanently 404s); prefer `suspend` when a change might be undone.\n\n" +
199
+ "Actions (pass via `action`, with `args`):\n" +
200
+ "- list — args: { page?, limit? (≤100), productId?, status?, search? }. status ∈ draft|in_review|approved|published|suspended|expired|archived. Read-only.\n" +
201
+ "- get — args: { id, format? (summary|full), lang? }. Read-only.\n" +
202
+ "- get_by_serial — args: { serial, format?, lang? }. Read-only.\n" +
203
+ "- create — args: { productId, gtin, serialNumber, confirmOverage? }. BILLABLE.\n" +
204
+ "- suspend — args: { id }. Reversible — public QR shows 'suspended'.\n" +
205
+ "- archive — args: { id }. IRREVERSIBLE — confirm with the user first.\n" +
206
+ "- get_qr — args: { id, format? (svg|png) }. Read-only.",
207
+ inputSchema: {
208
+ action: z.enum([
209
+ "list",
210
+ "get",
211
+ "get_by_serial",
212
+ "create",
213
+ "suspend",
214
+ "archive",
215
+ "get_qr",
216
+ ]),
217
+ args: z.record(z.string(), z.unknown()).optional()
218
+ .describe("Action-specific arguments — see the description for each action's shape."),
219
+ },
220
+ annotations: { idempotentHint: false },
221
+ handler: async (a) => {
222
+ const action = String(a.action);
223
+ switch (action) {
224
+ case "list": {
225
+ const p = parseArgs(SCHEMAS.passportList, a.args, "tracepass_passports", action);
226
+ if (isErr(p))
227
+ return p;
228
+ return apiResult(await client.get(`/api/v1/passports${qs(p)}`));
229
+ }
230
+ case "get": {
231
+ const p = parseArgs(SCHEMAS.passportGet, a.args, "tracepass_passports", action);
232
+ if (isErr(p))
233
+ return p;
234
+ return apiResult(await client.get(`/api/v1/passports/${seg(p.id)}${qs({ format: p.format, lang: p.lang })}`));
235
+ }
236
+ case "get_by_serial": {
237
+ const p = parseArgs(SCHEMAS.passportGetBySerial, a.args, "tracepass_passports", action);
238
+ if (isErr(p))
239
+ return p;
240
+ return apiResult(await client.get(`/api/v1/passports/by-serial/${seg(p.serial)}${qs({ format: p.format, lang: p.lang })}`));
241
+ }
242
+ case "create": {
243
+ const p = parseArgs(SCHEMAS.passportCreate, a.args, "tracepass_passports", action);
244
+ if (isErr(p))
245
+ return p;
246
+ return apiResult(await client.post("/api/v1/passports", {
247
+ productId: p.productId,
248
+ gs1: { gtin: p.gtin, serialNumber: p.serialNumber },
249
+ ...(p.confirmOverage ? { confirmOverage: true } : {}),
250
+ }));
251
+ }
252
+ case "suspend": {
253
+ const p = parseArgs(SCHEMAS.passportId, a.args, "tracepass_passports", action);
254
+ if (isErr(p))
255
+ return p;
256
+ return apiResult(await client.post(`/api/v1/passports/${seg(p.id)}/suspend`));
257
+ }
258
+ case "archive": {
259
+ const p = parseArgs(SCHEMAS.passportId, a.args, "tracepass_passports", action);
260
+ if (isErr(p))
261
+ return p;
262
+ return apiResult(await client.post(`/api/v1/passports/${seg(p.id)}/archive`));
263
+ }
264
+ case "get_qr": {
265
+ const p = parseArgs(SCHEMAS.passportQr, a.args, "tracepass_passports", action);
266
+ if (isErr(p))
267
+ return p;
268
+ return apiResult(await client.get(`/api/v1/passports/${seg(p.id)}/qr${qs({ format: p.format })}`));
269
+ }
270
+ default:
271
+ return errorResult(`Unknown action "${action}" for tracepass_passports.`);
272
+ }
273
+ },
274
+ };
275
+ // ──────────────────────── passport fields ────────────────────
276
+ const fieldsTool = {
277
+ name: "tracepass_passport_fields",
278
+ title: "TracePass passport fields",
279
+ description: "Update field values on a Digital Product Passport. Every change is recorded in the passport's audit trail, tagged as an API-key update.\n\n" +
280
+ "Actions (pass via `action`, with `args`):\n" +
281
+ "- update — args: { id, fieldKey, value }. `value` type matches the field's dataType (string, number, boolean, array, object).",
282
+ inputSchema: {
283
+ action: z.enum(["update"]),
284
+ args: z.record(z.string(), z.unknown()).optional()
285
+ .describe("Action-specific arguments — see the description."),
286
+ },
287
+ annotations: { idempotentHint: true },
288
+ handler: async (a) => {
289
+ const action = String(a.action);
290
+ if (action !== "update") {
291
+ return errorResult(`Unknown action "${action}" for tracepass_passport_fields.`);
292
+ }
293
+ const p = parseArgs(SCHEMAS.fieldUpdate, a.args, "tracepass_passport_fields", action);
294
+ if (isErr(p))
295
+ return p;
296
+ return apiResult(await client.patch(`/api/v1/passports/${seg(p.id)}/fields/${seg(p.fieldKey)}`, {
297
+ value: p.value,
298
+ }));
299
+ },
300
+ };
301
+ // ─────────────────────── passport parties ────────────────────
302
+ const partiesTool = {
303
+ name: "tracepass_passport_parties",
304
+ title: "TracePass passport parties",
305
+ description: "Manage the economic-operator parties on a passport — manufacturer, importer, authorisedRepresentative, distributor, recycler, producerResponsibilityOrg. Each party carries a legal name and ideally a validated 13-digit GS1 GLN.\n\n" +
306
+ "Actions (pass via `action`, with `args`):\n" +
307
+ "- set — args: { id, role, legalName, gln?, country?, legacyOperatorId? }. Sets or updates one role.\n" +
308
+ "- remove — args: { id, role }. Clears one role.",
309
+ inputSchema: {
310
+ action: z.enum(["set", "remove"]),
311
+ args: z.record(z.string(), z.unknown()).optional()
312
+ .describe("Action-specific arguments — see the description."),
313
+ },
314
+ annotations: { idempotentHint: true },
315
+ handler: async (a) => {
316
+ const action = String(a.action);
317
+ switch (action) {
318
+ case "set": {
319
+ const p = parseArgs(SCHEMAS.partySet, a.args, "tracepass_passport_parties", action);
320
+ if (isErr(p))
321
+ return p;
322
+ const { id, role, ...party } = p;
323
+ return apiResult(await client.patch(`/api/v1/passports/${seg(id)}/parties/${seg(role)}`, party));
324
+ }
325
+ case "remove": {
326
+ const p = parseArgs(SCHEMAS.partyRemove, a.args, "tracepass_passport_parties", action);
327
+ if (isErr(p))
328
+ return p;
329
+ return apiResult(await client.delete(`/api/v1/passports/${seg(p.id)}/parties/${seg(p.role)}`));
330
+ }
331
+ default:
332
+ return errorResult(`Unknown action "${action}" for tracepass_passport_parties.`);
333
+ }
334
+ },
335
+ };
336
+ // ───────────────────────────── epcis ─────────────────────────
337
+ const epcisTool = {
338
+ name: "tracepass_epcis",
339
+ title: "TracePass EPCIS 2.0",
340
+ description: "GS1 EPCIS 2.0 supply-chain events. `export` is included on Starter plans and up; `capture`, `capture_job`, and `query` require the paid EPCIS add-on (those actions return a 403-style message without it).\n\n" +
341
+ "Actions (pass via `action`, with `args`):\n" +
342
+ "- export — args: { id }. Export a passport's events as an EPCIS 2.0 JSON-LD document. Read-only.\n" +
343
+ "- capture — args: { events }. `events` is an EPCISDocument, a single event, or an array of events (JSON-LD). Returns a 202 with a captureJobId.\n" +
344
+ "- capture_job — args: { jobId }. Poll an async capture job. Read-only.\n" +
345
+ "- query — args: { params? }. `params` is a key/value map of standard EPCIS query parameters (EQ_bizStep, GE_eventTime, MATCH_epc, …). Read-only.",
346
+ inputSchema: {
347
+ action: z.enum(["export", "capture", "capture_job", "query"]),
348
+ args: z.record(z.string(), z.unknown()).optional()
349
+ .describe("Action-specific arguments — see the description."),
350
+ },
351
+ annotations: { idempotentHint: false },
352
+ handler: async (a) => {
353
+ const action = String(a.action);
354
+ switch (action) {
355
+ case "export": {
356
+ const p = parseArgs(SCHEMAS.epcisExport, a.args, "tracepass_epcis", action);
357
+ if (isErr(p))
358
+ return p;
359
+ return apiResult(await client.get(`/api/v1/passports/${seg(p.id)}/epcis`));
360
+ }
361
+ case "capture": {
362
+ const p = parseArgs(SCHEMAS.epcisCapture, a.args, "tracepass_epcis", action);
363
+ if (isErr(p))
364
+ return p;
365
+ return apiResult(await client.post("/api/v1/epcis/capture", p.events));
366
+ }
367
+ case "capture_job": {
368
+ const p = parseArgs(SCHEMAS.epcisCaptureJob, a.args, "tracepass_epcis", action);
369
+ if (isErr(p))
370
+ return p;
371
+ return apiResult(await client.get(`/api/v1/epcis/capture/${seg(p.jobId)}`));
372
+ }
373
+ case "query": {
374
+ const p = parseArgs(SCHEMAS.epcisQuery, a.args, "tracepass_epcis", action);
375
+ if (isErr(p))
376
+ return p;
377
+ return apiResult(await client.get(`/api/v1/epcis/events${qs(p.params ?? {})}`));
378
+ }
379
+ default:
380
+ return errorResult(`Unknown action "${action}" for tracepass_epcis.`);
381
+ }
382
+ },
383
+ };
384
+ return [productsTool, passportsTool, fieldsTool, partiesTool, epcisTool];
385
+ }
386
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,65 @@
1
+ {
2
+ "name": "tracepass-mcp-server",
3
+ "version": "1.0.0",
4
+ "description": "Model Context Protocol server for TracePass — the EU Digital Product Passport platform. Lets AI assistants manage products, passports, and EPCIS supply-chain events.",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "keywords": [
8
+ "mcp",
9
+ "model-context-protocol",
10
+ "tracepass",
11
+ "digital-product-passport",
12
+ "dpp",
13
+ "epcis",
14
+ "gs1"
15
+ ],
16
+ "homepage": "https://www.tracepass.eu",
17
+ "repository": {
18
+ "type": "git",
19
+ "url": "git+https://github.com/malinoto/tracepass-mcp-server.git"
20
+ },
21
+ "bugs": {
22
+ "url": "https://github.com/malinoto/tracepass-mcp-server/issues"
23
+ },
24
+ "bin": {
25
+ "tracepass-mcp-server": "dist/stdio.js"
26
+ },
27
+ "publishConfig": {
28
+ "access": "public",
29
+ "provenance": false
30
+ },
31
+ "main": "dist/server.js",
32
+ "types": "dist/server.d.ts",
33
+ "files": [
34
+ "dist"
35
+ ],
36
+ "exports": {
37
+ ".": {
38
+ "types": "./dist/server.d.ts",
39
+ "import": "./dist/server.js"
40
+ }
41
+ },
42
+ "scripts": {
43
+ "build": "tsc",
44
+ "start": "node dist/http.js",
45
+ "start:stdio": "node dist/stdio.js",
46
+ "typecheck": "tsc --noEmit",
47
+ "test": "vitest run",
48
+ "lint": "eslint src"
49
+ },
50
+ "dependencies": {
51
+ "@modelcontextprotocol/sdk": "1.29.0",
52
+ "zod": "^4.0.0"
53
+ },
54
+ "devDependencies": {
55
+ "@types/node": "^22.0.0",
56
+ "typescript": "^5.6.0",
57
+ "vitest": "^4.0.0",
58
+ "eslint": "^9.0.0",
59
+ "@eslint/js": "^9.0.0",
60
+ "typescript-eslint": "^8.0.0"
61
+ },
62
+ "engines": {
63
+ "node": ">=20"
64
+ }
65
+ }