Skip to main content
Glama
README.md
# yuque-mcp

语雀 MCP 服务 - 基于语雀 OpenAPI 的 Model Context Protocol 服务,让 AI Agent(如 Qoder、Claude Desktop、Cursor 等)能够安全地访问和操作语雀知识库。

> **本服务是给 AI Agent 使用的 MCP 工具服务**,不是手动运行的程序。安装后,AI Agent 会根据 MCP 配置自动启动本服务,通过 stdin/stdout 与之通信。你不需要手动运行它。

## 工作原理

```
AI Agent (Qoder / Claude Desktop / Cursor ...)
   │
   │  读取 MCP 配置,自动启动: yuque-mcp --permission read
   │  设置环境变量: YUQUE_TOKEN=xxx
   │
   ▼ 通过 stdin/stdout (JSON-RPC) 通信
yuque-mcp 进程
   │
   │  调用语雀 API
   ▼
语雀 API (https://www.yuque.com)
```

## 特性

- 基于语雀 OpenAPI 2.0.1 规范实现
- **三级权限控制**,默认只读,防止 AI 误操作
- 支持 stdio 传输模式,兼容主流 MCP 客户端
- 支持 Docker 部署

## 权限级别

| 级别 | 说明 | 可用操作 | 工具数 |
|------|------|---------|--------|
| `read` (默认) | 只读 | GET 请求 | 14 |
| `write` | 读写 | GET + POST/PUT/PATCH | 22 |
| `admin` | 管理 | 所有操作包括 DELETE | 25 |

## 快速开始

两种方式任选其一,**都只需操作一次**,之后 Agent 每次调用时自动拉起服务,无需手动启动。

### 方式一:本地安装(推荐,简单)

```bash
# 在项目目录下安装
pip install -e .

# 验证安装成功
yuque-mcp --version
```

安装后 `yuque-mcp` 命令注册到 PATH 中,Agent 自动找到并调用。

### 方式二:Docker(适合不想装 Python 的用户)

```bash
# 构建镜像(只需一次,镜像会留在本机)
docker build -t yuque-mcp .
```

构建后镜像 `yuque-mcp:latest` 永久存在本地。只有修改源码才需重新构建。

### 配置 MCP 客户端

在 AI Agent 的 MCP 配置中添加语雀服务,填入你的 Token 和权限级别即可。

> 你不需要手动运行服务,Agent 会根据配置自动启动它。

#### 本地安装方式

所有 MCP 客户端(Claude Desktop、Cursor、Qoder 等)配置相同:

```json
{
  "mcpServers": {
    "yuque": {
      "command": "yuque-mcp",
      "args": ["--permission", "read"],
      "env": {
        "YUQUE_TOKEN": "your_yuque_token_here",
        "YUQUE_BASE_URL": "https://www.yuque.com"
      }
    }
  }
}
```

#### Docker 方式

```json
{
  "mcpServers": {
    "yuque": {
      "command": "docker",
      "args": ["run", "-i", "--rm", "-e", "YUQUE_TOKEN", "-e", "YUQUE_BASE_URL", "yuque-mcp"],
      "env": {
        "YUQUE_TOKEN": "your_yuque_token_here",
        "YUQUE_BASE_URL": "https://www.yuque.com"
      }
    }
  }
}
```

> `-i` 保持 stdin 开放用于 MCP 通信,`--rm` 用完后自动清理容器。读写模式在 args 末尾加 `"--permission", "write"` 即可。

> 如果你的语雀团队使用了私有域名(如 `jojoread.yuque.com`),将 `YUQUE_BASE_URL` 改为对应的地址即可。

## 可用工具

### 只读工具(所有权限级别)

| 工具名 | 说明 |
|--------|------|
| `yuque_hello` | 心跳检测 |
| `yuque_get_user_info` | 获取当前用户详情 |
| `yuque_get_user_groups` | 获取用户团队列表 |
| `yuque_get_user_repos` | 获取用户知识库列表 |
| `yuque_get_group_repos` | 获取团队知识库列表 |
| `yuque_get_repo` | 获取知识库详情 |
| `yuque_get_docs` | 获取文档列表 |
| `yuque_get_doc` | 获取文档详情 |
| `yuque_get_doc_by_book_id` | 通过知识库 ID 获取文档 |
| `yuque_get_toc` | 获取知识库目录 |
| `yuque_get_toc_by_book_id` | 通过知识库 ID 获取目录 |
| `yuque_get_doc_versions` | 获取文档历史版本列表 |
| `yuque_get_doc_version` | 获取文档历史版本详情 |
| `yuque_search` | 通用搜索 |

### 写入工具(write/admin 权限)

| 工具名 | 说明 |
|--------|------|
| `yuque_create_repo` | 创建知识库 |
| `yuque_update_repo` | 更新知识库 |
| `yuque_create_doc` | 创建文档 |
| `yuque_update_doc` | 更新文档 |
| `yuque_create_doc_by_book_id` | 通过知识库 ID 创建文档 |
| `yuque_update_doc_by_book_id` | 通过知识库 ID 更新文档 |
| `yuque_update_toc` | 更新知识库目录 |
| `yuque_update_toc_by_book_id` | 通过知识库 ID 更新目录 |

### 删除工具(仅 admin 权限)

| 工具名 | 说明 |
|--------|------|
| `yuque_delete_repo` | 删除知识库 |
| `yuque_delete_doc` | 删除文档 |
| `yuque_delete_doc_by_book_id` | 通过知识库 ID 删除文档 |

## 环境变量

在 MCP 客户端配置的 `env` 字段中设置:

| 变量名 | 必需 | 默认值 | 说明 |
|--------|------|--------|------|
| `YUQUE_TOKEN` | 是 | - | 语雀 API Token |
| `YUQUE_PERMISSION_LEVEL` | 否 | `read` | 权限级别(read/write/admin) |
| `YUQUE_BASE_URL` | 否 | `https://www.yuque.com` | 语雀 API 地址,私有域名时需修改 |
| `YUQUE_MCP_DEBUG` | 否 | - | 设为 `1` 开启 DEBUG 日志 |

## 获取语雀 Token

1. 登录 [语雀](https://www.yuque.com)
2. 进入 **个人设置** → **Token**
3. 创建一个新的 Token

## 调试

服务运行时日志输出到 stderr(MCP 协议使用 stdout),包含配置加载、API 请求/响应等信息。

### 开启 DEBUG 日志

在 MCP 客户端配置中添加 `YUQUE_MCP_DEBUG` 环境变量:

```json
{
  "mcpServers": {
    "yuque": {
      "command": "yuque-mcp",
      "args": ["--permission", "read"],
      "env": {
        "YUQUE_TOKEN": "your_yuque_token_here",
        "YUQUE_BASE_URL": "https://www.yuque.com",
        "YUQUE_MCP_DEBUG": "1"
      }
    }
  }
}
```

### 日志示例

```
2026-06-10 15:28:33 [INFO] yuque_mcp: 配置初始化: base_url=https://www.yuque.com, token=qTGP3rqp..., permission=read, kwargs=[]
2026-06-10 15:28:33 [INFO] yuque_mcp: 创建 HTTP 客户端: base_url=https://www.yuque.com, token=qTGP3rqp...
2026-06-10 15:28:33 [INFO] yuque_mcp: API 请求: GET /api/v2/hello
2026-06-10 15:28:33 [INFO] yuque_mcp: API 响应: GET /api/v2/hello -> 200
```

### 常见问题

**401 Unauthorized**

如果日志显示 `Token: (空)`,说明 `YUQUE_TOKEN` 环境变量未正确传入:
- 确认 Token 写在 MCP 客户端配置的 `env` 字段中
- 确认环境变量名是 `YUQUE_TOKEN`(不是 `YUQUE_YUQUE_TOKEN`)
- 重启 MCP 客户端使配置生效

**私有域名访问**

如果你的语雀使用私有域名(如 `xxx.yuque.com`),需要设置 `YUQUE_BASE_URL`:
```json
"YUQUE_BASE_URL": "https://xxx.yuque.com"
```

## 开发

```bash
# 安装开发依赖
pip install -e ".[dev]"

# 代码检查
ruff check src/

# 格式化
ruff format src/
```

## License

Apache-2.0

TDQS

B3.4/5.0

Scored across 14 tools

Disambiguation4/5

Most tools have distinct purposes, but there is some redundancy between `yuque_get_doc` and `yuque_get_doc_by_book_id` (and similarly for TOC). However, the descriptions clearly differentiate them by the way the book is specified.

Naming Consistency5/5

All tools follow a consistent `yuque_<verb>_<noun>` pattern, with variants like `_by_book_id` for clarity. No mixing of styles or inconsistent verbs.

Tool Count5/5

14 tools cover the main read operations for a knowledge base platform: document retrieval, version history, repositories, TOC, user info, groups, search, and heartbeat. The scope is well-balanced.

Completeness2/5

All tools are read-only; there are no create, update, or delete operations. For a comprehensive Yuque interaction, this is a major gap. The server appears to intentionally limit to read, but it lacks essential write capabilities.

Maintenance

ActivityInactive
ResponsivenessNo issues