Skip to main content

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.

List the tools · curl
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.

Resolve an identity · curl
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.

structuredContent · real response, captured 23 August 2026
{
  "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 and machine
# 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.

Each resolver concept, the field path that carries it, and the live value published for the example record
ConceptField pathLive value, 23 August 2026
Identityidentity.{legal_name, trading_name, jurisdiction, entity_type, profile_state}ECOCITIZENZ LTD · EcoCitizenz · UNITED KINGDOM · ltd · PROFILE_COMPLETE
Authoritybinding.{state, scopes, do_not_infer_control_over} · agent_trust.statusNO_PUBLIC_PROOF · [] · AGENT_CREDENTIAL_MISSING
Evidenceevidence.public_receipt_state · ledger.{ledger_name, public_receipts_count}PUBLIC_RECEIPT_AVAILABLE · ecozledger · 1
Statestate.{lifecycle_state, reliance_level} · public_projection.axes (7 independent axes)ACTIVE · LIMITED_RELIANCE_NO_BINDING
Resolutioncanonical_resolver_url · canonical_machine_json_urlboth present, both absolute
The machine contract · real payload, captured 23 August 2026
"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"]
}
A correct gate, in six lines
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" ;;
esac

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

Claude Desktop / Claude Code
{
  "mcpServers": {
    "ecz-id-trust-mcp": {
      "type": "http",
      "url": "https://trust-mcp.ecocitizenz.com/mcp"
    }
  }
}
VS Code · .vscode/mcp.json
{
  "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.

Run it
npx -y @ecocitizenz/ecz-id-mcp-verifier --target "ECZ-GB-RBS1NW" --policy PREFER
Real output, captured 23 August 2026 · trimmed
{
  "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.

Print the config
npx -y @ecocitizenz/ecz-id-mcp-verifier --print-mcp-config
Paste the 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

Canonical result states in the group "Proof found", and what each one tells you
StateMeans
RESOLVER_VERIFIABLEPublic Resolver proof was found for this target. Informational; re-check before reliance and let local policy decide.

Proof absent or incomplete — neutral, never negative

Canonical result states in the group "Proof absent or incomplete — neutral, never negative", and what each one tells you
StateMeans
NO_PUBLIC_RESOLVER_PROOF_FOUNDNo 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_FOUNDSome, but not all, expected public proof was found.
SETUP_REQUIREDPublic proof would require the operator to complete setup. Routing-only; the verifier never completes setup.
CHALLENGE_ISSUEDA public verification challenge is outstanding.
OBSERVEDThe target was observed without full public proof.
NOT_APPLICABLEPublic Resolver proof is not applicable to this target shape.
UNSUPPORTED_TARGETThis target shape is not supported. No network lookup is performed.

Deterministic findings about published state

Canonical result states in the group "Deterministic findings about published state", and what each one tells you
StateMeans
DEGRADEDThe projection is degraded — for example stale. Treated as missing proof for re-check purposes; never as positive proof.
MISMATCHObserved public attributes did not match the expected proof. Informational; not a safety verdict.
EXPIREDA previously published proof posture has expired. Lifecycle posture only.
SUSPENDEDA previously published proof posture is suspended. Lifecycle posture only.
REVOKEDA previously published proof posture is revoked. Lifecycle posture only.

Routing-only

Canonical result states in the group "Routing-only", and what each one tells you
StateMeans
LEGACY_ALIAS_NOT_ACTIVE_SKUThe target resolves to a legacy alias that is not an active product.
REJECTED_PRODUCT_NOT_SELLABLEThe target maps to a product that is not currently sellable.
DEFERRED_PRODUCT_NOT_SELLABLEThe target maps to a product that is deferred and not currently sellable.
PARENT_UPGRADE_REQUIREDA parent upgrade would be required before proof applies.
UNKNOWN_PHASE1_SKUThe 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.

Every verifier exit code, the states that fire it, and the policy modes under which it fires
CodeFires onUnder which policy
0RESOLVER_VERIFIABLE, every informational state, and missing proofOPEN, PREFER
1NO_PUBLIC_RESOLVER_PROOF_FOUND, PARTIAL_PUBLIC_PROOF_FOUND, DEGRADEDREQUIRE only
2MISMATCHevery policy
3REVOKED, SUSPENDED, EXPIREDevery policy
4UNSUPPORTED_TARGETevery policy
5Network attempted and failedREQUIRE only
6Internal verifier errorevery 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>

    ECZ-ID MCP Verifier on npm

  • 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.

    The Action, in the ECZ-ID MCP Verifier repository

  • 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.

    The Trust MCP Server endpoint

  • 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.

    The ECZ-ID Resolver

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.

.github/workflows/ecz-id.yml
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 }}" ;;
          esac

One 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

Every output the ECZ-ID MCP Verifier Action sets, and what each one carries
OutputDescription
result-stateCanonical ResultState produced by the verifier.
reason-codesComma-separated canonical ReasonCodes.
action-envelope-jsonLocal ActionEnvelope JSON describing routing only.
setup-handoff-jsonDeterministic Setup Handoff JSON (routing only).
mcp-action-envelope-jsonMCP Action Envelope JSON (route-only posture path). Null for non-MCP targets.
request-to-resolve-jsonRequest-to-Resolve local guidance packet JSON. signed_request=false; not created server-side.
primary-actionSingle deterministic next action verb.
trustops-action-urlDeterministic TrustOps action URL (no secrets, allow-list params).
developer-guidance-urlDeterministic 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.

ECZ-ID MCP Trust · VS Code
code --install-extension ecocitizenz.eczid-mcp-trust

Free, 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.

ECZ-ID MCP Trust — 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”.

For each kind of work, the ECZ-ID software product that fits it and its published tiers.
What you are buildingProductTiers
Building MCP serversECZ-ID MCP TrustECZ-ID MCP Trust — tiers and pricesFree — £0 · Pro — £12.99/month or £119/year
Building agentsECZ-ID Agent TrustECZ-ID Agent Trust — tiers and pricesFree — £0 · Pro — £12.99/month or £119/year
Building bothDeveloper 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.

Each named surface, the kind of surface it is, where it lives, and how it is installed
SurfaceKindWhereInstall
Trust MCP ServerMachine surface — remote MCP server, 7 toolshttps://trust-mcp.ecocitizenz.com/mcpnone — it is an endpoint
ECZ-ID ResolverProof surface — public read-only projectionresolver.ecocitizenz.org/p/{id} · api.ecocitizenz.com/api/p/{id}.jsonnone — it is an endpoint
ECZ-ID MCP VerifierCI/CLI surface — CLI, stdio MCP server, GitHub Actionnpm @ecocitizenz/ecz-id-mcp-verifiernpx -y @ecocitizenz/ecz-id-mcp-verifier --capabilities
ECZ-ID MCP Verifier ActionCI surface — same repository as the Verifiergithub.com/Ecocitizenz/ecz-id-mcp-verifier (ships inside the Verifier repository; no ref pinned on this page)uses: in a workflow
ECZ-ID MCP TrustEditor surface — VS Code extensionecocitizenz.eczid-mcp-trustcode --install-extension ecocitizenz.eczid-mcp-trust
ECZ-ID Agent TrustEditor surface — VS Code extensionecocitizenz.eczid-ai-agentscode --install-extension ecocitizenz.eczid-ai-agents
ECZ-ID Python familyLocal inspection surface — 10 PyPI distributionspypi.org/search/?q=ecz-idpip install ecz-id ecz-id-mcp
Developer GatewayDocumentation surface — owns the schemasdevelopers.ecocitizenz.comnone — it is an endpoint
TrustOpsCommercial surface — entitlement and order statetrustops.ecocitizenz.com/startnone — 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.

    github.com/Ecocitizenz/ecz-id-mcp-verifier

  • EcoCitizenz-Ltd — the EcoCitizenz Ltd organisation

    Holds the documentation and toolkit repositories. It does not hold the ECZ-ID MCP Verifier.

    github.com/EcoCitizenz-Ltd

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.

Every machine-readable entry point to the layer, in the order an agent should try them, and what each one returns
#URLReturns
1https://mcp.ecocitizenz.com/llms.txtLayer role, doctrine, routes, forbidden inferences
2https://mcp.ecocitizenz.com/.well-known/mcp-services.jsonecz-mcp-services-v2 — surfaces, services, boundaries
3https://trust-mcp.ecocitizenz.com/mcpThe MCP surface itself: tools/list, then call
4https://trust-mcp.ecocitizenz.com/.well-known/oauth-protected-resource/mcpRFC 9728 metadata for the one protected tool
5https://api.ecocitizenz.com/api/p/{ecz_id}.jsonThe public record, with its own machine_policy
6https://developers.ecocitizenz.com/.well-known/ecz-developer-gateway.jsonecz-developer-gateway-v1 — routes, stakeholder map, schema index
7https://developers.ecocitizenz.com/schemas/index.jsonecz-schema-index-v1 — the Action Envelope Stack schemas
8https://machine.ecocitizenz.org/.well-known/ecz-machine.jsonecz-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.

Config Check — findings from a config you paste

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