{
  "data": {
    "tool": {
      "category": "data-providers",
      "endpoint": "https://ai.tracepass.eu/mcp",
      "jsonUrl": "https://www.anchorterminal.com/api/v1/tools/tracepass.json",
      "kind": "mcp",
      "listed": "indexed",
      "liveUrl": "https://www.anchorterminal.com/api/v1/live/tracepass.json",
      "markdownUrl": "https://www.anchorterminal.com/tools/tracepass.md",
      "mcpTools": {
        "check": {
          "checker": "anchor-check/1.0",
          "totalTokens": 8251,
          "counts": {
            "error": 0,
            "note": 0,
            "warn": 14
          },
          "findings": [
            {
              "rule": "TC07",
              "severity": "warn",
              "tool": "tracepass_passports",
              "message": "the description is about 2,243 tokens",
              "fix": "Keep the description to what a model needs to choose and call the tool; move the manual to a resource or the docs."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "tracepass_passports",
              "message": "none of its 2 parameters has a description",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC12",
              "severity": "warn",
              "tool": "tracepass_epcis",
              "message": "no type for args.events",
              "fix": "Give every parameter a type (or an enum)."
            },
            {
              "rule": "TC12",
              "severity": "warn",
              "tool": "tracepass_passport_fields",
              "message": "no type for args.value",
              "fix": "Give every parameter a type (or an enum)."
            },
            {
              "rule": "TC12",
              "severity": "warn",
              "tool": "tracepass_passports",
              "message": "no type for args.measurements[].value",
              "fix": "Give every parameter a type (or an enum)."
            },
            {
              "rule": "TC14",
              "severity": "warn",
              "tool": "tracepass_passports",
              "message": "allowed values are in the description, not an enum: args.status",
              "fix": "Move them into enum."
            },
            {
              "rule": "TC14",
              "severity": "warn",
              "tool": "tracepass_products",
              "message": "allowed values are in the description, not an enum: args.category",
              "fix": "Move them into enum."
            },
            {
              "rule": "TC14",
              "severity": "warn",
              "tool": "tracepass_templates",
              "message": "allowed values are in the description, not an enum: args.category",
              "fix": "Move them into enum."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "tracepass_epcis",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "tracepass_passport_fields",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "tracepass_passport_parties",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "tracepass_passports",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "tracepass_products",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC22",
              "severity": "warn",
              "tool": "tracepass_passports",
              "message": "the definition is about 3,793 tokens",
              "fix": "Trim the description and parameter docs, or split the tool."
            }
          ]
        },
        "checkedAt": "2026-10-04T22:25:04Z",
        "count": 6,
        "schemaTokens": 8251,
        "status": "ok",
        "tools": [
          {
            "name": "tracepass_products",
            "title": "TracePass products",
            "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- list — args: { page?, limit? (≤100), category?, status?, search? }. Read-only.\n- get — args: { id }. Read-only.\n- create — args: { name, model, category, description? }. `category` is one of: battery, textile, electronics, construction, steel, detergents, paints-coatings, packaging, furniture, tyres, jewelry, toys, fmcg.\n- update — args: { id, name?, model?, description? }; pass at least one field to change.\n- create_batch — args: { products: [ { name, model, category, description? }, … ] }, up to 100. Partial-success: the response carries a per-item status, so some items can be created while others error. The whole batch consumes N writes upfront; if that would exceed the daily cap NOTHING is created (429).\n- archive — args: { id }. Soft-archive a product. Blocked with 409 while any non-archived passport still references it — archive those passports first. This is reversible and is NOT deletion.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "properties": {
                "action": {
                  "description": "Which product operation to run: list | get | create | create_batch | update | archive.",
                  "enum": [
                    "list",
                    "get",
                    "create",
                    "create_batch",
                    "update",
                    "archive"
                  ],
                  "type": "string"
                },
                "args": {
                  "description": "Arguments for the chosen action; required fields depend on `action` (see each action above).",
                  "properties": {
                    "category": {
                      "description": "DPP category for create: battery | textile | electronics | construction | steel | detergents | paints-coatings | packaging | furniture | tyres | jewelry | toys | fmcg.",
                      "type": "string"
                    },
                    "description": {
                      "description": "Free-text product description (create/update).",
                      "type": "string"
                    },
                    "id": {
                      "description": "Product id. Required for get and update.",
                      "type": "string"
                    },
                    "limit": {
                      "description": "Page size for list, max 100.",
                      "type": "number"
                    },
                    "model": {
                      "description": "Manufacturer model / SKU. Required for create; optional on update.",
                      "type": "string"
                    },
                    "name": {
                      "description": "Product name. Required for create; optional on update.",
                      "type": "string"
                    },
                    "page": {
                      "description": "Page number for list (1-based).",
                      "type": "number"
                    },
                    "products": {
                      "description": "Products to create for create_batch: [{ name, model, category, description? }], max 100.",
                      "items": {
                        "additionalProperties": {},
                        "propertyNames": {
                          "type": "string"
                        },
                        "type": "object"
                      },
                      "type": "array"
                    },
                    "search": {
                      "description": "Filter list by a search term.",
                      "type": "string"
                    },
                    "status": {
                      "description": "Filter list by product status.",
                      "type": "string"
                    }
                  },
                  "type": "object"
                }
              },
              "required": [
                "action"
              ],
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "error": {
                  "description": "Machine-readable error code, when the API rejected the request.",
                  "type": "string"
                },
                "id": {
                  "description": "The resource's TracePass id, when the response is a single entity.",
                  "type": "string"
                },
                "items": {
                  "description": "The page of results, when the action is a list.",
                  "items": {},
                  "type": "array"
                },
                "limit": {
                  "description": "Page size (list actions).",
                  "type": "number"
                },
                "message": {
                  "description": "Human-readable error or status detail, when present.",
                  "type": "string"
                },
                "page": {
                  "description": "Current page number (list actions).",
                  "type": "number"
                },
                "result": {
                  "description": "Wraps a non-object response body (e.g. a QR code string)."
                },
                "total": {
                  "description": "Total matching records across all pages (list actions).",
                  "type": "number"
                },
                "totalPages": {
                  "description": "Total number of pages (list actions).",
                  "type": "number"
                }
              },
              "type": "object"
            },
            "annotations": {
              "idempotentHint": false
            }
          },
          {
            "name": "tracepass_passports",
            "title": "TracePass passports",
            "description": "Manage Digital Product Passports — create, read, and run lifecycle actions.\n\nIMPORTANT: `create` consumes DPP slots and IS BILLABLE. Over-quota creation incurs a per-passport charge; the tool surfaces a 402-style message — only re-run with args.confirmOverage=true after the user explicitly agrees. `archive` is IRREVERSIBLE (the public QR permanently 404s); prefer `suspend` when a change might be undone.\n\nIDENTIFIER SCHEMES (EN 18219): passports are identified by one of five schemes. Battery passports (Battery Regulation Art. 77(3)) accept ONLY gs1 and iso15459.\n  • gs1 — { scheme:\"gs1\", gtin, serialNumber } — GS1 GTIN + serial; gtin is 8/12/13/14 digits, stored as GTIN-14.\n  • iso15459 — { scheme:\"iso15459\", issuingAgencyCode, primaryId, serial? } — ISO/IEC 15459; the server derives raw (IAC + primaryId + serial).\n  • iec61406 — { scheme:\"iec61406\", uri } — IEC 61406 Identification Link (https URI). Not valid for batteries.\n  • did — { scheme:\"did\", did, method } — W3C DID Core. Not valid for batteries.\n  • doi — { scheme:\"doi\", doi, granularity:\"model\"|\"batch\"|\"item\" } — ISO 26324 DOI, stored as bare 10.\u003cregistrant\u003e/\u003csuffix\u003e (any https://doi.org/ or doi: prefix stripped on input; resolves as https://doi.org/\u003cdoi\u003e); granularity REQUIRED per EN 18219 §5.6.2(b). Not valid for batteries.\nThe legacy top-level gtin + serialNumber pair is still accepted as a deprecated alias for scheme:\"gs1\".\n\nActions (pass via `action`, with `args`):\n- list — args: { page?, limit? (≤100), productId?, status?, search? }. status ∈ draft|in_review|approved|published|suspended|expired|archived. Read-only.\n- get — args: { id, format? (summary|full), lang? }. Read-only. Response includes `identifier`, `identifierKey`, and (for GS1 passports) `gs1`.\n- get_by_serial — args: { serial, format?, lang?, gtin? }. Read-only. Addresses the passport by your own serial. A serial is unique only WITHIN a GTIN — if the same serial exists under two GTINs in your account the call returns 409 ambiguous_serial; pass `gtin` (or use the by-id action) to resolve exactly.\n- compliance — args: { id }. Read-only. Returns a three-tier compliance verdict (compliant | compliant_with_warnings | incomplete) with regulation-cited findings — use to gap-check a passport against the rules for its category, fix the cited fields/parties, then re-check. Also returns byRegulation[]: the same findings grouped per regulation, worst first, so you can tell WHICH regime is failing instead of reading one `incomplete` as everything being wrong. A regulation absent from that array raised no finding — that is not the same as it having passed.\n- registry_readiness — args: { id }. Read-only. Returns { ready, findings[] } — whether the passport would pass the EU DPP Registry's FORMAL submission gate (mandatory fields present, correct formatting, a resolvable public link, item-level granularity via a serial number, and a well-formed commodity code where the category carries one). This is the registry's mechanical pre-submission check, NOT the substantive compliance verdict; a passport can be registry-ready yet not substantively compliant. Battery passports only.\n- create — args: { productId, identifier?, gtin?, serialNumber?, confirmOverage?, lineage? }. BILLABLE. Provide identifier (preferred) or legacy gtin + serialNumber. Battery passports accept only gs1 and iso15459 schemes — other schemes return 400. A duplicate identifier returns 409.\n  lineage (battery only) — a repurposed, remanufactured or reused battery needs a NEW passport linked to the original(s) (Battery Regulation Art. 77(7)): { predecessors: [ { internalPassportId? | identifier?, trigger: preparation_for_reuse|preparation_for_repurposing|repurposing|remanufacturing } ] (≤10), noPredecessorReason? (only with an empty list, e.g. placed on the market before 18 Feb 2027) }. The server derives batteryStatus from the triggers and links your own predecessor passports back. Immutable after create. Rule violations return 422 with the rule code (duplicate_predecessor, predecessor_not_found, status_trigger_mismatch, …).\n- suspend — args: { id }. Reversible — public QR shows 'suspended'.\n- suspend_by_serial — args: { serial, gtin? }. Same as suspend, addressed by your serial. 409 ambiguous_serial if the serial isn't unique in your account — pass `gtin`.\n- archive — args: { id }. IRREVERSIBLE — confirm with the user first.\n- archive_by_serial — args: { serial, gtin? }. IRREVERSIBLE, addressed by your serial — confirm first. 409 ambiguous_serial if the serial isn't unique — pass `gtin`.\n- get_qr — args: { id, format? (svg|png), symbology? (qr|datamatrix) }. Read-only. symbology=datamatrix renders an ISO/IEC 16022 Data Matrix instead of a QR (EN 18220 permits both; same passport URL).\n- get_qr_by_serial — args: { serial, format? (svg|png), symbology? (qr|datamatrix), gtin? }. Read-only. Same as get_qr, addressed by your own serial. A serial is unique only WITHIN a GTIN — if the same serial exists under two GTINs in your account the call returns 409 ambiguous_serial; pass `gtin` (or use get_qr by id) to resolve exactly.\n- list_snapshots — args: { id, page?, limit? (≤100), at? (ISO 8601) }. Read-only. Returns a paginated list of snapshots for the passport (newest first). A snapshot is written on publish and after every change to a non-draft passport (EN 18221 change archive); each carries id, version, reason (e.g. published|field_edit|status_change|baseline), actor (who caused it, when known), snapshotAt, contentHash, hashValid (re-verified on every read), restorable, fieldCount. With `at`, returns instead the single snapshot valid at that instant (full record plus validFrom/validUntil) — answers \"what did this passport say on date D\"; 404 before the first snapshot. Counts 1 against the daily read budget.\n- get_snapshot — args: { id, snapshotId }. Read-only. Returns the full archival record of one snapshot: the complete JSON-LD the passport asserted at that time, plus hash and hashValid. Counts 1 against the daily read budget.\n- get_condition_flags — args: { id }. Read-only. Returns the resolved condition profile Record\u003cflagKey,{value,status,source}\u003e. Condition flags are reviewer-approved yes/no facts gating conditional legal duties. Battery flags: hasBMS, rechargeable, externalStorageOnly, isStationaryBess. An approved flag makes specific fields required — a missing gated field is a hard publish block (conditional_missing). Counts 1 against the daily read budget.\n- get_condition_flags_by_serial — args: { serial, gtin? }. Read-only. Same as get_condition_flags, addressed by your own serial. 409 ambiguous_serial if serial not unique — pass gtin.\n- set_condition_flags — args: { id, flags: Record\u003cflagKey, boolean|null\u003e }. WRITE. Set or clear condition flags (null clears). Keys must be registered for the passport category (battery: hasBMS, rechargeable, externalStorageOnly, isStationaryBess). WARNING: approving a flag can make fields required and block publishing if those fields are empty — fix any gated fields before or immediately after setting the flag. Writes are approved + audited. Idempotency-Key supported. Counts 1 write.\n- set_condition_flags_by_serial — args: { serial, gtin?, flags }. WRITE. Same as set_condition_flags, addressed by your own serial. 409 ambiguous_serial if serial not unique — pass gtin.\n- capture_measurements — args: { id, measurements: [ { fieldKey, value, measuredAt (ISO 8601), externalId?, unit? } ] (≤500) }. WRITE, battery passports only, published only. Pushes over-life measurements from the customer's own equipment (e.g. a BMS reporting stateOfHealth, numberOfFullEquivalentChargingCycles; the Annex XIII point 4 use-data keys). Every measurement is stored; the newest per field becomes the passport's current value and sets dynamicDataAsOf. externalId makes a measurement idempotent. A value may be at most 16 KB serialised. batteryStatus is NOT a measurement (400 invalid_field_key). A key the Regulation keeps off this battery category returns 422 field_not_applicable (e.g. stateOfCertifiedEnergy on an LMT battery). Metered against the plan's monthly measurement allowance, not the daily write budget: paid plans keep counting past it at no charge; Free stops at its allowance. Reading a passport is never metered.\n- capture_measurements_by_serial — args: { serial, gtin?, measurements }. Same, addressed by your own serial.\n- list_measurements — args: { id, fieldKey?, from?, to? (ISO 8601), limit? (≤200), cursor? }. Read-only. Measurement history, newest first; page with the returned nextCursor.\n- list_measurements_by_serial — args: { serial, gtin?, fieldKey?, from?, to?, limit?, cursor? }. Read-only.\n- latest_measurements — args: { id }. Read-only. The newest measurement per accepted key (null where none yet).\n- latest_measurements_by_serial — args: { serial, gtin? }. Read-only.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "properties": {
                "action": {
                  "description": "Which passport operation to run. Reads: list | get | get_by_serial | compliance | registry_readiness | get_condition_flags | get_condition_flags_by_serial | get_qr | get_qr_by_serial | list_snapshots | get_snapshot | list_measurements(_by_serial) | latest_measurements(_by_serial). Writes: set_condition_flags | set_condition_flags_by_serial | capture_measurements(_by_serial) | create (BILLABLE). Lifecycle: suspend (reversible) | archive (IRREVERSIBLE), each with a _by_serial variant.",
                  "enum": [
                    "list",
                    "get",
                    "get_by_serial",
                    "compliance",
                    "registry_readiness",
                    "get_condition_flags",
                    "get_condition_flags_by_serial",
                    "set_condition_flags",
                    "set_condition_flags_by_serial",
                    "capture_measurements",
                    "capture_measurements_by_serial",
                    "list_measurements",
                    "list_measurements_by_serial",
                    "latest_measurements",
                    "latest_measurements_by_serial",
                    "create",
                    "suspend",
                    "suspend_by_serial",
                    "archive",
                    "archive_by_serial",
                    "get_qr",
                    "get_qr_by_serial",
                    "list_snapshots",
                    "get_snapshot"
                  ],
                  "type": "string"
                },
                "args": {
                  "description": "Arguments for the chosen action; required fields depend on `action` (see each action above).",
                  "properties": {
                    "at": {
                      "description": "list_snapshots: ISO 8601 instant — return the snapshot valid then instead of the list.",
                      "type": "string"
                    },
                    "confirmOverage": {
                      "description": "Set true to accept per-passport overage charges when over the plan quota (402). Applies to create.",
                      "type": "boolean"
                    },
                    "cursor": {
                      "description": "list_measurements(_by_serial): nextCursor from the previous page.",
                      "type": "string"
                    },
                    "fieldKey": {
                      "description": "list_measurements(_by_serial): only this field key.",
                      "type": "string"
                    },
                    "flags": {
                      "additionalProperties": {
                        "anyOf": [
                          {
                            "type": "boolean"
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "description": "For set_condition_flags / set_condition_flags_by_serial: Record\u003cflagKey, boolean|null\u003e. null clears the flag.",
                      "propertyNames": {
                        "type": "string"
                      },
                      "type": "object"
                    },
                    "format": {
                      "description": "get/get_by_serial: summary|full. get_qr/get_qr_by_serial: svg|png.",
                      "type": "string"
                    },
                    "from": {
                      "description": "list_measurements(_by_serial): measuredAt from (ISO 8601).",
                      "type": "string"
                    },
                    "gtin": {
                      "description": "For create (legacy): GS1 GTIN. Also used as a disambiguator for *_by_serial actions when a serial isn't unique (else 409 ambiguous_serial).",
                      "type": "string"
                    },
                    "id": {
                      "description": "Passport id. Required for get/compliance/suspend/archive/get_qr (the by-id actions).",
                      "type": "string"
                    },
                    "identifier": {
                      "additionalProperties": {},
                      "description": "EN 18219 scheme-tagged identifier for create. Must have `scheme` plus scheme-specific fields. Schemes: gs1 {gtin, serialNumber} | iso15459 {issuingAgencyCode, primaryId, serial?} | iec61406 {uri} | did {did, method} | doi {doi, granularity} (granularity: \"model\"|\"batch\"|\"item\" REQUIRED per EN 18219 §5.6.2(b)). Battery passports: gs1 and iso15459 only.",
                      "propertyNames": {
                        "type": "string"
                      },
                      "type": "object"
                    },
                    "lang": {
                      "description": "Resolve field values to one of the 24 EU locales server-side (get/get_by_serial).",
                      "type": "string"
                    },
                    "limit": {
                      "description": "Page size for list, max 100.",
                      "type": "number"
                    },
                    "lineage": {
                      "description": "create, battery only: link a second-life battery's new passport to the original passport(s) (Art. 77(7)). See the create action.",
                      "properties": {
                        "noPredecessorReason": {
                          "maxLength": 500,
                          "type": "string"
                        },
                        "predecessors": {
                          "items": {
                            "properties": {
                              "identifier": {
                                "maxLength": 2000,
                                "type": "string"
                              },
                              "internalPassportId": {
                                "type": "string"
                              },
                              "trigger": {
                                "enum": [
                                  "preparation_for_reuse",
                                  "preparation_for_repurposing",
                                  "repurposing",
                                  "remanufacturing"
                                ],
                                "type": "string"
                              }
                            },
                            "required": [
                              "trigger"
                            ],
                            "type": "object"
                          },
                          "maxItems": 10,
                          "type": "array"
                        }
                      },
                      "required": [
                        "predecessors"
                      ],
                      "type": "object"
                    },
                    "measurements": {
                      "description": "capture_measurements(_by_serial): [{ fieldKey, value, measuredAt, externalId?, unit? }], max 500.",
                      "items": {
                        "properties": {
                          "externalId": {
                            "type": "string"
                          },
                          "fieldKey": {
                            "minLength": 1,
                            "type": "string"
                          },
                          "measuredAt": {
                            "minLength": 1,
                            "type": "string"
                          },
                          "unit": {
                            "type": "string"
                          },
                          "value": {}
                        },
                        "required": [
                          "fieldKey",
                          "value",
                          "measuredAt"
                        ],
                        "type": "object"
                      },
                      "type": "array"
                    },
                    "page": {
                      "description": "Page number for list (1-based).",
                      "type": "number"
                    },
                    "productId": {
                      "description": "Parent product id. Required for create.",
                      "type": "string"
                    },
                    "search": {
                      "description": "Filter list by a search term.",
                      "type": "string"
                    },
                    "serial": {
                      "description": "Your own serial number. Required for the *_by_serial actions.",
                      "type": "string"
                    },
                    "serialNumber": {
                      "description": "Serial for the new passport (create, legacy gs1 path).",
                      "type": "string"
                    },
                    "snapshotId": {
                      "description": "Snapshot id. Required for get_snapshot.",
                      "type": "string"
                    },
                    "status": {
                      "description": "Filter list by status: draft|in_review|approved|published|suspended|expired|archived.",
                      "type": "string"
                    },
                    "symbology": {
                      "description": "get_qr/get_qr_by_serial: qr (default) | datamatrix.",
                      "type": "string"
                    },
                    "to": {
                      "description": "list_measurements(_by_serial): measuredAt to (ISO 8601).",
                      "type": "string"
                    }
                  },
                  "type": "object"
                }
              },
              "required": [
                "action"
              ],
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "error": {
                  "description": "Machine-readable error code, when the API rejected the request.",
                  "type": "string"
                },
                "id": {
                  "description": "The resource's TracePass id, when the response is a single entity.",
                  "type": "string"
                },
                "items": {
                  "description": "The page of results, when the action is a list.",
                  "items": {},
                  "type": "array"
                },
                "limit": {
                  "description": "Page size (list actions).",
                  "type": "number"
                },
                "message": {
                  "description": "Human-readable error or status detail, when present.",
                  "type": "string"
                },
                "page": {
                  "description": "Current page number (list actions).",
                  "type": "number"
                },
                "result": {
                  "description": "Wraps a non-object response body (e.g. a QR code string)."
                },
                "total": {
                  "description": "Total matching records across all pages (list actions).",
                  "type": "number"
                },
                "totalPages": {
                  "description": "Total number of pages (list actions).",
                  "type": "number"
                }
              },
              "type": "object"
            },
            "annotations": {
              "idempotentHint": false
            }
          },
          {
            "name": "tracepass_passport_fields",
            "title": "TracePass passport fields",
            "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\nActions (pass via `action`, with `args`):\n- update — args: { id, fieldKey, value }. `value` type matches the field's dataType (string, number, boolean, array, object).\n- update_by_serial — args: { serial, fieldKey, value, gtin? }. Same as update, addressed by your own serial. A serial is unique only WITHIN a GTIN — if it isn't unique in your account the call returns 409 ambiguous_serial; pass `gtin` (or use update by id) to resolve exactly.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "properties": {
                "action": {
                  "description": "Update one passport field, addressed by passport id (update) or by your serial (update_by_serial).",
                  "enum": [
                    "update",
                    "update_by_serial"
                  ],
                  "type": "string"
                },
                "args": {
                  "description": "Arguments for the chosen action; required fields depend on `action`.",
                  "properties": {
                    "fieldKey": {
                      "description": "The field key to set (required).",
                      "type": "string"
                    },
                    "gtin": {
                      "description": "GTIN disambiguator for update_by_serial when the serial isn't unique (else 409).",
                      "type": "string"
                    },
                    "id": {
                      "description": "Passport id. Required for update.",
                      "type": "string"
                    },
                    "serial": {
                      "description": "Your serial. Required for update_by_serial.",
                      "type": "string"
                    },
                    "value": {
                      "description": "The new value for the field (required). Type depends on the field's dataType."
                    }
                  },
                  "type": "object"
                }
              },
              "required": [
                "action"
              ],
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "error": {
                  "description": "Machine-readable error code, when the API rejected the request.",
                  "type": "string"
                },
                "id": {
                  "description": "The resource's TracePass id, when the response is a single entity.",
                  "type": "string"
                },
                "items": {
                  "description": "The page of results, when the action is a list.",
                  "items": {},
                  "type": "array"
                },
                "limit": {
                  "description": "Page size (list actions).",
                  "type": "number"
                },
                "message": {
                  "description": "Human-readable error or status detail, when present.",
                  "type": "string"
                },
                "page": {
                  "description": "Current page number (list actions).",
                  "type": "number"
                },
                "result": {
                  "description": "Wraps a non-object response body (e.g. a QR code string)."
                },
                "total": {
                  "description": "Total matching records across all pages (list actions).",
                  "type": "number"
                },
                "totalPages": {
                  "description": "Total number of pages (list actions).",
                  "type": "number"
                }
              },
              "type": "object"
            },
            "annotations": {
              "idempotentHint": true
            }
          },
          {
            "name": "tracepass_passport_parties",
            "title": "TracePass passport parties",
            "description": "Manage the economic-operator parties on a passport — manufacturer, importer, authorisedRepresentative, distributor, recycler, producerResponsibilityOrg. Each party carries a legal name and at least one identifier.\n\nIdentifier rules (EN 18219 §6.2–6.5): a party needs at least one of `gln`, `legacyOperatorId`, or `operatorIdentifier`. If both `gln` and `operatorIdentifier` (scheme gln) are provided they must agree — a mismatch returns 400. An operatorIdentifier of scheme gln also fills the top-level `gln` field; facilityIdentifier never does. Typed identifiers (operatorIdentifier / facilityIdentifier) are not set by AI extraction or CSV import.\n\noperatorIdentifier schemes:\n  • iso6523 — { scheme:\"iso6523\", icd:\"\u003c4 digits\u003e\", value } — ICD 0199 = LEI (ISO 17442), 0088 = GLN, 0060 = DUNS.\n  • gln — { scheme:\"gln\", gln:\"\u003c13 digits\u003e\" } — also fills top-level `gln`.\n  • did — { scheme:\"did\", did:\"did:\u003cmethod\u003e:\u003cid\u003e\" } — syntax-checked only (EN 18219 §6.4.2(b)).\n  • doi — { scheme:\"doi\", doi:\"10.\u003cregistrant\u003e/\u003csuffix\u003e\" } — doi:/https://doi.org/ prefix accepted and stripped.\n\nfacilityIdentifier schemes: same four; the gln variant also accepts optional `extension` (GS1 SGLN sub-location).\n\nActions (pass via `action`, with `args`):\n- set — args: { id, role, legalName, gln?, country?, legacyOperatorId?, operatorIdentifier?, facilityIdentifier? }. Sets or updates one role.\n- remove — args: { id, role }. Clears one role.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "properties": {
                "action": {
                  "description": "Set (add/replace) or remove an economic-operator party on a passport by its role.",
                  "enum": [
                    "set",
                    "remove"
                  ],
                  "type": "string"
                },
                "args": {
                  "description": "Arguments for the chosen action; required fields depend on `action`.",
                  "properties": {
                    "country": {
                      "description": "ISO 3166-1 alpha-2 country code (set, optional).",
                      "type": "string"
                    },
                    "facilityIdentifier": {
                      "additionalProperties": {},
                      "description": "Structured facility identifier per EN 18219 §6.2–6.5. Same four schemes as operatorIdentifier; the gln variant also accepts optional `extension` (GS1 SGLN sub-location). Never fills the top-level gln field. Not set by AI extraction.",
                      "propertyNames": {
                        "type": "string"
                      },
                      "type": "object"
                    },
                    "gln": {
                      "description": "GS1 Global Location Number (13 digits). Strongly recommended for multi-role disambiguation.",
                      "type": "string"
                    },
                    "id": {
                      "description": "Passport id (required).",
                      "type": "string"
                    },
                    "legacyOperatorId": {
                      "description": "Free-text fallback identifier (VAT, EORI, supplier code). Required when gln and operatorIdentifier are both absent.",
                      "type": "string"
                    },
                    "legalName": {
                      "description": "Party legal name. Required for set.",
                      "type": "string"
                    },
                    "operatorIdentifier": {
                      "additionalProperties": {},
                      "description": "Structured operator identifier per EN 18219 §6.2–6.5. Must have `scheme` plus scheme fields. Schemes: iso6523 {icd:\"\u003c4 digits\u003e\", value} | gln {gln:\"\u003c13 digits\u003e\"} | did {did:\"did:\u003cmethod\u003e:\u003cid\u003e\"} | doi {doi:\"10.\u003cregistrant\u003e/\u003csuffix\u003e\"}. scheme gln also fills the top-level gln field; they must match if both are set (400 otherwise). Not set by AI extraction.",
                      "propertyNames": {
                        "type": "string"
                      },
                      "type": "object"
                    },
                    "role": {
                      "description": "Economic-operator role: manufacturer | importer | authorisedRepresentative | distributor | recycler | producerResponsibilityOrg (required).",
                      "type": "string"
                    }
                  },
                  "type": "object"
                }
              },
              "required": [
                "action"
              ],
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "error": {
                  "description": "Machine-readable error code, when the API rejected the request.",
                  "type": "string"
                },
                "id": {
                  "description": "The resource's TracePass id, when the response is a single entity.",
                  "type": "string"
                },
                "items": {
                  "description": "The page of results, when the action is a list.",
                  "items": {},
                  "type": "array"
                },
                "limit": {
                  "description": "Page size (list actions).",
                  "type": "number"
                },
                "message": {
                  "description": "Human-readable error or status detail, when present.",
                  "type": "string"
                },
                "page": {
                  "description": "Current page number (list actions).",
                  "type": "number"
                },
                "result": {
                  "description": "Wraps a non-object response body (e.g. a QR code string)."
                },
                "total": {
                  "description": "Total matching records across all pages (list actions).",
                  "type": "number"
                },
                "totalPages": {
                  "description": "Total number of pages (list actions).",
                  "type": "number"
                }
              },
              "type": "object"
            },
            "annotations": {
              "idempotentHint": true
            }
          },
          {
            "name": "tracepass_epcis",
            "title": "TracePass EPCIS 2.0",
            "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\nActions (pass via `action`, with `args`):\n- export — args: { id }. Export a passport's events as an EPCIS 2.0 JSON-LD document. Read-only.\n- export_by_serial — args: { serial, gtin? }. Same as export, addressed by your own serial. A serial is unique only WITHIN a GTIN — if it isn't unique in your account the call returns 409 ambiguous_serial; pass `gtin` (or use export by id). Read-only.\n- capture — args: { events }. `events` is an EPCISDocument, a single event, or an array of events (JSON-LD). Returns a 202 with a captureJobId.\n- capture_job — args: { jobId }. Poll an async capture job. Read-only.\n- query — args: { params? }. `params` is a key/value map of standard EPCIS query parameters (EQ_bizStep, GE_eventTime, MATCH_epc, …). Read-only.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "properties": {
                "action": {
                  "description": "EPCIS 2.0: export a passport's events (export | export_by_serial), capture new events, poll a capture job, or query events.",
                  "enum": [
                    "export",
                    "export_by_serial",
                    "capture",
                    "capture_job",
                    "query"
                  ],
                  "type": "string"
                },
                "args": {
                  "description": "Arguments for the chosen action; required fields depend on `action`.",
                  "properties": {
                    "events": {
                      "description": "EPCIS 2.0 event payload (an EPCISDocument or event list). Required for capture."
                    },
                    "gtin": {
                      "description": "GTIN disambiguator for export_by_serial when the serial isn't unique (else 409).",
                      "type": "string"
                    },
                    "id": {
                      "description": "Passport id. Required for export.",
                      "type": "string"
                    },
                    "jobId": {
                      "description": "Capture job id to poll. Required for capture_job.",
                      "type": "string"
                    },
                    "params": {
                      "additionalProperties": {
                        "type": "string"
                      },
                      "description": "EPCIS query parameters as key→value strings (query, optional).",
                      "propertyNames": {
                        "type": "string"
                      },
                      "type": "object"
                    },
                    "serial": {
                      "description": "Your serial. Required for export_by_serial.",
                      "type": "string"
                    }
                  },
                  "type": "object"
                }
              },
              "required": [
                "action"
              ],
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "error": {
                  "description": "Machine-readable error code, when the API rejected the request.",
                  "type": "string"
                },
                "id": {
                  "description": "The resource's TracePass id, when the response is a single entity.",
                  "type": "string"
                },
                "items": {
                  "description": "The page of results, when the action is a list.",
                  "items": {},
                  "type": "array"
                },
                "limit": {
                  "description": "Page size (list actions).",
                  "type": "number"
                },
                "message": {
                  "description": "Human-readable error or status detail, when present.",
                  "type": "string"
                },
                "page": {
                  "description": "Current page number (list actions).",
                  "type": "number"
                },
                "result": {
                  "description": "Wraps a non-object response body (e.g. a QR code string)."
                },
                "total": {
                  "description": "Total matching records across all pages (list actions).",
                  "type": "number"
                },
                "totalPages": {
                  "description": "Total number of pages (list actions).",
                  "type": "number"
                }
              },
              "type": "object"
            },
            "annotations": {
              "idempotentHint": false
            }
          },
          {
            "name": "tracepass_templates",
            "title": "TracePass DPP templates (regulatory schemas)",
            "description": "Discover the regulatory field schema for each DPP category — what a COMPLIANT passport must contain, per the governing EU regulation. Read-only reference data. Use this to advise on requirements before creating products/passports, and to gap-check a draft against the rules.\n\nActions (pass via `action`, with `args`):\n- list — args: {}. Lists all 13 categories with their field count, required-field count, and governing regulation (name + number + effective/mandatory dates).\n- get — args: { category }. Full field schema for one category: every field's key, label, dataType, whether it is REQUIRED, its access level (public/restricted/authority), enum options, validation bounds, and — where known — the regulation article/annex that mandates it. `category` is one of: battery, textile, electronics, construction, steel, detergents, paints-coatings, packaging, furniture, tyres, jewelry, toys, fmcg.\n\nBATTERY — required-ness is per-category, so `required` alone is the wrong answer. Resolve it in this order:\n  1. SCOPE FIRST. Only EV, LMT and industrial_gt_2kwh batteries owe a passport at all (Art. 77(1), Reg (EU) 2023/1542). For portable, SLI or industrial_lte_2kwh, NO field is required — do not list mandatory fields for them; say the battery is out of scope.\n  2. Then `requiredBy[batteryCategory]` where the field carries that map (required | conditional | notApplicable).\n  3. Then fall back to `required`.\nThe map is keyed ONLY by the three in-scope categories, so skipping step 1 falls through to `required` and invents an obligation the Regulation does not impose. Note also that EV and LMT report state-of-health through MUTUALLY EXCLUSIVE field sets — an EV battery must leave the remaining-capacity cluster empty and an LMT battery must leave stateOfCertifiedEnergy empty, so no single battery ever fills every field.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "properties": {
                "action": {
                  "description": "List all DPP category templates, or get one template by category.",
                  "enum": [
                    "list",
                    "get"
                  ],
                  "type": "string"
                },
                "args": {
                  "description": "Arguments for the chosen action; `category` is required for get, ignored for list.",
                  "properties": {
                    "category": {
                      "description": "DPP category to fetch (required for get): battery | textile | electronics | construction | steel | detergents | paints-coatings | packaging | furniture | tyres | jewelry | toys | fmcg.",
                      "type": "string"
                    }
                  },
                  "type": "object"
                }
              },
              "required": [
                "action"
              ],
              "type": "object"
            },
            "outputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "error": {
                  "description": "Machine-readable error code, when the API rejected the request.",
                  "type": "string"
                },
                "id": {
                  "description": "The resource's TracePass id, when the response is a single entity.",
                  "type": "string"
                },
                "items": {
                  "description": "The page of results, when the action is a list.",
                  "items": {},
                  "type": "array"
                },
                "limit": {
                  "description": "Page size (list actions).",
                  "type": "number"
                },
                "message": {
                  "description": "Human-readable error or status detail, when present.",
                  "type": "string"
                },
                "page": {
                  "description": "Current page number (list actions).",
                  "type": "number"
                },
                "result": {
                  "description": "Wraps a non-object response body (e.g. a QR code string)."
                },
                "total": {
                  "description": "Total matching records across all pages (list actions).",
                  "type": "number"
                },
                "totalPages": {
                  "description": "Total number of pages (list actions).",
                  "type": "number"
                }
              },
              "type": "object"
            },
            "annotations": {
              "idempotentHint": true,
              "readOnlyHint": true
            }
          }
        ]
      },
      "name": "TracePass",
      "note": "Indexed from the official MCP registry: facts and our own checks, not reviewed, so no score, grade or rank.",
      "packages": [
        {
          "registryType": "npm",
          "identifier": "tracepass-mcp-server",
          "version": "1.16.2",
          "transport": "stdio"
        }
      ],
      "pageJsonUrl": "https://www.anchorterminal.com/tools/tracepass.json",
      "popularity": {
        "githubStars": 1,
        "npmWeekly": 856
      },
      "registryName": "eu.tracepass/tracepass",
      "remotes": [
        {
          "type": "streamable-http",
          "url": "https://ai.tracepass.eu/mcp"
        }
      ],
      "repository": "https://github.com/malinoto/tracepass-mcp-server",
      "reviewed": false,
      "slug": "tracepass",
      "source": "the official MCP registry",
      "sourceUrl": "https://registry.modelcontextprotocol.io/v0.1/servers?search=eu.tracepass/tracepass",
      "summary": "Manage products, EU Digital Product Passports, operator parties, and GS1 EPCIS supply-chain events.",
      "updatedAt": "2026-10-02T16:05:29Z",
      "url": "https://www.anchorterminal.com/tools/tracepass",
      "vendor": "tracepass.eu",
      "vendorUrl": "https://www.tracepass.eu",
      "version": "1.16.2",
      "websiteUrl": "https://www.tracepass.eu",
      "where": "both",
      "why": [
        "vendor"
      ]
    }
  },
  "kind": "anchor.page",
  "links": {
    "api": "https://www.anchorterminal.com/api/v1/index.json",
    "html": "https://www.anchorterminal.com/tools/tracepass",
    "json": "https://www.anchorterminal.com/tools/tracepass.json",
    "llms": "https://www.anchorterminal.com/llms.txt",
    "markdown": "https://www.anchorterminal.com/tools/tracepass.md",
    "slim": "https://www.anchorterminal.com/tools/tracepass.min.md"
  },
  "markdown": "# TracePass\n\n\u003e Indexed, not reviewed: facts from the official MCP registry and our own checks. No score, grade or rank, and not in the rankings until the panel reviews it. How the index works: https://www.anchorterminal.com/indexed/\n\n- Kind: MCP server, by tracepass.eu (https://www.tracepass.eu)\n- Category: Data providers (https://www.anchorterminal.com/categories/data-providers.md)\n- Listed because: It's published in the registry under tracepass.eu, a namespace the registry only gives to whoever proves they control that domain.\n- What the official MCP registry says: Manage products, EU Digital Product Passports, operator parties, and GS1 EPCIS supply-chain events.\n\n## Facts\n\n- MCP registry: `eu.tracepass/tracepass` 1.16.2\n- Endpoint: https://ai.tracepass.eu/mcp (streamable HTTP)\n- Package: npm `tracepass-mcp-server` (stdio)\n- Source: https://github.com/malinoto/tracepass-mcp-server\n- Website: https://www.tracepass.eu\n- npm downloads a week: 856\n- GitHub stars: 1\n- Registry entry updated: 2026-10-02\n\n## Tools\n\n- Tools it lists (6, about 8,251 tokens of context, `tools/list` without credentials over MCP 2025-11-25, checked 2026-10-04 22:25 UTC):\n  - `tracepass_products`: Manage the TracePass product catalogue. A product is the catalogue layer — one product can have many passports (one per serialised unit). Products are not…\n  - `tracepass_passports`: Manage Digital Product Passports — create, read, and run lifecycle actions. IMPORTANT: `create` consumes DPP slots and IS BILLABLE. Over-quota creation incurs…\n  - `tracepass_passport_fields`: Update field values on a Digital Product Passport. Every change is recorded in the passport's audit trail, tagged as an API-key update. Actions (pass via…\n  - `tracepass_passport_parties`: Manage the economic-operator parties on a passport — manufacturer, importer, authorisedRepresentative, distributor, recycler, producerResponsibilityOrg. Each…\n  - `tracepass_epcis`: 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…\n  - `tracepass_templates` (read-only): Discover the regulatory field schema for each DPP category — what a COMPLIANT passport must contain, per the governing EU regulation. Read-only reference data.…\n- How its tools read to an agent (0 errors, 14 warnings, 0 notes, about 8,251 tokens; rules at https://www.anchorterminal.com/check.md; not part of the score):\n  - warn TC07 tracepass_passports: the description is about 2,243 tokens\n  - warn TC11 tracepass_passports: none of its 2 parameters has a description\n  - warn TC12 tracepass_epcis: no type for args.events\n  - warn TC12 tracepass_passport_fields: no type for args.value\n  - warn TC12 tracepass_passports: no type for args.measurements[].value\n  - warn TC14 tracepass_passports: allowed values are in the description, not an enum: args.status\n  - warn TC14 tracepass_products: allowed values are in the description, not an enum: args.category\n  - warn TC14 tracepass_templates: allowed values are in the description, not an enum: args.category\n  - warn TC16 tracepass_epcis: no readOnlyHint or destructiveHint\n  - warn TC16 tracepass_passport_fields: no readOnlyHint or destructiveHint\n  - warn TC16 tracepass_passport_parties: no readOnlyHint or destructiveHint\n  - warn TC16 tracepass_passports: no readOnlyHint or destructiveHint\n  - warn TC16 tracepass_products: no readOnlyHint or destructiveHint\n  - warn TC22 tracepass_passports: the definition is about 3,793 tokens\n\n- JSON: https://www.anchorterminal.com/api/v1/tools/tracepass.json\n- Being indexed says nothing about quality, and nobody can pay for it. Ask for a review: https://www.anchorterminal.com/builders/#claiming\n",
  "meta": {
    "attribution": "Anchor Terminal (https://www.anchorterminal.com)",
    "docs": "https://www.anchorterminal.com/docs/",
    "generatedAt": "2026-10-05",
    "license": "CC-BY-4.0",
    "method": "https://www.anchorterminal.com/benchmark/",
    "methodology": "0.3",
    "openapi": "https://www.anchorterminal.com/openapi.json",
    "preview": false,
    "run": "2026-10-01",
    "runLabel": "October 2026 research run"
  },
  "page": {
    "breadcrumbs": [
      {
        "name": "Home",
        "url": "https://www.anchorterminal.com/"
      },
      {
        "name": "Terminal",
        "url": "https://www.anchorterminal.com/tools/"
      },
      {
        "name": "Indexed",
        "url": "https://www.anchorterminal.com/indexed/"
      },
      {
        "name": "TracePass",
        "url": ""
      }
    ],
    "description": "TracePass, an MCP server by tracepass.eu, listed from the official MCP registry. Indexed, not reviewed: facts and our own checks, no score or ranking. Manage products, EU Digital Product Passports, operator parties, and GS1 EPCIS supply-chain events.",
    "facts": [
      "not reviewed",
      "not ranked",
      "facts only"
    ],
    "h1": "TracePass",
    "image": "https://www.anchorterminal.com/assets/og/indexed.png",
    "path": "/tools/tracepass",
    "published": "",
    "section": "indexed",
    "title": "TracePass: MCP server, indexed from the official MCP registry",
    "toc": null,
    "updated": "2026-10-05",
    "url": "https://www.anchorterminal.com/tools/tracepass"
  },
  "tokens": {
    "markdown": 1100,
    "slim": 1030
  },
  "version": 1
}
