Skip to main content
Glama
malinoto

tracepass-mcp-server

by malinoto

TracePass MCP Server

Listed on Glama

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:

  1. Hosted — point your MCP client at https://ai.tracepass.eu/mcp. Nothing to install; always current.

  2. Local (npm) — run tracepass-mcp-server via npx. 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 tp_… key as a Bearer token

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.

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

tracepass_products

list, get, create, create_batch, update, archive

tracepass_passports

list, get, get_by_serial, compliance, registry_readiness, create, suspend, suspend_by_serial, archive, archive_by_serial, get_qr, get_qr_by_serial

tracepass_passport_fields

update, update_by_serial

tracepass_passport_parties

set, remove

tracepass_epcis

export, export_by_serial, capture, capture_job, query

tracepass_templates

list, get

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_passports create consumes 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 with args.confirmOverage: true after the user agrees.

  • tracepass_passports archive is irreversible — the public QR permanently 404s. Use suspend (reversible) when a change might be undone.

  • tracepass_epcis capture / query require the paid EPCIS add-on; export is included on Starter plans and up.

Resources

Read-only entity data you can attach as conversation context:

  • tracepass://products — the product catalogue

  • tracepass://product/{id} — one product

  • tracepass://passport/{id} — one passport, full field detail

  • tracepass://passport/{id}/epcis — a passport's EPCIS 2.0 events

  • tracepass://passport/{id}/compliance — a passport's compliance verdict

  • tracepass://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 schemas

  • tracepass://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 readiness

  • onboard_product — create a product and its first passport

  • explain_dpp_requirements — explain what a category's compliant DPP must contain, and the regulation behind each field

  • compliance_gap_check — produce a prioritised, regulation-cited list of what's blocking a passport's compliant publication

  • review_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 locally

The 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:

TracePass MCP server

License

MIT

Available Tools

6 tools
tracepass_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 }. events is 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? }. params is a key/value map of standard EPCIS query parameters (EQ_bizStep, GE_eventTime, MATCH_epc, …). Read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
argsNoArguments for the chosen action; required fields depend on `action`.
actionYesEPCIS 2.0: export a passport's events (export | export_by_serial), capture new events, poll a capture job, or query events.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNoThe resource's TracePass id, when the response is a single entity.
pageNoCurrent page number (list actions).
errorNoMachine-readable error code, when the API rejected the request.
itemsNoThe page of results, when the action is a list.
limitNoPage size (list actions).
totalNoTotal matching records across all pages (list actions).
resultNoWraps a non-object response body (e.g. a QR code string).
messageNoHuman-readable error or status detail, when present.
totalPagesNoTotal number of pages (list actions).

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 fieldsA
Idempotent
Inspect

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 }. value type 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
argsNoArguments for the chosen action; required fields depend on `action`.
actionYesUpdate one passport field, addressed by passport id (update) or by your serial (update_by_serial).

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNoThe resource's TracePass id, when the response is a single entity.
pageNoCurrent page number (list actions).
errorNoMachine-readable error code, when the API rejected the request.
itemsNoThe page of results, when the action is a list.
limitNoPage size (list actions).
totalNoTotal matching records across all pages (list actions).
resultNoWraps a non-object response body (e.g. a QR code string).
messageNoHuman-readable error or status detail, when present.
totalPagesNoTotal number of pages (list actions).

TDQS

A4.6/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 partiesA
Idempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
argsNoArguments for the chosen action; required fields depend on `action`.
actionYesSet (add/replace) or remove an economic-operator party on a passport by its role.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNoThe resource's TracePass id, when the response is a single entity.
pageNoCurrent page number (list actions).
errorNoMachine-readable error code, when the API rejected the request.
itemsNoThe page of results, when the action is a list.
limitNoPage size (list actions).
totalNoTotal matching records across all pages (list actions).
resultNoWraps a non-object response body (e.g. a QR code string).
messageNoHuman-readable error or status detail, when present.
totalPagesNoTotal number of pages (list actions).

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
argsNoArguments for the chosen action; required fields depend on `action` (see each action above).
actionYesWhich 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

ParametersJSON Schema
NameRequiredDescription
idNoThe resource's TracePass id, when the response is a single entity.
pageNoCurrent page number (list actions).
errorNoMachine-readable error code, when the API rejected the request.
itemsNoThe page of results, when the action is a list.
limitNoPage size (list actions).
totalNoTotal matching records across all pages (list actions).
resultNoWraps a non-object response body (e.g. a QR code string).
messageNoHuman-readable error or status detail, when present.
totalPagesNoTotal number of pages (list actions).

TDQS

A5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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? }. category is 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
argsNoArguments for the chosen action; required fields depend on `action` (see each action above).
actionYesWhich product operation to run: list | get | create | create_batch | update | archive.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNoThe resource's TracePass id, when the response is a single entity.
pageNoCurrent page number (list actions).
errorNoMachine-readable error code, when the API rejected the request.
itemsNoThe page of results, when the action is a list.
limitNoPage size (list actions).
totalNoTotal matching records across all pages (list actions).
resultNoWraps a non-object response body (e.g. a QR code string).
messageNoHuman-readable error or status detail, when present.
totalPagesNoTotal number of pages (list actions).

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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)A
Read-onlyIdempotent
Inspect

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. category is 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:

  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.

  2. Then requiredBy[batteryCategory] where the field carries that map (required | conditional | notApplicable).

  3. Then fall back to required. The 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
argsNoArguments for the chosen action; `category` is required for get, ignored for list.
actionYesList all DPP category templates, or get one template by category.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNoThe resource's TracePass id, when the response is a single entity.
pageNoCurrent page number (list actions).
errorNoMachine-readable error code, when the API rejected the request.
itemsNoThe page of results, when the action is a list.
limitNoPage size (list actions).
totalNoTotal matching records across all pages (list actions).
resultNoWraps a non-object response body (e.g. a QR code string).
messageNoHuman-readable error or status detail, when present.
totalPagesNoTotal number of pages (list actions).

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

  1. 6 tool updatesv1.7.3
    • Changedtracepass_epcis7 fields changed
      • addedInput schema / properties / action / description
        Added value: +"EPCIS 2.0: export a passport's events (export | export_by_serial), capture new events, poll a capture job, or query events."
      • changedInput schema / properties / action / enum
        Previous value: -[
        -  "export",
        -  "capture",
        -  "capture_job",
        -  "query"
        -]New value: +[
        +  "export",
        +  "export_by_serial",
        +  "capture",
        +  "capture_job",
        +  "query"
        +]
      • removedInput schema / properties / args / additionalProperties
        Removed value: -{}
      • changedInput schema / properties / args / description
        Previous value: -"Action-specific arguments — see the description."New value: +"Arguments for the chosen action; required fields depend on `action`."
      • addedInput schema / properties / args / properties
        Added 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"
        +  }
        +}
      • removedInput schema / properties / args / propertyNames
        Removed value: -{
        -  "type": "string"
        -}
      • changedOutput 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"
        +}
    • Changedtracepass_passport_fields7 fields changed
      • addedInput schema / properties / action / description
        Added value: +"Update one passport field, addressed by passport id (update) or by your serial (update_by_serial)."
      • changedInput schema / properties / action / enum
        Previous value: -[
        -  "update"
        -]New value: +[
        +  "update",
        +  "update_by_serial"
        +]
      • removedInput schema / properties / args / additionalProperties
        Removed value: -{}
      • changedInput schema / properties / args / description
        Previous value: -"Action-specific arguments — see the description."New value: +"Arguments for the chosen action; required fields depend on `action`."
      • addedInput schema / properties / args / properties
        Added 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."
        +  }
        +}
      • removedInput schema / properties / args / propertyNames
        Removed value: -{
        -  "type": "string"
        -}
      • changedOutput 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"
        +}
    • Changedtracepass_passport_parties6 fields changed
      • addedInput schema / properties / action / description
        Added value: +"Set (add/replace) or remove an economic-operator party on a passport by its role."
      • removedInput schema / properties / args / additionalProperties
        Removed value: -{}
      • changedInput schema / properties / args / description
        Previous value: -"Action-specific arguments — see the description."New value: +"Arguments for the chosen action; required fields depend on `action`."
      • addedInput schema / properties / args / properties
        Added 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"
        +  }
        +}
      • removedInput schema / properties / args / propertyNames
        Removed value: -{
        -  "type": "string"
        -}
      • changedOutput 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"
        +}
    • Changedtracepass_passports7 fields changed
      • addedInput schema / properties / action / description
        Added 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."
      • changedInput schema / properties / action / enum
        Previous 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"
        +]
      • removedInput schema / properties / args / additionalProperties
        Removed value: -{}
      • changedInput schema / properties / args / description
        Previous 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)."
      • addedInput schema / properties / args / properties
        Added 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"
        +  }
        +}
      • removedInput schema / properties / args / propertyNames
        Removed value: -{
        -  "type": "string"
        -}
      • changedOutput 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"
        +}
    • Changedtracepass_products7 fields changed
      • addedInput schema / properties / action / description
        Added value: +"Which product operation to run: list | get | create | create_batch | update | archive."
      • changedInput schema / properties / action / enum
        Previous value: -[
        -  "list",
        -  "get",
        -  "create",
        -  "update"
        -]New value: +[
        +  "list",
        +  "get",
        +  "create",
        +  "create_batch",
        +  "update",
        +  "archive"
        +]
      • removedInput schema / properties / args / additionalProperties
        Removed value: -{}
      • changedInput schema / properties / args / description
        Previous 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)."
      • addedInput schema / properties / args / properties
        Added 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"
        +  }
        +}
      • removedInput schema / properties / args / propertyNames
        Removed value: -{
        -  "type": "string"
        -}
      • changedOutput 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"
        +}
    • Changedtracepass_templates6 fields changed
      • addedInput schema / properties / action / description
        Added value: +"List all DPP category templates, or get one template by category."
      • removedInput schema / properties / args / additionalProperties
        Removed value: -{}
      • changedInput schema / properties / args / description
        Previous 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."
      • addedInput schema / properties / args / properties
        Added value: +{
        +  "category": {
        +    "description": "DPP category to fetch (required for get): battery | textile | electronics | construction | steel | chemicals | packaging | furniture | tyres | jewelry | toys | fmcg.",
        +    "type": "string"
        +  }
        +}
      • removedInput schema / properties / args / propertyNames
        Removed value: -{
        -  "type": "string"
        -}
      • changedOutput 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"
        +}
  2. 6 tool updatesv1.1.4
    • First observedtracepass_epcis
    • First observedtracepass_passport_fields
    • First observedtracepass_passport_parties
    • First observedtracepass_passports
    • First observedtracepass_products
    • First observedtracepass_templates

TDQS

A4.7/5.0
Disambiguation5/5

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.

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness4/5

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

ActivityActive
ResponsivenessNo issues

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

Related MCP Servers

Latest Blog Posts

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