cs-mcp

mcp
Security Audit
Warn
Health Pass
  • License — License: MIT
  • Description — Repository has a description
  • Active repo — Last push 0 days ago
  • Community trust — 19 GitHub stars
Code Warn
  • process.env — Environment variable access in scripts/prepublish-gate.mjs
  • network request — Outbound network request in scripts/prepublish-gate.mjs
  • process.env — Environment variable access in scripts/readme-gate.mjs
  • process.env — Environment variable access in src/cli.ts
  • process.env — Environment variable access in src/env.ts
  • process.env — Environment variable access in src/groups/browser.ts
Permissions Pass
  • Permissions — No dangerous permissions requested

No AI report is available for this listing yet.

SUMMARY

CS system (CortexOS) MCP — one agent service that strings a personal open-source toolchain together: image generation, local vision, contrast gating, Markdown typesetting. Capability groups: a group's tools appear only when its CLI is installed.

README.md

🧭 cs-mcp

CS 系统(CortexOS)的 MCP —— 一条命令,把个人工具链接进任意 AI Agent。
把各开源项目的 CLI 能力串成一张网:出图 / 看图 / 对比度门禁 / Markdown 排版……
按「能力分组」组织,装了哪个 CLI 就自动长出哪组工具,没装的不会白占你的上下文。

npm downloads tools deps MIT stdio

English · 更新日志


⚠️ 别和 cs mcp serve 搞混

系统里有两个都叫「cs 的 MCP」的东西。它们互补,不重合 —— 接错的那个会得到一堆你不需要的工具:

cs mcp serve(CortexOS 内置) 本仓 cs-mcp
形态 Go,cs 的一个子命令 TypeScript,独立 npm 包
server 名 cortexos cs
管什么 系统上下文:规则 / 技能 / 知识搜索 / CLI 台账 / Agent 上下文 工具链串联:各开源项目的 CLI 能力
真源 cli-registry.json + docs/rules + skills 各项目自己的 CLI
数量 11 个只读发现工具 43 个工具,6 个能力分组

一句话分界:想知道「cs 系统里有什么规矩、有什么技能」用 cs mcp serve;
想「出一张图、把 Markdown 排成 PDF、开个真浏览器」用 cs-mcp。

顺带一句:Agent 侧其实不需要 MCP。 能跑 Bash 的 Agent 直接调 cs CLI 就够,
而且那是主干道(MCP 的通路管不到远端机器)。MCP 的价值只在跑不了 Bash 的客户端上。
见 cs rule 里 cmd/mcp.go 的定位说明。

🎯 为什么用它,而不是别的

需求 逐个手搓命令 每个工具各接一遍 SDK cs-mcp
一个 Agent 里同时用出图 / 看图 / 门禁 / 排版 ❌ 四套用法 ❌ 接四遍协议 ✅ 一个 server 全给
换 Agent 就失效 ❌ 命令绑定 ⚠️ 各家 SDK 不同 ✅ 换谁都认 MCP
没装的工具白占上下文 — ❌ 全量注册 ✅ 探测式:装了才注册
大图 / 长文进上下文 ❌ 手动处理 ❌ 自己写 base64 ✅ 一律走绝对路径
加新能力 各自记命令 ❌ 得改 MCP 代码 ✅ 升级 CLI 就生效(MCP 只做串联)

分层是硬的:能力在 CLI 里,MCP 只做串联。 这个仓自己零实现 —— 每个工具都是对某个项目
CLI 的一次薄封装。所以 CLI 一升级,MCP 这边立刻就有新能力;MCP 不重写任何逻辑,也就不存在
「两边行为不一致」。

传输方式 stdio。文件以绝对路径传入,处理结果写回磁盘并返回路径 —— 不走 base64。

🧩 能力分组(这张就是版图)

分组 层次 开源项目 工具 干什么 前置
museav 云能力 museav-cli 17 出图 / 出视频、本地后期(抠图·超分·去水印·压缩)、模板与技能清单、素材上传、图生模板、SCULPT 反推、小红书 SkillHub 发布 museav-cli ≥ 3.9.0
vlm 本地 mlx-vlm-kit 4 本地离线看图:描述、任意提问、封面质检、反推出图 prompt vlm(Apple Silicon)
contrast 本地 contrast-guard 3 对比度门禁:静态查色值达不达标、渲染后量实际字号灰阶、存基线与基线对比 contrast-guard
facet 本地 @webkubor/facet 2 Markdown 排版成 PDF / 长图 / 讲稿页(自带多套模板) facet
reel 本地 @kubor/reel-kit 3 素材 + 逐句文案 → 竖版成片(模板 / 转场 / 配乐 / 可选配音) reel + ffmpeg
browser 本地 lite-browser 13 真实 Chrome:打开/快照/点击/输入/截图/执行 JS + 人类交接协议 + 多 agent 会话隔离 lite-browser
— 自带 本 MCP 1 groups_list:列出全部分组、各自装什么、为什么没启用 无

六组里只有 museav 是在线服务:要登录、要网络、有余额配额、会花钱;其余五组是离线确定性计算。
这个差别在工具面上直接可读 —— 云能力那 17 个统一带 museav_ 前缀。owner 的口径就一句:
cs 是核心,museav 是云能力。

默认策略是探测式:某个分组的 CLI 在 PATH 上,它的工具才会注册。理由是工具 schema
会随每一次模型请求发出去 —— 聚合 MCP 越串越多,不该让用户为「他机器上根本没装的工具」
付 token。没启用的分组不会消失:groups_list 始终可用,它会告诉你这个 MCP 还能干什么、
该装什么。

想强开或裁剪,用环境变量 CS_MCP_GROUPS:

CS_MCP_GROUPS=all              # 全开(缺 CLI 的分组也注册,调用时才报装什么)
CS_MCP_GROUPS=facet,contrast   # 只开这几个
CS_MCP_GROUPS=-museav          # 默认集里去掉这几个

3.0.0 之前的旧名 MUSEAV_MCP_GROUPS 仍兼容(新名优先,同时设置且不同时以新名为准并在
stderr 提示)。之所以必须留旧名:变量被忽略不会报错 —— 它会静默回落成探测式,
原来写 all 的人那些强开的分组会悄悄消失,连告警都没有。

⚡ 30 秒上手

⚠️ 3.0.0 尚未发到 npm(cs-mcp 这个名字 2025-04-25 被撤过、museav-mcp 2026-10-05 被撤过,
两个都还是空位)。发布前请用下面的「从源码起」那一种;npx -y cs-mcp 要等 3.0.0 真发出去才成立。

npm i -g museav-cli                    # 想要哪组能力,就装哪个 CLI(这一行是出图那组)

发布之后(一行接入,任何支持 MCP 的客户端都认):

claude mcp add cs -- npx -y cs-mcp

现在就能用(从本地 clone 起):

git clone https://github.com/webkubor/cs-mcp && cd cs-mcp
pnpm install && pnpm build
claude mcp add cs -- node "$PWD/dist/index.js"

然后在 Agent 里说「用 museav 出一张图」,或者先问一句「这个 MCP 有哪些能力分组」。

工具(43 个)

museav 组 —— MUSE AV 出图中台(17)

工具 干什么 是否需要登录
museav_gen_background 出背景图 / 一般出图 / 出视频(走中台) ✅ 需要
museav_remove_bg 抠图去背景(BiRefNet / ISNet / U2Net),输出带 alpha 的 PNG 免登录,本地跑
museav_upscale_image 超分放大(Real-ESRGAN + Vulkan GPU),默认 4x 免登录,本地跑
museav_remove_watermark 去水印(LaMa 修复),自动定位,可传手工掩码 免登录,本地跑
museav_compress_image 压缩(sharp),可指定最长边 / 质量 / 格式 免登录,本地跑
museav_list_templates 查可用图片 / 文字模板(挑 template 用,别硬编码) ✅ 需要
museav_list_skills 查可用技能(挑 skill slug 用,别硬编码) ✅ 需要
museav_list_video_templates 查可用视频模板(与 museav_list_templates 平级,配合 museav_gen_background 的 video=true + template) ✅ 需要
museav_list_models 查可用模型;video=true 查视频档次(可直接喂 museav_gen_background 的 model) ✅ 需要
museav_balance 查上游余额 ✅ 需要
museav_list_jobs 查自己的出图工作流(结果 URL、失败原因) ✅ 需要
museav_upload_asset 上传素材拿公网直链(垫图要 URL 时用) ✅ 需要
museav_image_to_template 图生模板:读图 + 文字层逆向 + 变量化 ✅ 需要
museav_reverse 读图反推 SCULPT prompt(中台 API)。与 vlm_reverse_prompt 互补:图像识别默认优先本地 vlm_*,要走 SCULPT 格式再调这个 ✅ 需要
museav_skillhub_tags 查小红书 SkillHub 内容标签(发布必带,别硬编码) ✅ 需要
museav_skillhub_whoami 查 SkillHub 登录态(脱敏) ✅ 需要
museav_skillhub_publish 把本地 Agent Skill 发到小红书 SkillHub。默认 dry-run,submit=true 才真提交 ✅ 需要

本地后期那四个不联网、不消耗中台额度。

vlm 组 —— 本地看图理解(4)

工具 干什么
vlm_describe 描述图片主体与色调
vlm_ask 对图片任意提问
vlm_cover_check 音乐封面语义质检(batch=true 递归目录)
vlm_reverse_prompt 反推出图 prompt,喂回 museav_gen_background

四个都免登录、零成本、不联网(本地 Qwen3-VL);需要 Apple Silicon。

contrast 组 —— 对比度门禁(3)

工具 干什么
contrast_check 静态查色值达不达标(读项目的 contrast.config.*),dir 指定项目目录
contrast_init 在项目里生成一份配置模板(第一次用要先跑这个)
contrast_measure 渲染后量实际字号 / 灰阶 / 动效,可存基线与基线对比(需要浏览器)

check 查「对不对」,measure 查「多少」——丑的每一处单看往往都『对』,所以两个都要跑。
不达标时工具会照常把完整报告交回来(CLI 用退出码当判据,不是调用失败)。

facet 组 —— Markdown 排版成成品(2)

工具 干什么
facet_templates 列可用排版模板名(facet_build 的 template 从这里取)
facet_build 把 Markdown 排成 PDF / 长图 / 讲稿页

reel 组 —— 竖版短视频合成(3)

工具 干什么
reel_templates 列可用版式模板名(reel_make 的 template 从这里取)
reel_bgm 列配乐库:别名、时长、风格、授权
reel_make 素材图 + 逐句文案 → mp4(模板 / 转场 / 配乐 / 标题 / 可选配音)

素材与文案按顺序一一对应,数量不等时取较少的一方并明确报出来,不会静默丢弃。
不给 voice 时镜头时长由 perShot 决定(不需要任何模型);给了才走本地 Qwen3-TTS。
硬依赖系统里的 ffmpeg(不在 npm 包里)。

museav 出的是原料(图、无声片),reel 出的是能发的成品 —— 这两段是一条业务线的前后半截。

browser 组 —— 浏览器操控(13)

工具 干什么
browser_open / browser_close 打开网页建立会话 / 用完关闭(reuse=true 免扫码复用已确认的登录态)
browser_snapshot 提取可交互元素并编号(@1、@2…)—— click / type 传编号比 CSS 选择器稳
browser_click / browser_type / browser_press / browser_scroll 点击 / 输入 / 按键 / 滚动
browser_screenshot 截图当前视口,返回路径
browser_eval 在页面里执行 JS —— 读正文/结构化数据只能靠它(snapshot 只给可交互元素)
browser_status 唯一状态真源:相位、在等谁、下一步做什么
browser_await_human / browser_resume 人类交接协议:阻塞等人登录 → 人完成后恢复
browser_sessions 列出所有 agent 的会话(排查「浏览器被谁占着」)

人类交接协议是这个组的核心价值:撞到登录墙不是死路,而是一条有契约的路径 ——
status 看它在等什么 → await_human 阻塞等人(退出码 3/4 是状态不是故障,
工具会原样把「需要人类介入 / 等待超时」交回来)→ resume 继续。

身份隔离:lite-browser 的会话按 agent 隔离,而默认身份是 default。本 MCP 每次都
显式传自己的身份(默认 mcp,可用 CS_MCP_BROWSER_AGENT 改;旧名 MUSEAV_MCP_BROWSER_AGENT
仍兼容),不会跟别的 agent
抢会话
——这是实测踩出来的(第一次没传,直接开在别人正在用的 default 会话上)。

刻意不暴露(是判断,不是遗漏):exec -- <命令>(把输入变成任意 shell 命令)、
cdp(裸协议通道)、cookie export / cookie pull-system(导出/解密 Cookie = 直接交出凭据,
与 kyvault 不进公开 MCP 同一条理由)。

发 Skill 之前必读

museav_skillhub_publish 默认只预演(本地打包校验,不上传不提交),把待提交内容返回给你核对。
只有用户明确说「提交 / 确认 / submit」才带 submit=true —— 提交不可逆,Skill ID 是
平台主键、跨版本不可改名。

真提交前会先查登录态。未登录时 MCP 不会挂在那儿等你:二维码要等进程结束才能
返回给用户,硬等就是死锁,所以会直接报错,让你引导用户去终端跑一次
museav skillhub login 扫码。

CLI 自带平台资产护栏:Skill 正文里抄了 MUSE AV 平台公共模板的提示词会被拒绝发布,
只引用模板 slug(museav gen --template xxx)则放行——搬运是重新分发资产,引用是正常集成。
被拒时按提示把正文换成调用方式。

两个「先查再调」

museav_gen_background 的 template / skill 是必填二选一,但 id 和 slug 只能从中台实时拉:
先用 museav_list_templates / museav_list_skills 查真实清单,再传进去。凭印象编一个,中台只会报
「模板不存在」,Agent 分不清是自己拼错了还是真没有。

模板自带哪些占位符看清单里「字段:」那一列,取值用 museav_gen_background 的 fields 传
(JSON 对象字符串)。

facet_build 的 template 同理 —— 先用 facet_templates 拿清单。

前置条件

npm i -g museav-cli        # museav 组:出图 / 后期 / 素材 / SkillHub(需要 >= 3.9.0)
pipx install git+https://github.com/webkubor/mlx-vlm-kit.git   # vlm 组
npm i -g contrast-guard    # contrast 组
npm i -g @webkubor/facet   # facet 组
npm i -g @kubor/reel-kit   # reel 组(另外要 brew install ffmpeg)
curl -fsSL https://raw.githubusercontent.com/webkubor/lite-browser/main/install.sh | bash   # browser 组

装哪几个由你决定 —— 没装的组就是不会注册,不会报错。

museav_gen_background 还需要中台 apiKey(按 museav-cli 的说明配置)。
本地工具首次运行会下载对应模型(抠图 ~214MB、超分 ~65MB、去水印 ~200MB、
vlm 的 Qwen3-VL-4B 约 2.9GB)。

可执行文件不在全局 PATH 时,用环境变量指定绝对路径:
MUSEAV_BIN、MLX_VLM_BIN、CONTRAST_GUARD_BIN、FACET_BIN。

接到 Agent 上

Claude Code 一行(发布后):

claude mcp add cs -- npx -y cs-mcp

DSH 在 profile 的 cordis.patch.yml 里加一行:

- id: mcp-cs
  name: '@deepseek-ai/dsh-mcp-client'
  config:
    serverName: cs
    transport: stdio
    command: npx
    args: ['-y', 'cs-mcp']

serverName 决定客户端里的工具命名空间:cs 让工具叫 mcp__cs__museav_gen_background。
3.0.0 之前是 museav,于是加了 museav_ 前缀后会变成 mcp__museav__museav_gen_background
这种双重前缀 —— 所以这次一并改成了 cs。
DSH 与 WorkBuddy 是 GUI 工具、不是 Agent(见 cs rule agent_governance 的 gui-not-agent 红线),
这份配置是修工具本身,不是给它派活。

或手写配置(任意支持 MCP 的客户端):

{
  "mcpServers": {
    "cs": {
      "command": "npx",
      "args": ["-y", "cs-mcp"]
    }
  }
}

想让某个没装 CLI 的分组也出现在工具列表里(调用时才报装什么),加上 env:

{
  "mcpServers": {
    "cs": {
      "command": "npx",
      "args": ["-y", "cs-mcp"],
      "env": { "CS_MCP_GROUPS": "all" }
    }
  }
}

本地开发(改这个仓库时)

pnpm install && pnpm build     # 产物在 dist/,package.json 的 bin 指向它

配置里把 command 换成 node、args 指向 /绝对路径/cs-mcp/dist/index.js 即可
(3.0.0 发布前这是唯一可用的接法,见「30 秒上手」)。

还没进来的项目(以及为什么)

这张版图是逐步长出来的,不是一次列全。没进来分三种情况,都不是「忘了」:

项目 为什么还没进
scorecard 仓库里有 CLI,但 npm 上的 scorecard 被一个无关的旧包占着(tarball 里只有一个 index.js)。npm i -g scorecard 装不到它 —— 得先改名或加 scope 发布
kyvault 密钥库,get 会打印明文。这类能力不进公开 MCP,是红线
voxflow 工具面很清晰,但环境门槛高(本地 TTS 模型约 2.9GB),适合单独一组慢慢加
trend-radar / path-guard / tombstone-reaper 能力好,但没有可安装的 CLI:前两个仓库还没开源 / 没发布,最后一个只有仓内脚本
im-notify-kit / ai-sse-kit / talk-skills 等 纯库或纯提示词,没有命令行工具面 —— 要进得先给它们写一个 CLI

想加一组? 三步:给那个项目确认 CLI 能装、在 src/clis.ts 加一份 CliSpec、
在 src/groups/ 加一个分组文件并挂到 src/registry.ts 的 GROUPS。
MCP 侧不写任何业务逻辑。

验证

node test-mcp.mjs      # 起 server 跑 initialize + tools/list
                       # 断言:43 个工具;每个名字以所属分组 id 开头;旧变量名仍生效

CS_MCP_GROUPS=all 是测试用的启动方式 —— CI 机器上什么 CLI 都没装,
走默认的探测策略会一组都不启用,那就测不到工具集本身了。旧名 MUSEAV_MCP_GROUPS
会被再起一次 server 验证,确认与新名等价(改名的静默降级只在这条路上暴露)。

说明

museav_gen_background 的 prompt / skill / template 三者必须且只能提供一个:prompt 是直接给提示词,skill 和 template 是让中台在服务端展开提示词(配合 input 传一句业务描述)。

四个本地后期工具的 out 已存在时,CLI 会拒绝覆盖 —— 这是防手滑的语义,MCP 保留它:
要覆盖就显式传 overwrite: true,否则报错原文会回到 Agent 手里。

museav_list_templates / museav_list_skills 取的是 CLI 的人类可读表格(stderr),因为 stdout 只有裸 id;
museav_list_jobs 取 stdout 的完整 JSON(含 cdn_url / status / error)。清单超过 8000 字会截断,
并附一句「输出已截断」——不附的话 Agent 会把截断处当成清单结尾。

本地工具的超时上限是 10 分钟 —— 超分和 LaMa 修复在大图上确实会慢。

License

MIT

Reviews (0)

No results found