
labelproof
io.github.CloudCorpRecords/labelproof
Read-only EU energy-label preflight checks against supplier-declared EPREL records.
Documentation
labelproof
labelproof helps you check, before you ship or list a product, what the public EPREL register actually says about its energy label — and helps you keep a receipt of exactly what you checked.
EPREL holds supplier-declared records: the brand, the model, the declared label and product-sheet values. None of that is independently verified, and this tool treats it accordingly. A search reports candidate records with an explicit match kind, so a miss reads as "no match in the queried source", never as "not registered". Comparisons stay a plain table of common declared values, with no winner picked. The receipt tool bundles your own lookups into a signed, idempotent record of what was looked up and when. Everything here is preflight evidence only: nothing in this package decides conformity, CE marking, GPSR or safety questions, or market access.
The lookups themselves run on a hosted preflight service. This package is the local half: it answers tools/list from a captured copy of that service's surface and relays every call upstream, returning the answer unchanged.
Tools
search_eprel_products— find candidate public records bymodelIdentifier, byregistrationNumber, or bysupplierOrBrandnarrowed withproductGroup. Text searches need a product group because the live source searches one group at a time; registration-number lookups do not. All arguments are optional in the captured schema. Matches come back labelledexact_public_record,possible_match,multiple_matchesorno_match_in_queried_source, withunavailable,source_schema_unverifiedandstalestates for a source that cannot answer cleanly.get_eprel_product_record— expand one candidate via itspublicRecordIdinto the structured record: declared supplier and group, declared fields, documents, missing fields, provenance and freshness.get_eprel_energy_label_data— the declared label and product-sheet values for onepublicRecordId. The reply states plainly that the data is supplier-declared and not independently verified.compare_eprel_product_metrics— line up two to five records (publicRecordIds, optionally narrowed bymetricKeys) on the metrics they share. Records from different product groups fail safely asincompatible_comparison; fewer than two usable identifiers returnsinsufficient_identifiers.prepare_energy_label_preflight_receipt— attest a set of lookups. Requiresbundle(the fingerprinted results to attest, without raw query values) andcreatedAt(the ISO timestamp the bundle was assembled). The signed receipt commits to inputs, record references, sources, freshness and decision states — evidence of the checks, not of any outcome.
Configuration
EU_ENERGY_MCP_URL(optional) — replace the upstream endpoint, which defaults tohttps://energy.mcp.jithox.com/mcp. This override hook is a labelled reconstruction by this rebuild.EU_ENERGY_API_KEY(optional) — when set, its value is sent upstream on every request asAuthorization: Bearer <value>; when unset, no key header leaves the machine. TheAuthorizationheader name is declared in the original service's registry record, but that record names no package environment variable and the surface was captured without a key, so the env name, the Bearer form and the forwarding itself are labelled reconstructions.
How forwarding works
The first call opens a streamable-HTTP JSON-RPC
session upstream: an initialize request
(protocolVersion 2025-03-26, clientInfo name
labelproof), a notifications/initialized
notification, then the tools/call request carrying
your arguments exactly as given. If the upstream
issues an Mcp-Session-Id, it is sent on all later
requests and the session is reused for the rest of
the process. Replies in plain JSON and in
server-sent-event framing are both understood.
Upstream results pass through verbatim, including an
isError flag set upstream. Local relay failures —
an upstream JSON-RPC error, a non-2xx reply, a body
that cannot be read, or a request that never
completes — surface as an isError result whose text
begins labelproof error: (a labelled
reconstruction of this rebuild).
CLI
Every tool doubles as a subcommand taking one JSON argument string:
npx @reneturcios/labelproof search_eprel_products '{"modelIdentifier":"WM-100","productGroup":"washingmachines"}'
npx @reneturcios/labelproof get_eprel_product_record '{"publicRecordId":"rec-42"}'
npx @reneturcios/labelproof prepare_energy_label_preflight_receipt '{"bundle":{"lookups":[]},"createdAt":"2026-10-28T09:00:00Z"}'
npx @reneturcios/labelproof --version
Exit codes: 0 for a non-error result, 1 for an
isError result, 2 for a usage error.
MCP server
npx -y @reneturcios/labelproof mcp
MCP client config:
{
"mcpServers": {
"labelproof": {
"command": "npx",
"args": ["-y", "@reneturcios/labelproof", "mcp"]
}
}
}
Docker
docker run -i ghcr.io/cloudcorprecords/labelproof
docker run --rm ghcr.io/cloudcorprecords/labelproof --version
The image defaults to the mcp command, so the first
form runs the stdio MCP server; other arguments go to
the CLI.
Development
npm install
npm run build
npm test
npm run dev
Tests stub the upstream JSON-RPC service; the suite makes no live network calls.
License
MIT — see LICENSE.
@reneturcios/labelproofnpm install @reneturcios/labelproofghcr.io/cloudcorprecords/labelproof:0.1.0docker pull ghcr.io/cloudcorprecords/labelproof:0.1.0:undefinedRelated Servers
io.github.CloudCorpRecords/abandoncheck
Judge whether a dependency is maintained, from factual signals: releases, commits, archival.
io.github.CloudCorpRecords/actionbridge
Zapier exposed actions as MCP tools via a generic action runner.
io.github.CloudCorpRecords/actionpin
GitHub Actions supply-chain hardener: audit workflows for unpinned actions and build a SHA pin plan.