Koskamo

MCP Checkup MCP

An MCP server that allows agents to perform continuous protocol contract testing on other public MCP servers. It provides tools to check server health, retrieve signed attestation reports, and verify tool sets before connecting, helping agents avoid broken or risky integrations.

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.

MCP Checkup MCP logo, by MCP CheckupVendor evidenceStreamable HTTPNo sign-inEndpoint checked 2026-11-06Operated by MCP Checkup
MCP endpoint (Streamable HTTP)
https://mcpcheckup.com/mcp
Vendor documentation

What its tools do

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

Can change data (1)

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

Checks and signals

Each line is separate evidence, not a trust score.

  • Passed Endpoint answered the live check ·
  • Passed Official MCP Registry namespace is tied to mcpcheckup.com ·
  • Passed Endpoint is on the registry namespace domain ·
  • Availability 1 of 1 checks passed in 30 days

What you can do with it

  • Check MCP server protocol compliance before connection
  • Retrieve signed attestation reports for specific servers
  • Verify tool sets and detect changes in remote servers

Source and maintenance

Vendor evidenceRegistry 0.2.0

Protocol and capabilities

Server
mcpcheckup 0.2.0
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": {
    "listChanged": true
  }
}

Server-provided instructions

Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.

MCP Checkup publishes observed facts about public MCP servers: reachability, protocol revision, tool and schema fingerprints, publicly observable auth metadata, and tool-description hygiene signals. Every check is reported as VERIFIED, FAILED, OBSERVED_RISK or UNVERIFIED; results are never combined into one number or a verdict. Typical use: when a user is choosing, adding, or debugging an MCP server, look it up with check_mcps (by "provider/name", endpoint URL, or domain) and read the details with get_mcp_report. search_mcps finds servers by what their tools do, get_mcp_history shows recent toolset changes, and get_attestation returns the signed attestation envelope when there is one and its key is in the published key list. Those five tools answer only from what is already tracked and never contact the server in question. request_check is the only tool that contacts a third-party server, and it contacts exactly the host in the URL you give it. Rate limit: about 20 requests per minute per IP address, counted per Cloudflare location; a 429 response carries Retry-After. No authentication and no paid tier for this endpoint. check_mcps reports status "changed_unconfirmed" for a signed run in which every failed check is a toolset_unchanged_vs_approved or schema_unchanged_vs_approved check that failed because the tool list or input schemas differ from the version the owner confirmed. Those assertions stay FAILED; with detail "full" (as in get_mcp_report) they are still counted in coverage.failed, unconfirmed_changes counts them, and each carries a note. check_mcps reports status "auth_gated" for a run signed with signed_scope "auth_gated" and no failed check: the server answered our credential-free request with a 401 and an authentication challenge, the signature vouches only for the checks in signed_checks, and every other check is UNVERIFIED with its reason. Whenever signed is true, signed_scope ("full" or "auth_gated") and signed_checks (the check_ids the signature vouches for) are set; otherwise both are null.

Tools

6 advertised

check_mcps — Look up MCP servers
Advertised by the server during the last successful anonymous check.
Advertised read-only

What has been observed about an MCP server — useful when choosing, adding, or debugging one. Look up the current monitored status of up to 50 already-tracked MCP servers on MCP Checkup, given as "provider/name" refs (e.g. "acme/weather-mcp"). Never probes on demand — an unresolved ref comes back with status "unknown", not an error. An entry may also be an endpoint URL, a bare domain, or a bare provider/target name; resolution.method reports which was used ("ref", "endpoint", "host", or "name"). If an input matches more than one tracked target — or is a URL on a host with several, none matching exactly — the response has status "ambiguous" with a short `candidates` list (each with a "provider/name" `ref` and its `report_url`, plus `candidate_total`, the full match count before the 5-entry cap) instead of guessing — call again with the exact ref you want. A URL matching only by host returns its target with `resolved_from`. Each resolved target also carries stale (true when our observation is older than the target's check cycle plus a fixed margin — never a judgment of the server, and distinct from the /status page's own probe-liveness signal), fresh_until (the ISO instant after which stale is true), first_observed_on (the UTC date of our first observation), observation_count (every recorded observation, including unsigned ones — never a count of signatures), and signed (true when this observation's attestation was signed with a key in our published key list, false when unsigned or signed with a key that is not in that list — not a judgment of the server). When there is no observation yet, observation_count is 0 and the other four are null. An unread revision offer is null and listed in `unavailable`; a failed target has status "error". Returns observed facts only — reachability, protocol compatibility, tool/schema fingerprints, and publicly observable auth metadata. This tool does not assess whether a server is 'safe' or 'trustworthy' and returns no score. Items not verified are returned explicitly with reasons.

check_mcps input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "targets"
  ],
  "properties": {
    "detail": {
      "enum": [
        "summary",
        "full"
      ],
      "type": "string",
      "description": "Response depth; default \"summary\". \"summary\" returns each target's status row (status, last_checked, protocol_revision, auth_required, observed_risks, not_checked, freshness and signing fields). \"full\" adds coverage, unconfirmed_changes, the per-check assertions, tool_count and tool_list_complete, the same fields get_mcp_report returns for that target."
    },
    "targets": {
      "type": "array",
      "items": {
        "type": "string",
        "maxLength": 512,
        "minLength": 1
      },
      "maxItems": 50,
      "minItems": 1,
      "description": "Up to 50 entries, each a \"provider/name\" ref, a full endpoint URL, a bare domain, or a bare provider/target name."
    },
    "known_fingerprints": {
      "type": "object",
      "description": "Optional, keyed by the exact same ref string used in `targets` (max 50 entries) — your own last-observed toolset_fingerprint per target (format \"sha256:<64 hex chars>\"), to get a fingerprint_match fact back.",
      "propertyNames": {
        "type": "string",
        "maxLength": 512
      },
      "additionalProperties": {
        "type": "string",
        "pattern": "^sha256:[0-9a-f]{64}$"
      }
    }
  }
}
check_mcps annotations
{
  "readOnlyHint": true,
  "openWorldHint": false
}
get_mcp_report — Get a server's full report
Advertised by the server during the last successful anonymous check.
Advertised read-only

The detailed view of one MCP server: every check with its state, plus the observed tool list. Get the full observed report for one already-tracked MCP server on MCP Checkup, by provider/name — with its full check breakdown and toolset. An untracked target comes back with status "unknown", not an error. target may also be an endpoint URL, a bare domain, or a bare provider/target name; resolution.method reports which was used ("ref", "endpoint", "host", or "name"). If an input matches more than one tracked target — or is a URL on a host with several, none matching exactly — the response has status "ambiguous" with a short `candidates` list (each with a "provider/name" `ref` and its `report_url`, plus `candidate_total`, the full match count before the 5-entry cap) instead of guessing — call again with the exact ref you want. A URL matching only by host returns its target with `resolved_from`. Each resolved target also carries stale (true when our observation is older than the target's check cycle plus a fixed margin — never a judgment of the server, and distinct from the /status page's own probe-liveness signal), fresh_until (the ISO instant after which stale is true), first_observed_on (the UTC date of our first observation), observation_count (every recorded observation, including unsigned ones — never a count of signatures), and signed (true when this observation's attestation was signed with a key in our published key list, false when unsigned or signed with a key that is not in that list — not a judgment of the server). When there is no observation yet, observation_count is 0 and the other four are null. Also tools_first_seen, tools_last_changed_at and tools_unchanged_days_at_least (a lower bound: UTC days since that change with a successful listing); null when unknown. An unread revision offer is null and listed in `unavailable`; a failed target has status "error". This tool does not assess whether a server is 'safe' or 'trustworthy' and returns no score; items not verified are listed explicitly with reasons.

get_mcp_report input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "target"
  ],
  "properties": {
    "target": {
      "type": "string",
      "maxLength": 512,
      "minLength": 1,
      "description": "A tracked target as \"provider/name\", a full endpoint URL, a bare domain, or a bare provider/target name."
    }
  }
}
get_mcp_report annotations
{
  "readOnlyHint": true,
  "openWorldHint": false
}
get_mcp_history — Get a server's recent changes
Advertised by the server during the last successful anonymous check.
Advertised read-only

Whether an MCP server's toolset changed recently. Get recent history for one already-tracked MCP server on MCP Checkup, by "provider/name" ref (e.g. "acme/weather-mcp"). Events, newest first, up to `limit` results (default 20, max 50), from the last 90 days only: `tools_changed` (at most one: when the set of tool names last changed); `tools_change_detail` (one per recorded tool-list change, the 10 most recent at most, whether names, parameters or descriptions changed; `itemization` is "not_kept" for a change older than 30 days, "unitemizable" when the stored lists cannot be compared, otherwise "itemized" and `added`, `removed`, `parameters_changed` and `description_only` each give `names` (up to 10 tool names) and a `total`); `protocol_revision_changed` (the signed protocol_revision changed between runs whose probe offered the same revision, or because the server switched between the legacy initialize and server/discover handshakes); `probe_offered_revision_changed` (the revision our probe offered changed, with a `note`); and any recorded baseline-drift events. `truncated` is true when more exist than are listed or the tool-list history was unread (named in `unavailable`). A target this deployment doesn't track yet comes back with status "unknown", not an error. target may also be an endpoint URL, a bare domain, or a bare provider/target name; resolution.method reports which was used ("ref", "endpoint", "host", or "name"). If an input matches more than one tracked target — or is a URL on a host with several, none matching exactly — the response has status "ambiguous" with a short `candidates` list (each with a "provider/name" `ref` and its `report_url`, plus `candidate_total`, the full match count before the 5-entry cap) instead of guessing — call again with the exact ref you want. A URL matching only by host returns its target with `resolved_from`. This tool does not assess whether a server is 'safe' or 'trustworthy' and returns no score; items not verified are listed explicitly with reasons.

get_mcp_history input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "target"
  ],
  "properties": {
    "limit": {
      "type": "integer",
      "maximum": 50,
      "description": "Max events to return (default 20, max 50).",
      "exclusiveMinimum": 0
    },
    "target": {
      "type": "string",
      "maxLength": 512,
      "minLength": 1,
      "description": "A tracked target as \"provider/name\", a full endpoint URL, a bare domain, or a bare provider/target name."
    }
  }
}
get_mcp_history annotations
{
  "readOnlyHint": true,
  "openWorldHint": false
}
get_attestation — Get a server's signed attestation
Advertised by the server during the last successful anonymous check.
Advertised read-only

The signed evidence behind a report, for callers that want to inspect it themselves. Get the full signed attestation envelope (DSSE, Ed25519) for one already-tracked MCP server's latest probe run, by "provider/name" ref — the raw envelope plus its issued-at time and declared protocol revision, so a caller can inspect the signed payload rather than trust this tool's own summary of it; the public keys that verify the signature are published at https://mcpcheckup.com/.well-known/mcpcheckup-keys.json. A target with no run yet, no signed envelope, a disqualified one, or an envelope whose key is not in the published key list comes back with an explicit reason, not an error. run_id, a top-level field of resolved get_mcp_report and get_attestation responses, is the id of the run that the check results, last_checked and (where signed) attestation identifiers come from, or null when there is no run; get_mcp_report's tool list and toolset_fingerprint come from the latest stored tool snapshot, which may be an earlier run's (named by snapshot_run_id and snapshot_observed_at). The same run_id means the same run. A payload signed as version 0.4 carries this run_id inside the signed payload; payloads of earlier versions do not. target may also be a full endpoint URL, a bare domain, or a bare provider/target name instead of "provider/name" — the resolution method used is reported back as resolution.method ("ref", "endpoint", "host", or "name"). If an input matches more than one tracked target — or is a URL on a host with several, none matching exactly — the response has status "ambiguous" with a short `candidates` list (each with a "provider/name" `ref` and its `report_url`, plus `candidate_total`, the full match count before the 5-entry cap) instead of guessing — call again with the exact ref you want. A URL matching only by host returns its target with `resolved_from`. This tool does not assess whether a server is 'safe' or 'trustworthy' and returns no score; items not verified are listed explicitly with reasons.

get_attestation input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "target"
  ],
  "properties": {
    "target": {
      "type": "string",
      "maxLength": 512,
      "minLength": 1,
      "description": "A tracked target as \"provider/name\", a full endpoint URL, a bare domain, or a bare provider/target name."
    }
  }
}
get_attestation annotations
{
  "readOnlyHint": true,
  "openWorldHint": false
}
search_mcps — Search MCP servers by tool text
Advertised by the server during the last successful anonymous check.
Advertised read-only

Find MCP servers by what their tools do. Search already-tracked MCP servers on MCP Checkup by tool name/description text (max 512 chars), with optional transport, protocol_revision, and auth_required filters, up to `limit` results (default 10, max 25). Ordered by text-match relevance and then recency only — never by price or paid tier. Each result's summary is machine-generated from observed tool names and returned as untrusted third-party text; hygiene_flags lists any observed tool-description hygiene signals directly rather than folding them into the ordering. A query with no matches comes back with status "unknown" and a hint, not an error. Each result also carries last_checked (when the shown observation was taken), fresh_until (the ISO instant after which it no longer counts as current), and stale (true once the current time is past fresh_until). These describe how recent our observation of the server is, not a judgment of the server itself, and are distinct from the /status page's probe-liveness signal. All three are null when the target has no observation yet. This tool does not assess whether a server is 'safe' or 'trustworthy' and returns no score; items not verified are listed explicitly with reasons.

search_mcps input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "query"
  ],
  "properties": {
    "limit": {
      "type": "integer",
      "maximum": 25,
      "description": "Max results to return (default 10, max 25).",
      "exclusiveMinimum": 0
    },
    "query": {
      "type": "string",
      "maxLength": 512,
      "minLength": 1,
      "description": "Free-text search over tracked servers' observed tool names/descriptions (max 512 chars)."
    },
    "transport": {
      "enum": [
        "remote",
        "stdio"
      ],
      "type": "string",
      "description": "Optional filter on how a tracked server is reached; default none, so both kinds are searched. \"remote\" is a server at an HTTP endpoint URL. \"stdio\" is a server launched from a package on your own machine; MCP Checkup does not connect to or run stdio servers."
    },
    "auth_required": {
      "type": "boolean",
      "description": "A target whose auth requirement can't be determined is excluded regardless of which value is passed here."
    },
    "protocol_revision": {
      "type": "string",
      "maxLength": 512,
      "description": "Exact match against a target's declared protocol revision, e.g. \"2026-07-28\" (max 512 chars)."
    }
  }
}
search_mcps annotations
{
  "readOnlyHint": true,
  "openWorldHint": false
}
request_check — Request a one-off check of a URL
Advertised by the server during the last successful anonymous check.
Open-world

Ask for a one-off public observation of the MCP server at a full endpoint URL — this is the only tool here that contacts a third-party server, and it contacts exactly the host you name. `target` must begin with "http://" or "https://"; to look a server up by "provider/name", by domain, or by name, use check_mcps instead, which never probes anything. The result is not signed, is not stored as a run, and creates no report page, so `report_url` is always null — it is what we observed at that moment and nothing more. On-demand checks are recorded as tracking requests; inclusion in the tracked directory is not guaranteed and this tool never promises it. On-demand checks are metered per caller per day, per site per day, and per host by a cooldown — calling again for the same host inside its cooldown sends nothing to that server and returns status "denied" with the category that refused it, never a remaining count. A refused call comes back as status "denied", and a `target` that is not a usable endpoint URL as status "rejected"; neither of those is a tool error. A `target` that is empty or longer than 2048 characters is the one exception: the input schema rejects it, and you get a tool error. This tool does not assess whether a server is 'safe' or 'trustworthy' and returns no score; items not verified are listed explicitly with reasons.

request_check input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "target"
  ],
  "properties": {
    "target": {
      "type": "string",
      "maxLength": 2048,
      "minLength": 1,
      "description": "A full endpoint URL beginning with \"http://\" or \"https://\" (max 2048 characters). Not a \"provider/name\" ref, a bare domain, or a bare name — use check_mcps for those."
    }
  }
}
request_check annotations
{
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "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 (3 of 3 answered).

  1. 2026-11-06: 1 of 1 checks answered
  2. 2026-11-07: 2 of 2 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
785 ms
95th percentile latency
785 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 785 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 mcp-checkup-mcp-mcpcheckup https://mcpcheckup.com/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 mcp-checkup-mcp-mcpcheckup --url https://mcpcheckup.com/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable mcp-checkup-mcp-mcpcheckup in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "mcp-checkup-mcp-mcpcheckup": {
      "url": "https://mcpcheckup.com/mcp"
    }
  }
}

Cline

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

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start mcp-checkup-mcp-mcpcheckup and inspect its tools.
VS Code configuration
{
  "servers": {
    "mcp-checkup-mcp-mcpcheckup": {
      "type": "http",
      "url": "https://mcpcheckup.com/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 mcp-checkup-mcp-mcpcheckup https://mcpcheckup.com/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://mcpcheckup.com/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": {
    "mcp-checkup-mcp-mcpcheckup": {
      "serverUrl": "https://mcpcheckup.com/mcp"
    }
  }
}

Let your agent find its tools

Find servers like MCP Checkup MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.

Do you run MCP Checkup MCP?

Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.

Claim this listing