ECZ-ID Trust MCP · developer surfaces
Ask who operates an MCP server. Get an answer you can re-check.
ECZ-ID Trust MCP is the identity, authority, evidence and current-state layer for MCP. It answers one question — who stands behind this machine surface, and what is publicly published about them right now — and it answers it to AI systems, in JSON, over MCP. Every answer carries a link a human can open and a re-check route a machine can call again tomorrow.
The layer has five named surfaces. The Trust MCP Server is the machine one: seven tools at trust-mcp.ecocitizenz.com/mcp, six of them anonymous and read-only. Start there — it needs nothing installed.
Reference documentation is not on this site. Guides, integration patterns and every canonical schema live on the ECZ-ID Developer Gateway, which owns them; this page owns none of them and exists to get you to a working call.
ECZ-ID Developer Gateway — reference documentation
Websites explain. TrustOps operates. Backend truth decides. Resolver proves.
Ten seconds
Your first working call. No install, no account, no key.
The Trust MCP Server is a remote MCP server over Streamable HTTP, speaking JSON-RPC 2.0. Six of its seven tools are anonymous and read-only, so a plain curl is a complete client. Paste this.
curl -sS -X POST https://trust-mcp.ecocitizenz.com/mcp \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-H 'MCP-Protocol-Version: 2026-07-28' \
-H 'Mcp-Method: tools/list' \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{"_meta":{
"io.modelcontextprotocol/protocolVersion":"2026-07-28",
"io.modelcontextprotocol/clientCapabilities":{}}}}'resolve_identity
- Access
- anonymous
- Read-only
- yes
- Answers
- Who is this ECZ-ID, what state is it in, where is the proof
get_current_state
- Access
- anonymous
- Read-only
- yes
- Answers
- The narrow current state, nothing else
get_resolver_link
- Access
- anonymous
- Read-only
- yes
- Answers
- The deterministic proof URL. Makes no network call
explain_status
- Access
- anonymous
- Read-only
- yes
- Answers
- What a status means, rendered deterministically. No LLM
find_product
- Access
- anonymous
- Read-only
- yes
- Answers
- The single best next ECZ-ID action for a described situation
get_install_instructions
- Access
- anonymous
- Read-only
- yes
- Answers
- Official install and discovery routes for an ECZ-ID surface
create_request_to_resolve
- Access
- OAuth2 bearer
- Read-only
- no
- Answers
- Creates a neutral request for evidence. Scope RequestToResolve.Create
Contract: ECZ-ID Trust MCP Contract v1.0.0, frozen 19 August 2026, provider-neutral. The Trust MCP Server accepts protocol 2026-07-28 and negotiates the session version with the client; a client that offers 2025-11-25 is served on 2025-11-25.
What came back
Four things it gives you, and one it deliberately withholds.
ECZ-GB-RBS1NW is EcoCitizenz's own live record. It is public, it is safe to call, and you can check the answer by hand at resolver.ecocitizenz.org/p/ECZ-GB-RBS1NW.
curl -sS -X POST https://trust-mcp.ecocitizenz.com/mcp \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-H 'MCP-Protocol-Version: 2026-07-28' \
-H 'Mcp-Method: tools/call' \
-H 'Mcp-Name: resolve_identity' \
-d '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{
"name":"resolve_identity",
"arguments":{"ecz_id":"ECZ-GB-RBS1NW"},
"_meta":{"io.modelcontextprotocol/protocolVersion":"2026-07-28",
"io.modelcontextprotocol/clientCapabilities":{}}}}'Mcp-Method is required by this deployment on any request that sends MCP-Protocol-Version: 2026-07-28, and tools/call additionally requires Mcp-Name matching the tool. Neither is part of the MCP HTTP transport; a client that omits them is rejected with JSON-RPC -32020. Accept must list both application/json and text/event-stream — a default Accept returns HTTP 406.
{
"schema_version": "1.0",
"ecz_id": "ECZ-GB-RBS1NW",
"canonical_state": "ACTIVE",
"evidence": { "present": true },
"checked_at": "2026-08-23T03:41:57.408Z",
"resolver_url": "https://resolver.ecocitizenz.org/p/ECZ-GB-RBS1NW",
"recheck": { "available": true, "method": "GET", "href": "/v1/resolve/ECZ-GB-RBS1NW" },
"policy": {
"statement": "Local policy decides whether this signal is sufficient for the decision at hand."
},
"correlation_id": "26fadaf2-f7b7-40e9-a37a-a21fbab5adbe"
}A static transcript captured on 23 August 2026, not proof and not live data. It is what the server returned that day; call it yourself for what it returns today, and always verify live on the Resolver before relying on anything.
- canonical_state
- the current state. A state, not a score, and not a grade.
- checked_at
- when. A trust answer with no timestamp is not an answer.
- resolver_url
- a link a human can open and read for themselves.
- recheck
- the route to ask again, because state changes and today's answer expires.
- policy.statement
- the thing it will not give you. The response says, in the payload: "Local policy decides whether this signal is sufficient for the decision at hand." There is no verdict field. There will not be one.
That last point is the design, not a limitation. ECZ-ID publishes what is true about a record right now and hands the decision back to you. It does not decide whether you should trust something, because it cannot know what you are about to do with it — and a layer that issued verdicts would be making a promise it has no way to keep.
The whole record
The Resolver is the proof surface. It is a projection, and never a source.
Canonical state is written by ECZ-ID Core. The Resolver renders a read-only public projection of what that state permits. Every ECZ-ID has a human page and a machine document at the same identifier — and the machine document tells machines how to use it.
# Human
https://resolver.ecocitizenz.org/p/ECZ-GB-RBS1NW
# Machine
curl -sS https://api.ecocitizenz.com/api/p/ECZ-GB-RBS1NW.json | jq '.resolver_v2'Identifier format, from the live server's own input schema: ^ECZ(-[A-Z0-9]{2,32}){1,4}$, maximum 64 characters. Example: ECZ-GB-RBS1NW.
Five concepts, five field paths. Integrate against resolver_v2; the blocks outside it are legacy compatibility.
| Concept | Field path | Live value, 23 August 2026 |
|---|---|---|
| Identity | identity.{legal_name, trading_name, jurisdiction, entity_type, profile_state} | ECOCITIZENZ LTD · EcoCitizenz · UNITED KINGDOM · ltd · PROFILE_COMPLETE |
| Authority | binding.{state, scopes, do_not_infer_control_over} · agent_trust.status | NO_PUBLIC_PROOF · [] · AGENT_CREDENTIAL_MISSING |
| Evidence | evidence.public_receipt_state · ledger.{ledger_name, public_receipts_count} | PUBLIC_RECEIPT_AVAILABLE · ecozledger · 1 |
| State | state.{lifecycle_state, reliance_level} · public_projection.axes (7 independent axes) | ACTIVE · LIMITED_RELIANCE_NO_BINDING |
| Resolution | canonical_resolver_url · canonical_machine_json_url | both present, both absolute |
"machine_policy": {
"recommended_machine_action": "ALLOW_PARENT_IDENTITY_VISIBILITY_ONLY",
"high_risk_action": "FAIL_CLOSED_UNLESS_LIVE_BINDING_AND_EVIDENCE_AVAILABLE",
"fail_closed_states": ["REVOKED","SUSPENDED","DEGRADED","MISMATCH","PROOF_UNAVAILABLE",
"PUBLIC_PROJECTION_UNAVAILABLE","ACTIVE_ABUSE_FLAGGED","UNKNOWN"],
"machines_should_use": ["state.lifecycle_state","state.reliance_level","binding.state",
"evidence.public_receipt_state","ledger.public_receipt_state",
"agent_trust.status"]
}STATE=$(curl -sS https://api.ecocitizenz.com/api/p/ECZ-GB-RBS1NW.json \
| jq -r '.resolver_v2.state.lifecycle_state // "UNKNOWN"')
case "$STATE" in
REVOKED|SUSPENDED|DEGRADED|MISMATCH|PROOF_UNAVAILABLE|PUBLIC_PROJECTION_UNAVAILABLE|ACTIVE_ABUSE_FLAGGED|UNKNOWN)
echo "fail closed: $STATE"; exit 1 ;;
*) echo "proceed under local policy: $STATE" ;;
esacThe same payload states what may and may not be inferred from it.
- Rely on
- record_existence · active_parent_state · current_parent_tier · public_resolver_visibility
- Do not infer
- legal_name · domain_control · api_control · repository_control · wallet_control · asset_control · agent_authority · insurance · regulatory_approval · safety · compliance · business_quality · live_operational_monitoring
Read that list twice. legal_name is published on this record — sourced from Companies House, provenance recorded, checked 31 July 2026 — and it is still on the do-not-infer list. Publishing a field is disclosure. It is not a warranty that the field is currently correct, and the layer will not let you read it as one.
One minute
Give your agent the trust layer.
The Trust MCP Server is remote, so there is nothing to install. Add it to your MCP host and the six anonymous tools are available immediately; the seventh returns 401 until you supply a bearer token.
{
"mcpServers": {
"ecz-id-trust-mcp": {
"type": "http",
"url": "https://trust-mcp.ecocitizenz.com/mcp"
}
}
}{
"servers": {
"ecz-id-trust-mcp": {
"type": "http",
"url": "https://trust-mcp.ecocitizenz.com/mcp"
}
}
}Remote MCP servers over Streamable HTTP are supported by a growing set of hosts, and the config key differs between them — mcpServers here, servers there. Check your host's documentation for its remote-server syntax. Where a host does not support remote servers yet, use the stdio verifier below: stdio works wherever stdio works.
Then ask it: "Resolve ECZ-GB-RBS1NW and tell me what I may not infer from the answer." A well-behaved agent will answer from the payload's own reliance block rather than from its priors — which is the entire point of publishing the boundary in the data.
Thirty seconds
ECZ-ID MCP Verifier — check a target from your terminal, your CI, or your agent.
One npm package ships three things: a command-line tool, a stdio MCP server, and a GitHub Action. All three call the same deterministic core. It reads public manifests and the public Resolver, returns a canonical result state and reason codes, and routes you to the next action. It never writes truth, never activates proof, never marks anything BOUND.
npx -y @ecocitizenz/ecz-id-mcp-verifier --target "ECZ-GB-RBS1NW" --policy PREFER{
"target": "ECZ-GB-RBS1NW",
"target_type": "ecz_id",
"policy_mode": "PREFER",
"result_state": "RESOLVER_VERIFIABLE",
"reason_codes": [],
"resolver_url": "https://resolver.ecocitizenz.org/p/ECZ-GB-RBS1NW",
"machine_json_url": "https://api.ecocitizenz.com/api/p/ECZ-GB-RBS1NW.json",
"primary_action": "VIEW_RESOLVER_PROOF",
"verifier_writes_truth": false,
"verifier_activates_proof": false,
"verifier_marks_bound": false,
"local_policy_decides": true,
"recheck_before_reliance": true,
"no_safety_or_approval_inference": true,
"no_source_uploaded": true,
"no_secrets_uploaded": true,
"no_telemetry": true,
"exit_code": 0
}A static transcript captured on 23 August 2026, not proof and not live data. The tool also prints a verifier_version field, which this page does not reproduce: the npm release line and the repository's tag line do not currently agree, so any number printed here would be a claim we cannot keep true for every reader. Run the command to see the version you actually have.
Add --report for a human-readable version, --sarif <path> for SARIF output, --offline to run with no network at all, and --capabilities to print the tool's own machine-readable capability profile. When this page and --capabilities disagree, --capabilities is right.
Three local policy modes, and they only ever govern your own gate:
- OPEN
- Missing public proof is informational. Exit 0.
- PREFER
- Missing public proof warns on stderr. Exit 0. This is the Action's default; the CLI defaults to OPEN.
- REQUIRE
- Missing public proof fails closed — exit 1, or exit 5 if the network was attempted and failed. Your CI gate. Not a global verdict about anyone.
A mismatch, revocation, suspension or expiry exits non-zero under every mode, because those are deterministic findings about published state rather than questions about your appetite for risk.
The same package is a local MCP server. It prints its own host config — do not transcribe it by hand.
npx -y @ecocitizenz/ecz-id-mcp-verifier --print-mcp-config{
"mcpServers": {
"ecz-id": {
"command": "npx",
"args": ["-y", "-p", "@ecocitizenz/ecz-id-mcp-verifier", "ecz-id-mcp-server"]
}
}
}- ecz_check_target
- the full canonical result, plus the computed exit code
- ecz_recheck_resolver
- a read-only Resolver re-check, forced to OPEN so it stays informational
- ecz_explain_result
- a public-safe explanation of states and codes that already exist — it never invents one
The -p flag is load-bearing: it selects the package, then runs the ecz-id-mcp-server binary from it. Without -p, npx looks for a package named ecz-id-mcp-server, which does not exist.
Free to use — personal, organisational, development, CI/CD and internal business use, at no charge, under the ECZ-ID Proprietary Limited-Use License. That licence is not an open-source licence and we do not describe it as one.
The result contract
Eighteen states. None of them is called failure.
The verifier classifies every target into exactly one of eighteen canonical result states. There is no FAILED_VERIFICATION state and there never will be. That is a design decision with a comment guarding it in the source, and it is the single most important thing to understand about this layer before you build on it.
Absence of proof is not failure.
Every state below is informational: your policy decides whether it is sufficient for the decision at hand. ECZ-ID resolves; it does not decide.
Grouped by what they tell you, not by severity — because severity is your call, not ours.
Proof found
| State | Means |
|---|---|
| RESOLVER_VERIFIABLE | Public Resolver proof was found for this target. Informational; re-check before reliance and let local policy decide. |
Proof absent or incomplete — neutral, never negative
| State | Means |
|---|---|
| NO_PUBLIC_RESOLVER_PROOF_FOUND | No public proof was found yet. This does not indicate a problem with the target; it only means no public proof is published. |
| PARTIAL_PUBLIC_PROOF_FOUND | Some, but not all, expected public proof was found. |
| SETUP_REQUIRED | Public proof would require the operator to complete setup. Routing-only; the verifier never completes setup. |
| CHALLENGE_ISSUED | A public verification challenge is outstanding. |
| OBSERVED | The target was observed without full public proof. |
| NOT_APPLICABLE | Public Resolver proof is not applicable to this target shape. |
| UNSUPPORTED_TARGET | This target shape is not supported. No network lookup is performed. |
Deterministic findings about published state
| State | Means |
|---|---|
| DEGRADED | The projection is degraded — for example stale. Treated as missing proof for re-check purposes; never as positive proof. |
| MISMATCH | Observed public attributes did not match the expected proof. Informational; not a safety verdict. |
| EXPIRED | A previously published proof posture has expired. Lifecycle posture only. |
| SUSPENDED | A previously published proof posture is suspended. Lifecycle posture only. |
| REVOKED | A previously published proof posture is revoked. Lifecycle posture only. |
Routing-only
| State | Means |
|---|---|
| LEGACY_ALIAS_NOT_ACTIVE_SKU | The target resolves to a legacy alias that is not an active product. |
| REJECTED_PRODUCT_NOT_SELLABLE | The target maps to a product that is not currently sellable. |
| DEFERRED_PRODUCT_NOT_SELLABLE | The target maps to a product that is deferred and not currently sellable. |
| PARENT_UPGRADE_REQUIRED | A parent upgrade would be required before proof applies. |
| UNKNOWN_PHASE1_SKU | The target maps to an unknown identifier. |
Why there is no FAILED_VERIFICATION state
Because "we found no published proof" and "this thing is bad" are not the same fact, and a tool that renders them with the same word is lying to its user.
Most of the internet has no ECZ-ID. Most MCP servers have not published Resolver proof. If absence were rendered as failure, the verifier would return failure for nearly every target it was ever pointed at — and a signal that is almost always negative carries no information at all. Worse, it would make the layer a de facto gatekeeper: publish with us or be marked failed. That is a protection racket, not infrastructure, and it is exactly what this layer refuses to become.
So the states split absence from finding. NO_PUBLIC_RESOLVER_PROOF_FOUND is neutral and exits 0 under OPEN and PREFER. MISMATCH, REVOKED, SUSPENDED and EXPIRED are deterministic findings about state that was actually published, and they exit non-zero under every policy mode — including OPEN — because they are facts about a record rather than questions about your risk appetite.
Absence becomes a gate only when you decide it should. That is what policy REQUIRE is: your local choice to treat missing proof as blocking, in your repository, for your reasons. The verifier never makes that choice for you and never makes it globally.
The same principle is implemented independently in the ECZ-ID Python family, whose shared CLI states it as a rule: "a completed inspection always exits 0 regardless of posture. Only genuine tool or input errors exit non-zero." Two codebases, two languages, one commitment.
The exit codes are where the principle becomes mechanical.
| Code | Fires on | Under which policy |
|---|---|---|
| 0 | RESOLVER_VERIFIABLE, every informational state, and missing proof | OPEN, PREFER |
| 1 | NO_PUBLIC_RESOLVER_PROOF_FOUND, PARTIAL_PUBLIC_PROOF_FOUND, DEGRADED | REQUIRE only |
| 2 | MISMATCH | every policy |
| 3 | REVOKED, SUSPENDED, EXPIRED | every policy |
| 4 | UNSUPPORTED_TARGET | every policy |
| 5 | Network attempted and failed | REQUIRE only |
| 6 | Internal verifier error | every policy |
Read the table by column, not by row. Codes 2, 3 and 4 are facts. Codes 1 and 5 are your policy. That column split is the contract.
Every result also carries reason codes — thirty-one canonical uppercase snake-case values, including RESOLVER_READ_ONLY (“the Resolver is read-only; the verifier only reads public proof, it never writes truth”) and LOCAL_POLICY_DECIDES. Print explanations for any of them with ecz-mcp-verify --capabilities, or ask the ecz_explain_result MCP tool.
How to verify
Four real ways to verify — none of them on this page.
This website does not verify anything. It has no lookup box and it never will, because a page on this site has no authority to tell you what is true about someone else. Here are the four surfaces that do, and what each one is actually for.
You have a server URL, a package or a repository, and you are at a keyboard.
ECZ-ID MCP Verifier — CI and CLI surface
npx -y @ecocitizenz/ecz-id-mcp-verifier --target <target>
You want the check to run on every pull request rather than when someone remembers.
ECZ-ID MCP Verifier — GitHub Action surface
Policy OPEN, PREFER or REQUIRE. Outputs result-state, reason-codes and an action envelope your workflow can branch on.
You are an agent, or you are building one, and the check has to happen mid-conversation.
Trust MCP Server — machine surface
Call resolve_identity over Streamable HTTP. Six of the seven tools are anonymous and read-only.
You already have an ECZ-ID and you just want to read the record.
ECZ-ID Resolver — proof surface
Open the canonical URL and match the identifier format ^ECZ(-[A-Z0-9]{2,32}){1,4}$. No account, no key, no rate limit to negotiate.
If a target has no public ECZ-ID record, every one of those four surfaces reports exactly that and stops. Absence of a record is reported as absence. It is not rendered as failure, risk, or a reason to distrust anyone — which is why there is no FAILED_VERIFICATION state anywhere in the ECZ-ID MCP Verifier.
Five minutes
Put it in CI. It reads, reports and routes — it never writes to your repository.
The GitHub Action ships inside the ECZ-ID MCP Verifier repository; there is no separate action repo. Pin the exact tag: there is no moving v0 tag on this repository.
name: ECZ-ID posture
on:
pull_request:
push:
branches: [main]
# The Action only reads and reports.
permissions:
contents: read
jobs:
ecz-id:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Check ECZ-ID Resolver posture
id: ecz
uses: <ecz-id-mcp-verifier action ref — take the exact tag from the repository's own README>
with:
target: "https://api.example.com/.well-known/ecz-mcp.json"
target-type: "mcp_server"
policy: "PREFER"
operator: "third_party"
timeout-ms: "5000"
- name: Route on state
run: |
case "${{ steps.ecz.outputs.result-state }}" in
RESOLVER_VERIFIABLE)
echo "Public proof found. Local policy decides sufficiency." ;;
NO_PUBLIC_RESOLVER_PROOF_FOUND|PARTIAL_PUBLIC_PROOF_FOUND|SETUP_REQUIRED)
echo "No published proof yet. Not a failure signal." ;;
MISMATCH|REVOKED|SUSPENDED|EXPIRED|DEGRADED)
echo "Deterministic finding. Failing this job."; exit 1 ;;
*)
echo "Informational: ${{ steps.ecz.outputs.result-state }}" ;;
esacOne line of this workflow is a placeholder, and it is the uses: ref. This page publishes no version literal: the repository's newest tag and the newest npm release are not the same release, and there is no moving v0 tag, so a ref printed here would pin one of two answers without knowing which one you need. Everything else runs as printed. Take the exact ref from the repository's own README.
To make it a hard gate instead, change one input: policy: REQUIRE. That is your decision about your repository, not a verdict this layer issues about anyone else's.
Nine inputs, nine outputs. operator is never auto-inferred — the routing advice differs depending on whether the target is yours, and a wrong guess sends you to the wrong place.
Inputs
target
- Required
- yes
- Default
- —
- Does
- Target to verify (URL, package, repo, or identifier).
target-type
- Required
- no
- Default
- ""
- Does
- Optional explicit target type hint.
policy
- Required
- no
- Default
- PREFER
- Does
- Local policy mode: OPEN, PREFER, or REQUIRE.
operator
- Required
- no
- Default
- unknown
- Does
- Operator role: self, third_party, or unknown. Not auto-inferred.
resolver-base
- Required
- no
- Default
- https://resolver.ecocitizenz.org
- Does
- Override for the public resolver base URL.
no-network
- Required
- no
- Default
- false
- Does
- If true, run in fully offline mode.
offline
- Required
- no
- Default
- false
- Does
- Alias for no-network.
json
- Required
- no
- Default
- true
- Does
- If true, emit JSON output to the log.
timeout-ms
- Required
- no
- Default
- 5000
- Does
- Timeout for resolver lookups, in milliseconds.
Outputs
| Output | Description |
|---|---|
| result-state | Canonical ResultState produced by the verifier. |
| reason-codes | Comma-separated canonical ReasonCodes. |
| action-envelope-json | Local ActionEnvelope JSON describing routing only. |
| setup-handoff-json | Deterministic Setup Handoff JSON (routing only). |
| mcp-action-envelope-json | MCP Action Envelope JSON (route-only posture path). Null for non-MCP targets. |
| request-to-resolve-json | Request-to-Resolve local guidance packet JSON. signed_request=false; not created server-side. |
| primary-action | Single deterministic next action verb. |
| trustops-action-url | Deterministic TrustOps action URL (no secrets, allow-list params). |
| developer-guidance-url | Deterministic Developer Gateway guidance URL for this target type. |
Air-gapped runners: set no-network: "true" (or its alias offline: "true"). Offline runs perform deterministic classification only — no lookup, no network. In every mode the Action uploads no source, no secrets and no telemetry.
Editor surface
ECZ-ID MCP Trust — the VS Code extension, not the server.
ECZ-ID MCP Trust is the editor surface of the layer: it inventories the MCP configuration on your own machine and shows you what changed. It reads local configuration and public records. It starts no server, executes no configured command and connects to no transport.
code --install-extension ecocitizenz.eczid-mcp-trustFree, with a Pro tier issued by TrustOps. Entitlement is held by TrustOps, distribution is by the VS Code extension gallery and Open VSX, and neither this page nor a payment creates or amends any ECZ-ID state. Current tiers and prices are published on the extension's own page.
Software products
Which ECZ-ID product fits what you are building.
Two of the surfaces above are commercial software products, and there is a bundle that covers both. Free tiers are genuinely free — no card, no trial clock. This block routes you to the product's own page; it is the shortest honest answer to “which one do I want”.
| What you are building | Product | Tiers |
|---|---|---|
| Building MCP servers | ECZ-ID MCP TrustECZ-ID MCP Trust — tiers and prices | Free — £0 · Pro — £12.99/month or £119/year |
| Building agents | ECZ-ID Agent TrustECZ-ID Agent Trust — tiers and prices | Free — £0 · Pro — £12.99/month or £119/year |
| Building both | Developer Trust Pro BundleDeveloper Trust Pro Bundle — tiers and prices | £19.99/month or £199/year · no free tier |
These are software products. They are not the four fixed-scope professional engagements published on this site, which are a different thing bought a different way.
TrustOps issues entitlement and holds order state. This page only routes: it does not sell, does not know what you already hold, and does not create or amend any ECZ-ID state. Tiers and prices as published on 23 August 2026 — the product page is authoritative.
The layer and its surfaces
ECZ-ID Trust MCP is the layer. These are its named surfaces.
Nothing here is renamed and nothing here is new. Each surface has one job, one canonical location and one install route. Two of the names differ only by word order — so each is always named with the kind of surface it is.
| Surface | Kind | Where | Install |
|---|---|---|---|
| Trust MCP Server | Machine surface — remote MCP server, 7 tools | https://trust-mcp.ecocitizenz.com/mcp | none — it is an endpoint |
| ECZ-ID Resolver | Proof surface — public read-only projection | resolver.ecocitizenz.org/p/{id} · api.ecocitizenz.com/api/p/{id}.json | none — it is an endpoint |
| ECZ-ID MCP Verifier | CI/CLI surface — CLI, stdio MCP server, GitHub Action | npm @ecocitizenz/ecz-id-mcp-verifier | npx -y @ecocitizenz/ecz-id-mcp-verifier --capabilities |
| ECZ-ID MCP Verifier Action | CI surface — same repository as the Verifier | github.com/Ecocitizenz/ecz-id-mcp-verifier (ships inside the Verifier repository; no ref pinned on this page) | uses: in a workflow |
| ECZ-ID MCP Trust | Editor surface — VS Code extension | ecocitizenz.eczid-mcp-trust | code --install-extension ecocitizenz.eczid-mcp-trust |
| ECZ-ID Agent Trust | Editor surface — VS Code extension | ecocitizenz.eczid-ai-agents | code --install-extension ecocitizenz.eczid-ai-agents |
| ECZ-ID Python family | Local inspection surface — 10 PyPI distributions | pypi.org/search/?q=ecz-id | pip install ecz-id ecz-id-mcp |
| Developer Gateway | Documentation surface — owns the schemas | developers.ecocitizenz.com | none — it is an endpoint |
| TrustOps | Commercial surface — entitlement and order state | trustops.ecocitizenz.com/start | none — it is an endpoint |
Verified 23 August 2026. The Trust MCP Server implements Trust MCP contract v1.0.0, frozen. Version numbers for the npm package, the GitHub Action and the VS Code extensions are not published here: the npm release line and the repository's tag line are not at the same release, so a number on this page would be right for some readers and wrong for others. Run the command shown above to print the version you actually have, or open the package page for the current published version.
Three of the ten Python distributions matter for MCP work: ecz-id (the shared core), ecz-id-mcp (inspects MCP manifests — server.json, mcp_server_manifest.json, mcp.json, .mcp.json) and ecz-id-agents (inspects agent projects). They are static inspectors: they never start a server, never execute a configured command and never connect to a transport. inspect makes no network call unless you pass --check-public; recheck opts in by default.
Source
Where the code is published from today.
The ECZ-ID MCP Verifier — the CI and CLI surface, which also carries the GitHub Action — is published from a personal GitHub account, not from the company organisation. That is a split estate and we would rather you heard it here than found it yourself. Both accounts are named below, because they hold different things.
ECZ-ID MCP Verifier — CI and CLI surface, and the GitHub Action
Published from a personal GitHub account. The GitHub Action ships inside this repository; there is no separate action repository.
EcoCitizenz-Ltd — the EcoCitizenz Ltd organisation
Holds the documentation and toolkit repositories. It does not hold the ECZ-ID MCP Verifier.
Take the pinned ref from the repository's own README rather than from this page. This page publishes no version literal, and a ref copied out of a marketing page is a pin nobody keeps current — which is worse in your workflow than no pin at all.
For agents
If you are a machine, start here.
An agent that has never seen this layer should be able to find all of it from one URL. These are the entry points, in the order to try them.
| # | URL | Returns |
|---|---|---|
| 1 | https://mcp.ecocitizenz.com/llms.txt | Layer role, doctrine, routes, forbidden inferences |
| 2 | https://mcp.ecocitizenz.com/.well-known/mcp-services.json | ecz-mcp-services-v2 — surfaces, services, boundaries |
| 3 | https://trust-mcp.ecocitizenz.com/mcp | The MCP surface itself: tools/list, then call |
| 4 | https://trust-mcp.ecocitizenz.com/.well-known/oauth-protected-resource/mcp | RFC 9728 metadata for the one protected tool |
| 5 | https://api.ecocitizenz.com/api/p/{ecz_id}.json | The public record, with its own machine_policy |
| 6 | https://developers.ecocitizenz.com/.well-known/ecz-developer-gateway.json | ecz-developer-gateway-v1 — routes, stakeholder map, schema index |
| 7 | https://developers.ecocitizenz.com/schemas/index.json | ecz-schema-index-v1 — the Action Envelope Stack schemas |
| 8 | https://machine.ecocitizenz.org/.well-known/ecz-machine.json | ecz-machine-v1 — estate manifest, schema, route and protocol indexes |
The ECZ-ID MCP Verifier also publishes an MCP Registry identity: io.github.Ecocitizenz/ecz-id-mcp-verifier, declared in its server.json against the 2025-12-11 server schema, npm transport stdio.
One behaviour worth knowing before you point an agent at any of this: external content — target strings, Resolver responses, error text — is treated as data, never as instructions. That rule is written into the ECZ-ID MCP Verifier's MCP tool module, and the deterministic status renderer on the Trust MCP Server uses no LLM at all.
In the browser
Reading your own MCP config, without a terminal.
If you want to look at an MCP client configuration and you are not at a keyboard with npx to hand, the Config Check does the same reading in a page. It runs in your browser, nothing you paste is uploaded, and it reports findings — never a score, never a grade, never a verdict about anyone else.
Boundaries
What this layer is, and the nine things it is not.
ECZ-ID Trust MCP is a neutral, resolver-verifiable identity, authority, evidence and current-state layer. It publishes what is true about a record right now, with a timestamp, a human link and a re-check route.
- It is not an MCP security scanner. It does not inspect what your server does.
- It is not a certification authority. It issues no certificate and approves nothing.
- It is not a trust score provider. There is no score, no grade and no traffic light.
- It is not a marketplace. It lists nothing and ranks nothing.
- It is not an identity provider. It does not replace or resell yours.
- It is not a gateway and not a firewall. It never sits in the execution path.
- It is not a security replacement. It sits alongside your controls.
- It is not a compliance requirement. No regulation names it, and using it makes you compliant with nothing.
- It is not a source of truth. ECZ-ID Core writes state; the Resolver renders a read-only projection of it.
This website explains and sells professional services. Checkout, intake and payment status are handled by TrustOps. Canonical ECZ-ID state is held by the ECZ-ID backend; the public Resolver is a read-only projection of proof. Nothing on this site — including payment — creates or amends authoritative ECZ-ID state.
Which is why there is no lookup box on this page. Verification happens on the Resolver, where the answer is a live projection you can re-check — not here, where it would be a screenshot of one.
Next
Where the documentation lives.
- Developer Gateway — developers.ecocitizenz.com
- Guides, integration patterns, and the canonical schemas. The Gateway owns every schema in the estate; this page owns none of them.ECZ-ID Developer Gateway
- ECZ-ID Resolver — resolver.ecocitizenz.org
- Public proof. Look up any ECZ-ID, read the record, re-check it whenever you need to.ECZ-ID Resolver
- TrustOps — trustops.ecocitizenz.com/start
- Setup, entitlement and lifecycle. If you operate a surface and want it identifiable, this is where that begins. Public proof appears after backend activation, not at checkout.TrustOps
If you would rather have this assessed than integrate it yourself, four fixed-scope MCP engagements are published with full prices and scope at /services. Nothing on this page requires any of them.
The four fixed-scope MCP engagements, with published prices and scope