docs/reference/mcp-cli.md
Back to README
PicoClaw includes an mcp CLI command group for managing MCP server entries in config.json.
This CLI acts as a configuration manager:
tools.mcp.serversThe CLI updates the same config file used by the rest of PicoClaw:
PICOCLAW_CONFIG if set~/.picoclaw/config.jsonWhen the CLI writes the file, it:
Behavior notes:
picoclaw mcp add ... enables tools.mcp.enabledpicoclaw mcp remove ... disables tools.mcp.enabledAdd a stdio server via npx:
picoclaw mcp add filesystem -- npx -y @modelcontextprotocol/server-filesystem /tmp
Add a stdio server with environment variables saved in config:
picoclaw mcp add github --env GITHUB_PERSONAL_ACCESS_TOKEN=ghp_xxx -- npx -y @modelcontextprotocol/server-github
Add a stdio server using an env file for secrets:
picoclaw mcp add github --env-file .env.github -- npx -y @modelcontextprotocol/server-github
Add a remote HTTP server:
picoclaw mcp add context7 --transport http https://mcp.context7.com/mcp
Add a remote HTTP server with auth header, even with flags after the URL:
picoclaw mcp add apify "https://mcp.apify.com/" -t http --header "Authorization: Bearer OMITTED"
Add a stdio server using an explicit command separator:
picoclaw mcp add --transport stdio --env AIRTABLE_API_KEY=YOUR_KEY airtable -- npx -y airtable-mcp-server
Inspect the configured entries:
picoclaw mcp list
picoclaw mcp list --status
Inspect one server's full details and its exposed tools:
picoclaw mcp show filesystem
Probe a single server entry:
picoclaw mcp test filesystem
Open the raw config for advanced editing:
picoclaw mcp edit
| Command | Purpose |
|---|---|
picoclaw mcp add <name> [flags] <command-or-url> [args...] | Add or update an MCP server entry |
picoclaw mcp remove <name> | Remove a server entry from config |
picoclaw mcp list | List configured MCP servers |
picoclaw mcp show <name> | Show full details and tools for one server |
picoclaw mcp test <name> | Try connecting to one configured server |
picoclaw mcp edit | Open config.json in $EDITOR |
picoclaw mcp addSyntax:
picoclaw mcp add <name> [flags] <command-or-url> [args...]
Supported flags:
| Flag | Meaning |
|---|---|
--env, -e | Add a stdio environment variable in KEY=value format. Repeatable. Values are saved to config. |
--env-file | Attach an env file path to a stdio server. Recommended for secrets you do not want stored inline in config.json. |
--header, -H | Add an HTTP header in Name: Value or Name=Value format. Repeatable. |
--transport, -t | Transport type: stdio (default), http, or sse. |
--force, -f | Overwrite an existing server entry without confirmation. |
--deferred | Mark the server as deferred: tools are hidden and discoverable on demand. |
--no-deferred | Mark the server as non-deferred: tools are always loaded into context. |
When neither --deferred nor --no-deferred is passed, the deferred field is omitted from the stored config and the global discovery.enabled value applies at runtime.
Supported forms:
picoclaw mcp add [flags] <name> <command-or-url> [args...]
picoclaw mcp add [flags] <name> -- <command> [args...]
Parsing behavior:
stdio, the most robust form is -- <command> [args...]-- separator when the stdio command itself has arguments that may look like PicoClaw CLI flags--, PicoClaw treats the first two non-flag tokens as <name> and <command-or-url>Secret handling:
--env KEY=value stores the resolved value directly in config.json--env-file instead when the value is sensitive and should stay outside the main config fileExample:
picoclaw mcp add sqlite npx -y @modelcontextprotocol/server-sqlite --db ./mydb.db
This stores:
{
"tools": {
"mcp": {
"enabled": true,
"servers": {
"sqlite": {
"enabled": true,
"type": "stdio",
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-sqlite", "--db", "./mydb.db"]
}
}
}
}
}
Adding the same server with --deferred stores the extra field:
picoclaw mcp add --deferred sqlite npx -y @modelcontextprotocol/server-sqlite --db ./mydb.db
{
"sqlite": {
"enabled": true,
"type": "stdio",
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-sqlite", "--db", "./mydb.db"],
"deferred": true
}
}
For stdio:
<command-or-url> is treated as the command[args...] are stored in args--env is supported--env-file is supported and stored in env_file--header is rejected-- <command> [args...] is supported and recommended for unambiguous parsingFor http / sse:
<command-or-url> must be a valid URL--env is rejected--env-file is rejected--header is supported and stored in headersOverwrite behavior:
<name> already exists, PicoClaw asks for confirmation--force to skip the promptLocal path validation:
./server.py or /opt/mcp/serverClear URL/transport error:
https://... but transport is still stdio, PicoClaw returns an explicit error telling you to use --transport http or --transport ssepicoclaw mcp removeSyntax:
picoclaw mcp remove <name>
This removes the named entry from tools.mcp.servers.
If the removed server was the last configured MCP server, PicoClaw also disables tools.mcp.enabled.
picoclaw mcp listSyntax:
picoclaw mcp list
picoclaw mcp list --status
On wide terminals the output is a styled box (same look as mcp show). On narrow terminals or when stdout is not a TTY, a plain ASCII table is printed instead.
Output fields:
| Field | Meaning |
|---|---|
Name | Server key inside tools.mcp.servers |
Type | Effective transport: stdio, http, or sse |
Command / Target | Stored command line for stdio servers, or URL for remote servers |
Status | enabled / disabled by default; with --status: ok (N tools) or error |
Deferred | deferred if the per-server override is true; eager if false; omitted if not set |
Notes:
--status, PicoClaw prints configuration state only--status, PicoClaw tries to connect to each enabled server and reports ok (N tools) or errorpicoclaw mcp show <name>picoclaw mcp showSyntax:
picoclaw mcp show <name>
picoclaw mcp show <name> --timeout 15s
This connects to the named server and prints:
On wide terminals the output is a styled box matching the mcp list look. On narrow terminals or non-TTY stdout, plain text is printed instead.
Example output (wide terminal):
╭──────────────────────────────────────────────────────────╮
│ ⬡ filesystem │
│ │
│ Type stdio │
│ Target npx -y @modelcontextprotocol/server-fs /tmp │
│ Enabled yes │
│ Deferred no │
│ │
│ Tools (3) │
│ │
│ read_file [1/3] │
│ Read the complete contents of a file from the disk │
│ │
│ path <string> required │
│ Path to the file to read │
│ ──────────────────────────────────────────────────────── │
│ ... │
╰──────────────────────────────────────────────────────────╯
Flags:
| Flag | Default | Meaning |
|---|---|---|
--timeout | 10s | Connection timeout |
Notes:
mcp show prints the metadata only and skips tool discoverymcp show always connects live to fetch the tool list; use mcp test if you only need a reachability checkpicoclaw mcp testSyntax:
picoclaw mcp test <name>
This performs a direct connection test for one configured entry and prints the number of discovered tools when successful.
It is useful when:
picoclaw mcp editSyntax:
picoclaw mcp edit
This opens the config file in the editor pointed to by $EDITOR.
Use it when you need to configure MCP fields that are not exposed directly by picoclaw mcp add.
If $EDITOR is not set, the command fails with an explicit error.
For common cases:
picoclaw mcp add (include --deferred if you want tools hidden by default).picoclaw mcp show <name>.picoclaw mcp list --status.For advanced cases:
picoclaw mcp add.picoclaw mcp edit to fill in fields that are not exposed as CLI flags.picoclaw mcp show <name> to confirm the final configuration and tool list.