{"name":"eu.tracepass/tracepass","slug":"tracepass","title":"TracePass","description":"Manage products, EU Digital Product Passports, operator parties, and GS1 EPCIS supply-chain events.","url":"https://mcp.market/server/tracepass","rating":null,"grade":"A","score":88,"certified":false,"status":"active","category":"ecommerce","tags":["ecommerce"],"presence":{"score":35,"stars":1,"forks":0,"downloads_week":71,"last_push_at":"2026-09-21T22:24:38.000Z","license":"MIT"},"uptime":{"percent":100,"checks":15,"ok":15,"last_checked_at":"2026-09-23T01:35:41.376Z","last_ok_at":"2026-09-23T01:35:41.376Z","latency_ms":152},"claimed":false,"transport":"mixed","callable_via_gateway":true,"default_price_micros":0,"repository":"https://github.com/malinoto/tracepass-mcp-server","website":"https://www.tracepass.eu","version":"1.7.4","remotes":[{"type":"streamable-http","url":"https://ai.tracepass.eu/mcp","headers":[{"description":"TracePass API key as a bearer token (tp_ prefix). Mint one in the dashboard under Developer -> API Keys.","isRequired":true,"isSecret":true,"name":"Authorization"}]}],"packages":[{"registryType":"npm","registryBaseUrl":"https://registry.npmjs.org","identifier":"tracepass-mcp-server","version":"1.7.4","transport":{"type":"stdio"}}],"tools":[{"name":"tracepass_epcis","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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"action":{"type":"string","enum":["export","export_by_serial","capture","capture_job","query"],"description":"EPCIS 2.0: export a passport's events (export | export_by_serial), capture new events, poll a capture job, or query events."},"args":{"description":"Arguments for the chosen action; required fields depend on `action`.","type":"object","properties":{"id":{"description":"Passport id. Required for export.","type":"string"},"serial":{"description":"Your serial. Required for export_by_serial.","type":"string"},"gtin":{"description":"GTIN disambiguator for export_by_serial when the serial isn't unique (else 409).","type":"string"},"events":{"description":"EPCIS 2.0 event payload (an EPCISDocument or event list). Required for capture."},"jobId":{"description":"Capture job id to poll. Required for capture_job.","type":"string"},"params":{"description":"EPCIS query parameters as key→value strings (query, optional).","type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}}}}},"required":["action"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"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.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"action":{"type":"string","enum":["update","update_by_serial"],"description":"Update one passport field, addressed by passport id (update) or by your serial (update_by_serial)."},"args":{"description":"Arguments for the chosen action; required fields depend on `action`.","type":"object","properties":{"id":{"description":"Passport id. Required for update.","type":"string"},"serial":{"description":"Your serial. Required for update_by_serial.","type":"string"},"gtin":{"description":"GTIN disambiguator for update_by_serial when the serial isn't unique (else 409).","type":"string"},"fieldKey":{"description":"The field key to set (required).","type":"string"},"value":{"description":"The new value for the field (required). Type depends on the field's dataType."}}}},"required":["action"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"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 ideally a validated 13-digit GS1 GLN.\n\nActions (pass via `action`, with `args`):\n- set — args: { id, role, legalName, gln?, country?, legacyOperatorId? }. Sets or updates one role.\n- remove — args: { id, role }. Clears one role.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"action":{"type":"string","enum":["set","remove"],"description":"Set (add/replace) or remove an economic-operator party on a passport by its role."},"args":{"description":"Arguments for the chosen action; required fields depend on `action`.","type":"object","properties":{"id":{"description":"Passport id (required).","type":"string"},"role":{"description":"Economic-operator role, e.g. manufacturer | importer | distributor | authorised_representative (required).","type":"string"},"legalName":{"description":"Party legal name. Required for set.","type":"string"},"gln":{"description":"GS1 Global Location Number for the party (set, optional).","type":"string"},"country":{"description":"Party country code (set, optional).","type":"string"},"legacyOperatorId":{"description":"Your internal operator id for the party (set, optional).","type":"string"}}}},"required":["action"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"tracepass_passports","description":"Manage Digital Product Passports — create, read, and run lifecycle actions.\n\nIMPORTANT: `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\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.\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.\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, gtin, serialNumber, confirmOverage? }. BILLABLE.\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) }. Read-only.\n- get_qr_by_serial — args: { serial, format? (svg|png), 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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"action":{"type":"string","enum":["list","get","get_by_serial","compliance","registry_readiness","create","suspend","suspend_by_serial","archive","archive_by_serial","get_qr","get_qr_by_serial"],"description":"Which passport operation to run. Reads: list | get | get_by_serial | compliance | registry_readiness | get_qr | get_qr_by_serial. Lifecycle: create (BILLABLE) | suspend (reversible) | archive (IRREVERSIBLE), each with a _by_serial variant."},"args":{"description":"Arguments for the chosen action; required fields depend on `action` (see each action above).","type":"object","properties":{"id":{"description":"Passport id. Required for get/compliance/create-result/suspend/archive/get_qr (the by-id actions).","type":"string"},"serial":{"description":"Your own serial number. Required for the *_by_serial actions.","type":"string"},"gtin":{"description":"GTIN disambiguator for *_by_serial actions when a serial isn't unique across GTINs (else 409 ambiguous_serial).","type":"string"},"productId":{"description":"Parent product id. Required for create.","type":"string"},"serialNumber":{"description":"Serial for the new passport. Required for create.","type":"string"},"confirmOverage":{"description":"Set true to accept a per-passport overage charge when create is over the plan quota (402).","type":"boolean"},"format":{"description":"get/get_by_serial: summary|full. get_qr/get_qr_by_serial: svg|png.","type":"string"},"lang":{"description":"Resolve field values to one of the 24 EU locales server-side (get/get_by_serial).","type":"string"},"page":{"description":"Page number for list (1-based).","type":"number"},"limit":{"description":"Page size for list, max 100.","type":"number"},"status":{"description":"Filter list by status: draft|in_review|approved|published|suspended|expired|archived.","type":"string"},"search":{"description":"Filter list by a search term.","type":"string"}}}},"required":["action"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"action":{"type":"string","enum":["list","get","create","create_batch","update","archive"],"description":"Which product operation to run: list | get | create | create_batch | update | archive."},"args":{"description":"Arguments for the chosen action; required fields depend on `action` (see each action above).","type":"object","properties":{"id":{"description":"Product id. Required for get and update.","type":"string"},"name":{"description":"Product name. Required for create; optional on update.","type":"string"},"model":{"description":"Manufacturer model / SKU. Required for create; optional on update.","type":"string"},"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"},"page":{"description":"Page number for list (1-based).","type":"number"},"limit":{"description":"Page size for list, max 100.","type":"number"},"status":{"description":"Filter list by product status.","type":"string"},"search":{"description":"Filter list by a search term.","type":"string"},"products":{"description":"Products to create for create_batch: [{ name, model, category, description? }], max 100.","type":"array","items":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}}}}},"required":["action"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"tracepass_templates","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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"action":{"type":"string","enum":["list","get"],"description":"List all DPP category templates, or get one template by category."},"args":{"description":"Arguments for the chosen action; `category` is required for get, ignored for list.","type":"object","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"}}}},"required":["action"],"$schema":"http://json-schema.org/draft-07/schema#"}}],"scan":{"score":88,"grade":"A","scanned_at":"2026-09-23T04:56:47.527Z","report":{"scannerVersion":"0.1.9","scannedAt":"2026-09-23T04:56:47.464Z","components":{"code":{"score":25,"max":25,"notes":["17 source files scanned"]},"reliability":{"score":20,"max":20,"notes":["remote reachable in 1791ms"]},"poisoning":{"score":13,"max":15,"notes":["6 tool descriptions checked"]},"auth":{"score":8,"max":15,"notes":["API key sent as a header"]},"maintenance":{"score":15,"max":15,"notes":["last push 1 days ago"]},"identity":{"score":7,"max":10,"notes":["namespace and repository owner differ","GitHub account older than a year","website matches verified namespace"]}},"findings":[{"id":"poison.long-description","severity":"low","component":"poisoning","title":"Unusually long tool description (over 2,000 characters)","evidence":"tool tracepass_passports: …Manage Digital Product Passports — create, read, and run lifecycle actions. 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. Actions (pass via `action`, with `args`): - list — args: { page?, limit? (≤100), productId?, status?, search? }. status ∈ draft|in_review|approved|published|suspended|expired|archived. Read-only. - get — args: { id, format? (summary|full), lang? }. Read-only. - 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. - 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. - 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. - create — args: { productId, gtin, serialNumber, confirmOverage? }. BILLABLE. - suspend — args: { id }. Reversible — public QR shows 'suspended'. - 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`. - archive — args: { id }. IRREVERSIBLE — confirm with the user first. - archive_by_serial — args: { serial, gtin? }. IRREVERSIBLE, addressed by your serial — confirm first. 409 ambiguous_serial if the serial isn't unique — pass `gtin`. - get_qr — args: { id, format? (svg|png) }. Read-only. - get_qr_by_serial — args: { serial, format? (svg|png), 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.…"}],"inputs":{"probes":[{"url":"https://ai.tracepass.eu/mcp","reachable":true,"authRequired":false,"latencyMs":1791,"serverInfo":{"name":"tracepass","version":"1.7.4"}}],"packages":[{"registryType":"npm","identifier":"tracepass-mcp-server","version":"1.7.4","found":true,"license":"MIT","hasInstallScripts":false,"dependencyCount":2,"publishedAt":"2026-08-17T16:28:39.846Z","repositoryUrl":"git+https://github.com/malinoto/tracepass-mcp-server.git","weeklyDownloads":71}],"repo":{"found":true,"owner":"malinoto","repo":"tracepass-mcp-server","archived":false,"pushedAt":"2026-09-21T22:24:38Z","stars":1,"forks":0,"openIssues":0,"ownerType":"User","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/345519?v=4","ownerCreatedAt":"2010-07-27T09:05:33Z","license":"MIT"},"icon":{"url":"https://www.tracepass.eu/tracepass-icon-512.png","source":"registry","width":512,"height":512},"presence":{"stars":1,"forks":0,"downloadsWeek":71,"license":"MIT","lastPushAt":"2026-09-21T22:24:38.000Z","score":35}}}},"grade_history":[],"reviews":[]}