Wedjat MCP
A read-only MCP server that measures and verifies the conformance of other MCP servers or A2A agents. It provides tools to check conditions, verify verdicts, and lookup server status without requiring an API key or account, allowing agents to assess trustworthiness before delegation.
Endpoint and access
No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.
https://gate.horizonshield.dev/mcpWhat its tools do
6 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.
Checks and signals
Each line is separate evidence, not a trust score.
- Passed Endpoint answered the live check ·
- Availability 1 of 1 checks passed in 30 days
What you can do with it
- Check an MCP server's conformance before connecting
- Verify the integrity of a server's verdict via SHA-256
- Lookup server status and conditions
- Integrate security checks into CI/CD pipelines
Source and maintenance
- Maintenance checked
Protocol and capabilities
- Server
- hs-verify-gate 0.4.24
- MCP protocol negotiated in check
- 2025-11-25
- Tools
- 6 advertised
- Resources
- Not advertised
- Resource templates
- Not advertised
- Prompts
- Not advertised
{
"tools": {}
}Tools
6 advertised
get_conditions — Get the conformance conditions
Return the five conditions this gate measures, what it explicitly does not verify, and the tier definitions. Takes no arguments and returns identical output every time. Read this before running a check so you know what a verdict does and does not claim.
{
"type": "object",
"properties": {},
"additionalProperties": false
}{
"type": "object",
"properties": {
"gate": {
"type": "string",
"description": "Name of this gate."
},
"tiers": {
"type": "object",
"description": "The status words a verdict can carry and what each one means."
},
"lookup": {
"type": "object",
"description": "How to read the register for one endpoint before connecting (GET /register/lookup)."
},
"consent": {
"type": "string",
"description": "When this gate calls a tool on a checked server, and what counts as the owner's consent."
},
"version": {
"type": "string",
"description": "Version of the gate code that produced this document."
},
"operator": {
"type": "string",
"description": "Who operates this gate."
},
"red_team": {
"type": "string",
"description": "The adversarial test suite this gate is run against, with its scores by version."
},
"conditions": {
"type": "object",
"description": "The measured conditions, keyed by condition id, each with what is measured and how."
},
"mcp_client": {
"type": "object",
"description": "How this gate calls an MCP endpoint (Accept, initialize params, versions, session, event stream limits) since 0.4.24, and the correction for 0.4.22 and earlier."
},
"gate_commit": {
"type": "string",
"description": "Git commit of the deployed gate, or a sentence saying the deployment did not pin one."
},
"reachability": {
"type": "string",
"description": "How an answer from the server is told apart from a failure to reach it (pending versus held)."
},
"record_bytes": {
"type": "object",
"description": "Where the exact bytes that record_sha256 hashes are served, and since when."
},
"self_applied": {
"type": "string",
"description": "Statement that this gate is measured under its own conditions."
},
"number_safety": {
"type": "object",
"description": "How numbers in a verdict are kept recomputable across JSON implementations."
},
"instant_coordinate": {
"type": "object",
"description": "How the time of a scheduled measurement and the measured tool are derived rather than chosen."
},
"well_known_consent": {
"type": "object",
"description": "The consent file an origin can publish, its path and its fields."
},
"what_this_verifies": {
"type": "array",
"description": "The claims a verdict from this gate supports, as sentences."
},
"also_measured_no_verdict": {
"type": "object",
"description": "Measurements that are disclosed and never change a verdict."
},
"what_this_does_not_verify": {
"type": "array",
"description": "What a verdict from this gate never supports, as sentences."
},
"establishes_and_does_not_establish": {
"type": "object",
"description": "What a verdict establishes and what it does not, as two lists."
}
},
"description": "Deterministic. Takes no arguments, looks nothing up, and returns the same document every time. It therefore declares no read-state field, and a structural probe will score it as unable to hold the difference between a failed read and an empty one. That score is correct and is left standing: this tool has no read to fail. Adding a state field it can never use would make the number look better and mean less.",
"additionalProperties": true
}{
"title": "Get the conformance conditions",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}check_conformance — Check an MCP server for conformance and disclosure
Measure a public MCP endpoint against five conditions: it speaks MCP, it publishes an A2A agent card, it declares who pays it, identical input returns identical output, and the verdict itself can be recomputed by anyone. Free, no key. Conformance and disclosure only; this says nothing about whether any figure the checked server returns is correct. By default no tool on the checked server is called, so determinism comes back as not measured rather than guessed. It is measured when the owner has published /.well-known/mcp-conduct.json with allow_tool_call true.
{
"type": "object",
"required": [
"endpoint"
],
"properties": {
"endpoint": {
"type": "string",
"description": "https URL of the MCP endpoint to measure"
},
"allow_tool_call": {
"type": "boolean",
"description": "Kept for compatibility. Since 2026-10-08 an assertion alone calls no tool: consent is proven only by the owner's /.well-known/mcp-conduct.json. Default false."
}
},
"additionalProperties": false
}{
"type": "object",
"properties": {
"gate": {
"type": "string",
"description": "Name of this gate."
},
"checks": {
"type": "object",
"description": "One entry per condition, each with whether it was measured, whether it passed, and the detail."
},
"status": {
"type": "string",
"description": "verified = every measured condition passed. pending = measured, not all passing. held = could not be reached, nothing established."
},
"endpoint": {
"type": "string",
"description": "The MCP endpoint that was measured."
},
"reachable": {
"type": [
"boolean",
"null"
],
"description": "Three-valued on purpose (gate58). true = measured and answered. false = measured and did not answer. null = NOT MEASURED. null is never to be read as a failing endpoint; it means this gate has nothing to say."
},
"checked_at": {
"type": "string",
"description": "When the measurement started, ISO 8601 UTC."
},
"probed_via": {
"type": "string",
"description": "The network path the probe took (relay or direct)."
},
"scope_note": {
"type": "string",
"description": "What this measurement covers and what it does not."
},
"establishes": {
"type": "array",
"description": "What this verdict establishes, as sentences."
},
"gate_commit": {
"type": "string",
"description": "Git commit of the deployed gate, or a sentence saying the deployment did not pin one."
},
"gate_version": {
"type": "string",
"description": "Version of the gate code that took this measurement."
},
"tools_called": {
"type": "string",
"description": "Whether a tool on the checked server was executed, in words."
},
"consent_basis": {
"type": "string",
"description": "On what basis a tool call was or was not made."
},
"measured_from": {
"type": "object",
"description": "Where this measurement was taken, inside the hashed bytes: platform (cloudflare, azure, ...) and origin, the public origin that serves this record and its history. Absent on records before 0.4.23."
},
"number_safety": {
"type": "object",
"description": "Whether every number in this verdict survives a JSON round trip unchanged."
},
"record_sha256": {
"type": "string",
"description": "Hash of this verdict with record_sha256 and recompute_note removed. Recompute it yourself; verify_verdict does the same arithmetic."
},
"consent_lookup": {
"type": "object",
"description": "Present when no proven consent was found: the consent file that was read, the result, and how to consent."
},
"consent_source": {
"type": "string",
"description": "Where the consent came from: operator_list, well_known, requester or none."
},
"recompute_note": {
"type": "string",
"description": "How to recompute record_sha256. Not part of the hashed bytes."
},
"canonicalization": {
"type": "object",
"description": "Condition 07, disclosed and never a verdict: whether the declared tool surface canonicalizes under RFC 8785."
},
"measurement_note": {
"type": "string",
"description": "Present only when the gate's own relay failed, so that nothing here is read as a statement about the target."
},
"absence_vs_failure": {
"type": "object",
"description": "Condition 06, disclosed and never a verdict: whether the server's tools can tell a failed lookup from an empty one."
},
"does_not_establish": {
"type": "array",
"description": "What this verdict does not establish, as sentences."
},
"coordinate_derivation": {
"type": "object",
"description": "How the measured tool and instant were derived, or that the legacy rule applied."
},
"consent_assertion_ignored": {
"type": "object",
"description": "Present when the request set allow_tool_call true without proven consent: the assertion was recorded and no tool was called."
}
},
"additionalProperties": true
}{
"title": "Check an MCP server for conformance and disclosure",
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}verify_verdict — Recompute a verdict hash without trusting the issuer
Take a verdict this gate issued and recompute its record_sha256 independently. Removes record_sha256 and recompute_note, serialises the remainder in key order, and hashes it. Returns whether the verdict was altered after it was issued. You do not have to trust the party that issued the verdict, including this one.
{
"type": "object",
"required": [
"record"
],
"properties": {
"record": {
"type": "object",
"description": "The full verdict object as returned by check_conformance or GET /self"
}
},
"additionalProperties": false
}{
"type": "object",
"properties": {
"note": {
"type": "string",
"description": "What a match or a mismatch does and does not prove."
},
"method": {
"type": "string",
"description": "The arithmetic used, so you can repeat it without this gate."
},
"reason": {
"type": "string",
"description": "Present instead of the hashes when the input could not be checked: not an object, or no record_sha256."
},
"verified": {
"type": "boolean",
"description": "true = the verdict hashes to its own record_sha256, so it was not altered after issue. false = it was altered, or it carries no record_sha256. This is a finding about the record, not an error."
},
"expected_sha256": {
"type": [
"string",
"number",
"boolean",
"object",
"array"
],
"description": "The record_sha256 found in the record you passed, echoed as given (a string in any verdict this gate issued). Absent when the record had none."
},
"recomputed_sha256": {
"type": "string",
"description": "SHA-256 this call computed from the record. Absent when there was nothing to compare it with."
}
},
"additionalProperties": true
}{
"title": "Recompute a verdict hash without trusting the issuer",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}lookup_server — Look up an MCP server on this register
Returns one record (not a list). Look up what this register already holds about an MCP endpoint: whether it is watched, how often it is re-measured, how many measurements exist, when the first and latest were taken, and the latest verdict with the record_sha256 you can recompute yourself. Reads stored measurements only. It contacts nothing and measures nothing, so use check_conformance for a fresh reading. An endpoint that is absent is reported as absent and that is NOT a negative verdict: it means nobody has measured it here, not that it failed.
{
"type": "object",
"required": [
"endpoint"
],
"properties": {
"endpoint": {
"type": "string",
"description": "https URL of the MCP endpoint to look up, exactly as it appears on the register"
}
},
"additionalProperties": false
}{
"type": "object",
"properties": {
"tier": {
"type": "string",
"description": "On the register: free, paid or self. The verdict is the same for every tier."
},
"means": {
"type": "string",
"description": "What this answer means."
},
"latest": {
"type": [
"object",
"null"
],
"description": "On the register: the latest stored measurement as a summary with its record_sha256, or null if none."
},
"cadence": {
"type": "string",
"description": "On the register: how often it is re-measured (weekly or daily)."
},
"history": {
"type": "array",
"description": "On the register: the most recent stored measurements, oldest first, at most 20."
},
"added_at": {
"type": [
"string",
"null"
],
"description": "On the register: when the row was added, or null if not recorded."
},
"endpoint": {
"type": "string",
"description": "The endpoint you asked about, echoed."
},
"standing": {
"type": "string",
"description": "On the register: measured, or a sentence saying it is watched and not yet measured."
},
"on_register": {
"type": "boolean",
"description": "true = this endpoint is on the register. false = the register was READ and this endpoint is not on it. If the register could not be read at all, this field is not returned: the call comes back as a tool error (isError), because absence and not-knowing are different answers."
},
"measurements": {
"type": "integer",
"description": "On the register: how many measurements are stored for this endpoint."
},
"does_not_mean": {
"type": "string",
"description": "What this answer must not be read as."
},
"fresh_reading": {
"type": "string",
"description": "Absent endpoint only: how to measure it right now."
},
"how_to_appear": {
"type": "string",
"description": "Absent endpoint only: how anyone can add it to the register."
},
"register_size": {
"type": "integer",
"description": "Absent endpoint only: how many endpoints are on the watchlist."
},
"full_history_url": {
"type": "string",
"description": "On the register: URL of the complete history for this endpoint."
},
"last_measured_at": {
"type": [
"string",
"null"
],
"description": "On the register: time of the latest stored measurement, or null."
},
"alerted_on_change": {
"type": "boolean",
"description": "On the register: whether someone asked to be notified when the row changes."
},
"first_measured_at": {
"type": [
"string",
"null"
],
"description": "On the register: time of the first stored measurement, or null."
},
"history_truncated": {
"type": "boolean",
"description": "On the register: true when history leaves out older measurements."
}
},
"description": "Returns one record (not a list): what this register holds for the single endpoint you named. Fields after on_register depend on its value: an absent endpoint carries register_size, how_to_appear and fresh_reading; an endpoint on the register carries the rest.",
"additionalProperties": true
}{
"title": "Look up an MCP server on this register",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}is_verified — One glance: is this MCP server verified, with proof
A single machine-first answer for an agent deciding whether to trust an MCP endpoint BEFORE it connects. Returns verified (true only when the latest scheduled measurement passed every measured condition; null otherwise, never false), a state enum saying which case it is, measured_at, and a record_sha256 with a recompute_url so you can check the verdict without trusting this gate. Reads the stored register only: it contacts nothing and measures nothing. Absent and pending are reported honestly and are NOT negative verdicts. For a fresh measurement rather than the stored one, use check_conformance.
{
"type": "object",
"required": [
"endpoint"
],
"properties": {
"endpoint": {
"type": "string",
"description": "https URL of the MCP endpoint to look up, exactly as it appears on the register"
}
},
"additionalProperties": false
}{
"type": "object",
"properties": {
"gate": {
"type": "string",
"description": "Name of this gate."
},
"state": {
"enum": [
"verified",
"pending",
"held",
"watched",
"absent"
],
"type": "string",
"description": "verified = passed all measured conditions. pending = measured but not passing every one (often only because determinism needs the owner's consent). held = could not be reached. watched = on the list, not yet measured. absent = no row here at all."
},
"reason": {
"type": "string",
"description": "One sentence saying why state has the value it has."
},
"endpoint": {
"type": "string",
"description": "The endpoint you asked about, echoed."
},
"verified": {
"type": [
"boolean",
"null"
],
"description": "true = latest measurement passed all measured conditions. null = not established here (see state). Never false: unmeasured or not-yet-passing is not a failure."
},
"conditions": {
"type": [
"object",
"null"
],
"description": "Per condition: true passed, false did not pass, null not measured. null as a whole when nothing was measured."
},
"record_url": {
"type": [
"string",
"null"
],
"description": "URL of the exact bytes that record_sha256 hashes, or null for a verdict stored before those bytes were kept."
},
"gate_commit": {
"type": "string",
"description": "Git commit of the deployed gate, or a sentence saying the deployment did not pin one."
},
"history_url": {
"type": "string",
"description": "URL of the stored measurements for this endpoint."
},
"measured_at": {
"type": [
"string",
"null"
],
"description": "Time of the latest stored measurement, or null when there is none."
},
"on_register": {
"type": "boolean",
"description": "true = the endpoint has a row here. false = the register was read and it has none."
},
"measurements": {
"type": "integer",
"description": "Measured endpoints only: how many measurements are stored."
},
"how_to_appear": {
"type": [
"string",
"null"
],
"description": "Absent endpoint only: how anyone can add it to the register."
},
"recompute_url": {
"type": "string",
"description": "Where to fetch what record_sha256 can be checked against: record_url when it exists, otherwise the history."
},
"record_sha256": {
"type": [
"string",
"null"
],
"description": "Hash of the latest verdict. Recompute it via recompute_url; no trust in this gate required."
},
"recompute_note": {
"type": "string",
"description": "How to recompute record_sha256 from record_url, or why it cannot be recomputed."
},
"verified_meaning": {
"type": "string",
"description": "What verified true and null mean."
},
"absence_vs_failure": {
"type": [
"object",
"null"
],
"description": "Measured endpoints only: condition 06 from the latest measurement, disclosed and never a verdict."
},
"not_an_endorsement": {
"type": "string",
"description": "What a verified reading does not claim."
}
},
"description": "A one-glance answer for an agent deciding whether to trust an MCP endpoint BEFORE connecting. Reads the register only; measures nothing. verified is true ONLY when the latest scheduled measurement passed every measured condition; it is null in every other case (pending, held, watched, absent), and never false, because this gate calls nothing a failure. The state enum says which case it is, so a consumer can tell 'not verified here' apart from 'the lookup failed' (that returns as a tool error, isError) and from 'measured and passing'.",
"additionalProperties": true
}{
"title": "One glance: is this MCP server verified, with proof",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}preflight_agent — Before delegating: check an A2A agent's card, who pays it, and its register reading
Call this before handing work to an A2A agent you have not used before. Fetches the agent's public card (https://<agent>/.well-known/agent-card.json, one request), reports whether it declares the A2A Conduct Extension, who it says pays it (the compensation declaration, as declared and not verified), whether the card carries a signature, the endpoints it asks to be measured on, and this register's stored reading for each (verified is true only when the latest scheduled measurement passed; null otherwise, never false), plus where to file your own witness walk. Measures nothing new and returns counts and pointers, never a score. An agent that does not declare the extension is reported as such, which is not a negative verdict.
{
"type": "object",
"required": [
"agent"
],
"properties": {
"agent": {
"type": "string",
"description": "https origin of the agent (https://agent.example) or the full URL of its agent card"
}
},
"additionalProperties": false
}{
"type": "object",
"properties": {
"ok": {
"type": "boolean",
"description": "Always true in this object: the card was fetched and read."
},
"agent": {
"type": "string",
"description": "The agent's https origin."
},
"schema": {
"type": "string",
"description": "Format name of this object: gate-preflight-v1."
},
"card_url": {
"type": "string",
"description": "The agent card URL that was fetched."
},
"register": {
"type": "array",
"description": "This register's stored reading for each of those endpoints: state, verified (true or null, never false), record_sha256."
},
"card_status": {
"type": [
"integer",
"null"
],
"description": "HTTP status the card URL answered with."
},
"how_to_file": {
"type": "string",
"description": "How to walk the agent yourself and file your own record."
},
"compensation": {
"type": [
"object",
"null"
],
"description": "Who the agent says pays it, as declared and not verified, or null when it says nothing."
},
"declared_uri": {
"type": [
"string",
"null"
],
"description": "The extension URI the card declared, or null."
},
"conduct_record": {
"type": [
"string",
"null"
],
"description": "Where the card says its conduct record is published, or null."
},
"witness_intake": {
"type": [
"string",
"null"
],
"description": "Where the card says witness records can be filed, or null."
},
"does_not_establish": {
"type": "array",
"description": "What this reading does not establish, as sentences."
},
"extension_declared": {
"type": "boolean",
"description": "true = the card declares the A2A Conduct Extension. false is not a negative verdict."
},
"measured_endpoints": {
"type": "array",
"description": "The https endpoints the card asks to be measured on, at most 5."
},
"compensation_source": {
"type": [
"string",
"null"
],
"description": "Where the compensation declaration was read: extension params or card top-level."
},
"card_signature_present": {
"type": "boolean",
"description": "Whether the card carries a signature. Presence only; the signature is not verified here."
}
},
"description": "What the agent's public card declares and what this register holds for the endpoints it names. Counts and pointers, never a score. A card that could not be fetched or read comes back as a tool error (isError), not as this object.",
"additionalProperties": true
}{
"title": "Before delegating: check an A2A agent's card, who pays it, and its register reading",
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}Prompts
Not advertised
Resources
Not advertised
90-day uptime
A lightweight connection check about every six hours, sampled on hosts with many listings. It shows the server answered, not that its tools work.
- 2026-11-06: 1 of 1 checks answered
30-day availability
Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.
- Successful checks
- 1 of 1 (100%)
- Average latency
- 211 ms
- 95th percentile latency
- 211 ms
Maintenance history
Public check and source-refresh events. Editorial and ownership records remain private.
- · probe · passed · 211 ms · metadata changed · 6 tool(s)
Connect from your client
Each snippet registers the same endpoint; pick the client you use.
Claude Code
claude mcp add --transport http wedjat-mcp https://gate.horizonshield.dev/mcpCodex
codex mcp add wedjat-mcp --url https://gate.horizonshield.dev/mcpCursor
{
"mcpServers": {
"wedjat-mcp": {
"url": "https://gate.horizonshield.dev/mcp"
}
}
}Cline
{
"mcpServers": {
"wedjat-mcp": {
"type": "streamableHttp",
"url": "https://gate.horizonshield.dev/mcp",
"disabled": false
}
}
}VS Code
{
"servers": {
"wedjat-mcp": {
"type": "http",
"url": "https://gate.horizonshield.dev/mcp"
}
}
}Gemini CLI
gemini mcp add --transport http wedjat-mcp https://gate.horizonshield.dev/mcpClaude Desktop
https://gate.horizonshield.dev/mcpWindsurf
{
"mcpServers": {
"wedjat-mcp": {
"serverUrl": "https://gate.horizonshield.dev/mcp"
}
}
}Let your agent find its tools
Find servers like Wedjat MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.