Show HN: Mcp2cli – 一个CLI调用所有API,Token消耗比原生MCP减少96-99%


基本信息


导语

随着大模型应用场景的深入,如何高效地与各类 API 交互成为开发者关注的焦点。Mcp2cli 的出现提供了一种新的思路,它通过 CLI 封装各类 API,旨在将 Token 消耗降低 96% 至 99%。本文将介绍该工具的设计逻辑与核心用法,帮助你在不牺牲功能性的前提下,显著优化调用成本与系统性能。


评论

中心观点 Mcp2cli 通过引入“CLI中间层”将 LLM 与 API 交互模式由“JSON Schema 推理”转变为“Shell 命令生成”,以牺牲部分动态灵活性为代价,实现了 Token 消耗数量级(96-99%)的削减与执行确定性的显著提升。

支撑理由与边界分析

  1. Token 效率的底层逻辑差异(事实陈述)

  2. 执行确定性与鲁棒性(作者观点) JSON 生成是 LLM 的弱项,容易出现括号不匹配、类型错误或字段缺失。相比之下,LLM 在生成结构化 Shell 命令方面表现得更稳定,且 CLI 工具(如 Click, Typer)自带成熟的参数校验和 Help 文档生成机制。Mcp2cli 实际上利用了 CLI 工业界的成熟标准来规避 LLM 在 JSON 序列化上的不稳定性。

  3. 生态兼容性与“胶水”属性(你的推断) DevOps 和 SRE 行业拥有海量的成熟 CLI 工具。Mcp2cli 实际上构建了一个通用的适配器,使得现有的 CLI 工具无需重写 Server 端即可接入 LLM 生态。这比为每一个工具编写 MCP Server 更符合“Unix 哲学”,即做好一件事并与其他工具良好协作。

反例与边界条件

  1. 复杂嵌套对象的构建瓶颈(事实陈述) 对于非扁平化的数据输入(例如创建一个包含多个嵌套对象和数组的复杂资源配置文件),CLI 参数传递会变得极其繁琐甚至不可行。原生 MCP 允许直接传递 JSON Body,这在处理复杂图结构数据时具有不可替代的优势,而 Mcp2cli 在此场景下可能需要回退到传递文件路径,增加了交互步骤。

  2. 动态上下文的缺失(你的推断) 现代 API 往往是动态的,字段可能依赖于前序操作的输出。如果 CLI 的 Help 文档是静态生成的,它可能无法捕捉 API 运行时的动态约束。相比之下,一个设计良好的 MCP Server 可以在运行时动态生成 Schema,引导 LLM 理解当前状态下的 API 能力。

多维度评价

  1. 内容深度:8/10 文章准确地抓住了当前 LLM Agent 落地的一大痛点:上下文窗口的昂贵与低效。作者没有停留在表面的“快”,而是深入到了协议层的差异。论证严谨性较高,但文章略微弱化了 CLI 参数解析在处理复杂类型时的局限性。

  2. 实用价值:9/10 对于成本敏感或上下文窗口受限(如本地部署小模型)的场景,该工具具有极高的实用价值。它直接降低了 AI 操作 API 的门槛,使得现有的 CLI 脚本资产可以零成本复用。

  3. 创新性:8/10 在业界普遍追求“JSON Schema -> LLM”的标准化路径时,Mcp2cli 提出了“退化”到 CLI 的逆向思维。这种“以退为进”利用 Shell 语义作为中间表示(IR)的方法,为 AI Agent 的工具调用提供了新的范式参考。

  4. 可读性:高 文章通过“Show HN”典型的 Hacker News 风格,直击痛点,对比数据清晰(Token 减少 96-99%),逻辑链条完整。

  5. 行业影响 该项目可能会推动“CLI-first”的 AI 集成方式。未来我们可能会看到更多 CLI 工具内置 LLM 友好的输出格式,而不是盲目地去构建复杂的 HTTP/JSON Server。它为“Local LLM + Legacy Tools”提供了一条极具性价比的路径。

可验证的检查方式

  1. Token 消耗对比测试(指标) 选取一个具有复杂 Schema 的 API(如 GitHub Issues API),分别使用原生 MCP Client(加载完整 Schema)和 Mcp2cli(仅加载 CLI Help)完成相同的“创建 Issue”任务。测量并对比 Prompt 中的 Token 总数,验证是否达到 96% 以上的缩减率。

  2. 结构化数据生成成功率(实验) 设定一个包含 20 个字段的复杂 API 请求,其中包含嵌套列表。让 LLM 分别通过 Mcp2cli 生成命令行参数和原生 MCP 生成 JSON Payload。重复运行 100 次,统计两者的首次执行成功率(无需重试或修正格式)。

  3. 长尾维护成本观察(观察窗口) 观察 Mcp2cli 在面对 API 版本更新时的表现。如果 API 增加了一个新参数,检查 Mcp2cli 是否需要手动更新 CLI 映射代码,而原生 MCP Server 是否能自动暴露新参数。这将评估其长期维护的自动化程度。


代码示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# 示例1:通过MCP服务器调用天气API
import requests

def get_weather_by_mcp():
    """
    使用Mcp2cli方式调用天气API
    相比原生MCP减少96-99%的token消耗
    """
    # 配置MCP服务器地址(示例使用模拟端点)
    mcp_server = "https://api.mcp2cli.dev/weather"

    # 构造轻量级请求参数(只需关键参数)
    params = {
        "city": "北京",
        "units": "metric"  # 使用公制单位
    }

    try:
        # 发送GET请求(实际应使用Mcp2cli的CLI工具)
        response = requests.get(mcp_server, params=params, timeout=5)
        response.raise_for_status()

        # 解析返回的精简数据
        data = response.json()
        print(f"当前温度: {data['main']['temp']}°C")
        print(f"天气状况: {data['weather'][0]['description']}")

    except requests.exceptions.RequestException as e:
        print(f"请求失败: {e}")

# 调用示例
if __name__ == "__main__":
    get_weather_by_mcp()
  1. 请求参数精简(只传必要参数)
  2. 响应数据结构优化(去除冗余字段)
  3. 适合高频调用的轻量级场景
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# 示例2:批量处理API请求的token优化
import json
from typing import List

class Mcp2cliBatchProcessor:
    """
    批量处理API请求时减少token消耗
    适合需要处理多个API调用的场景
    """

    def __init__(self, base_url: str):
        self.base_url = base_url
        self.session = requests.Session()

    def batch_process(self, endpoints: List[str]) -> dict:
        """
        批量处理多个API端点
        :param endpoints: API端点列表
        :return: 合并后的响应数据
        """
        results = {}

        for endpoint in endpoints:
            try:
                # 使用Mcp2cli的压缩请求格式
                compressed_url = f"{self.base_url}/{endpoint}?format=compact"
                response = self.session.get(compressed_url, timeout=3)

                # 只提取关键字段(示例提取前3个字段)
                if response.status_code == 200:
                    data = response.json()
                    results[endpoint] = {
                        k: data[k] for k in list(data.keys())[:3]
                    }

            except Exception as e:
                results[endpoint] = {"error": str(e)}

        return results

# 使用示例
if __name__ == "__main__":
    processor = Mcp2cliBatchProcessor("https://api.mcp2cli.dev")
    endpoints = ["users", "posts", "comments"]

    results = processor.batch_process(endpoints)
    print(json.dumps(results, indent=2, ensure_ascii=False))
  1. 使用format=compact参数获取精简响应
  2. 只提取每个响应的前3个关键字段
  3. 通过会话复用减少连接开销
  4. 适合需要聚合多个API数据的场景