🎃 Build an `amcp` CLI (MVP): log in with an API key, list and call tools
メンテナーはふだん 1 日以内に返信
@Coding-Professional がすでに取り組んでいます。
2026年10月11日 から。
評価
- 難易度
- 4/5
- 見積もり時間
- 3〜5日
- 初心者へのやさしさ
- 45/100
- issue の種類
- 機能追加
- 明瞭さ
- 明確に書かれている
- 活発さ
- 活発
- 技術スタック
- node.js, typescript
- 領域
- cli
調査の方向性
Start with the new packages/cli workspace, the root package.json workspaces and the Docker COPY lines at Dockerfile:26-32, then read mcp-combined-auth.guard.ts:61-85 for how X-API-Key is accepted and mcp-client.engine.ts:46 for the existing StreamableHTTP transport. Done means amcp login, tools ls, tools describe and tools call work against /mcp/<serverId>, the node --test suite passes with the key kept out of output, and docker build . still succeeds.
索引モデルが issue の本文から書いたものです。
説明
Part of the October Challenge #997.
Why
Developers want to test a connector's tools from the terminal or a CI job ("does sap_query still answer after the upgrade?") without opening the UI or wiring up an MCP client. A small CLI that talks to the MCP endpoint we already expose is enough, and it works the same against AnythingMCP Cloud and any self-hosted instance. Comparable tools: mcp-cli, the MCP Inspector CLI mode, Composio's CLI.
Self-hosted vs Cloud
- Self-hosted: works with per-user MCP API keys (
mcp_…) and with the instance-wideMCP_API_KEY/MCP_BEARER_TOKENused inlegacyauth mode. - Cloud (
DEPLOYMENT_MODE=cloud): works with per-user MCP API keys. Important difference: on Cloud the bare/mcpURL serves a fixed set of 8 meta-tools (anythingmcp_search_tools,anythingmcp_run_read_tool, …, seeshared-toolset.ts:26and:52), not the workspace's tools. The CLI must therefore always target a server URL/mcp/<serverId>, which exposes that server's tools directly on both deployments. - Who can use it: any member who can create an MCP API key. The backend already scopes everything: the key resolves to a user and organization, the per-server endpoint checks org membership (
mcp-endpoint.controller.ts:837–871) and the user's MCP role limits which tools are listed and callable. The CLI adds no permissions of its own.
What to build
New workspace package packages/cli (@anythingmcp/cli, "bin": { "amcp": "dist/index.js" }, TypeScript, Node ≥ 22.12 like the root engines).
- Transport:
@modelcontextprotocol/clientv2 (already used by the backend) withStreamableHTTPClientTransport, headerX-API-Key: <key>. One small dependency for argument parsing (commanderor Node's built-inutil.parseArgs); nothing else. - Commands:
amcp login --url https://cloud.anythingmcp.com --server <serverId>— reads the key from a hidden prompt or--key-stdin(never as a plain argument, it would land in shell history), callstools/listonce to verify, saves a profile to~/.config/amcp/config.json($XDG_CONFIG_HOMErespected, file mode0600).--profile <name>for several instances.amcp logout,amcp whoami(URL, server id, key prefixmcp_ab12…only).amcp tools ls [--filter <text>]— name, read-only/destructive hint (from tool annotations), first line of description.amcp tools describe <name>— description + input JSON schema.amcp tools call <name> --args '<json>'(or--args @file.json, or-for stdin). Prints text content; if a tool annotation saysdestructiveHint: trueand stdin is a TTY, ask for confirmation unless--yes.- Global
--json(machine-readable output for every command),--profile,--url/--server/AMCP_URL/AMCP_API_KEY/AMCP_SERVERenv overrides for CI.
- Exit codes:
0ok,1tool returnedisError,2usage/invalid JSON,3auth (401/403),4network/server error. Errors to stderr; never print the key or full request headers, even with--verbose. - Workspace wiring: add
packages/clito rootpackage.jsonworkspaces; give itbuild,lintandtestscripts. The Docker build runsnpm ciwith only the backend/frontendpackage.jsoncopied (Dockerfile:26–32); verifydocker build .still works and adjust the COPY lines if needed. The CLI must not end up in the server image.
Where to look
package.json(root) —workspaces,engines,test/lintscripts.docs/api-reference.md:3— the REST API under/api/*requires a JWT, not an MCP API key;:286MCP API keys.packages/backend/src/auth/mcp-combined-auth.guard.ts:61–85— howX-API-Key(mcp_…or static key) is accepted.packages/backend/src/mcp-server/mcp-endpoint.controller.ts:222(bare/mcp),:676(/mcp/:serverId).packages/backend/src/mcp-server/shared-toolset.ts:52—sharedEndpointMode(), why bare/mcpdiffers on Cloud.packages/backend/src/connectors/engines/mcp-client.engine.ts:46— existingStreamableHTTPClientTransportusage with custom headers.packages/frontend/src/app/mcp-server/[id]/page.tsx:270,:297— where users find the server URL and theX-API-Keyheader; add a "CLI" snippet there in a follow-up.packages/backend/prisma/schema.prisma:344—McpApiKey(optionally bound to onemcpServerId).
Acceptance criteria
- Tests with
node --test(or jest like the backend) against an in-process fake MCP server (@modelcontextprotocol/server):tools ls,tools callsuccess,isError, 401, invalid--argsJSON,--jsonoutput shape. - Config file is created
0600; the key never appears in stdout/stderr (test it). - Manually verified against a local
docker compose upinstance and against Cloud (put the commands/output, key redacted, in the PR). - The backend and frontend tests and lint still pass;
docker build .still passes. - Docs:
packages/cli/README.md+ a "CLI" section indocs/api-reference.md.
Out of scope
amcp servers ls/ connector management: there is no endpoint that lists MCP servers for an API key (/api/mcp-serversis JWT-only,mcp-servers.controller.ts:92). Follow-up: a maintainer-designed read-only endpoint, then the command.- OAuth device-flow / browser login, email+password login.
- Publishing to npm, Homebrew, standalone binaries.
- Resources and prompts (
resources/list,prompts/get), interactive REPL, shell completions.
Size
L (several days, may be split: package skeleton + login/tools ls first, tools call + --json second).
How to claim
Comment "I'd like to work on this" and we'll assign you. Rules in #997.
- 主要言語
- TypeScript
- スター
- 856
- フォーク
- 82
- 平均マージ
- 6時間 44分
- マージ済み PR(30日)
- 181
環境構築
このプロジェクトには開発コンテナ、Dockerfile、コントリビューションガイドがありません。まず README を読み、一般的な手順ははじめてのコントリビューションガイドを参照してください。
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
HelpCode-ai/anythingmcp のほかの issue
-
Docs: document all SMTP_* and other undocumented env vars for self-hosting対応中かも @notlakshitha が 5 日前に担当しました。 オープンenhancement
難易度 2/5 1〜3時間 初心者へのやさしさ 82/100
HelpCode-ai/anythingmcp#1049 · コメント 3 件 ·
メンテナーはふだん 1 日以内に返信
-
good first issue hacktoberfest
難易度 2/5 半日 初心者へのやさしさ 70/100
HelpCode-ai/anythingmcp#996 ·
メンテナーはふだん 1 日以内に返信
-
good first issue hacktoberfest
難易度 2/5 半日 初心者へのやさしさ 72/100
HelpCode-ai/anythingmcp#995 ·
メンテナーはふだん 1 日以内に返信
-
enhancement good first issue hacktoberfest help wanted
難易度 2/5 1〜3時間 初心者へのやさしさ 78/100
HelpCode-ai/anythingmcp#982 · コメント 2 件 ·
メンテナーはふだん 1 日以内に返信
-
Workspace memory: personal and organization memory for AI clients対応中かも @helpcodeai が今日担当しました。 オープン
難易度 5/5 1週間以上 初心者へのやさしさ 25/100
HelpCode-ai/anythingmcp#1151 ·
メンテナーはふだん 1 日以内に返信
HelpCode-ai/anythingmcp の issue をすべて見る
似ている issue
-
[Android] Nested transforms are composed in reverse order対応中かも @Danyalo が今日担当しました。 オープンRepro provided
難易度 2/5 1〜3時間 初心者へのやさしさ 74/100
software-mansion/react-native-svg#3090 ·
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 76/100
radix-ui/primitives#4228 ·
メンテナーはふだん 1 日以内に返信
-
bug
難易度 1/5 1時間未満 初心者へのやさしさ 95/100
rocketride-org/rocketride-server#2705 · コメント 1 件 ·
メンテナーはふだん 1 日以内に返信
-
archon-ready archon-size-s archon-type-bug area: web
難易度 2/5 1〜3時間 初心者へのやさしさ 82/100
coleam00/Archon#4707 · コメント 1 件 ·
メンテナーはふだん 1 日以内に返信
-
bug
難易度 2/5 1〜3時間 初心者へのやさしさ 70/100
HarperFast/grafana-datasource#177 ·