cli2mcp

io.github.RonieNeubauer由 GitHub 账号 RonieNeubauer 发布v0.1.4更新于 Oct 28, 2026

Wrap any CLI as a Model Context Protocol server - schema auto-inferred from --help.

已验证STDIO仅桌面效率与工作流开发者工具

概览

AI 生成的概览

把任意命令行程序包装成一个 MCP 工具,启动时从该命令的 --help 输出自动推断输入 schema。

可以做什么
  • 把 CLI 暴露为可调用工具:用命令名启动 cli2mcp,即注册一个 MCP 工具,其名称、描述和 JSON Schema 来自该命令的 --help。
  • 从帮助文本推断参数类型:标志位映射为布尔、字符串、数字、枚举或数组,位置参数归入 args 列表,保留的 stdin 属性会写入子进程标准输入。
  • 每次调用执行被包装的命令:参数转换为 argv,子进程按超时和工作目录运行,标准输出与标准错误以文本返回。
  • 帮助解析失败时退化为自由形式的 args 列表,并可通过选项设置工具名、描述、超时、工作目录、额外环境变量和标准错误处理方式。
适用场景
适合已经依赖某个命令行工具、希望助手直接调用它而不必编写和维护自定义 MCP 服务器的场景。最适用于只读、结果确定的 CLI,例如搜索、JSON 处理或文档转换。
运行要求
由 MCP 客户端以 stdio 子进程方式在本地启动,需要 Node.js 22 或更高版本。每个被包装的 CLI 必须已安装并在 PATH 中,cli2mcp 不会代为安装。未声明需要账号、API 密钥或环境变量。
安装前请注意
助手可以用自选参数调用被暴露的 CLI,且没有沙箱隔离,提示注入可能让被包装的命令抓取网址或删除文件。只暴露你能接受其影响范围的 CLI,避免 shell 和任何具有 eval 语义的命令,用工作目录选项限制文件系统范围,并谨慎设置额外环境变量以免凭据被传递出去。项目为早期 v0.1 版本,API 可能变化。

安装

在 SourceWeft 中

  1. 打开 控制台中的 cli2mcp,将其添加到工作区。
  2. 为需要使用其工具的对话启用该服务。

Desktop only,通过 STDIO。 STDIO 服务会启动本地进程,因此需要 SourceWeft 桌面宿主。

其他 MCP 客户端

参照 仓库 中的启动说明。

README

cli2mcp

[npm version] [npm downloads] [CI] [node] [license]

Status: v0.1 — early release. Stdio transport only. APIs may change before 1.0.

Expose any command-line binary as a Model Context Protocol tool by parsing its --help output and synthesizing a JSON Schema at startup. One command, no boilerplate.

Works with any MCP-compatible client — Claude Desktop, ChatGPT (via OpenAI Agents SDK), Cursor, Gemini CLI, Cline, Windsurf, Continue, Zed, and anything else that speaks the MCP stdio transport.

sh
npx cli2mcp <command>

[cli2mcp demo]


Why

Writing an MCP server for a CLI you already have is mechanical work: instantiate the SDK, register a tool, hand-write the input schema, marshal arguments, spawn the subprocess, format the output. Roughly 80–150 lines of TypeScript per binary, repeated forever as new tools come out.

cli2mcp does it in one command. The CLI's own --help is the source of truth for the schema — if rg adds a flag tomorrow, the AI sees it tomorrow without code changes.


Install

sh
npm install -g cli2mcp# or invoke without installingnpx cli2mcp <command>

Requires Node.js 22+.


Configure your MCP client

cli2mcp is launched by your client as a stdio subprocess. Add an entry per CLI you want to expose.

Claude Desktop

Config file location:

OSPath
macOS~/Library/Application Support/Claude/claude_desktop_config.json
Windows%APPDATA%\Claude\claude_desktop_config.json
Linux~/.config/Claude/claude_desktop_config.json
json
{  "mcpServers": {    "ripgrep": {      "command": "npx",      "args": ["-y", "cli2mcp", "rg", "--name", "ripgrep"]    },    "jq": {      "command": "npx",      "args": ["-y", "cli2mcp", "jq"]    }  }}

Restart Claude Desktop after editing.

Other clients

ClientConfig fileFormat
ChatGPT (OpenAI Agents SDK)MCPServerStdio parameter — see OpenAI Agents docscommand: "npx", args: ["-y", "cli2mcp", "<cli>"]
Cursor.cursor/mcp.json (project) or ~/.cursor/mcp.json (global)Same mcpServers block as above
ClineVS Code → Cline → MCP Settings → cline_mcp_settings.jsonSame mcpServers block
Windsurf~/.codeium/windsurf/mcp_config.jsonSame mcpServers block
Gemini CLI~/.gemini/settings.jsonSame mcpServers block
Continue~/.continue/config.json → experimental.modelContextProtocolServersSame launcher
Zed~/.config/zed/settings.json → context_serversSame launcher
Any stdio-capable MCP clientper the client's docsSame launcher: npx -y cli2mcp <command>

Refer to each client's documentation for the exact config path on your platform — they evolve and are not guaranteed to match the table above.


Quick wins — copy-paste configs

Drop any of these into your client's mcpServers block (paths shown above per client). Each one wraps a popular CLI as an MCP tool an AI can call directly.

json
{  "mcpServers": {    "ripgrep": {      "command": "npx",      "args": ["-y", "cli2mcp", "rg", "--name", "ripgrep",               "--description", "Recursively search files with regex"]    },    "jq": {      "command": "npx",      "args": ["-y", "cli2mcp", "jq",               "--description", "Query and transform JSON via stdin"]    },    "pandoc": {      "command": "npx",      "args": ["-y", "cli2mcp", "pandoc",               "--description", "Convert documents between markup formats"]    },    "sqlite3": {      "command": "npx",      "args": ["-y", "cli2mcp", "sqlite3",               "--description", "Run SQL against a SQLite database file",               "--cwd", "/path/to/safe/dir"]    },    "yt-dlp": {      "command": "npx",      "args": ["-y", "cli2mcp", "yt-dlp",               "--description", "Download media from URLs",               "--cwd", "/path/to/downloads",               "--timeout", "300000"]    }  }}

Each CLI must already be installed and on PATH. cli2mcp does not install them for you.


How it compares

ApproachLOC per CLINew flag handlingMaintenance
Hand-written MCP server (TypeScript SDK)~80–150manual schema editper-CLI release cycle
OpenAPI → MCP generatorsn/arequires an OpenAPI specdoes not cover arbitrary CLIs
Wrapping bash / sh as a tool~10n/a — gives the AI a shellunsafe, no schema, no sandbox
cli2mcp <command>0automatic at next startnone — re-reads --help

The closest neighbor is FastMCP's from_openapi — it does not cover arbitrary CLI binaries. As of April 2026 there is no other published tool that turns an arbitrary --help output into a typed MCP tool in one command.


Verified targets

These CLIs are covered by the test suite or have been manually exercised end-to-end:

CLIStatusNotes
jq✅ testedhelp-on-stderr correctly captured; stdin piping works
ripgrep (rg)✅ tested90+ flags inferred; args positional handled
curl✅ fixtureshape extraction validated against bundled fixture
node✅ integration testend-to-end MCP handshake + tools/call

Other POSIX-style CLIs (e.g. ffmpeg, yt-dlp, pandoc, sqlite3, imagemagick) are expected to work but are not yet covered by tests. Report bugs in issues.


How --help becomes a JSON Schema

Help fragmentMCP property
--flagboolean
--flag <value> / <file> / <path>string
--flag <n> / <ms> / <size>number
--flag <a|b|c>string enum with choices
Repeatable flagarray<string>
Positional argsargs: array<string>
Reserved input stdinstring piped to subprocess stdin

When parsing fails on an unconventional --help, cli2mcp falls back to a single variadic args positional so the tool is still usable — the model just gets a free-form argument list instead of typed flags.


Options

cli2mcp <command> [options]
  --name <name>         Tool name shown to the AI           (default: <command>)  --description <text>  Tool description shown to the AI    (default: first --help line)  --timeout <ms>        Subprocess timeout per call         (default: 60000)  --cwd <path>          Working directory for subprocess    (default: process.cwd())  --env <KEY=VALUE>     Extra environment variables         (repeatable)  --stderr <mode>       stderr handling:                          include  →  appended to tool output (default)                          drop     →  discarded                          error    →  any stderr → isError: true  -h, --help            Show help

Piping stdin

Reserved input property stdin is piped to the subprocess:

json
{ "args": [".name"], "stdin": "{\"name\": \"cli2mcp\"}" }

How it works

cli2mcp rg   │   ├─ 1. spawn: rg --help          →  capture stdout + stderr   ├─ 2. parse help text           →  CliShape { flags, positionals, description }   ├─ 3. synthesize JSON Schema    →  inputSchema   ├─ 4. register one MCP tool     →  name: "rg", schema: <above>   └─ 5. start stdio MCP server    →  await client connection
On tools/call:   { args, flags, stdin? }  →  argv builder  →  execa(rg, argv, { stdin })                                                           │                                          stdout (+ stderr) → content[text]

Non-zero exit → { isError: true, content: [{ type: "text", text: <stderr> }] } (unless --stderr drop).


Security

cli2mcp lets an AI agent invoke the CLIs you expose, with the arguments the agent chooses. You are responsible for what those CLIs can do on your machine.

Practical guidance:

  • Only expose CLIs whose blast radius you accept. jq, rg, pandoc are mostly safe (read-only, deterministic). curl, ffmpeg --output, sqlite3, rm, kubectl, aws are not.
  • The AI is not sandboxed. A prompt injection attack could cause an exposed curl to fetch evil.example.com, an exposed rm to delete files, etc.
  • Use --cwd to constrain filesystem scope when wrapping CLIs that touch files.
  • Use --env deliberately. Do not pass through credentials the model shouldn't reach.
  • Never expose sh, bash, zsh, python -c, or anything with eval semantics — that bypasses every safeguard cli2mcp provides.

The schema-from-help design reduces the risk of malformed argv but does not eliminate the risk of misuse. Treat each exposed CLI as a delegated capability, not a sandbox.


Troubleshooting

The CLI has no --help flag. cli2mcp will still start with a single args positional. The AI can pass arguments freely; you lose typed flag inference.

The schema came out empty / wrong. Run cli2mcp <command> manually and inspect the tools/list response (use npx @modelcontextprotocol/inspector). The most common cause is non-standard help formatting (no --long-form flags, columns misaligned). Open an issue with the <command> --help output attached.

The subprocess hangs. The default 60s timeout will kill it. Raise via --timeout. If your CLI is interactive (waits for a TTY), cli2mcp cannot help — pipe input via stdin instead.

Flag not being passed. Set --stderr include (the default) and inspect the content[].text. If the flag isn't appearing in argv, the help parser failed to extract it — file an issue.


Contributing

Bug reports and patches welcome. Fixtures for new CLIs (test/fixtures/help/<cli>.txt + a shape test) are the highest-leverage contributions.

sh
pnpm installpnpm test         # vitestpnpm typecheck    # tsc --noEmitpnpm lint         # biome check

Star history

[Star History Chart]

If cli2mcp saved you an afternoon of writing MCP boilerplate, a star helps other people find it.


Author

Built by Ronie Neubauer — Principal Engineer, 22+ years shipping production systems.


License

MIT © 2026 Ronie Neubauer.

来源:README.md,提交 3b705e0

工具

0
SourceWeft 尚未在沙箱中启动过该软件包,因此其工具未知。

版本历史

1
  1. v0.1.4最新Sep 16, 2026

评分

已满足适用检查项的 50%

该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。

  • 近 30 天内可连通25 分

    请保持端点能够响应 MCP 握手;SourceWeft 每 30 天探测一次。

  • 已声明认证方式10 分

    请在注册中心条目中声明凭据请求头,或保持端点能够响应探测,以便判定其认证方式。

  • 已列出工具15 分

    请让服务器在无凭据时响应 tools/list,或发布可在沙箱中无凭据启动的软件包。

  • 描述必需15 分
  • 图标10 分
  • 文档15 分
  • 许可证10 分