{"id":306032,"recorded_at":"2026-10-26T23:19:38.309278Z","observed_at":"2026-10-26T23:19:38.309196Z","subject_kind":"endpoint","subject":"694841f4-dbf4-4125-a4fb-355e1488ce98","kind":"mcp.tools","method":"probe.mcp/1","body":{"count":11,"tools":[{"description":"Navigate 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.","inputSchema":{"properties":{"id_or_path":{"description":"Full URI or path under /v1/. Omit for the top concepts.","type":"string"},"language":{"default":"en","type":"string"}},"required":[],"type":"object"},"name":"ptpge_browse"},{"description":"Does 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?'.","inputSchema":{"properties":{"document":{"description":"Optional: https URL of a declaration or catalogue hosted elsewhere than the known path (a register entry marked «hosted»).","type":"string"},"domain":{"description":"A hostname or URL, e.g. trykkverk.no or https://trykkverk.no/.","type":"string"}},"required":["domain"],"type":"object"},"name":"ptpge_check_domain"},{"description":"Expand 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.","inputSchema":{"properties":{"fingerprint":{"description":"SHA-256 hex (64) or the 16-hex short form, with or without the resolver URL prefix.","type":"string"},"language":{"default":"en","type":"string"}},"required":["fingerprint"],"type":"object"},"name":"ptpge_expand_fingerprint"},{"description":"Side 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.","inputSchema":{"properties":{"bindings":{"items":{"properties":{"ordered":{"type":"boolean"},"surface":{"type":"string"},"unit":{"description":"custom-width / custom-height only — converted to mm before the identity.","enum":["mm","cm","m","in","pt"],"type":"string"},"value":{"description":"URI/path or number."},"values":{"type":"array"},"variable":{"type":"string"}},"required":["variable"],"type":"object"},"type":"array"},"product":{"description":"Product URI or path.","type":"string"},"visuals":{"default":false,"description":"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.","type":"boolean"}},"required":["product","bindings"],"type":"object"},"name":"ptpge_fingerprint"},{"description":"Return 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).","inputSchema":{"properties":{"id_or_path":{"description":"Product URI or path, e.g. 'ordering/products/brochures'.","type":"string"},"language":{"default":"en","type":"string"}},"required":["id_or_path"],"type":"object"},"name":"ptpge_get_product_envelope"},{"description":"Fetch 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/.","inputSchema":{"properties":{"id_or_path":{"description":"Full URI or relative path under /v1/. E.g. 'printing/configurations/formats/a-series/a4'.","type":"string"},"language":{"default":"en","description":"ISO 639-1 language code for which label and definition variants to return flat.","type":"string"}},"required":["id_or_path"],"type":"object"},"name":"ptpge_get_term"},{"description":"Return 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.","inputSchema":{"properties":{},"required":[],"type":"object"},"name":"ptpge_get_version"},{"description":"Resolve 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.","inputSchema":{"properties":{"language":{"default":"en","type":"string"},"notation":{"description":"Pair notation, e.g. '4/4', '4 / 1', '4+4'.","type":"string"},"product":{"description":"Product URI or path.","type":"string"},"setup":{"description":"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.","type":"string"},"surfaces":{"description":"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).","items":{"type":"string"},"type":"array"}},"required":["product","notation"],"type":"object"},"name":"ptpge_resolve_color_notation"},{"description":"Free-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).","inputSchema":{"properties":{"groups":{"description":"Optional filter by group code(s), e.g. [\"substrates\", \"configurations\"]. Omit for all groups.","items":{"type":"string"},"type":"array"},"include_deprecated":{"default":false,"description":"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.","type":"boolean"},"language":{"default":"en","description":"ISO 639-1 language code for label and definition matching.","type":"string"},"limit":{"default":10,"description":"Maximum number of results to return.","maximum":100,"minimum":1,"type":"integer"},"query":{"description":"Free-text query. Matched against notation, label, altLabels, and definition.","type":"string"},"query_language":{"description":"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.","type":"string"}},"required":["query"],"type":"object"},"name":"ptpge_search_terms"},{"description":"Envelope 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).","inputSchema":{"properties":{"bindings":{"description":"Variable bindings to validate.","items":{"properties":{"provenance":{"description":"How this value came about (SD-0071): 'confirmed' — the buyer chose it; 'inferred' — you derived it without asking; 'policy-default' — a house rule supplied it. Never part of the fingerprint; identity is the product, not the conversation. Set it honestly: a vendor may refuse an order whose colour was never confirmed.","enum":["confirmed","inferred","policy-default","envelope-implied"],"type":"string"},"surface":{"description":"Surface slug for surface-scoped bindings (e.g. 'outside').","type":"string"},"unit":{"description":"custom-width / custom-height only: the unit the value is stated in. Converted to mm before validation and identity (the identity is always mm).","enum":["mm","cm","m","in","pt"],"type":"string"},"value":{"description":"URI/path (enum) or number (numeric variables)."},"values":{"description":"For cardinality-multiple variables.","type":"array"},"variable":{"description":"Variable URI or path, e.g. 'variables/configuration/format'.","type":"string"}},"required":["variable"],"type":"object"},"type":"array"},"language":{"default":"en","type":"string"},"product":{"description":"Product URI or path.","type":"string"}},"required":["product","bindings"],"type":"object"},"name":"ptpge_validate_config"},{"description":"Validate 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.","inputSchema":{"properties":{"document":{"description":"The document itself (JSON object with a `schema` field).","type":"object"}},"required":["document"],"type":"object"},"name":"ptpge_validate_document"}]},"body_sha256":"6c2080f0ae934a1acedcdea6b256099541ef0d87048e0463b3ee0bd01dff7ef4","prev_id":null,"leaf":"0x853db7be5d85f0e9d11de33495863f8d7f49caeab52adca67af32b740df645e3","leaf_text":"{\"body\":\"6c2080f0ae934a1acedcdea6b256099541ef0d87048e0463b3ee0bd01dff7ef4\",\"id\":306032,\"kind\":\"mcp.tools\",\"method\":\"probe.mcp/1\",\"observed_us\":1793056778309196,\"prev\":null,\"subject\":\"694841f4-dbf4-4125-a4fb-355e1488ce98\",\"subject_kind\":\"endpoint\"}","day":{"day":"2026-10-26","leaves":296695,"root":"0xf43e8dcc3d451a4788b26be904c55e8c4c0fa75c9666796c51db38d37e2c0df8","chained":"0x702d5ac508f08b0d1accf36af25822d8e5660367494edd17a642fb61e158a57a","anchor_chain":"eip155:5042002","anchor_tx":"0x495162f8936e19f0039918feebe6c307f327cd6bf8c37219620b1970041fa9ae","anchor_block":69251483},"proof":["0x853d9548105dbcdd21f61cc4adf3b07eec0836b9a5d33c3bbfdb7b79e3e8d5c9","0x21b43c3a7bfe7a4e492c060006a5f7a602da508bcb023ba05d77cb7ffeaba3bc","0x06ebc651b0725c3fea26d0c5cb04177a1ae78c077d00721026fa10a39b60ca45","0x76dbe48174e51a830de5e12980b51a221ffff479ae8b3fbd892debdddf8ad392","0x67ddcb1971189ee3ca35fdff24dcc6115c64c75c7abd9e595ed3f9dc3c5b8aed","0xc2e5d38724ae9f061982de606529ea822ccd265792510aed8cfa687c7df21c7e","0x756d5656b6e79d3e6a3e7a4d004c9ae85ad634e418062c4bfb97685bfeb17cf6","0xca7d5673e948641678afca09cf314dea22f14cc709af0674cf146d69992a5354","0x58b7ee5b62b8ee6a0b2f7bc8a51622b7fa7a224885c3d1c4f768751b5f3bbec8","0x57cf22ad94c4fd01cd46cc494037c1e1c1e5762f276a703f5e957ef32ad4aa0a","0x147021357b2eb773d60db74f751316bfd367b06080320d378c0c402240e98d59","0x146f43471a3bde6d8a04e87b6afd3ee6860c6e38a009f86aee705ce722b67748","0x91c2ae93ec20c7fed5088112fe3941ca622dfb3f8f1022c4844726c361244bd4","0x0eff463856b0992d53ab7d8c0b97c71541413358bdd445710c1e4b6aeb4d8f78","0x7eb603d37f0f22dae1ea013e391889906ffc0139ff26e25b044bee38eec8f9b2","0x2b6e23e3624a1b66e1d2298cfbce99a93ce6b13d24a58112a71802d79c5f7a76","0xd21942ae3214eff88e08ab04884fd4b11958b51af9a0741b7668e2d07a2c56c9","0x9a9024edb5069d88a324facb310a5ce8e495214bbaa968f077bede437390194f","0x9b9ce5b74b9bab5121612ef6b64920a8d453cbf311096a423eef9702747e868a"]}