Koskamo

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.

Wedjat MCP logo, by Horizon ShieldCommunity listingStreamable HTTPNo sign-inEndpoint checked 2026-11-06Published by Horizon Shield
MCP endpoint (Streamable HTTP)
https://gate.horizonshield.dev/mcp
Vendor documentation

What its tools do

6 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.

6 of 6 have a description · 6 of 6 declare behavior hints · 5 of 5 with parameters document them all

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

Community listingRegistry 0.4.24
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
Server-advertised capabilities
{
  "tools": {}
}

Tools

6 advertised

get_conditions — Get the conformance conditions
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

get_conditions input schema
{
  "type": "object",
  "properties": {},
  "additionalProperties": false
}
get_conditions output schema
{
  "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
}
get_conditions annotations
{
  "title": "Get the conformance conditions",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
check_conformance — Check an MCP server for conformance and disclosure
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

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.

check_conformance input schema
{
  "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
}
check_conformance output schema
{
  "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
}
check_conformance annotations
{
  "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
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

verify_verdict input schema
{
  "type": "object",
  "required": [
    "record"
  ],
  "properties": {
    "record": {
      "type": "object",
      "description": "The full verdict object as returned by check_conformance or GET /self"
    }
  },
  "additionalProperties": false
}
verify_verdict output schema
{
  "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
}
verify_verdict annotations
{
  "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
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

lookup_server input schema
{
  "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
}
lookup_server output schema
{
  "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
}
lookup_server annotations
{
  "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
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

is_verified input schema
{
  "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
}
is_verified output schema
{
  "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
}
is_verified annotations
{
  "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
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

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.

preflight_agent input schema
{
  "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
}
preflight_agent output schema
{
  "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
}
preflight_agent annotations
{
  "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

No prompt definitions available.

Resources

Not advertised

No resource definitions available.

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.

Too few checks for a percentage yet (1 of 1 answered).

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

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http wedjat-mcp https://gate.horizonshield.dev/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add wedjat-mcp --url https://gate.horizonshield.dev/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable wedjat-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "wedjat-mcp": {
      "url": "https://gate.horizonshield.dev/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "wedjat-mcp": {
      "type": "streamableHttp",
      "url": "https://gate.horizonshield.dev/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start wedjat-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "wedjat-mcp": {
      "type": "http",
      "url": "https://gate.horizonshield.dev/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http wedjat-mcp https://gate.horizonshield.dev/mcp

Claude Desktop

Open Claude Settings > Connectors > Add custom connector, enter this server URL and enable it for the conversation. This is a manual remote-connector handoff, not a desktop JSON configuration.
Claude Desktop configuration
https://gate.horizonshield.dev/mcp

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "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.