Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -651,6 +651,15 @@ Any change to help text β€” a description, an option, an `addHelpText` section,

The same applies to the comparison image `docs/images/related-work.svg`, which is rendered from the "MCP CLI clients" table in the "Related work" section of README.md by `scripts/generate-related-work-image.mjs`. Never edit the SVG by hand: after changing the table (rows, columns, or their order), run `node scripts/generate-related-work-image.mjs` (also part of `pnpm run build:readme`) and commit the result β€” the same unit test fails when the image has drifted from the table. Keep `docs/` out of the npm package: it holds multi-MB README media that nothing reads at runtime (`.npmignore` excludes it, and `test/unit/packaging.test.ts` fails if it ever ships).

**Refreshing the related-work table** ("update the related work table with latest data"): use the same source for every row so the numbers stay comparable between refreshes.

- **Commits** and **Active**: full (not `--depth`) `git clone` of each repo into the scratchpad (public git reads work in cloud sessions), then `git rev-list --count HEAD` on the default branch and `git log -1 --format=%cs`. ⚠️ means the last commit is 3+ months old.
- **Stars**: the GitHub repo page ("N stars" in the sidebar), written as-is below 1000 and as one-decimal `k` above (`2,405` β†’ `2.4k`).
- **Contrib**: the number GitHub itself shows, from `https://github.com/<owner>/<repo>/contributors_list?deferred=true` ("Contributors N"). Not the REST `/contributors` API: it counts differently (off by one or two, more with `anon=1`).
- **MCP**: only re-check repos whose dependency files changed since the last refresh (`git log --since=<last refresh> -- package.json go.mod pyproject.toml uv.lock ...`), then read the pinned SDK version from the lockfile.
- **Tooling**: in cloud sessions `api.github.com` and `github.com` are blocked for `curl`, so fetch the two GitHub pages with the built-in WebFetch tool. Do not use the `apify/web-fetch` MCP tool: every call and every result read needs a fresh approval. Locally, `gh api` works for stars.
- Follow renamed repos (a clone or page redirect means the repo moved) and update the link, keep rows ordered by stars after mcpc, update the `as of <date>` comment above the table, and keep the column alignment Prettier would produce (README.md is outside the Prettier lint scope, so don't run `prettier --write` on it; that reformats every other table). Then regenerate the SVG as described above.

Keep the MCP conformance tests up to date the same way you keep the e2e tests up to date. Whenever a change touches protocol behaviour, the OAuth/authentication flows, or transport handling, check `test/conformance/` in the same PR: update the adapter (`test/conformance/client.mjs`) if the change alters what a scenario observes, and wire up a matching upstream scenario when a new feature has one. Run the affected scenario locally before finishing β€” see `test/conformance/README.md` for the command, the current coverage table, and the list of scenarios that are not covered yet. A deliberate behaviour change that breaks the adapter must be fixed in the PR that makes the change, not discovered later when a release is gated on it.

Keep each changelog entry to one or two short sentences focused on the user-visible behaviour. Do not enumerate implementation details, internal class names, or step-by-step breakdowns β€” readers want to know what changed for them, not how it was built. If an entry needs subheadings or its own bulleted breakdown, it's too long.
Expand Down
26 changes: 13 additions & 13 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -1487,24 +1487,24 @@ See [CONTRIBUTING](./CONTRIBUTING.md) for development setup, architecture overvi

### MCP CLI clients

<!-- Stars, contributors, commits, and activity as of September 2026. -->
<!-- Stars, contributors, commits, and activity as of 2026-09-23. -->

| Tool | MCP | Active | Lang | Stars | Commits | Contrib | Tools | Resources | Prompts | Tasks | Skills | Code mode | Sessions | OAuth | Client creds | Enterprise auth | Stdio | HTTP | Tool search | x402 | LLM |
| ----------------------------------------------------------------------- | ---------- | ------ | ------ | ----: | ------: | ------: | ----- | --------- | ------- | ----- | ------ | --------- | -------- | ----- | ------------ | --------------- | ----- | ---- | ----------- | ---- | --- |
| **[apify/mcpc](https://github.com/apify/mcpc)** | 2026-07-28 | βœ… | TS | 847 | 758 | 15 | βœ… | βœ… | βœ… | βœ… | βœ… | βœ… | βœ… | βœ… | βœ… | βœ… | βœ… | βœ… | βœ… | βœ… | β€” |
| [steipete/mcporter](https://github.com/steipete/mcporter) | 2026-07-28 | βœ… | TS | 5.0k | 942 | 51 | βœ… | βœ… | β€” | β€” | β€” | βœ… | βœ… | βœ… | β€” | β€” | βœ… | βœ… | β€” | β€” | β€” |
| [knowsuchagency/mcp2cli](https://github.com/knowsuchagency/mcp2cli) | 2025-11-25 | βœ… | Python | 2.4k | 168 | 24 | βœ… | βœ… | βœ… | β€” | β€” | βœ… | βœ… | βœ… | βœ… | β€” | βœ… | βœ… | βœ… | β€” | β€” |
| [IBM/mcp-cli](https://github.com/IBM/mcp-cli) | 2025-06-18 | βœ… | Python | 2.0k | 800 | 23 | βœ… | βœ… | βœ… | β€” | β€” | βœ… | βœ… | βœ… | β€” | β€” | βœ… | βœ… | β€” | β€” | βœ… |
| **[apify/mcpc](https://github.com/apify/mcpc)** | 2026-07-28 | βœ… | TS | 891 | 779 | 17 | βœ… | βœ… | βœ… | βœ… | βœ… | βœ… | βœ… | βœ… | βœ… | βœ… | βœ… | βœ… | βœ… | βœ… | β€” |
| [openclaw/mcporter](https://github.com/openclaw/mcporter) | 2026-07-28 | βœ… | TS | 5.0k | 965 | 47 | βœ… | βœ… | β€” | β€” | β€” | βœ… | βœ… | βœ… | β€” | β€” | βœ… | βœ… | β€” | β€” | β€” |
| [knowsuchagency/mcp2cli](https://github.com/knowsuchagency/mcp2cli) | 2025-11-25 | βœ… | Python | 2.4k | 168 | 19 | βœ… | βœ… | βœ… | β€” | β€” | βœ… | βœ… | βœ… | βœ… | β€” | βœ… | βœ… | βœ… | β€” | β€” |
| [IBM/mcp-cli](https://github.com/IBM/mcp-cli) | 2025-06-18 | βœ… | Python | 2.0k | 800 | 22 | βœ… | βœ… | βœ… | β€” | β€” | βœ… | βœ… | βœ… | β€” | β€” | βœ… | βœ… | β€” | β€” | βœ… |
| [f/mcptools](https://github.com/f/mcptools) | 2024-11-05 | ⚠️ | Go | 1.6k | 174 | 16 | βœ… | βœ… | βœ… | β€” | β€” | βœ… | β€” | β€” | β€” | β€” | βœ… | βœ… | β€” | β€” | β€” |
| [philschmid/mcp-cli](https://github.com/philschmid/mcp-cli) | 2025-11-25 | ⚠️ | TS | 1.3k | 30 | 3 | βœ… | β€” | β€” | β€” | β€” | βœ… | βœ… | β€” | β€” | β€” | βœ… | βœ… | βœ… | β€” | β€” |
| [philschmid/mcp-cli](https://github.com/philschmid/mcp-cli) | 2025-11-25 | ⚠️ | TS | 1.3k | 30 | 2 | βœ… | β€” | β€” | β€” | β€” | βœ… | βœ… | β€” | β€” | β€” | βœ… | βœ… | βœ… | β€” | β€” |
| [adhikasp/mcp-client-cli](https://github.com/adhikasp/mcp-client-cli) | 2025-06-18 | ⚠️ | Python | 677 | 113 | 5 | βœ… | β€” | β€” | β€” | β€” | β€” | β€” | β€” | β€” | β€” | βœ… | β€” | β€” | β€” | βœ… |
| [thellimist/clihub](https://github.com/thellimist/clihub) | 2025-11-25 | ⚠️ | Go | 667 | 60 | 1 | βœ… | β€” | β€” | β€” | β€” | β€” | β€” | βœ… | βœ… | β€” | βœ… | βœ… | βœ… | β€” | β€” |
| [wong2/mcp-cli](https://github.com/wong2/mcp-cli) | 2025-11-25 | ⚠️ | JS | 444 | 67 | 6 | βœ… | βœ… | βœ… | β€” | β€” | β€” | β€” | βœ… | β€” | β€” | βœ… | βœ… | β€” | β€” | β€” |
| [activeing123/mcptoon](https://github.com/activeing123/mcptoon) | 2026-07-28 | βœ… | Python | 197 | 229 | 3 | βœ… | β€” | β€” | β€” | β€” | βœ… | β€” | β€” | β€” | β€” | βœ… | βœ… | β€” | β€” | β€” |
| [thellimist/clihub](https://github.com/thellimist/clihub) | 2025-11-25 | ⚠️ | Go | 666 | 60 | 1 | βœ… | β€” | β€” | β€” | β€” | β€” | β€” | βœ… | βœ… | β€” | βœ… | βœ… | βœ… | β€” | β€” |
| [wong2/mcp-cli](https://github.com/wong2/mcp-cli) | 2025-11-25 | ⚠️ | JS | 446 | 67 | 7 | βœ… | βœ… | βœ… | β€” | β€” | β€” | β€” | βœ… | β€” | β€” | βœ… | βœ… | β€” | β€” | β€” |
| [activeing123/mcptoon](https://github.com/activeing123/mcptoon) | 2026-07-28 | βœ… | Python | 203 | 272 | 3 | βœ… | β€” | β€” | β€” | β€” | βœ… | β€” | β€” | β€” | β€” | βœ… | βœ… | β€” | β€” | β€” |
| [mcpshim/mcpshim](https://github.com/mcpshim/mcpshim) | 2025-11-25 | βœ… | Go | 64 | 17 | 1 | βœ… | β€” | β€” | β€” | β€” | βœ… | βœ… | βœ… | β€” | β€” | β€” | βœ… | βœ… | β€” | β€” |
| [lydakis/mcpx](https://github.com/lydakis/mcpx) | 2026-07-28 | βœ… | Go | 52 | 119 | 3 | βœ… | β€” | β€” | β€” | β€” | βœ… | βœ… | βœ… | β€” | β€” | βœ… | βœ… | β€” | β€” | β€” |
| [evantahler/mcpx](https://github.com/evantahler/mcpx) | 2026-07-28 | βœ… | TS | 33 | 116 | 1 | βœ… | βœ… | βœ… | βœ… | β€” | βœ… | β€” | βœ… | β€” | β€” | βœ… | βœ… | βœ… | β€” | β€” |
| [EstebanForge/mcp-cli-ent](https://github.com/EstebanForge/mcp-cli-ent) | 2026-07-28 | βœ… | Go | 15 | 61 | 3 | βœ… | β€” | β€” | β€” | β€” | βœ… | βœ… | β€” | β€” | β€” | βœ… | βœ… | βœ… | β€” | β€” |
| [lydakis/mcpx](https://github.com/lydakis/mcpx) | 2026-07-28 | βœ… | Go | 53 | 121 | 3 | βœ… | β€” | β€” | β€” | β€” | βœ… | βœ… | βœ… | β€” | β€” | βœ… | βœ… | β€” | β€” | β€” |
| [evantahler/mcpx](https://github.com/evantahler/mcpx) | 2026-07-28 | βœ… | TS | 32 | 116 | 3 | βœ… | βœ… | βœ… | βœ… | β€” | βœ… | β€” | βœ… | β€” | β€” | βœ… | βœ… | βœ… | β€” | β€” |
| [EstebanForge/mcp-cli-ent](https://github.com/EstebanForge/mcp-cli-ent) | 2026-07-28 | βœ… | Go | 15 | 61 | 2 | βœ… | β€” | β€” | β€” | β€” | βœ… | βœ… | β€” | β€” | β€” | βœ… | βœ… | βœ… | β€” | β€” |
| [domdomegg/call-mcp](https://github.com/domdomegg/call-mcp) | 2025-11-25 | βœ… | TS | 3 | 37 | 3 | βœ… | β€” | β€” | β€” | β€” | βœ… | β€” | βœ… | β€” | β€” | βœ… | βœ… | β€” | β€” | β€” |

**Legend:** βœ… = supported, ⚠️ = stale (no commits in 3+ months), **MCP** = latest [MCP protocol version](https://modelcontextprotocol.io/specification/latest/basic/index#protocol-version) the client supports, per its pinned SDK/own implementation, **Commits** = total commits, **Contrib** = contributors, **Tasks** = [async tasks](https://modelcontextprotocol.io/specification/latest/basic/utilities/tasks), **Skills** = [skills extension](https://modelcontextprotocol.io/extensions/skills/overview), **Client creds** = [OAuth client credentials](https://modelcontextprotocol.io/extensions/auth/oauth-client-credentials) extension (machine-to-machine login, no browser), **Enterprise auth** = [enterprise-managed authorization](https://modelcontextprotocol.io/extensions/auth/enterprise-managed-authorization) extension (ID-JAG issued by a corporate IdP), **x402** = [x402 payment protocol](https://www.x402.org/) support, **LLM** = requires/uses an LLM.
Expand All @@ -1529,7 +1529,7 @@ These resources describe the "code mode" pattern (replacing many tool definition
- [Advanced tool use](https://www.anthropic.com/engineering/advanced-tool-use) - Anthropic's engineering post on tool search
- [Claude tool search](https://platform.claude.com/docs/en/agents-and-tools/tool-use/tool-search-tool) - Claude platform docs
- [Dynamic context discovery](https://cursor.com/blog/dynamic-context-discovery) - Cursor's approach to dynamic tool discovery
- [cmcp](https://github.com/assimelha/cmcp) (~31 stars, Rust) - MCP proxy aggregating servers behind `search()` + `execute()`
- [cmcp](https://github.com/assimelha/cmcp) (~32 stars, Rust) - MCP proxy aggregating servers behind `search()` + `execute()`
- [cloudflare-mcp](https://github.com/mattzcarey/cloudflare-mcp) (~128 stars, TS) - MCP server for the Cloudflare API using code mode
- [infinite-mcp](https://github.com/day50-dev/infinite-mcp) (~6 stars, Python) - Meta-MCP server that exposes 1000+ pre-indexed MCP servers via semantic search and dynamic tool discovery

Expand Down
Loading
Loading