This file provides guidance to coding agents (Codex, and any AGENTS.md-aware tool) when working with code in this repository. It mirrors .claude/CLAUDE.md — keep the two in sync.
AgentKey Skill ships the agent-side half of AgentKey: a single skill that teaches agents how to call the AgentKey MCP tools correctly.
AgentKey has two pieces and a full end-user install is two commands:
npx skills add chainbase-labs/agentkey— installs this skill. It does NOT register the MCP server.npx -y @agentkey/cli --auth-login— runs the AgentKey CLI (@agentkey/clifrom../AgentKey-Server/cli). It mints an API key via device-code login and writes a remote-HTTP MCP block (pointing athttps://api.agentkey.app/v1/mcp) into agent configs (Claude Code, Codex, Cursor, and 13 more). The hosted MCP server itself lives at/v1/mcpon AgentKey-Server.
The skill is useless without the MCP server; the MCP server works without the skill but the agent won't know to prefer it over built-in web search. Keep this mental model when editing docs — do not let either command drift into claiming it does both.
The same repo also works as:
- a Claude Code plugin (
.claude-plugin/plugin.json+ root.mcp.json) — the plugin'suserConfiginjects the API key via${user_config.AGENTKEY_API_KEY}, substituting for step 2. - a Codex plugin (
.codex-plugin/plugin.json+.codex-plugin/mcp.json, distributed through.agents/plugins/marketplace.json; the repo is its own marketplace:codex plugin marketplace add chainbase-labs/agentkey). Codex plugins have nouserConfig/header-interpolation mechanism, so auth uses MCP OAuth via the server's RFC 9728 metadata discovery (type+urlonly in mcp.json), substituting for step 2. - a Kimi Code plugin (
.kimi-plugin/plugin.json). Kimi requiresmcpServersto be an inline object in the manifest. The remote AgentKey endpoint uses Kimi's native MCP OAuth flow; after install Kimi shows the standard/reloadhint, then the user signs in with/mcp-config login plugin-agentkey:agentkeywhen Kimi reports that OAuth is required.
agentkey/
├── .claude-plugin/plugin.json # Claude Code plugin manifest
├── .codex-plugin/
│ ├── plugin.json # Codex plugin manifest (skills + mcpServers + interface metadata)
│ └── mcp.json # Codex MCP entry — http + oauth_resource (NOT the root .mcp.json)
├── .kimi-plugin/
│ └── plugin.json # Kimi Code manifest with inline HTTP MCP entry (OAuth)
├── .agents/plugins/marketplace.json # Codex marketplace listing this repo as a local-source plugin
├── .mcp.json # Auto-registers AgentKey MCP when installed as a Claude Code plugin
├── skills/agentkey/
│ ├── SKILL.md # Decision tree + routing rules (end-user facing)
│ ├── scripts/ # check-update helper
│ └── version.txt # Managed by release-please only — must live inside the skill so it survives `npx skills add`
└── scripts/
└── uninstall.sh # End-user cleanup helper
# Test a local edit against every detected agent
npx skills add .
# Daily commit (does NOT trigger user updates)
git add -A && git commit -m "..." && git push origin main
# Publish a new release
# Releases are cut automatically by release-please on merge to main.
# To manually trigger: merge a conventional-commit PR; release-please will open
# a Release PR; merge that to tag and create the GitHub Release.
# Undo a bad release
git tag -d vX.Y.Z && git push origin :refs/tags/vX.Y.Z
gh release delete vX.Y.Z --repo chainbase-labs/agentkey --yesReleases are driven by release-please: merged PRs with Conventional Commit messages (feat:, fix:, feat!:, etc.) update an open Release PR that bumps skills/agentkey/version.txt, all three plugin manifest versions, and CHANGELOG.md. Merging the Release PR tags the release and creates the GitHub Release, which in turn triggers plugin updates for users.
skills/agentkey/version.txt, the versions in.claude-plugin/plugin.json,.codex-plugin/plugin.json, and.kimi-plugin/plugin.json, plusCHANGELOG.md, are managed by release-please based on Conventional Commits — never edit manually except via PR that intentionally amends them.version.txtlives insideskills/agentkey/(not at repo root) so it travels with the skill when the Skills CLI copies the subdirectory.release-please-config.jsonpoints at this path viaversion-file.- Tag format:
vprefix (e.g.v0.4.5) - Plugin updates trigger on GitHub Release publication, not on plain commits
npx skills updatepulls from the default branch, so main must always be shippable
Changes to any plugin.json:
- release-please automatically bumps all three manifest versions +
CHANGELOG.mdfrom merged conventional-commit PRs; maintainers review + merge the generated Release PR rather than editing these files directly
Changes to the root .mcp.json (Claude Code plugin path):
- The MCP server is
type: http(remote endpoint, no subprocess), so inject the API key by interpolating the userConfig value as${user_config.AGENTKEY_API_KEY}in theAuthorizationheader — the key name MUST match the.claude-plugin/plugin.jsonuserConfigkey. Do NOT use${CLAUDE_PLUGIN_OPTION_<KEY>}: those env vars are only exported to stdio/subprocess servers and hook/monitor commands, and are not interpolated into an http server's headers. - Only matters for the Claude Code plugin path; the Skills-CLI path writes MCP config through
npx @agentkey/cli --auth-login
Changes to .codex-plugin/mcp.json (Codex plugin path):
- Codex plugin MCP config does NOT support
${user_config.*}interpolation — a literal${…}would be sent as the Authorization header. Auth is MCP OAuth via RFC 9728 discovery: the server's 401 advertisesresource_metadata, and the rmcp client automatically appendsresource=<server url>to the authorization request. - Do NOT set
oauth_resource: rmcp already sendsresourceon its own, and Codex appendsoauth_resourceas a secondresourcequery param without deduplication (codex-rs/rmcp-client/src/perform_oauth_login.rs). Clerk enforces RFC 6749 (no repeated params) and rejects the request withinvalid_request: The request includes the parameter 'resource' more than once. The official Notion/Figma plugins get away with it only because their authorization servers tolerate duplicates. - Keep the endpoint URL in sync with the root
.mcp.json— both must point at the same/v1/mcpendpoint.
Changes to .kimi-plugin/plugin.json (Kimi Code plugin path):
mcpServersMUST be an inline object. Kimi does not accept a path such as"./mcp.json"for this field.- Keep the HTTP entry minimal:
{"agentkey":{"url":"https://api.agentkey.app/v1/mcp"}}. Kimi infers the transport fromurl. - Do not add
userConfig, a static Authorization header, or${user_config.*}interpolation. Kimi discovers and persists MCP OAuth credentials itself. - Kimi displays
Run /new or /reload to apply plugin changes.after install. Once reloaded, the user completes native MCP OAuth with/mcp-config login plugin-agentkey:agentkeywhen Kimi reports that authentication is required. - Keep the endpoint URL in sync with the root
.mcp.jsonand.codex-plugin/mcp.json.
Changes to install/uninstall docs:
- Update both
README.mdanddocs/README_zh.mdtogether — they mirror each other - The canonical install is always the two-command sequence (
npx skills add …+npx -y @agentkey/cli --auth-login). Don't imply either command does both. - Do not re-add OpenClaw / per-agent installers without a new design — historical context is in git history (removed in chore/remove-archive-directory)
- Setup mode in SKILL.md runs
! npx -y @agentkey/cli --auth-loginto authenticate via browser — same command as step 2 of the public install @agentkey/cli --auth-loginauto-writes MCP configs for 16 agents (canonical list lives inAGENT_REGISTRYin../AgentKey-Server/cli/src/lib/mcp-clients.ts): Claude Code, Claude Desktop, Cursor, Codex, Gemini CLI, OpenCode, Qwen Code, iFlow CLI, Kimi CLI, Kiro CLI, Windsurf, Warp, Amp, Crush, droid, openclaw. The--only <ids>flag (used by install.sh'sMCP_TARGETSand install.ps1's$McpTargets) filters this list — its id values MUST matchnpx skills add -aids, withclaude-desktopas the one documented MCP-only exception. Goose / kode / kilo still need a manual JSON paste (see SKILL.md's "Fallback" section); when adding more agents server-side, keepMCP_AUTO_AGENTSin both install scripts and the cleanup list in both uninstall scripts in sync.- Root
.mcp.jsonregisters the remote-HTTP MCP endpoint (https://api.agentkey.app/v1/mcp) in Claude Code plugin mode; the API key flows from plugin userConfig into theAuthorization: Bearer ${user_config.AGENTKEY_API_KEY}header (no stdio binary is launched) .codex-plugin/mcp.jsonregisters the same endpoint in Codex plugin mode, authenticated via MCP OAuth (RFC 9728 discovery; nooauth_resource— see checklist above).kimi-plugin/plugin.jsonregisters the same endpoint inline in Kimi Code plugin mode. After reloading, the user starts Kimi's native MCP OAuth flow with/mcp-config login plugin-agentkey:agentkey.README.md/docs/README_zh.mdare the public-facing docs; keep them in sync with any structural changes