tracepass-mcp-server
The TracePass MCP Server lets AI assistants manage EU Digital Product Passports (DPPs), product catalogues, supply-chain events, and regulatory schemas on the TracePass platform.
Product Catalogue – List, get, create, and update products across 12 categories (battery, textile, electronics, construction, steel, chemicals, packaging, furniture, tyres, jewelry, toys, FMCG).
Digital Product Passports – List, get (by ID or serial), create (billable), suspend (reversible), archive (irreversible), retrieve QR codes (SVG/PNG), and run compliance checks returning a three-tier verdict (compliant / compliant_with_warnings / incomplete) with regulation-cited findings.
Passport Fields – Update category-specific data fields on a passport by ID or serial number; all changes are audit-trailed.
Economic-Operator Parties – Set or remove party roles (manufacturer, importer, authorised representative, distributor, recycler, etc.) with legal name, GLN, and country.
GS1 EPCIS 2.0 Supply-Chain Events – Export a passport's events as EPCIS 2.0 JSON-LD; capture new events, poll async capture jobs, and query events (capture/query require a paid add-on).
Regulatory Templates – List all 12 DPP category schemas (field counts, governing EU regulations) and retrieve full field schemas including required fields, data types, access levels, validation rules, and regulation article/annex citations.
Resources – Read-only access to products, passports, EPCIS events, compliance verdicts, and templates as conversation context.
Prompts – Predefined workflows for auditing a passport, onboarding a product, explaining DPP requirements, running compliance gap checks, and reviewing EPCIS supply-chain trails.
Deployment – Available as a hosted endpoint (https://ai.tracepass.eu/mcp) with OAuth 2.0 or API key auth, or run locally via npx with API key auth.
TracePass MCP Server
A Model Context Protocol server for TracePass — the EU Digital Product Passport platform. It lets AI assistants (Claude, Cursor, IDE agents) manage products, Digital Product Passports, economic-operator parties, and GS1 EPCIS 2.0 supply-chain events.
It speaks the full MCP protocol — tools, resources, resource templates, and prompts.
Two ways to use it
The same server core ships two ways:
Hosted — point your MCP client at
https://ai.tracepass.eu/mcp. Nothing to install; always current.Local (npm) — run
tracepass-mcp-servervianpx. The MCP client launches it as a subprocess and speaks MCP over stdio.
Related MCP server: fallpharm-mcp
Authentication
The server accepts either of TracePass's two v1 auth methods on the
same Authorization: Bearer … header — it forwards whatever you send to
the API, which decides. Pick the one that fits how you're connecting:
API key | OAuth 2.0 | |
Best for | A single user, scripts, server-to-server | AI assistants / apps acting on a user's behalf |
What you send | A static | A scoped access token obtained via the OAuth flow |
Setup | Mint at Developer → API Keys | The user clicks Connect and approves scopes |
Scope | All-or-nothing (the whole workspace) | Exactly the scopes the user granted; revocable |
Works with | Hosted and local (npx) | Hosted endpoint only (needs a browser consent step) |
Which should an AI assistant use? If your MCP client supports OAuth (Claude.ai, ChatGPT, and others), prefer OAuth — the user authorizes the connection once on a TracePass consent screen, you never handle a secret, and access is least-privilege and revocable. If your client only takes a header/token, use an API key.
OAuth 2.0 (recommended for hosted clients)
No config beyond pointing your client at the hosted endpoint — discovery
is automatic. On the first unauthenticated request the server returns a
401 whose WWW-Authenticate header carries a resource_metadata URL
(RFC 9728) pointing at /.well-known/oauth-protected-resource, which
names the TracePass authorization server. The client runs the standard
authorization-code flow with PKCE (/api/oauth/authorize →
/api/oauth/token), the user approves scopes, and the client stores +
refreshes the token. If you distribute your own client, register an app
under Developer → OAuth Apps to get a client_id; many hosted
clients self-register via Dynamic Client Registration automatically.
Request only the scopes you need, e.g. passports:read passports:write offline_access. Users manage connected apps (and revoke) under
Developer → OAuth Apps → Connected Apps.
API key
Mint a tp_… key under Developer → API Keys and send it as a Bearer
token.
Hosted:
{
"mcpServers": {
"tracepass": {
"url": "https://ai.tracepass.eu/mcp",
"headers": { "Authorization": "Bearer tp_YOUR_KEY" }
}
}
}Local (npx / stdio) — the local subprocess can't do an interactive
OAuth consent step, so it's API-key only, via the TRACEPASS_API_KEY env:
{
"mcpServers": {
"tracepass": {
"command": "npx",
"args": ["-y", "tracepass-mcp-server"],
"env": {
"TRACEPASS_API_KEY": "tp_YOUR_KEY"
}
}
}
}Optional env var: TRACEPASS_BASE_URL (defaults to
https://app.tracepass.eu) — point the tools at a different
TracePass deployment.
Tools
The TracePass v1 API operations are grouped into 6 tools. Each takes an action enum plus action-specific arguments. The tools are:
tracepass_products- manage the product catalogue (list, get, create, create_batch, update, archive products).tracepass_passports- manage Digital Product Passports (list, get, compliance check, registry-readiness check, create, suspend, archive, get QR), by id or by serial.tracepass_passport_fields- update a passport's category-specific data fields, by id or by serial.tracepass_passport_parties- set or remove a passport's economic-operator parties (manufacturer, importer, etc.).tracepass_epcis- export, capture, and query a passport's GS1 EPCIS 2.0 supply-chain events.tracepass_templates- list and get the DPP category field schemas, each field traced to the EU instrument that mandates it.
Each tool's full action set:
Tool | Actions |
|
|
|
|
|
|
|
|
|
|
|
|
The *_by_serial actions address a passport by the customer's own serial
number instead of its TracePass id. A serial is unique only within a GTIN, so
if the same serial exists under two GTINs in your account a serial-only call
returns 409 ambiguous_serial — pass the optional gtin arg to disambiguate
(or use the by-id action). The same gtin disambiguator applies to every
*_by_serial action.
The tracepass_passports compliance action returns a three-tier
compliance verdict (compliant / compliant_with_warnings /
incomplete) with regulation-cited findings — missing required fields,
missing economic-operator parties, format issues, and per-category
conditional rules. Read-only; use it to gap-check a passport, fix the
cited gaps, then re-check.
A compliant verdict means this passport satisfies the rules encoded here,
not this product may be placed on the market. The field specifications are
hand-authored from the regulations, not an official EU artefact, and delegated
acts are still landing. It is not legal advice.
A note on writes
Some actions cost money or are irreversible — the server's tool descriptions tell the model so:
tracepass_passportscreateconsumes a billable DPP slot on the account's plan. Over-quota creation incurs a per-passport overage charge; the tool surfaces a 402-style message and only proceeds withargs.confirmOverage: trueafter the user agrees.tracepass_passportsarchiveis irreversible — the public QR permanently 404s. Usesuspend(reversible) when a change might be undone.tracepass_epciscapture/queryrequire the paid EPCIS add-on;exportis included on Starter plans and up.
Resources
Read-only entity data you can attach as conversation context:
tracepass://products— the product cataloguetracepass://product/{id}— one producttracepass://passport/{id}— one passport, full field detailtracepass://passport/{id}/epcis— a passport's EPCIS 2.0 eventstracepass://passport/{id}/compliance— a passport's compliance verdicttracepass://passport/{id}/registry-readiness— a mechanical pre-submission check modelled on the EU DPP Registry's formal gate: mandatory-field presence, formatting, a resolvable public link, item-level granularity, a well-formed commodity code. Not the substantive compliance verdict, and not a prediction of the real registry's response — its registration API has no published spec. Battery only.tracepass://templates— all 13 DPP category field schemastracepass://template/{category}— one category's full field schema
Prompts
Reusable DPP workflows the client surfaces as slash-commands:
audit_passport— review a passport for completeness and compliance readinessonboard_product— create a product and its first passportexplain_dpp_requirements— explain what a category's compliant DPP must contain, and the regulation behind each fieldcompliance_gap_check— produce a prioritised, regulation-cited list of what's blocking a passport's compliant publicationreview_epcis_events— summarise a passport's supply-chain trail
Development
npm install
npm run build # tsc -> dist/
npm run typecheck
npm test # vitest
npm run lint
npm start # run the hosted HTTP service locally (:8080)
npm run start:stdio # run the stdio server locallyThe hosted service is a plain Node HTTP server (dist/http.js),
stateless — each request carries its own API key and builds a fresh
MCP session. It is containerised via the Dockerfile and deployed to
Hetzner; see tracepass-environment/docker-mcp.yml.
Listed on Glama
This server is published in the official MCP Registry
as eu.tracepass/tracepass and listed on Glama:
License
MIT
Available Tools
6 toolstracepass_epcisTracePass EPCIS 2.0AInspect
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).
Actions (pass via action, with args):
export — args: { id }. Export a passport's events as an EPCIS 2.0 JSON-LD document. Read-only.
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.capture — args: { events }.
eventsis an EPCISDocument, a single event, or an array of events (JSON-LD). Returns a 202 with a captureJobId.capture_job — args: { jobId }. Poll an async capture job. Read-only.
query — args: { params? }.
paramsis a key/value map of standard EPCIS query parameters (EQ_bizStep, GE_eventTime, MATCH_epc, …). Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| args | No | Arguments for the chosen action; required fields depend on `action`. | |
| action | Yes | EPCIS 2.0: export a passport's events (export | export_by_serial), capture new events, poll a capture job, or query events. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | The resource's TracePass id, when the response is a single entity. |
| page | No | Current page number (list actions). |
| error | No | Machine-readable error code, when the API rejected the request. |
| items | No | The page of results, when the action is a list. |
| limit | No | Page size (list actions). |
| total | No | Total matching records across all pages (list actions). |
| result | No | Wraps a non-object response body (e.g. a QR code string). |
| message | No | Human-readable error or status detail, when present. |
| totalPages | No | Total number of pages (list actions). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With only idempotentHint: false in annotations, the description carries the full behavioral burden and does so extensively. It marks four actions as read-only, reveals that capture returns a 202 with a captureJobId and is asynchronous, and discloses specific error conditions like 409 ambiguous_serial and 403-style messages. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a concise lead sentence, a critical plan-requirement note, and a clean action-by-action bullet list. Every sentence adds value, and the structure makes the multi-action tool easy to scan and understand.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (five actions, nested args, async behavior, plan restrictions), the description is complete. It covers all actions, their required args, error conditions, and asynchronous behavior. Return values are not detailed, but an output schema exists, so that omission is acceptable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although the schema already has 100% description coverage, the description adds substantial meaning beyond it. It maps each parameter to its action, clarifies that a serial is unique only within a GTIN, explains that events can be an EPCISDocument or an array, and gives examples of EPCIS query parameters. This goes well beyond the schema's field-level descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'GS1 EPCIS 2.0 supply-chain events.' It then enumerates each specific action (export, export_by_serial, capture, capture_job, query) with a precise verb and resource. This distinguishes it from sibling tools like tracepass_passports and tracepass_products.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit usage context: it notes which actions are included on Starter plans vs. require the paid add-on, and explains when to use export_by_serial versus export with a GTIN. It does not explicitly name alternative sibling tools, but the action-level guidance is clear enough for correct selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tracepass_passport_fieldsTracePass passport fieldsAIdempotentInspect
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 action, with args):
update — args: { id, fieldKey, value }.
valuetype matches the field's dataType (string, number, boolean, array, object).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.
| Name | Required | Description | Default |
|---|---|---|---|
| args | No | Arguments for the chosen action; required fields depend on `action`. | |
| action | Yes | Update one passport field, addressed by passport id (update) or by your serial (update_by_serial). |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | The resource's TracePass id, when the response is a single entity. |
| page | No | Current page number (list actions). |
| error | No | Machine-readable error code, when the API rejected the request. |
| items | No | The page of results, when the action is a list. |
| limit | No | Page size (list actions). |
| total | No | Total matching records across all pages (list actions). |
| result | No | Wraps a non-object response body (e.g. a QR code string). |
| message | No | Human-readable error or status detail, when present. |
| totalPages | No | Total number of pages (list actions). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the idempotentHint annotation, the description discloses that every change is recorded in the passport's audit trail and tagged as an API-key update. It also explains the 409 error condition for ambiguous serials and that the value type must match the field's dataType. This adds meaningful behavioral context without contradicting the annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and well-structured: a purpose sentence followed by a clear list of actions with their args and usage notes. Every sentence adds value; there is no redundant repetition of schema information. The format makes it easy to scan and understand the tool's behavior.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (two actions, nested args, optional disambiguator) and the presence of an output schema, the description covers all necessary aspects: purpose, action mechanics, error handling, audit trail, and value typing. No critical behavior is left unexplained, and the output schema handles return-value details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although the input schema describes each parameter, the description adds crucial semantic meaning by tying parameters to actions: it details the args structure for update vs update_by_serial, clarifies the optional `gtin` disambiguator, and specifies that `value` must match the field's dataType. This goes well beyond the schema's one-line descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource: 'Update field values on a Digital Product Passport.' This clearly states the tool's function and distinguishes it from sibling tools that manage passports, products, parties, EPCIS, or templates. The two actions (update, update_by_serial) are concrete and further clarify the scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear guidance on choosing between the two actions: 'update' by passport id and 'update_by_serial' by your own serial. It explains the serial-uniqueness caveat within a GTIN and the 409 ambiguous_serial error, advising to pass `gtin` or use update by id. However, it does not explicitly compare this tool to sibling tools or state when to prefer this over them.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tracepass_passport_partiesTracePass passport partiesAIdempotentInspect
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.
Actions (pass via action, with args):
set — args: { id, role, legalName, gln?, country?, legacyOperatorId? }. Sets or updates one role.
remove — args: { id, role }. Clears one role.
| Name | Required | Description | Default |
|---|---|---|---|
| args | No | Arguments for the chosen action; required fields depend on `action`. | |
| action | Yes | Set (add/replace) or remove an economic-operator party on a passport by its role. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | The resource's TracePass id, when the response is a single entity. |
| page | No | Current page number (list actions). |
| error | No | Machine-readable error code, when the API rejected the request. |
| items | No | The page of results, when the action is a list. |
| limit | No | Page size (list actions). |
| total | No | Total matching records across all pages (list actions). |
| result | No | Wraps a non-object response body (e.g. a QR code string). |
| message | No | Human-readable error or status detail, when present. |
| totalPages | No | Total number of pages (list actions). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the idempotentHint annotation, the description adds behavioral context: 'set' adds/replaces one role, 'remove' clears one role, and parties ideally carry a validated GLN. It does not contradict annotations and provides useful detail about how each action behaves.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact, front-loaded with purpose, and uses a clean bullet structure for actions. Every sentence adds meaningful information with no redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers both actions, their required arguments, and the domain concept of economic-operator parties. Given the output schema exists and annotations declare idempotency, the description is sufficiently complete, though it does not discuss validation failure or edge-case behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds value by grouping parameters per action (set includes legalName, gln, country, legacyOperatorId; remove only id and role) and by highlighting the validated 13-digit GLN requirement that is not in the schema description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool manages economic-operator parties on a passport, lists the specific roles, and distinguishes it from sibling tools like passport_fields or passports. The verb 'manage' paired with the resource and action definitions leaves no ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly shows when to use set vs remove actions and their required args, providing clear operational context. It does not mention alternatives or exclusions relative to sibling tools, but the action-based instructions are sufficient for most use cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tracepass_passportsTracePass passportsAInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| args | No | Arguments for the chosen action; required fields depend on `action` (see each action above). | |
| action | Yes | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | The resource's TracePass id, when the response is a single entity. |
| page | No | Current page number (list actions). |
| error | No | Machine-readable error code, when the API rejected the request. |
| items | No | The page of results, when the action is a list. |
| limit | No | Page size (list actions). |
| total | No | Total matching records across all pages (list actions). |
| result | No | Wraps a non-object response body (e.g. a QR code string). |
| message | No | Human-readable error or status detail, when present. |
| totalPages | No | Total number of pages (list actions). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses critical behavioral traits beyond the idempotentHint annotation: create is billable and may return 402, archive permanently 404s the QR, serials are only unique within a GTIN and trigger 409 errors, and registry_readiness is only a formal check not substantive compliance. These are non-obvious, high-impact details not visible in annotations or schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but well-structured: a short intro, a prominent billing/irreversibility warning, then a bullet-style action list with inline args and notes. Each sentence serves a purpose, and critical warnings are front-loaded before the action list. Despite the length, it is easy to scan and reference.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 12 actions, nested args, multiple enums, and high-stakes side effects, the description covers all bases: read vs write actions, per-action parameter requirements, error conditions (402, 409), and the distinction between registry readiness and compliance. The presence of an output schema for each action likely completes the picture, but the description alone is already thorough.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Though schema coverage is 100%, the description adds significant semantic value: it clarifies that `confirmOverage` must only be true after explicit user consent, that `format` values differ by action (summary/full vs svg/png), that `status` is an enum with exact values, and that `gtin` resolves ambiguous_serial. These enrich the schema definitions with usage context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a clear verb+resource statement: 'Manage Digital Product Passports — create, read, and run lifecycle actions.' It then enumerates 12 specific actions with distinct purposes, effectively distinguishing this tool from siblings like tracepass_products (products) and tracepass_epcis (event data). No ambiguity about scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit guidance on when to use each action, including when to avoid certain ones: 'archive is IRREVERSIBLE... prefer suspend when a change might be undone.' It also explains when to pass `gtin` to resolve ambiguous serials, and warns about the billing implications of `create`. This goes well beyond basic context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tracepass_productsTracePass productsAInspect
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.
Actions (pass via action, with args):
list — args: { page?, limit? (≤100), category?, status?, search? }. Read-only.
get — args: { id }. Read-only.
create — args: { name, model, category, description? }.
categoryis one of: battery, textile, electronics, construction, steel, chemicals, packaging, furniture, tyres, jewelry, toys, fmcg.update — args: { id, name?, model?, description? }; pass at least one field to change.
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).
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.
| Name | Required | Description | Default |
|---|---|---|---|
| args | No | Arguments for the chosen action; required fields depend on `action` (see each action above). | |
| action | Yes | Which product operation to run: list | get | create | create_batch | update | archive. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | The resource's TracePass id, when the response is a single entity. |
| page | No | Current page number (list actions). |
| error | No | Machine-readable error code, when the API rejected the request. |
| items | No | The page of results, when the action is a list. |
| limit | No | Page size (list actions). |
| total | No | Total matching records across all pages (list actions). |
| result | No | Wraps a non-object response body (e.g. a QR code string). |
| message | No | Human-readable error or status detail, when present. |
| totalPages | No | Total number of pages (list actions). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite minimal annotations (only idempotentHint=false), the description discloses important behaviors: list/get are read-only, create_batch has partial success with per-item status and consumes N writes upfront with 429 on daily cap, and archive is soft, reversible, and blocked with 409 when referenced by non-archived passports. This exceeds typical transparency expectations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a clear opening, a contextual paragraph, and bulleted actions. Each sentence adds value—no fluff. The format is scannable and information-dense without being verbose, earning a high score.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is complex with six actions and nested args, but the description covers every action's arguments, constraints, error conditions, and edge cases (partial success, rate limit, conflict). Presence of an output schema means return-value details are not needed. Sibling context and annotations are adequately supplemented.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds meaningful semantics beyond the schema: category enum values, update requiring at least one field, batch element structure, and list filters. It also clarifies constraints like limit ≤100 and page numbering, which the schema describes but the description reinforces for usability.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Manage the TracePass product catalogue' and clearly defines the product as the catalogue layer, distinguishing it from passports and other sibling tools. It enumerates six specific actions with their arguments, making the tool's purpose and scope unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context on when to use this tool ('Manage the TracePass product catalogue') and explains the relationship to passports, implying use for catalogue-level operations. It does not explicitly name alternative tools for exclusion, but the product/passport distinction provides sufficient guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tracepass_templatesTracePass DPP templates (regulatory schemas)ARead-onlyIdempotentInspect
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.
Actions (pass via action, with args):
list — args: {}. Lists all 12 categories with their field count, required-field count, and governing regulation (name + number + effective/mandatory dates).
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.
categoryis one of: battery, textile, electronics, construction, steel, chemicals, packaging, furniture, tyres, jewelry, toys, fmcg.
BATTERY — required-ness is per-category, so required alone is the wrong answer. Resolve it in this order:
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.
Then
requiredBy[batteryCategory]where the field carries that map (required | conditional | notApplicable).Then fall back to
required. The map is keyed ONLY by the three in-scope categories, so skipping step 1 falls through torequiredand 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.
| Name | Required | Description | Default |
|---|---|---|---|
| args | No | Arguments for the chosen action; `category` is required for get, ignored for list. | |
| action | Yes | List all DPP category templates, or get one template by category. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | The resource's TracePass id, when the response is a single entity. |
| page | No | Current page number (list actions). |
| error | No | Machine-readable error code, when the API rejected the request. |
| items | No | The page of results, when the action is a list. |
| limit | No | Page size (list actions). |
| total | No | Total matching records across all pages (list actions). |
| result | No | Wraps a non-object response body (e.g. a QR code string). |
| message | No | Human-readable error or status detail, when present. |
| totalPages | No | Total number of pages (list actions). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint/idempotentHint annotations, the description adds substantial behavioral detail: the battery-specific resolution order, the warning that using `required` without checking scope invents obligations, and the mutually exclusive EV/LMT field sets. This goes far beyond what annotations alone convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but well-structured: a lead purpose sentence, a clear action breakdown, and a focused battery caveat. Every sentence carries meaningful constraints or guidance, and the critical battery logic is visually separated. It is dense but appropriate for the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Combined with the rich input schema, output schema, and annotations, the description is complete: it covers scope, all categories, action-specific behavior, and the most confusing edge case (battery). It even references governing regulations and dates, leaving little ambiguity for an agent selecting or invoking this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the description adds semantic depth by explaining the action/args passing pattern and elaborating on the meaning of `category` (including the full enum and battery-specific resolution logic). It slightly duplicates what the schema already states, so it does not reach 5, but it does exceed the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies this as a read-only discovery tool for regulatory DPP templates, with a specific verb ('Discover') and resource ('regulatory field schema for each DPP category'). It distinguishes itself from siblings (e.g., tracepass_passports, tracepass_products) by focusing on compliance requirements and template-level reference data.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides clear usage context: 'Use this to advise on requirements before creating products/passports, and to gap-check a draft against the rules.' This tells the agent when to consult the tool, though it does not explicitly name sibling tools as alternatives or state when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
6 tool updates
v1.7.3- Changed
tracepass_epcis7 fields changed- added
Input schema / properties / action / descriptionAdded value: +"EPCIS 2.0: export a passport's events (export | export_by_serial), capture new events, poll a capture job, or query events." - changed
Input schema / properties / action / enumPrevious value: -[ - "export", - "capture", - "capture_job", - "query" -]New value: +[ + "export", + "export_by_serial", + "capture", + "capture_job", + "query" +] - removed
Input schema / properties / args / additionalPropertiesRemoved value: -{} - changed
Input schema / properties / args / descriptionPrevious value: -"Action-specific arguments — see the description."New value: +"Arguments for the chosen action; required fields depend on `action`." - added
Input schema / properties / args / propertiesAdded value: +{ + "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" + } +} - removed
Input schema / properties / args / propertyNamesRemoved value: -{ - "type": "string" -} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$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" +}
- Changed
tracepass_passport_fields7 fields changed- added
Input schema / properties / action / descriptionAdded value: +"Update one passport field, addressed by passport id (update) or by your serial (update_by_serial)." - changed
Input schema / properties / action / enumPrevious value: -[ - "update" -]New value: +[ + "update", + "update_by_serial" +] - removed
Input schema / properties / args / additionalPropertiesRemoved value: -{} - changed
Input schema / properties / args / descriptionPrevious value: -"Action-specific arguments — see the description."New value: +"Arguments for the chosen action; required fields depend on `action`." - added
Input schema / properties / args / propertiesAdded value: +{ + "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." + } +} - removed
Input schema / properties / args / propertyNamesRemoved value: -{ - "type": "string" -} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$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" +}
- Changed
tracepass_passport_parties6 fields changed- added
Input schema / properties / action / descriptionAdded value: +"Set (add/replace) or remove an economic-operator party on a passport by its role." - removed
Input schema / properties / args / additionalPropertiesRemoved value: -{} - changed
Input schema / properties / args / descriptionPrevious value: -"Action-specific arguments — see the description."New value: +"Arguments for the chosen action; required fields depend on `action`." - added
Input schema / properties / args / propertiesAdded value: +{ + "country": { + "description": "Party country code (set, optional).", + "type": "string" + }, + "gln": { + "description": "GS1 Global Location Number for the party (set, optional).", + "type": "string" + }, + "id": { + "description": "Passport id (required).", + "type": "string" + }, + "legacyOperatorId": { + "description": "Your internal operator id for the party (set, optional).", + "type": "string" + }, + "legalName": { + "description": "Party legal name. Required for set.", + "type": "string" + }, + "role": { + "description": "Economic-operator role, e.g. manufacturer | importer | distributor | authorised_representative (required).", + "type": "string" + } +} - removed
Input schema / properties / args / propertyNamesRemoved value: -{ - "type": "string" -} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$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" +}
- Changed
tracepass_passports7 fields changed- added
Input schema / properties / action / descriptionAdded value: +"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." - changed
Input schema / properties / action / enumPrevious value: -[ - "list", - "get", - "get_by_serial", - "create", - "suspend", - "archive", - "get_qr" -]New value: +[ + "list", + "get", + "get_by_serial", + "compliance", + "registry_readiness", + "create", + "suspend", + "suspend_by_serial", + "archive", + "archive_by_serial", + "get_qr", + "get_qr_by_serial" +] - removed
Input schema / properties / args / additionalPropertiesRemoved value: -{} - changed
Input schema / properties / args / descriptionPrevious value: -"Action-specific arguments — see the description for each action's shape."New value: +"Arguments for the chosen action; required fields depend on `action` (see each action above)." - added
Input schema / properties / args / propertiesAdded value: +{ + "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" + }, + "gtin": { + "description": "GTIN disambiguator for *_by_serial actions when a serial isn't unique across GTINs (else 409 ambiguous_serial).", + "type": "string" + }, + "id": { + "description": "Passport id. Required for get/compliance/create-result/suspend/archive/get_qr (the by-id actions).", + "type": "string" + }, + "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" + }, + "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. Required for create.", + "type": "string" + }, + "status": { + "description": "Filter list by status: draft|in_review|approved|published|suspended|expired|archived.", + "type": "string" + } +} - removed
Input schema / properties / args / propertyNamesRemoved value: -{ - "type": "string" -} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$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" +}
- Changed
tracepass_products7 fields changed- added
Input schema / properties / action / descriptionAdded value: +"Which product operation to run: list | get | create | create_batch | update | archive." - changed
Input schema / properties / action / enumPrevious value: -[ - "list", - "get", - "create", - "update" -]New value: +[ + "list", + "get", + "create", + "create_batch", + "update", + "archive" +] - removed
Input schema / properties / args / additionalPropertiesRemoved value: -{} - changed
Input schema / properties / args / descriptionPrevious value: -"Action-specific arguments — see the description for each action's shape."New value: +"Arguments for the chosen action; required fields depend on `action` (see each action above)." - added
Input schema / properties / args / propertiesAdded value: +{ + "category": { + "description": "DPP category for create: battery | textile | electronics | construction | steel | chemicals | 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" + } +} - removed
Input schema / properties / args / propertyNamesRemoved value: -{ - "type": "string" -} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$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" +}
- Changed
tracepass_templates6 fields changed- added
Input schema / properties / action / descriptionAdded value: +"List all DPP category templates, or get one template by category." - removed
Input schema / properties / args / additionalPropertiesRemoved value: -{} - changed
Input schema / properties / args / descriptionPrevious value: -"Action-specific arguments — see the description for each action's shape."New value: +"Arguments for the chosen action; `category` is required for get, ignored for list." - added
Input schema / properties / args / propertiesAdded value: +{ + "category": { + "description": "DPP category to fetch (required for get): battery | textile | electronics | construction | steel | chemicals | packaging | furniture | tyres | jewelry | toys | fmcg.", + "type": "string" + } +} - removed
Input schema / properties / args / propertyNamesRemoved value: -{ - "type": "string" -} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$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" +}
6 tool updates
v1.1.4- First observed
tracepass_epcis - First observed
tracepass_passport_fields - First observed
tracepass_passport_parties - First observed
tracepass_passports - First observed
tracepass_products - First observed
tracepass_templates
TDQS
Each tool targets a distinct domain: passports, products, passport fields, parties, EPCIS events, and templates. Even within passports, actions like compliance and get_qr are clearly separated from basic CRUD, and _by_serial variants are explicitly scoped to avoid ambiguity.
All tools follow the consistent pattern tracepass_<resource> with snake_case, and actions use predictable verb prefixes (list, get, create, update, archive, etc.). The naming is uniform and easily navigable.
Six tools is within the ideal 3-15 range, and each tool addresses a clear functional area of DPP management. The count feels neither bloated nor sparse for the server's purpose.
The surface covers the core DPP workflow: product CRUD, passport lifecycle (create/read/suspend/archive), field updates, party management, EPCIS capture/query/export, and regulatory schema reference. Minor gaps exist, such as no explicit reactivation from suspension and immutable passport-level metadata, but these are likely intentional design constraints.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
MCP server for Boson Protocol — on-chain agentic commerce for physical & digital goods.
MCP server for Product Management
MCP Server for agents to onboard, pay, and provision services autonomously with InFlow
MCP server for verifying EUDI/Talao wallet data via OIDC4VP (pull) for AI agents.
Related MCP Servers
- AlicenseAqualityAmaintenanceModel Context Protocol (MCP) server for French Electronic Invoicing (NF XP Z12-013). Provide tools to validate, generate, and explore API specifications for PDP/OD interoperability.34Apache 2.0
- AlicenseNot gradedqualityCmaintenanceProvides a sovereign, MIT-licensed MCP server for professional-service workflows, running entirely on your infrastructure with Ed25519 cryptographic signing for every action.MIT
- AlicenseNot gradedqualityDmaintenanceA hosted remote MCP server for verifying C2PA intakes, classifying source risk, issuing media receipts, and exporting intake logs. Designed for AI governance, trust and safety, and compliance teams.MIT
- AlicenseAqualityAmaintenanceMCP server for GoCertius: certified evidence, dossiers, notifications and chats via AI agents.41115MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/malinoto/tracepass-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server