Model Context Protocol server for TracePass — the EU Digital Product Passport platform. Lets AI assistants manage products, passports, and EPCIS supply-chain events.
TracePass MCP server demonstrates solid definition quality with well-documented tools, proper input schema structures, and thoughtful action-based design. All 6 tools have clear descriptions explaining their purpose and the actions they support. Input schemas follow a consistent pattern with action enums and args objects. Output schemas are explicitly documented with `.passthrough()` to handle action-specific variations. However, per-action schema details are delegated to handler validation rather than exposed in the inputSchema, creating a gap between declared and actual validation rigor. Error handling guidance is present in descriptions but lacks actionable recovery hints for common failure modes. Tool naming follows verb_resource convention well, though the single-parameter 'args' design limits schema introspection at the protocol level.
Read and write GS1 EPCIS 2.0 supply-chain events. Actions: export (fetch a passport's event history as EPCIS JSON-LD), export_by_serial (by serial + optional GTIN), capture (ingest new events), capture_job (poll an async capture job's status), and query (scan events by filters).
Update individual DPP fields. Actions: update (by passport id) and update_by_serial (by serial + optional GTIN). Each action takes fieldKey + value (any type); the v1 API validates the value's type + format per field definition.
Manage economic-operator parties (roles like manufacturer, distributor, recycler). Actions: set (upsert a party by role with legal name + optional GLN/country) and remove (delete a party by id + role).
Manage Digital Product Passports. Actions: list (paginate), get (fetch by id), get_by_serial (by serial + optional GTIN), create (register — billable, consumes quota), and qr (render QR code as SVG/PNG).
Manage TracePass products. Actions: list (paginate catalogue), get (fetch one), create (register new product), update (modify name/model/description), archive (retire), and batch-create (100 at a time).
Action-specific input schemas not exposed in inputSchema, validation logic lives in handlers, not in the declared tool contract. This violates the pattern:constrained-input principle: LLMs cannot see what args each action requires without reading the full description text. Per-action validation should be encoded in the schema itself or documented as discrete sub-schemas per action.
No actionable error guidance in tool descriptions or error responses. Descriptions mention 'validate the value's type + format' but do not explain what the LLM should do if validation fails. Error responses should guide recovery (e.g., 'Invalid field: got X, must be one of Y; try calling tracepass_templates get to see valid fields').
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | B | 75 | 2026-07-28+ | v2 |
Fetch DPP category schemas. Actions: list (all 13 regulatory schemas with field counts) and get (one category's full field schema — required/optional fields, data types, access levels, regulation articles).
Parameter descriptions for 'args' object are generic ('Arguments specific to the action. Shape depends on action...') and do not itemize the per-action parameters. LLMs must infer arg shapes from the action description text, creating ambiguity. Each action should document its required/optional params explicitly (action: 'create', required params: [name, model, ...], optional: [description, ...]).
No confirmation or dry-run mechanism for destructive or billable actions (e.g., 'passport create' is marked as billable and consumes quota). Tools like create_passport should support a 'dry_run' param or a separate 'confirm_passport_creation' step to prevent accidental quota consumption.
Output schema uses `.passthrough()` to handle action-specific fields, but this means the declared outputSchema does not fully specify what each action returns. Clients (and LLMs during planning) cannot know in advance what a 'qr' action will return (SVG/PNG wrapped in result) vs a 'list' action (paginated items). This should be documented in the tool description with examples for each action.