Repository navigation
🎃 Build an amcp CLI (MVP): log in with an API key, list and call tools #1009
Copy link
Copy link
Open
Labels
enhancementNew feature or requestNew feature or requesthacktoberfestGood for Hacktoberfest contributorsGood for Hacktoberfest contributorshelp wantedExtra attention is neededExtra attention is needed
Description
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.
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
enhancementNew feature or requestNew feature or requesthacktoberfestGood for Hacktoberfest contributorsGood for Hacktoberfest contributorshelp wantedExtra attention is neededExtra attention is needed
Activity
helpcodeai commentedon Oct 10, 2026
@Coding-Professional this is the new issue for the one you are working on, and it is still yours. Leave a short comment here so GitHub lets us assign it to you again. The notes from before, for reference:
Coding-Professional commentedon Oct 11, 2026
I'd like to work on this.
helpcodeai commentedon Oct 11, 2026
@Coding-Professional thanks, it's yours (GitHub won't let me set the assignee field right now, so this comment counts). I've seen #1024, review coming shortly.
Coding-Professional commentedon Oct 11, 2026
@helpcodeai
Thanks for assigning this to me! I have raised the PR.
Looking forward to your feedback.
fix(cli): secure transport and profile overrides (HelpCode-ai#1009)
feat(cli): add secure login and tool listing (#1024)
fix(cli): support slow tool calls and SSE (HelpCode-ai#1009)
feat(cli): add tool calls and JSON output (#1088)