org.ptpge/mcp-server
Measured conclusion: Deep-tested. L2 outcome: tools_ok.
The open vocabulary of print for AI agents: terms, product envelopes, validation, fingerprint.
| Author | org.ptpge |
|---|---|
| Access | remote |
| Publisher key required | No |
| Measured state | Deep-tested |
| L1 liveness | alive |
| L1 latency | 358 ms |
| Last measured | 2026-10-24 |
Add to your agent
Copy this into your MCP client config:
{
"mcpServers": {
"mcp-server": {
"url": "https://mcp.ptpge.org/mcp",
"transport": "streamable-http"
}
}
}
Measured tools (11)
ptpge_search_termsread-onlyFree-text search over the PTPGE vocabulary and registers — the open specification of print. Returns a ranked list of matching terms with their URI, notation, preferred label, level (top-concept / group / category / sub-category / element), group, and a relevance score (0.0–1.0).
Parameters:
query(required) — string — Free-text query. Matched against notation, label, altLabels, and definition.limit— integer — Maximum number of results to return.groups— array — Optional filter by group code(s), e.g. ["substrates", "configurations"]. Omit for all groups.language— string — ISO 639-1 language code for label and definition matching.query_language— string — ISO 639-1 code for the language the QUERY is written in — not the language of the labels you want back (that is `language`). Optional, and it never changes the results: search always looks across every language. It is used only so that a phrase we cannot resolve is recorded against the right market, which is how missing synonyms get found and added. Send it if you know it; omit it if you do not.include_deprecated— boolean — Also return deprecated terms (they still resolve by URI but are no longer vocabulary). Default false: a brand name resolves to its register entry (kind=supplier) instead of the retired term.
Hints: read-only yes · destructive no · idempotent yes · open-world no
ptpge_get_termread-onlyFetch full context for a single PTPGE term: definition, broader/narrower relations, exactMatch / closeMatch mappings, properties, notation, level, and metadata. Accepts either a full URI (https://ptpge.org/v1/...) or a relative path under /v1/.
Parameters:
id_or_path(required) — string — Full URI or relative path under /v1/. E.g. 'printing/configurations/formats/a-series/a4'.language— string — ISO 639-1 language code for which label and definition variants to return flat.
Hints: read-only yes · destructive no · idempotent yes · open-world no
ptpge_get_versionread-onlyReturn the current PTPGE dataset version, total term count, counts per level and per group, license, scheme URL, and server version. Useful for version-pinning, health checks, and diagnostics.
Hints: read-only yes · destructive no · idempotent yes · open-world no
ptpge_browseread-onlyNavigate the PTPGE hierarchy. Returns a node and its children (id, notation, label, level, elementType, hasChildren). Omit id_or_path to get the three top concepts (printing, ordering, variables). Use this for systematic exploration instead of guessing search keywords.
Parameters:
language— stringid_or_path— string — Full URI or path under /v1/. Omit for the top concepts.
Hints: read-only yes · destructive no · idempotent yes · open-world no
ptpge_get_product_enveloperead-onlyReturn the complete Configuration Envelope of a product class in one call: supportsSetupModel, every supports* and perSurfaceSupports* predicate with resolved labels, plus typical* descriptors. This is the full menu of what can be configured for the product — use it before composing a configuration, instead of many individual ptpge_get_term calls. Absent predicates mean NOT supported (closed semantics).
Parameters:
id_or_path(required) — string — Product URI or path, e.g. 'ordering/products/brochures'.language— string
Hints: read-only yes · destructive no · idempotent yes · open-world no
ptpge_validate_configread-onlyEnvelope validation of a product configuration against the specification: checks every binding against the product's supports* envelopes. When a value is not in this template's envelope but another template takes every bound value, the result carries alsoOfferedBy (ranked) and switchHint — switch product and validate again rather than dropping what the buyer asked for (a poster on aluminium composite is a panel print). Maps numeric substrate-weight (gsm) to its weight band via the bands' minWeight/maxWeight properties, and returns data-driven advisories (e.g. creasing recommended above the scoring thresholds). NOTE: this validates the ENVELOPE only — cross-variable legality (e.g. valid panel counts per fold topology) and vendor capability matching are an implementation's concern (a configurator), not the specification's; commercial values (date, price) are not configuration and belong to the transaction layer. Elicitation contract (shared by every ptpge_* tool): whenever a result carries `needs_disambiguation`, each entry has a `field`, a `question` that MUST be put to the user verbatim, and `candidates` — never infer the answer, never fingerprint until it is resolved. SD-0083: the validator also checks completeness — a missing REQUIRED axis of the product (setup/fold, format, page count, binding, colour on the first face, shape where shape is the product) returns needs_disambiguation with the envelope's candidates; a required axis with exactly one allowed value is bound for you as envelope-implied; a surface name that is not a face of the bound setup (faces: flat-sheet front/back, folded-sheet outside/inside, multi-page front-cover…back-cover) is rejected with the allowed faces. `complete: true` means an identity can be issued. SD-0104 spot inks: a spot-color layer in color-mode is not identified until it is named — bind variables/features/spot-ink on the same face with the value <matching-system term>/<code>: Pantone 300 C → printing/standards/color-systems/color-matching-systems/pantone-matching-system/300-c, HKS 43 K → …/color-matching-systems/hks/43-k, RAL 5015 → …/ral/5015 (code lower-case, spaces as hyphens; checked for form only). One spot-ink per spot-color layer; two spots = color-mode values [cmyk, spot-color, spot-color] + two spot-ink values. Fewer inks than layers → needs_disambiguation; the specification sets no limit on the number of spot colours (the press does).
Parameters:
product(required) — string — Product URI or path.bindings(required) — array — Variable bindings to validate.language— string
Hints: read-only yes · destructive no · idempotent yes · open-world no
ptpge_resolve_color_notationread-onlyResolve print colour pair notation (4/4, 4/1, 4+4) into per-surface colour bindings for a given product. The number is a COUNT OF SEPARATIONS, not a colour: it is resolved by searching the combinations this product's envelope actually supports whose colorChannelCount sums to that number. Returns one of three outcomes per surface — a deterministic binding, `needs_disambiguation` with the candidate combinations, or `invalid_for_template` when no combination is possible. IMPORTANT: when `needs_disambiguation` is returned you MUST put its `question` to the user and never infer the answer yourself. '1' is black on some products and a named spot colour on others; guessing gives two different products the same identity. Do not fingerprint an unresolved configuration.
Parameters:
product(required) — string — Product URI or path.notation(required) — string — Pair notation, e.g. '4/4', '4 / 1', '4+4'.setup— string — Optional setup-model URI/path (e.g. 'printing/configurations/setup-models/folded-sheet/tri-fold') so the surfaces match the fold. Required for products with several setups.language— stringsurfaces— array — Optional surface slugs in notation order. Without them the faces come from 'setup' (or the product's only setup): flat-sheet front/back, folded-sheet outside/inside, roll face/back (SD-0083).
Hints: read-only yes · destructive no · idempotent yes · open-world no
ptpge_fingerprintSide effect: the spec-profile fingerprint is registered in the public register at ptpge.org/f (no personal data; same configuration → same entry; cannot be undone). Compute the canonical ptpge-cfs/1 serialization and SHA-256 fingerprint of a resolved product configuration (SD-0040) — the vendor-neutral identity used as quote/order/cache key. Returns both profiles in strict containment spec ⊂ request: 'spec' = the manufacturable artifact, commercial cluster excluded; 'request' = spec plus the commercial cluster — the variables under variables/order/ (quantity, lead-time, delivery-method, incoterm; SD-0040) without a vendor. An 'offer' is a request plus variables/order/vendor, one per vendor (SD-0108). Transaction data (print-ready file, delivery date, price) is keyed BY the request fingerprint and never hashed into it. SD-0083: the input is validated first and an identity is issued ONLY for a valid, complete configuration — every required axis of the product bound (or envelope-implied where the envelope offers one value; those are written into the identity) and every surface one of the bound setup's faces. Otherwise the result is error=not_fingerprintable with the validator's needs_disambiguation: put each question to the user verbatim, bind the answer, call again. Never guess a missing axis.
Parameters:
product(required) — string — Product URI or path.bindings(required) — arrayvisuals— boolean — Also return markSvg (the ptpge-mark/1 recognition mark) and qrSvg (QR encoding the resolver permalink) per profile. Off by default to keep payloads small.
Hints: read-only no · destructive no · idempotent yes · open-world yes
ptpge_expand_fingerprintread-onlyExpand a spec or request fingerprint (ptpge-cfs/1, full 64-hex or 16-hex short form) back into its structured configuration — the read-back path for MIS/ERP: matched profile, product, every binding with resolved labels, the canonical string, and the dataset version. This is a LOOKUP in the public resolver (ptpge.org/f/), not an inversion of the hash: it resolves when the fingerprint has been registered (every fingerprint computed by ptpge_fingerprint is self-registered within seconds). An unregistered fingerprint is still a valid identity — it simply has no stored expansion yet; returns status 'unknown' then.
Parameters:
fingerprint(required) — string — SHA-256 hex (64) or the 16-hex short form, with or without the resolver URL prefix.language— string
Hints: read-only yes · destructive no · idempotent yes · open-world no
ptpge_check_domainread-onlyDoes an agent find PTPGE on this domain? Fetches exactly what a checkout agent fetches — https://<domain>/.well-known/ucp (the UCP manifest and its ptpge block), the vendor declaration at /.well-known/ptpge/declaration.json, the identity in the vendors register, and a supplier catalogue if the domain is a maker — and validates each against its published JSON Schema (ptpge.org/v1/schemas/) and the vocabulary. Returns a verdict (ready | partial | none), one line per step with errors and warnings, what the agent sees (name, identity, products, capability counts) and what is missing with where to fix it. Read-only; nothing is stored. Use it to answer 'is <printer> agent-ready?' or 'why does my declaration not validate?'.
Parameters:
domain(required) — string — A hostname or URL, e.g. trykkverk.no or https://trykkverk.no/.document— string — Optional: https URL of a declaration or catalogue hosted elsewhere than the known path (a register entry marked «hosted»).
Hints: read-only yes · destructive no · idempotent yes · open-world yes
ptpge_validate_documentread-onlyValidate ONE document you hand over — a vendor declaration, supplier catalogue, request, quote or UCP manifest (its `schema` field says which) — against the published JSON Schema, the vocabulary (every term URI must exist; deprecated warns) and, for request/1 and quote/1, the identity: the spec and request fingerprints are recomputed from the configuration and must match what the document states; a quote's offer fingerprint must equal request + the quote's vendor (SD-0108). Nothing is fetched from any domain and nothing is stored. This is the PTPGE Ready conformance check for a module that writes these documents (ptpge.org/ready/). Returns valid, errors[], warnings[] and what was checked.
Parameters:
document(required) — object — The document itself (JSON object with a `schema` field).
Hints: read-only yes · destructive no · idempotent yes · open-world yes
Measured by MCPYP probing. Untested fields are omitted, never estimated. Listing is always free; MCPYP never proxies calls or stores user tokens.