{"id":51544844,"url":"https://github.com/roninforge/akashi","last_synced_at":"2026-07-09T17:01:08.056Z","repository":{"id":368759102,"uuid":"1286704112","full_name":"RoninForge/akashi","owner":"RoninForge","description":"Verify an MCP server is alive and conformant. Keyless. Emits an embeddable verified-on-date badge.","archived":false,"fork":false,"pushed_at":"2026-07-02T05:11:23.000Z","size":39,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-07-02T05:13:31.162Z","etag":null,"topics":["cli","developer-tools","golang","health-check","keyless","mcp","model-context-protocol"],"latest_commit_sha":null,"homepage":"https://roninforge.org","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/RoninForge.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-07-02T03:00:58.000Z","updated_at":"2026-07-02T05:11:27.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/RoninForge/akashi","commit_stats":null,"previous_names":["roninforge/akashi"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/RoninForge/akashi","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RoninForge%2Fakashi","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RoninForge%2Fakashi/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RoninForge%2Fakashi/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RoninForge%2Fakashi/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/RoninForge","download_url":"https://codeload.github.com/RoninForge/akashi/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RoninForge%2Fakashi/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35306717,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-09T02:00:07.329Z","response_time":57,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cli","developer-tools","golang","health-check","keyless","mcp","model-context-protocol"],"created_at":"2026-07-09T17:01:06.933Z","updated_at":"2026-07-09T17:01:08.047Z","avatar_url":"https://github.com/RoninForge.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# akashi\n\nVerify an MCP server is alive and conformant. Keyless.\n\n`akashi` probes a Model Context Protocol server with only public,\nunauthenticated signals and tells you whether it is healthy, degraded, or dead.\nIt emits an embeddable \"verified on DATE\" badge for the healthy ones.\n\nThe name means \"proof\" or \"certificate\" (証) in Japanese.\n\n## Zero keys, by construction\n\nakashi reads only public endpoints: the official MCP registry, the GitHub API,\nthe npm and PyPI registries, Docker Hub's anonymous manifest API, and the\nserver's own remote endpoint via a capability-only MCP `initialize` handshake.\n\nIt never authenticates to a probed server and never runs one of its tools. The\n`initialize` request negotiates protocol capabilities and executes nothing, so\nit is safe to send to a server you do not trust. Any GitHub token akashi finds\n(`GITHUB_TOKEN`, `GH_TOKEN`, or your local `gh`) is used only against the public\nGitHub API to raise the rate limit, exactly as a human running `gh` would. No\nuser secret is ever sent to a probed server.\n\n## Install\n\n```sh\ncurl -fsSL https://roninforge.org/akashi/install.sh | sh\n```\n\nOr with Go:\n\n```sh\ngo install github.com/RoninForge/akashi/cmd/akashi@latest\n```\n\n## Usage\n\n```sh\nakashi check \u003cserver\u003e\n```\n\n`\u003cserver\u003e` may be:\n\n- an official-registry server name (`io.github.owner/name`)\n- a GitHub repository URL (`https://github.com/owner/repo`)\n- a remote endpoint URL (`https://mcp.example.com/sse`)\n\nA healthy server that ships an npm package:\n\n```\n$ akashi check ai.adeu/adeu\n\nai.adeu/adeu  checked 2026-07-02 UTC, keyless\n\n  PASS  registry status                 active\n  PASS  server.json valid               validates against its declared JSON Schema\n  PASS  repo reachable                  exists\n  PASS  repo freshness                  pushed 0d ago\n  PASS  package npm                     published (1.18.1)\n  PASS  at least one live entrypoint    2 alive\n  PASS  license present                 MIT\n\n  OK    healthy\n```\n\nA healthy hosted server, with its tools listed over a full MCP session:\n\n```\n$ akashi check ac.tandem/docs-mcp\n\nac.tandem/docs-mcp  checked 2026-07-02 UTC, keyless\n\n  PASS  registry status                 active\n  PASS  server.json valid               validates against its declared JSON Schema\n  PASS  repo reachable                  exists\n  PASS  remote reachable                HTTP 200 via initialize\n  PASS  MCP conformance                 initialize handshake ok\n  PASS  tools/list                      13 tools: search_docs, get_doc, ...\n  PASS  at least one live entrypoint    2 alive\n\n  OK    healthy\n```\n\nA dead one:\n\n```\n$ akashi check io.github.akutishevsky/spotify\n\nio.github.akutishevsky/spotify  checked 2026-07-01 UTC, keyless\n\n  PASS  registry status                 active\n  FAIL  repo reachable                  404 (repository gone)\n  FAIL  remote reachable                unreachable\n  FAIL  at least one live entrypoint    nothing installable or reachable\n\n  DEAD  dead (nothing works)\n     reasons: repo_404, remote_unreachable\n```\n\n### Output formats\n\n```sh\nakashi check \u003cserver\u003e --json     # the full result row, for scripts and CI\nakashi check \u003cserver\u003e --badge    # a shields.io endpoint badge JSON\n```\n\n### Exit codes\n\n| Code | Meaning |\n|------|---------|\n| 0 | healthy |\n| 1 | degraded, dead, or unknown (a real health finding) |\n| 2 | invocation or network error |\n\n## Census: scan the whole registry\n\n`akashi scan` runs the same keyless check set as `akashi check` against every\nserver in the official MCP registry and writes a dated dataset.\n\n```\nakashi scan --out ./census              # the whole registry\nakashi scan --out ./census --limit 500  # a sample\n```\n\nIt writes two files into `--out`:\n\n- `records.jsonl` - one probe result per server, one JSON line each. Each line\n  is byte-identical to `akashi check \u003cserver\u003e --json`, so any row is\n  independently reproducible with a single-server check.\n- `summary.json` - verdict counts and rates, a remote-bearing segment, name\n  validation findings, and the run's reproducibility parameters.\n\nA scan resumes automatically: rerun with the same `--out` and servers already\nrecorded are not re-probed. Concurrency, the per-server timeout, and the server\ncount are tunable with `--concurrency`, `--timeout`, and `--limit`.\n\n## What it checks\n\n**Health** (can I get and run this at all):\n\n- Registry status: the registry has not deprecated or deleted it.\n- Repository reachable: the source still exists (not 404, not archived).\n- Repository freshness: last push under 90 days (pass), under a year (warn),\n  over a year (fail).\n- Package published: the npm, PyPI, or Docker Hub entrypoint installs.\n- Remote reachable: the hosted endpoint answers. akashi tries a capability-only\n  MCP `initialize` handshake first (which also yields the conformance signal),\n  and falls back to a plain GET for transports the handshake cannot exercise\n  (for example an SSE endpoint), so a transport mismatch is never called dead.\n- At least one live entrypoint: something is actually usable.\n\n**Conformance** (is it a well-behaved MCP server):\n\n- `server.json` validates against the JSON Schema it declares. An invalid\n  manifest downgrades the verdict to degraded.\n- `initialize` handshake negotiates a protocol version.\n- The JSON-RPC response echoes the request id (not an HTML page impersonating a\n  server with a 200).\n- `tools/list` resolves over a full MCP session, using the official\n  [MCP go-sdk](https://github.com/modelcontextprotocol/go-sdk) client. This is\n  the strongest keyless proof that the endpoint is a real, working server (a raw\n  `initialize` 200 only shows it answered one request). It runs no tool: it\n  connects, reads the advertised tool list, and closes. It is informational and\n  never downgrades the verdict, since many valid servers advertise no tools.\n- A license is declared.\n\nAn auth-gated remote (a 401/403 to `initialize`) is treated as alive, not\nbroken. akashi never supplies credentials to reach past it, and does not attempt\n`tools/list` against it.\n\n## Verdicts\n\n- **healthy** - at least one live entrypoint and nothing broken.\n- **degraded** - usable, but something is broken (a 404 repo link while the\n  package still installs, a stale-over-a-year repo, a deprecated registry entry,\n  a down remote while a package works).\n- **dead** - registry-deleted, or every probed entrypoint is broken.\n- **unknown** - only entrypoints akashi cannot probe without a key were\n  declared.\n\nA degraded, dead, deprecated, or unknown server never renders a green\n\"verified\" badge.\n\n## Badge\n\n`--badge` emits a [shields.io endpoint](https://shields.io/badges/endpoint-badge)\nJSON. Host it and embed:\n\n```\n![MCP health](https://img.shields.io/endpoint?url=https://your.host/akashi-badge.json)\n```\n\nA healthy server reads `verified \u003cdate\u003e` in green; anything else reads its\nverdict, so a stale or broken server can never masquerade as verified.\n\n## GitHub Action\n\nFail CI when a server you depend on is not healthy:\n\n```yaml\n- uses: RoninForge/akashi@v0\n  with:\n    server: io.github.owner/name\n    # allow-degraded: true   # optional: only dead/unknown fails\n```\n\n## License\n\nMIT. See [LICENSE](LICENSE).\n\nPart of [RoninForge](https://roninforge.org). Sibling tools:\n[hanko](https://github.com/RoninForge/hanko) (plugin manifest validator),\n[tsuba](https://github.com/RoninForge/tsuba) (skill scaffolder).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Froninforge%2Fakashi","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Froninforge%2Fakashi","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Froninforge%2Fakashi/lists"}