GitHub
Connect AI assistants to GitHub - manage repos, issues, PRs, and workflows through natural language.
作者提供的说明(英文原文)
Transactional write gate for coding agents: plan, canonical manifest, checks, two-phase apply.
这三项永远不会合并成一个分数:意见、测量和人气是不同的东西。
我们还没有为它写通俗的介绍。下面是我们从注册中心读取到的事实。
选择你使用的 AI 应用,然后复制设置。
AXIOM_SIGNING_KEY标为机密的值是你账户的钥匙。千万不要分享给别人,也不要粘贴到聊天里。
你需要
你用的是哪个应用?
在上方选择你的应用。我们会记住它,下次按钮会显示“安装到 …”。
打开 Claude Desktop → Settings → Developer → Edit Config,把下面的内容粘贴到 claude_desktop_config.json
{
"mcpServers": {
"axiom": {
"command": "npx",
"args": [
"-y",
"@codai/axiom-mcp",
"mcp",
"--root",
"your-value"
],
"env": {
"AXIOM_SIGNING_KEY": "your-value"
}
}
}
}在终端中运行这条命令
claude mcp add axiom --env AXIOM_SIGNING_KEY=your-value -- npx -y @codai/axiom-mcp mcp --root your-value运行前请先填写空着的值。
这个服务器需要在启动命令中填入值,请复制设置后自行填写。
粘贴到项目中的 .cursor/mcp.json,或 ~/.cursor/mcp.json
{
"mcpServers": {
"axiom": {
"command": "npx",
"args": [
"-y",
"@codai/axiom-mcp",
"mcp",
"--root",
"your-value"
],
"env": {
"AXIOM_SIGNING_KEY": "your-value"
}
}
}
}浏览器会先询问是否打开应用,然后应用会显示设置并请你确认。密钥的值会留空,由你自己填写。
这个服务器需要在启动命令中填入值,请复制设置后自行填写。
粘贴到项目中的 .vscode/mcp.json
{
"servers": {
"axiom": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"@codai/axiom-mcp",
"mcp",
"--root",
"your-value"
],
"env": {
"AXIOM_SIGNING_KEY": "your-value"
}
}
}
}浏览器会先询问是否打开应用,然后应用会显示设置并请你确认。密钥的值会留空,由你自己填写。
这个服务器在你的电脑上运行,而 ChatGPT 只能连接互联网上的服务器。请选择其他应用。
你的选择通过 Cookie 保存在这台设备上,无需账户。
这些设置是根据作者在注册中心的条目生成的。如果 README 的写法不同,请以 README 为准。
它在你的电脑上运行;安装后,工具列表会显示在你的 AI 应用中。
我们检查的是任何人都能看到的信息;我们没有阅读代码。不适用的检查项不计入总数。 · 检查于 2026年11月7日
注册名称已通过 GitHub 账户 dragoscv 验证,该账户拥有此仓库
我们还没有从 GitHub 读取这个仓库
我们还没有从 GitHub 读取这个仓库
它在你的电脑上运行,没有互联网端点
在你的电脑上运行,改用本地设置
它在你的电脑上运行;我们只能读取互联网端点的工具列表
与注册中心里这个分类中所有活跃的服务器比较。只有当发布者拥有该仓库时,星标数才计入。
它在 1 项适用的基础检查中通过了 1 项。我们没有阅读代码。在添加密钥或令牌之前,请先看看这个服务器要求哪些权限,并使用只具备所需权限的密钥。
你需要填写:AXIOM_SIGNING_KEY
它在你的电脑上运行。你的 AI 应用会在需要时启动它,数据不会经过作者的服务器(除非它自己调用在线服务)。
GitHub 仓库最后更新于–,最新版本(3.0.0)于19天前进入注册中心。
支持 MCP 的应用,例如 Claude Desktop、Claude Code、Cursor 和 VS Code。你的电脑上还需要有 Node.js。
同一分类中有:GitHub, Desktop Commander, Cloudflare MCP
同一分类中其他作者的服务器,按星标数排序。
如何看卡片:★ GitHub 星标i三大支柱:评价 · 检查 · 使用情况i更新 = 最新版本发布到注册中心的时间i
Connect AI assistants to GitHub - manage repos, issues, PRs, and workflows through natural language.
MCP server for terminal commands, file operations, and process management
Cloudflare MCP servers
按原文从作者的仓库复制。PopNx MCP 没有审查或背书其内容。HTML、图片和脚本已被移除。链接会离开本站。
MCP server (stdio or Streamable HTTP) and CLI for AXIOM v2 — the transactional write gate for coding agents: Plan → canonical ManifestBundle → set-level checks → hash-gated two-phase apply → journal. dist/cli.js (thin entry) + dist/cli-main.js (lazy-loaded engines; the MCP SDK v2 and zod are bundled into the mcp-lazy / http-lazy chunks); no runtime dependencies.
npx @codai/axiom-mcp mcp --root /abs/path/to/repo # stdio MCP server
npx @codai/axiom-mcp mcp --root /abs/path/to/repo --http 127.0.0.1:3411 # Streamable HTTP at /mcp npx @codai/axiom-mcp --help # CLI verbs
--root may repeat. Every tool root argument must equal or lie inside one of them; with exactly one root it is the default. There is no env-var or cwd fallback (ERR_ROOT_REQUIRED / ERR_ROOT_NOT_ALLOWED).
--wire 2026|2025|2026-onlyBuilt on MCP TypeScript SDK v2 (@modelcontextprotocol/server 2.0.0). The server speaks the 2026-07-28 revision (no initialize, per-request _meta envelope, server/discover, ttlMs/cacheScope on list results) and the 2025-era revisions (initialize handshake, HTTP sessions) from the same entry — the SDK pins each stdio connection, or routes each HTTP request, to the era the client opened with. --wire 2026 (default) and --wire 2025 both serve both; --wire 2026-only refuses 2025 openings with the unsupported-protocol-version error. Clients on SDK v1 need no change. Details: docs/reference/mcp-tools.md.
.vscode/mcp.json{
"servers": { "axiom": { "type": "stdio", "command": "npx", "args": ["-y", "@codai/axiom-mcp", "mcp", "--root", "${workspaceFolder}"] } } }
--http axiom mcp --root /abs/repo --http 127.0.0.1:3411 # loopback, no token needed
axiom mcp --root /abs/repo --http 0 # random port; URL logged at info level AXIOM_HTTP_TOKEN=$(openssl rand -hex 32) axiom mcp --root /abs/repo --http 0.0.0.0:3411 --log-level info
POST /mcp (2026-07-28 requests are served statelessly; a 2025 initialize opens a session and returns Mcp-Session-Id, which every later 2025 request must send), GET /mcp (standalone SSE stream, one per 2025 session), DELETE /mcp (close the session), GET /health → { ok, name, version } (unauthenticated). Anything else is 404 JSON.--http-token-env (default AXIOM_HTTP_TOKEN, ≥ 16 chars). Clients send Authorization: Bearer ; the compare is constant-time. A token is optional on loopback.Host must be : , localhost: or 127.0.0.1: ; otherwise 403). Request bodies over 4 MiB are 413.dist/http-lazy.js, loaded only with --http, and is plain node:http — no express/hono at runtime.{ "type": "http", "url": "http://127.0.0.1:3411/mcp" }; add "headers": { "Authorization": "Bearer ${input:axiom-token}" } when a token is set.Conformance: packages/conformance runs @modelcontextprotocol/conformance server against this transport in CI with an expected-failures baseline (packages/conformance/baseline.yml).
claude_desktop_config.json{
"mcpServers": { "axiom": { "command": "npx", "args": ["-y", "@codai/axiom-mcp", "mcp", "--root", "/abs/path/to/repo"] } } }
axiom mcp serves the core toolset by default — the six tools an agent needs to write through the gate: axiom_write, axiom_status, axiom_rollback, axiom_check, axiom_apply, axiom_apply_dry_run. Start the server with --tools full to also expose the plan / manifest / task plumbing below (every row not marked core). spec/tools.json and spec/codai-tools.json list every tool with "toolset": "core" | "full". Library users pass createServer(policy, { toolset: "full" }) / serverFactory(policy, { toolset }); parseToolset(value) maps the flag value (ERR_USAGE otherwise).
| tool | risk | input | output | ||||
|---|---|---|---|---|---|---|---|
axiom_plan_validate | READ | { plan } | { ok, planDigest?, errors[] } | ||||
axiom_plan_compile | ACT | `{ plan, store?: inline\ | cas, root? }` | ManifestBundle (writes only under /.axiom/ — CAS blobs and the stored manifest — when a root is given) | |||
axiom_manifest_verify | READ | { bundle, root? } | { ok, manifestDigest, canonical, signed, missing[], errors[], signatures?: { trustFile, keyids[], findings[], ok, code? } } — signatures only when root has .axiom/trust/keys.json; code is ERR_SIGNATURE_MISSING \ | ERR_SIGNATURE_INVALID when not ok | |||
axiom_check core | READ | { bundle, profile?, root? } | CheckReport (`verdict: pass\ | fail\ | error, preImage: verified\ | drifted\ | unverified`) |
axiom_check_start | READ | { bundle, profile?, root? } | { taskId, tool, status: "working", pollIntervalMs, ttlMs, elapsedMs } — same evaluation as axiom_check, returned immediately as a task so long guard.external suites (up to 15 min per guard) outlive the client's per-call timeout (S-406 / D-24) | ||||
axiom_task_get | READ | { taskId } | descriptor + result: CheckReport once completed, or error: { code, message } once failed/cancelled; unknown/expired id → ERR_TASK_NOT_FOUND | ||||
axiom_task_cancel | ACT | { taskId } | descriptor; kills every running guard tree, task ends cancelled with ERR_TASK_CANCELLED (idempotent on terminal tasks) | ||||
axiom_plan_begin | ACT | Plan header: { name, intent, profile?, capabilities?, checks?, counter?, metadata? } | { sessionId, artifacts: 0, bytes: 0, limits: { maxArtifacts, maxBytes }, ttlMs } — opens a chunked plan session for Plans whose JSON would exceed the 4 MiB call cap | ||||
axiom_plan_add | ACT | { sessionId, artifacts[] } (each call ≤ 4 MiB) | session descriptor; duplicate path across chunks → ERR_INVALID_PLAN, over budget (2000 artifacts / 64 MiB) or sealed → ERR_PLAN_SESSION_STATE | ||||
axiom_plan_seal | ACT | `{ sessionId, store?: inline\ | cas, root? }` | ManifestBundle — compiled by the same code path as axiom_plan_compile, so the digest equals a one-shot compile of the assembled Plan (property-tested); the session is consumed | |||
axiom_apply_dry_run core | READ | { bundle, root, profile? } | ApplyResult{mode:"dry-run", diff} | ||||
axiom_apply core | SENSITIVE | { bundle, root, profile?, confirmDigest, mode?, branch?, commitMessage?, lockTimeoutMs? (0..600000), keepBackups? (0..1000) } | ApplyResult — error.details carries { otherDigest, paths } for ERR_CONFLICT and { holder, waitedMs, queuePosition } for ERR_LOCKED | ||||
axiom_write core | SENSITIVE | `{ root, files[]: { path, content?, encoding?: utf8\ | base64, op?: write\ | delete, mode? }, intent?, profile?, confirmDigest?, lockTimeoutMs?, keepBackups? }` | One-tool write (2.5.0): without confirmDigest → status: "preview" (dry-run + checks, diff, manifestDigest, next; nothing outside .axiom/ touched); the same files + confirmDigest → atomic apply like axiom_apply (journal, one-step axiom_rollback). A target changed since the preview → ERR_CONFIRM_DIGEST_MISMATCH. Prefer it for multi-file or sensitive changes | ||
axiom_rollback core | SENSITIVE | { root, manifestDigest } | { status:"rolled-back", phase, steps } | ||||
axiom_manifest_diff | READ | `{ a: bundle\ | "sha256:…", b }` | { added[], removed[], changed[] } | |||
axiom_axm_parse | READ | { source } (.axm text) | { plan?, diagnostics: [{ severity, code, message, range: { start: {line, column}, end } }] } | ||||
axiom_roots_list | READ | {} | { roots: [{ path, writable, hasGit }] } | ||||
axiom_status core | READ | { root? } | { root, lock: { held, holder?: { pid, host?, digest?, since?, stale }, queue[], intents[] }, interrupted[], corrupt[], lastApplied?, chain: { ok, entries, head, firstBad?, missingJournals } } — same as axiom status --json; never takes the lock | ||||
axiom_repo_snapshot | READ | { root?, include?[], exclude?[], maxFiles? (20000, cap 50000), maxBytes? (64 MiB), respectGitignore? (true), withContentDigest? (true) } | RepoSnapshot { snapshotDigest, body: { files: [{ path, bytes, sha256?, mode, kind }], truncated, counts } } — sorted, no timestamps/absolute paths; .git/, .axiom/ always skipped; symlinks recorded, never followed (docs/guides/snapshot.md) |
Every tool carries MCP annotations (readOnlyHint, destructiveHint, idempotentHint, openWorldHint) and an outputSchema; structuredContent is the full result, content[0].text a small summary (digest, verdict, counts, first 20 findings). Errors come back as isError: true with { code, message, path? } from the closed ERROR_CODES enum — a handler never throws. spec/tools.json is generated from the same registry (pnpm build:spec) and guarded by a parity test. spec/codai-tools.json is the same registry in codai's packages/agent-core/spec/tools-v2.json entry shape ({ name, risk, toolset, description, parameters }) — see docs/integration/codai.md.
Resources: axiom://manifest/{sha}, axiom://report/{sha}, axiom://applied/{sha}, axiom://profile/{name}, axiom://schema/{Plan|Manifest|ManifestBundle|CheckReport|ApplyResult|Profile|Journal|RepoSnapshot}, axiom://emitters (template emitters loaded with --emitter — empty by default since 3.0; install @codai/axiom-emitters-web next to the repo and pass --emitter @codai/axiom-emitters-web, see docs/guides/emitters.md), axiom://lock ({ roots: [{ root, held, holder?, queue[], intents[] }] } for every allowlisted root; read-only).
axiom_apply requires confirmDigest === bundle.manifestDigest — echo the digest you saw in dry-run. Pre-apply checks run against the profile (default default, or /.axiom/profiles/ .json); a non-pass verdict aborts with ERR_CHECKS_FAILED before any write.ERR_BUNDLE_TOO_LARGE).ERR_EBUSY beyond that). Stopping the server aborts every running task and kills its guard trees..axiom/lock makes apply single-writer per root; the journal makes it crash-safe and reversible.--log-level error|warn|info|debug, default warn).guard.external) are off unless the process is started with --allow-guards *and* the profile sets facts.allowGuards: true. Relative commands must live under /scripts/; absolute ones must be listed exactly via --guard-allowlist (repeatable). Guards are spawned with an args array (never a shell), a scrubbed environment, a wall-clock timeout, and must print GuardOutput JSON — see docs/guides/checks.md.docs/guides/signing.md): a root can pin Ed25519 public keys in .axiom/trust/keys.json; a profil只显示了开头部分;其余内容请在仓库中阅读