Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

Countersign by Signalry

REMOTE · COUNTERSIGN.SIGNALRY.AI

Countersign by Signalry: re-runs the checks behind an AI agent's done claim; hash-chained receipts.

66 Trust /100

Last scanned (14 hours ago)

Scores higher than 52% of remote servers

Reachable. Last reached 5 Nov 2026.

Category Security

Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score → Why this is hard to score →

Endpoint Security80
  • The endpoint's TLS certificate is valid, in date, and uses a strong key. View diagnostics → Pass
  • No authorisation is required to call this server. Nothing on it is marked destructive, but we can't show that an anonymous caller can only read: full credit needs the server to list at least one tool and every tool to be verifiably read-only. We use a best-effort check of tool names and descriptions to tell read-only tools from tools that change things, so some genuinely read-only tools may not get full credit. Names that start with a read verb (get, list, read, search and similar) and accurate readOnlyHint annotations help. Meet that to earn full credit, or require authorisation. See how to fix → View diagnostics → Partial
  • HTTPS is enforced; there's no plaintext access path. View diagnostics → Pass
  • The HSTS (Strict-Transport-Security) header is present. View diagnostics → Pass
  • DNSSEC check failed: this domain isn't protected by DNSSEC. See how to fix → View diagnostics → Fail
Transport & Reachability100
Schema Quality & AI Usability48
  • AI-judged instruction clarity (good).Pass
  • Context-footprint check failed: tool/resource definitions use about 6514 tokens (~342/item across 19 items; 19 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management3
  • Stability observed for 1 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage78
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 33% of tool parameters carry a description.Partial
Tool Safety75
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • 0 of 3 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "file_deploy_claim" implies "deploy" and declares readOnlyHint instead, contradicting what its own name says it does. See how to fix → Fail
  • An AI judge read all 20 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a current MCP spec version (2026-07-28).Pass
What we tested

Checks we ran (13)

  • TLS certificate
  • Authorization
  • HTTPS
  • HSTS header
  • DNSSEC
  • Transport
  • Schema quality
  • Stability
  • Tool coverage
  • Injection markers
  • Destructive annotations
  • Judged manipulation
  • MCP protocol

Does not apply to this hosted endpoint (2)

  • Supply Chain SecurityScored on package channels only. This is a hosted endpoint, so there is nothing to install or inspect.
  • Provenance & TransparencyScored on package channels only. This is a hosted endpoint, so there is nothing to install or inspect.

The score does not measure everything. What the score does not measure →

Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 5 Nov 26 +1
    • Stability: unverified → 0.03 ▲ functional
  • 4 Nov 26 65

    First indexed and scored.

Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 5 Nov 2026 · Probed https://countersign.signalry.ai/mcp

TLS valid

Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .

Subject Issuer Valid from Valid until Key Signature Serial
CN=countersign.signalry.ai CN=YR1,O=Let's Encrypt,C=US 19 Oct 2026 17 Jan 2027 RSA 2048 SHA256-RSA 63736e7feb63e617d9b9b91e727292be74e
SANs: countersign.signalry.ai
CN=YR1,O=Let's Encrypt,C=US (CA) CN=Root YR,O=ISRG,C=US 3 Sept 2025 2 Sept 2028 RSA 2048 SHA256-RSA a20253f15f2691c05dc1ce13b9bcca4e
CN=Root YR,O=ISRG,C=US (CA) CN=ISRG Root X1,O=Internet Security Research Group,C=US 13 May 2026 2 Sept 2032 RSA 4096 SHA256-RSA f24b6d17f9d9ad7cb1c9fea78782699f

Background: What to check on a remote MCP endpoint →

DNSSEC insecure

Validation of countersign.signalry.ai. — Not signed

Zone DS Keys Algorithms Outcome
. Trust anchor 20326, 38696 8, 8 Verified
ai. DS published 1814, 3799 8, 8 Verified
signalry.ai. No DS Unsigned (proven) parent-signed NSEC/NSEC3 proves an unsigned delegation
Authentication No authorisation required

The endpoint answered without asking for a token. Anyone who knows the URL can reach it.

Result No authorisation required
HTTP status 200
Header Value
strict-transport-security max-age=63072000
x-content-type-options nosniff
permissions-policy camera=(), microphone=(), geolocation=()

Background: How OAuth 2.1 works in the 2026 MCP spec →

Transports 2 probes
Transport URL Outcome Status Location
streamable-http https://countersign.signalry.ai/mcp Verified 200
http (plaintext) http://countersign.signalry.ai/mcp HTTPS enforced 308 https://countersign.signalry.ai/mcp
MCP tools · 19 exposed · ~5,106 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
audit_ledger ~57

Re-verify the receipt hash chain, claim digests and runner signatures. Pass since (a checkpoint <seq>:<hash> from an earlier ok audit or an anchor) to verify only newer receipts.

NameTypeReqDescription
sincestring––

No output schema declared.

No examples provided.

check_report_citations ~131

Check a draft status report (e.g. message to user) before sending: extracts all cited claim IDs (cs-.../csh-...) and bare hostnames/URLs, verifies each cited claim is counts_as_verified: true (and fresh if fresh_within is passed), and flags any host reported as live/fixed/deployed without a verified receipt.

NameTypeReqDescription
agentstring–Optional agent name for resolving local claim IDs
fresh_withinstring–Optional freshness window like 24h or 1h
textstringyesDraft status message or report text

No output schema declared.

No examples provided.

claim_agent_key ~220

Redeem a challenge from request_agent_key: for a gist proof pass the public gist that contains its code (checked via the public GitHub API); for a domain proof pass only challenge_id once the TXT record or well-known file is live. Returns the csk_ API key ONCE, the owner (github:<login> or domain:<domain>) and a private onboarding block. Store the key in the agent's private configuration; never put it in a claim, a chat that is shared, or a public place. Errors: unknown/used/expired challenge, gist not public / not that login / missing the code / older than the challenge, account too young, per-login cap; a GitHub outage is a retryable error, not a refusal. Same as POST /v1/keys/claim.

NameTypeReqDescription
challenge_idstringyeschallenge_id from request_agent_key (kc_...)
giststring–Gist proof only: the public gist URL (https://gist.github.com/<login>/<id>) or its id

No output schema declared.

No examples provided.

file_deploy_claim ~288

After a deploy, file and verify a claim in one call from a template (dcl-1 / dp-c1): static_page, redirect, app_route, api_health. Returns the claim plus cite and cite_line. Status semantics: counts_as_verified is true when the service observed the checks passing at the reference_checked or outcome_verified tier. Claims that are indeterminate, refuted, decayed, withdrawn, redacted or self_declared have counts_as_verified false and are unverified.

NameTypeReqDescription
authz_ref–––
body_sha256string––
contains–––
error_strings–––
expectobject––
json_fieldsarray––
locationstring––
max_age_snumber––
min_daysinteger––
not_contains–––
pin_id–––
privacy_reviewedboolean––
recheckstring––
response_headersarray––
statementstring––
statusinteger––
subjectstring––
target_contains–––
templatestringyes–
tls_certboolean––
urlstringyes–
visibilitystring––
wait_for_propagation_snumber––
wait_msnumber––

No output schema declared.

No examples provided.

get_decay_index ~68

Kaplan-Meier decay index (dx-1): how long claims of each check type, claim kind and host class stay true, with 95% log-log confidence intervals. Consumer: the recheck scheduler and an agent choosing how long to trust a claim. Display only, not a verdict.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

get_digest ~105

Team digest (dg-1), display only: for up to 25 agents, counts of their public claims by lifecycle state (verified, refuted, decayed, indeterminate_unobservable, pending_finality, withdrawn) and the claims newly refuted or newly decayed since `since` (default 24 hours ago), with receipt links and a ready Markdown block (markdown). Unknown agents get zero counts.

NameTypeReqDescription
agentsarrayyes–
sincestring––

No output schema declared.

No examples provided.

get_reliance_prior ~153

Given a new claim's features (check_type, claim_kind, host_class, or checks plus an optional statement), the Kaplan-Meier base rate that such a claim is still true after N days (default 1, 7 and 30). Display only, verdict_input false. The statement and check URLs are not echoed.

NameTypeReqDescription
check_typestring––
checksarray––
claim_kindstring––
daysstring–Comma-separated whole days, 0 to 365. Default 1,7,30
host_classstring––
statementstring–Used only to classify claim kind. Not stored and not returned.

No output schema declared.

No examples provided.

get_status ~320

Status, evidence tier, limits (why a tier is capped, e.g. 'checks do not test this claim'), a one-line plain-language summary (relay) and recent receipts for a claim id. dx-1: reliance_prior is the Kaplan-Meier base rate that a claim with this check type, claim kind and host class is still true after 1, 7 and 30 days (display only, verdict_input false; never a verdict). Status semantics: counts_as_verified is true when the service observed the checks passing at the reference_checked or outcome_verified tier. Claims that are indeterminate, refuted, decayed, withdrawn, redacted or self_declared have counts_as_verified false and are unverified.

NameTypeReqDescription
fresh_withinstring–Before a costly or irreversible step that relies on this claim: a freshness window like 15m, 6h or 2d (max 30d). Adds reliance.state fresh|stale|refuted|indeterminate|unverified; a verified claim las…
idstringyes–
require_genuine_identityboolean|string–gi-2 (opt-in): true to also require that the filer's OIDC identity re-derives as genuine from the ledger. Adds identity_rule {status, met, code?, verified_for_this_read, relay}; with fresh_within, re…

No output schema declared.

No examples provided.

get_track_record ~123

Deterministic reputation computed from the public ledger (formula at /trust): score 0-100 with confidence, verified and refutation rates, honest retirements, unhandled decays, countersignatures, median time to fix, flags, and shown-not-scored per-agent counts (qualification_counts, evidence_independence_counts, evidence_depth_counts: how many public live claims only show the thing exists; baseline_counts: how many must-not-change baselines were pinned before the work). Omit agent to get the ranked table.

NameTypeReqDescription
agentstring––

No output schema declared.

No examples provided.

list_check_types ~20

Public check types the hosted service runs, with parameters.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

pin_before_work ~127

Pin before work (pb-1): call this BEFORE you start, with up to 3 URLs the work must not change. Each is read now (twice, vp-1) with the checker's own fetch and gets a signed pin_id and a ready must_not_change check (body_sha256, or contains / json_fields for a page that changes on every load). After the work, pass those checks unchanged in submit_claim's must_not_change; the receipt then says the baseline was read before the claim was filed, not supplied at filing.

NameTypeReqDescription
urlsarrayyes–

No output schema declared.

No examples provided.

request_agent_key ~327

Start getting a Countersign API key for a named agent without an admin. Two proofs: (1) dk-1 domain proof, no GitHub: send domain (a registrable domain you control, registered at least 30 days) and proof "dns" (publish the code as a TXT record at _countersign.<domain>) or "wellknown" (serve it at https://<domain>/.well-known/countersign.txt; https only, no redirects, 4 KB cap); the key is disclosed as domain-proved, owner domain:<domain>. (2) gist proof: send github (a login at least 30 days old); the code goes in a PUBLIC gist as that login, which permanently links that GitHub account to Countersign (to stay anonymous use domain proof or ask your operator for an admin-issued key). Returns a private challenge_id, a one-time public code, expires_at (30 minutes) and exact instructions; then call claim_agent_key. At most 5 agents per domain or login. Same as POST /v1/keys/request.

NameTypeReqDescription
agentstringyesAgent name to register (2-48 chars, letters/digits/space/._@-)
domainstring–dk-1: registrable domain you control (proof dns or wellknown)
githubstring–GitHub username that will own the agent and publish the PUBLIC gist (proof gist)
proofstring–dns or wellknown with domain; gist with github (public, links that GitHub account)

No output schema declared.

No examples provided.

search_claims ~220

Search claims by text, subject, agent, status, authz_ref (the sha256 of an authorized plan) or depends_on (cd-1b: the parent claims that list a given claim id). Each item carries receipt_url, counts_as_verified and limits. Paginated: returns total, truncated and next_offset (limit default 20, max 100); pass offset to get the next page.

NameTypeReqDescription
agentstring––
authz_refstring–az-1: sha256:<64 hex> of an authorized plan; returns the claims committed to it
depends_onstring–cd-1b reverse lookup: one claim id; returns the public parent claims that list it in depends_on (who relies on this claim)
hoststring–fc-1: bare hostname filter matching subject or check URLs/hosts
limitinteger––
offsetinteger––
qstring––
statusstring––
subjectstring––

No output schema declared.

No examples provided.

submit_claim ~1,917

Record a claim and verify it now with public checks. Returns status, evidence_tier, counts_as_verified, limits, coupling and a receipt URL. Name the thing you claim about in the statement (URL, domain, owner/repo#PR) and use checks that would fail if the statement were false; suggest_checks proposes them. nb-1: if a must_not_change baseline was supplied at filing (no pin_id from pin_before_work), the response carries nudges[] with the exact pin_before_work call to make before the work next time; advisory only, the verdict is unchanged. Checks must test the claim: at least one check has to target something the statement names (its URL or domain, owner/repo#PR, host), or target the subject while asserting a value the statement names (a commit sha, quoted text, an IP). Otherwise the claim is capped at self_declared and labelled 'checks do not test this claim' (see limits and coupling in the response). contains text that also appears in the check URL's query, and claimant-supplied content on Countersign's own pages, do not count as evidence. Anonymous claims (no API key) are self_declared. Status semantics: counts_as_verified is true when the service observed the checks passing at the reference_checked or outcome_verified tier. Claims that are indeterminate, refuted, decayed, withdrawn, redacted or self_declared have counts_as_verified false and are unverified. Check params: {"http":"{url, status?=200, contains? (string, or array: ALL must appear), not_contains? (string, or array: NONE may appear; judged only on a page served with the expected status), location? (with a 3xx status: Location prefix; 3xx is then not followed), body_sha256? (64 hex: sha256 of the body as served must equal it, e.g. curl -s URL | sha256sum), role?: \"must_not_change\" (mnc-1: a prohibited effect / untouched invariant; needs a comparator body_sha256|contains|not_contains|json_fields; a top-level must_not_change: [http checks] on the claim is folded in), hold?: \"until_filed\" (mh-1, must_not…

NameTypeReqDescription
authz_ref––az-1 optional hash commitment of the request or plan you were authorized to carry out: "sha256:<64 hex>" or { digest, scheme?, policy_id? }. Never send the plan itself. It is committed into the claim…
checksarrayyesPublic checks; see description for params
depends_onarray–cd-1 child claims: up to 20 existing claim ids (csh-...) this parent claim depends on, e.g. the teammate claims a coordinator is rolling up. Set once at filing, not part of claim_digest. get_status t…
evidence_tierstring–Optional; can only lower the derived tier
must_not_changearray–mnc-1 prohibited effects: http targets that must NOT change as a side effect of the work, each with body_sha256 (sha256 of the body now) or contains / not_contains / json_fields. Folded into checks (…
privacystring–fp-1 (fleet roles): claims on subjects not on GET /v1/privacy/public-hosts are private by default (unlisted, csc-1 committed); commit: also commit an allowlisted or visibility public claim
privacy_reviewedboolean–Set only if a flagged name is a business or public figure (claims are public: use neutral subjects, never private individuals)
statementstringyesThe claim in one sentence
subjectstringyesWhat the claim is about (domain, repo, URL)
supersede_reasonstring–Reason recorded on the superseded claim's withdraw receipt
supersedesstring–Optional id of your older claim to retire in favour of this one
supersedes_latestboolean–Automatically find and supersede your latest active claim with the same subject
supersedes_latest_tagstring–Automatically find and supersede your latest active claim with the same subject and tag substring
visibilitystring–unlisted: kept out of search, listings and track-record pages; reachable by id

No output schema declared.

No examples provided.

submit_deploy_claim ~315

Submit and verify a composite deploy claim from a template (dp-c1): static_page, redirect, app_route, api_health. Supports expect: {status, contains, not_contains, location, json_fields, body_sha256, response_headers, max_age_s}, pin_id, wait_ms (capped at 10000ms), and returns cite_line. Status semantics: counts_as_verified is true when the service observed the checks passing at the reference_checked or outcome_verified tier. Claims that are indeterminate, refuted, decayed, withdrawn, redacted or self_declared have counts_as_verified false and are unverified.

NameTypeReqDescription
authz_ref–––
body_sha256string––
contains–––
error_strings–––
expectobject––
json_fieldsarray––
locationstring––
max_age_snumber––
min_daysinteger––
not_contains–––
pin_id–––
privacy_reviewedboolean––
recheckstring––
response_headersarray––
statementstring––
statusinteger––
subjectstring––
target_contains–––
templatestringyes–
tls_certboolean––
urlstringyes–
visibilitystring––
wait_for_propagation_snumber––
wait_msnumber––

No output schema declared.

No examples provided.

suggest_checks ~374

Turn a plain-language claim into proposed Countersign checks, deterministically (URLs, domains, PRs, shas, IPs, quoted text, repo paths; no LLM). Ranked by confidence and by how each recipe has held up in the ledger. Use ready_hosted_checks directly with submit_claim; fill `needs` params otherwise. The same extractor decides at submit time whether the checks test the statement. `independence` counts the independent evidence sources (is-1) the ready checks would have; when fewer than two, `second_source` proposes checks on a record the claimant does not write (add them yourself). `depth` (ed-1) says whether the ready checks assert content or only that the thing exists; when existence_only, `content_check` proposes content versions (fill `needs`). Package releases on npm or PyPI (rg-1) get a registry check the publisher does not write. URLs the statement says must not change ("without changing <url>", "<url> is unchanged") become prohibited_effect_preserved checks with role must_not_change (mnc-2); pass pin: true to fill body_sha256 now (vp-1: a page that changes between two reads gets no pin; a contains / json_fields check on its stable content is proposed instead). nb-1: when it finds must-not-change targets, nudges[] carries the exact pin_before_work call for them; make it BEFORE you start the work so the baseline reads before_work, not at_filing.

NameTypeReqDescription
pinboolean–mnc-2: for URLs the statement says must not change, read each body's sha256 now with the checker's own fetch (at most 3) so the prohibited_effect_preserved check is ready to submit
statementstringyes–

No output schema declared.

No examples provided.

supersede_claim ~153

Retire YOUR claim OLD in favour of the live claim NEW (claimant of OLD only, needs your API key). OLD is kept, marked withdrawn with superseded_by=NEW. Peer countersignatures on OLD whose checks match NEW per check (identical, or only the file target moved) show on NEW as carried_countersignatures, state pending_rerun: they never count as verified until that peer re-runs NEW and pushes a passing signed receipt.

NameTypeReqDescription
newstringyesHosted id, or your own runner claim's local id (cs-...)
oldstringyesHosted id, or your own runner claim's local id (cs-...)
reasonstring––

No output schema declared.

No examples provided.

verify_claim ~115

Re-run YOUR hosted claim's checks now and append a receipt (claimant only, needs your API key). Other agents' claims are re-run by the scheduled rechecks on their cadence; read their latest receipt with get_status. Status semantics: counts_as_verified is true when the service observed the checks passing at the reference_checked or outcome_verified tier. Claims that are indeterminate, refuted, decayed, withdrawn, redacted or self_declared have counts_as_verified false and are unverified.

NameTypeReqDescription
idstringyes–

No output schema declared.

No examples provided.

withdraw_claim ~73

Retire YOUR claim with a reason (claimant only, needs your API key). It is kept with a chained withdraw receipt and can no longer be verified or pushed to.

NameTypeReqDescription
idstringyes–
reasonstringyes–
superseded_bystring–Optional live claim id that replaces it

No output schema declared.

No examples provided.

Install

How do I install the Countersign by Signalry MCP server?

Countersign by Signalry is a hosted endpoint at https://countersign.signalry.ai/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

remote · countersign.signalry.ai

# add to Claude Code
claude mcp add --transport http ai-signalry-countersign 'https://countersign.signalry.ai/mcp'
Common questions

What is the Countersign by Signalry MCP server?

Countersign by Signalry is an MCP server listed in the public MCP registry as ai.signalry/countersign. Countersign by Signalry: re-runs the checks behind an AI agent's done claim; hash-chained receipts. This page covers its hosted endpoint (https://countersign.signalry.ai/mcp).

Is the Countersign by Signalry MCP server safe to use?

Countersign by Signalry scores 66 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the Countersign by Signalry MCP server expose?

Countersign by Signalry exposes 19 tools: submit_claim, file_deploy_claim, submit_deploy_claim, verify_claim, withdraw_claim, and 14 more. Their descriptions and schemas cost roughly 5,106 tokens of context every time the server is loaded.

Does the Countersign by Signalry MCP server require authentication?

No. We connected to Countersign by Signalry without credentials and it answered, so anything it exposes is reachable by anyone who knows the address.

Is the Countersign by Signalry MCP server still maintained?

Countersign by Signalry is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

What did VerifyMCP test on the Countersign by Signalry MCP server?

VerifyMCP ran 13 checks on Countersign by Signalry, covering TLS certificate, Authorization, HTTPS, HSTS header and 9 more. Supply Chain Security and Provenance & Transparency do not apply to a hosted endpoint, so they were not tested. The score does not measure everything, and the scoring documentation lists what it leaves out.