mcpField
M
Maple

Maple

本地服务
maple-kit.org开发工具211 周前更新

关于 Maple

Maple 是一个 MCP 服务,让编码 Agent 读取并处理在预览部署上收集的评审评论,并在修复后将评论标记为已解决。它面向使用预览环境进行前端评审的团队,目前为预发布版本(0.x)。

主要功能

  1. 01等待并读取新的评审评论
  2. 02评论附带文件行号、视口与截图等上下文
  3. 03修复后按提交记录标记评论已解决
  4. 04Stop 钩子在评论未处理时阻止 Agent 结束
  5. 05支持 GitHub 存储与本地 .maple/ 文件存储

适用场景

  1. 01让编码 Agent 根据预览页面上的评论逐条修改代码
  2. 02在没有拉取请求的本地环境中处理前端评审意见
  3. 03在 CI 中通过 Gate 应用的令牌发布评审检查结果

MCP 相关

Maple 以 MCP 服务的形式运行,向客户端提供 list_comments、wait_for_comments、resolve_comment、get_comment_context 和 start_solo 等工具。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"maple-kit-maple": {
"command": "npx",
"args": [
"-y",
"@maple-kit/mcp"
],
"env": {
"GITHUB_TOKEN": "<GITHUB_TOKEN>",
"MAPLE_GITHUB_OWNER": "<MAPLE_GITHUB_OWNER>",
"MAPLE_GITHUB_REPO": "<MAPLE_GITHUB_REPO>",
"MAPLE_STORE": "<MAPLE_STORE>"
}
}
}
}
启动命令npx -y @maple-kit/mcp
需要配置的环境变量
GITHUB_TOKEN密钥A token that can read and write the repository's pull request comments. Required for the github store.
MAPLE_GITHUB_OWNERThe repository's owner. Required for the github store.
MAPLE_GITHUB_REPOThe repository. Required for the github store.
MAPLE_STOREgithub, the default when a forge is configured, or file, the comments under .maple/ on this machine.

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
npm@maple-kit/mcp0.17.1

工具

5

收录的工具列表 · 更新于 2 周前

参数类型必填说明
branchstring是评论所属拉取请求的头分支,例如 `feat/login`。不是拉取请求编号。
statusesarray否仅限这些状态。省略则返回所有状态。

详细介绍

@maple-kit/mcp

Model Context Protocol 服务,会将 Maple 在预览部署中收集的评审评论交给编码 Agent。

预发布版本。 这里的每个软件包都是 0.x 版本,不承诺兼容性。

一个终端:Agent 等待评论,收到一条标注了文件和行号的评论,修改一行代码,并在一次提交中解决该评论。

Agent 等待评论,读取评论及其上下文——标注者提供的 file:line、视口、截图,以及编写评论时所依据的模拟图——然后进行修改,并将评论关联到修复该问题的提交以解决它。评审者负责添加覆盖层;双方在存储中会合。

安装

npm install @maple-kit/mcp

随附两个二进制文件:服务 maple-mcp,以及用于阻止 Agent 在评论仍未解决时自称已完成的 maple-stop-hook。

连接 Agent

客户端不带参数启动服务,因此通过环境变量进行配置。在 Claude Code 的 .mcp.json 中:

{
  "mcpServers": {
    "maple": {
      "command": "npx",
      "args": ["-y", "-p", "@maple-kit/mcp", "maple-mcp"],
      "env": { "MAPLE_GITHUB_OWNER": "acme", "MAPLE_GITHUB_REPO": "web" }
    }
  }
}

并通过 op run --env-file 运行客户端,以确保 GITHUB_TOKEN 不会落入文件。缺少所需值时,服务会在启动时失败,而不是等到首次调用工具时才失败。

名称是否为密钥说明
GITHUB_TOKEN是可读取和写入拉取请求评论的令牌。github 存储所必需。
MAPLE_GITHUB_OWNER否仓库所有者。github 存储所必需。
MAPLE_GITHUB_REPO否仓库。github 存储所必需。
MAPLE_GITHUB_API否API 根地址,用于 Enterprise Server。
MAPLE_STORE否github:配置了代码托管平台时的默认值;或 file:未配置时的默认值,即 .maple/ 下的评论。
MAPLE_BRANCH否Stop hook 检查的分支,否则检查当前检出的分支。服务会忽略此变量。
MAPLE_URL否已部署路由的挂载 URL。解决评论时会请求它重新发布门禁。
MAPLE_GATE_TOKEN是仅用于 CI:门禁 App 的安装令牌。不可与 MAPLE_URL 同时使用。
MAPLE_GATE_APP_ID否门禁 App 的 ID,使其更新自己的检查运行,而非其他 App 的检查运行。
MAPLE_REQUIRE_APPROVAL否设为 true 时,门禁会保持等待,直到有人批准,与路由和 CI 的行为一致。
未配置代码托管平台

不设置 GITHUB_TOKEN、MAPLE_GITHUB_OWNER 和 MAPLE_GITHUB_REPO 时,服务会读取和写入工作目录所在仓库中 .maple/ 下由 fileStore() 保存的评论,因此即使没有拉取请求,也能在笔记本电脑上完成整个流程。显式设置 MAPLE_STORE=file 也能指定此行为。这是笔记本电脑的存储,不是预览 Pod 的存储:相关说明见 docs/connectors.md。Stop hook 会读取会话工作目录中当前检出分支对应的同一文件夹;如果没有 .maple/ 文件夹、该分支没有评论或当前目录不属于仓库,它就不会输出任何内容。

工具

工具读取功能
list_comments(branch, statuses?)✓返回分支上的评审评论,按时间从新到旧排列。
wait_for_comments(branch, cursor?, timeoutMs?)✓阻塞,直到收到新评论或等待时间结束。如果没有新评论,则返回状态 "timeout",而不会报错。
resolve_comment(id, sha, note?)将评论标记为已解决,并记录处理该评论的提交。
get_comment_context(id, branch)✓返回处理单条评论所需的所有信息:锚点、视口、周边标记,以及任何回放链接。在 Maple Mock 下撰写的评论会附带 mock.recipe 和 mock.replay,后者是指向该状态下页面的链接。
start_solo(previewUrl)在 localhost 上启动桥接服务,并返回将已部署预览与其配对的链接。评审者在浏览器中打开该链接后,他们在那里撰写的评论会写入 .maple/,供 list_comments 和 wait_for_comments 读取。这些评论不会计入合并门槛。

wait_for_comments 的等待时间上限为 55 秒,因为每个编码客户端都会在 60 秒时终止工具调用;它每 15 秒发送一次 notifications/progress。超时是一种结果:如果 Agent 把超时视为错误,那么第一次没人查看时,它就会停止循环。它的游标是时间戳;首次调用时省略游标,即可读取所有已经等待处理的评论。

停止钩子

MCP 无法让服务中断客户端,因此循环需要从另一端闭合。当 Agent 认为自己已完成时,Claude Code 的 Stop 钩子会运行,而 Maple 会用仍未关闭的评论作出回应:

{
  "hooks": {
    "Stop": [
      { "hooks": [{ "type": "command", "command": "npx -y -p @maple-kit/mcp maple-stop-hook" }] }
    ]
  }
}

Maple Claude Code 插件会为你注册此钩子。当评论处于 open 或 needs_reverify 状态时,它会阻塞;每个会话最多连续阻塞八次。第九次时,它会让会话结束,并说明仍有哪些评论未关闭;这比 Agent 为了脱身而解决评论要好。计数按 session_id 保存在系统临时目录中,未被阻塞的停止操作会重新开始计数。

钩子无法看到 .mcp.json 中的 env。 该配置块只会传递给 MCP 服务;钩子运行在客户端自己的环境中。因此,MAPLE_GITHUB_OWNER、MAPLE_GITHUB_REPO 和 GITHUB_TOKEN 必须在客户端自身启动的位置设置——使用同一个 op run --env-file——否则钩子会指出缺少的变量并失败。如果前两个变量都未设置,它会改为读取当前分支下 .maple/ 中的评论;如果没有评论,则允许所有停止操作通过。MAPLE_BRANCH 默认为会话工作目录中检出的分支。

问题解决后,合并门禁解除

拉取请求的检查:maple/visual-review 检查失败,仍有两条未解决的评论;解决它们后,检查通过,合并按钮恢复可用。

设置 MAPLE_URL 为已部署路由的挂载 URL,例如 https://web-482.preview.acme.dev/api/maple,resolve_comment 会请求该路由 重新发布 maple/visual-review,因此,即使 Agent 解决了最后一条评论后没有待推送的内容, 检查也不会一直停留在已完成的工作上。 请求会携带分支和 GITHUB_TOKEN,后者必须具有向仓库推送的权限。 路由会判定结果,并使用门禁 App 自身的凭据发布结果,这些凭据绝不会离开路由。 刷新失败时会记录到标准错误输出,但仍会记录问题已解决。

MAPLE_GATE_TOKEN 是供 CI 使用的另一种方式:直接用于发布的门禁 App 安装令牌。 该令牌自生成后一小时过期,因此适用于作业,而非会话。启动时同时设置两者会失败。

文档

许可证

Apache-2.0。请参阅 LICENSE 和 NOTICE。

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。