🎃 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
- 平均合并
- 7 小时 49 分钟
- 30 天内合并 PR
- 302
环境准备
这个项目没有提供开发容器、Dockerfile 或贡献指南,环境需要你自己搭建:先看它的 README,通用步骤见我们的新手贡献指南。
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
HelpCode-ai/anythingmcp 的其他 Issue
-
🐣 Good first issue: contribute a new MCP adapter可能已有人在做 关联的 PR 仍在进行中或已合并。 未关闭enhancement good first issue hacktoberfest help wanted
难度 2/5 1-3 小时 新手友好度 78/100
HelpCode-ai/anythingmcp#982 · 10 条评论 ·
维护者通常 1 天内回复
-
enhancement
难度 5/5 一周以上 新手友好度 30/100
HelpCode-ai/anythingmcp#1284 ·
维护者通常 1 天内回复
-
Translate the rest of the admin UI (DE, IT)可能已有人在做 关联的 PR 仍在进行中或已合并。 未关闭
难度 4/5 3-5 天 新手友好度 38/100
HelpCode-ai/anythingmcp#1271 ·
维护者通常 1 天内回复
-
DATABASE connectors keep a connection-string password in plaintext and return it to the browser可能已有人在做 @Riteesh-2k6 于 3 天前认领。 未关闭
难度 4/5 3-5 天 新手友好度 45/100
HelpCode-ai/anythingmcp#1245 · 2 条评论 ·
维护者通常 1 天内回复
-
🎃 New adapter: SonarQube (code quality, Server or Cloud)可能已有人在做 @aj-codespy 于 1 天前认领。 未关闭enhancement hacktoberfest help wanted
难度 3/5 半天 新手友好度 85/100
HelpCode-ai/anythingmcp#1240 · 2 条评论 · 已指派 1 人 ·
维护者通常 1 天内回复
查看 HelpCode-ai/anythingmcp 的全部 Issue
相似的 Issue
-
[Bug]: Pen taps on sidebar rows start a drag and lose their click可能已有人在做 @makhnatkin 今天认领。 未关闭
难度 2/5 1-3 小时 新手友好度 62/100
维护者通常 1 天内回复
-
enhancement
难度 2/5 1-3 小时 新手友好度 70/100
b310-digital/teammapper#1515 ·
维护者通常 1 天内回复
-
难度 2/5 1-3 小时 新手友好度 79/100
puckeditor/puck#1884 ·
维护者通常 1 天内回复
-
bug
难度 2/5 1-3 小时 新手友好度 65/100
outline/outline#14378 · 1 条评论 ·
维护者通常 1 天内回复
-
难度 2/5 1-3 小时 新手友好度 72/100
nicobailon/pi-web-access#642 ·
维护者通常 1 天内回复