本文描述 yuque-mcp 当前使用的技术栈和工程工具链。项目本质是一个 Node.js CLI package,同时也是一个 MCP server。
- Runtime: Node.js
>=18.0.0。 - Language: TypeScript,
strict模式,编译目标为ES2022。 - Module system: ESM(
package.json中type: "module")。 - Package entry:
dist/cli.js,命令名为yuque-mcp。
@modelcontextprotocol/sdk: MCP SDK,用来创建 server、注册tools/list和tools/callhandler,并提供 stdio / streamable HTTP transport(传输层)。axios: 语雀 HTTP API client。zod: tool 入参 validation(参数校验)。zod-to-json-schema: 将 Zod schema 转成 MCP client 可理解的 JSON Schema。
当前运行时配置由 src/config.ts 统一解析(CLI 和 HTTP 入口共用),然后传给 server 和 YuqueClient:
- Token 读取优先级:
YUQUE_TOKEN->YUQUE_PERSONAL_TOKEN->--token。 - Host / Base URL 读取优先级:
YUQUE_HOST->--host->YUQUE_BASE_URL->--base-url。 YUQUE_HOST/--host传站点或空间地址(如https://your-space.yuque.com),会自动补全/api/v2;YUQUE_BASE_URL/--base-url传完整 API base URL。- 默认语雀 API base URL 由
YuqueClient提供:https://www.yuque.com/api/v2。 - 请求认证 header 为
X-Auth-Token。 - HTTP 入口(
src/index.ts)监听PORT,默认3000。 - 所有环境变量直接从进程环境读取,项目不加载
.env文件。
HTTP 入口(src/index.ts)额外支持:
PORT: 监听端口,默认3000。HOST: 绑定地址,默认127.0.0.1(回环)。默认开启 DNS rebinding 防护(校验 Host header);显式设置为非回环地址时防护关闭,网络暴露需自行加认证层。
tsx: 本地开发运行 TypeScript 入口,npm run dev会 watchsrc/cli.ts。typescript:npm run build负责编译到dist/,并给dist/cli.js加执行权限。vitest: 单元测试、contract tests 和 real API smoke tests。npm test单次运行全量测试,npm run test:watch进入 watch 模式。@vitest/coverage-v8: 测试覆盖率。eslint: TypeScript lint。prettier: 代码格式化。conventional-changelog-cli: 生成 changelog。scripts/new-tool.js:npm run new:tool -- <domain> <yuque_tool_name>生成新 tool 骨架和步骤清单。
- Tool tests: 覆盖各 domain tool handler 的行为。
- Service tests: 覆盖
YuqueClientAPI wrapper。 - MCP contract tests: 固定 MCP tool surface、JSON Schema 和 OpenAPI 映射。
- Real API smoke tests: 通过环境变量显式开启(见下节),用真实语雀 API 验证读路径和可选写回读回路径。
Real API smoke tests(tests/real-api/smoke.test.ts)默认跳过,通过以下环境变量显式开启:
YUQUE_REAL_API=1: 开启 real API smoke tests,未设置时整个 describe 跳过。YUQUE_PERSONAL_TOKEN或YUQUE_MCP_TEST_TOKEN: 真实 API 认证 token,必须提供其一(前者优先)。YUQUE_BASE_URL: 可选,指向私有部署实例的完整 API base URL。YUQUE_REAL_REPO_ID: 可选,指定被测知识库;未设置时自动发现当前用户的第一个知识库。YUQUE_REAL_WRITE=1且YUQUE_REAL_WRITE_NOTE_ID=<note id>: 可选,开启写路径测试;会更新指定小记并在测试结束时恢复原内容,请使用专门的 scratch 小记。
示例:
YUQUE_REAL_API=1 YUQUE_PERSONAL_TOKEN=<token> npx vitest run tests/real-api/smoke.test.ts另外,packed install smoke(npm run smoke:pack-install)可用 YUQUE_MCP_SMOKE_NPM_CACHE 覆盖 npm cache 路径,CI workflow 已设置该变量。
- 主 CI(
.github/workflows/ci.yml)在 Node.js 18/20/22/24 矩阵上运行npm run check(lint、format:check、typecheck、test、build,与本地质量门同一条命令)和两个 dist smoke tests,另有独立 job 收集测试覆盖率。 - Real API smoke(
.github/workflows/real-api-smoke.yml)只跑读路径,使用 repo secretYUQUE_MCP_TEST_TOKEN(专用测试账号)和可选 repo variableYUQUE_REAL_REPO_ID。触发方式:手动 workflow_dispatch、每周定时、或给 PR 打real-apilabel(label 权限即授权门槛)。写路径测试永不在 CI 开启。
项目通过 npm package 发布,package.json 的 files 只包含 dist、README、LICENSE 和 CHANGELOG。prepublishOnly 会先执行 npm run build。