feishu-cli-mcp
by axunrun
README.md
# feishu-cli-mcp
把官方 `lark-cli` 暴露成 MCP 服务,让 Agent 通过清晰的上下文协议使用飞书/ Lark CLI 的完整能力。
## 设计
本项目不重写飞书 API,也不手工封装 200+ CLI 命令。MCP 只做一层受控代理:
- `lark_cli_run`:执行任意 `lark-cli` 参数数组,覆盖 CLI 全部能力。
- `lark_cli_schema`:查询 API 方法参数、响应、身份和 scopes。
- `lark_cli_help`:查询服务或命令帮助,发现快捷命令。
- `lark_cli_auth_status`:检查登录、scope 和身份状态。
Agent 上下文通过 MCP Resources / Prompts 暴露:
- `lark://agent-guide`:Agent 使用规则。
- `lark://command-model`:快捷命令、API 命令、Raw API 的选择顺序。
- `lark://skills`:官方 CLI 覆盖的业务域。
- `lark://security`:写操作、scope、Docker 和 HTTP 安全规则。
- `lark://schema/{method}`:动态读取某个 API 方法 schema。
- `lark_plan_command`:让 Agent 先规划命令。
- `lark_safe_write`:让 Agent 走 schema、dry-run、用户确认流程。
## Agent 协议
Agent 必须按这个顺序使用:
1. 读 `lark://agent-guide` 和 `lark://command-model`。
2. 优先查 `lark_cli_help`,选择 `+shortcut`。
3. 快捷命令不够时,用 `lark_cli_schema` 查 API 命令。
4. API 命令不够时,才用 `lark_cli_run` 调 raw `api METHOD /open-apis/...`。
5. 读操作用 `intent=read`。
6. 写操作用 `intent=write`,先 help/schema,能 dry-run 就先 dry-run。
7. `intent=write` 或 `intent=auth_config` 必须传 `confirm=true`,否则服务拒绝执行。
8. 机器读取优先加 `--format json`。
示例:
```json
{
"tool": "lark_cli_run",
"arguments": {
"args": ["calendar", "+agenda", "--format", "json"],
"intent": "read"
}
}
```
写操作示例:
```json
{
"tool": "lark_cli_run",
"arguments": {
"args": ["im", "+messages-send", "--chat-id", "oc_xxx", "--text", "hello", "--dry-run"],
"intent": "write",
"confirm": true
}
}
```
## 本地运行
```bash
npm install
npm run build
node dist/index.js --transport stdio
```
HTTP:
```bash
copy .env.example .env
npm run build
node dist/index.js --transport http
```
MCP URL:
```text
http://127.0.0.1:3333/mcp
```
如果设置了 `MCP_HTTP_TOKEN`,客户端需要传:
```http
Authorization: Bearer <token>
```
## Docker / Unraid
```bash
cp .env.example .env
docker compose up -d --build
```
Unraid 模板关键配置:
- Repository/Image: `feishu-cli-mcp:latest` 或你的 GitHub 镜像地址
- WebUI / MCP URL: `http://<unraid-ip>:3333/mcp`
- Port: `3333:3333`
- Volume: `/mnt/user/appdata/feishu-cli-mcp/lark-cli:/data/lark-cli`
- Env:
- `MCP_TRANSPORT=http`
- `MCP_HOST=0.0.0.0`
- `MCP_PORT=3333`
- `MCP_HTTP_TOKEN=<强随机 token>`
- `LARK_CLI_HOME=/data/lark-cli`
持久化点是 `/data/lark-cli`。这里保存 CLI 配置和授权状态。
## 初始化飞书授权
容器启动后,通过 MCP 执行:
```json
{
"tool": "lark_cli_run",
"arguments": {
"args": ["config", "init", "--new"],
"intent": "auth_config",
"confirm": true
}
}
```
然后登录:
```json
{
"tool": "lark_cli_run",
"arguments": {
"args": ["auth", "login", "--recommend", "--no-wait"],
"intent": "auth_config",
"confirm": true
}
}
```
把 CLI 输出里的授权 URL 发给用户完成浏览器授权。
## 验证
```bash
npm run check
docker compose up -d --build
curl http://127.0.0.1:3333/healthz
```
TDQS
A4.4/5.0
Scored across 4 tools
Disambiguation5/5
Each tool has a clearly distinct purpose: running CLI commands, inspecting schemas, reading help, and checking auth status. No overlap or ambiguity between them.
Naming Consistency5/5
All tools follow the consistent pattern 'lark_cli_' followed by a descriptive action (run, schema, help, auth_status). Perfectly uniform naming convention.
Tool Count5/5
Four tools is well-scoped for a CLI wrapper server, providing essential operations without unnecessary bloat. Each tool earns its place.
Completeness4/5
The surface covers running, schema lookup, help, and auth status, which are the core needs for interacting with lark-cli. A minor gap is lack of explicit logout or config tools, but these are workable via lark_cli_run with appropriate arguments.
Maintenance
ActivityInactive
ResponsivenessNo issues