关于 changelogforge
changelogforge 是 MCP 服务和命令行工具,可将已合并的 Pull Request 转为分组明确的 Markdown 发布日志。它支持按标签配置分组,并以确定顺序输出,同时在本地校验输入。
主要功能
- 01生成 Markdown 发布日志
- 02按 Pull Request 标签分组
- 03配置分组及标题级别
- 04按编号稳定排序
- 05返回分组数据并校验输入
适用场景
- 01根据已合并的 Pull Request 编写发布日志
- 02采用仓库特定的标签分组规则
- 03为发布工具生成可重复的 Markdown
MCP 相关
提供 `generate_changelog` 工具,接收发布信息和 Pull Request,并返回分组数据及生成的 Markdown。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
1收录的工具列表 · 更新于 1 周前
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| date | string | 是 | 发布日期,在标题中原样输出(不解析) |
| version | string | 是 | 发布版本标签,在标题中原样输出 |
| group_order | array | 否 | 用于定义分组的标签,按输出顺序排列;拉取请求归入其包含的第一个匹配标签对应的分组(可选,默认值为 ["feature", "bugfix", "documentation", "maintenance"]) |
| heading_level | integer | 否 | 版本标题的 Markdown 标题级别;分组标题的级别比它深一级(可选,默认值为 2) |
| pull_requests | array | 是 | 此版本的已合并拉取请求(至少一个) |
详细介绍
changelogforge
一个版本已准备就绪,拉取请求已合并,现在需要有人把这份列表整理成读者真正会浏览的变更日志章节。changelogforge 专注于这一项工作:它会获取某个版本已合并的拉取请求,将它们归入带标签的分组,并以固定、可预测的格式将章节渲染为 Markdown。
- 按标签分组 — 每个拉取请求会归入它所带标签中,在
group_order里排位最靠前的那个。默认顺序为feature、bugfix、documentation和maintenance,你也可以提供自己的列表来重命名、调整顺序、添加或移除分组。匹配区分大小写,且必须完全一致。 - 其他分组 — 不带任何分组标签的拉取请求会归入最后一个分组,该分组的标题为
Other changes。最终为空的分组会被完全省略,只有在包含内容时才会显示其他分组。 - 排序稳定 — 分组遵循
group_order的顺序,其他分组始终排在最后;每个分组内的拉取请求按编号升序排列,因此相同的输入始终会渲染出相同的章节。 - 精确的 Markdown — 版本标题位于
heading_level指定的级别(默认为 2),分组标题则比它深一级。结果还会返回分组结构本身,因此调用方可以用其他方式渲染相同的数据。
版本和日期会按原样显示在标题中,不会解析或重新格式化。拉取请求编号在列表中必须唯一——重复编号会触发验证错误,并指出两处位置,例如 pull_requests[2].number duplicates pull_requests[0].number。其他格式错误的字段也会触发错误,并指出其路径;不会生成不完整的章节。整个计算是纯本地操作:不访问网络、不需要配置,也不会读取你传入输入之外的文件。
CLI
npx @reneturcios/changelogforge generate --input args.json
npx @reneturcios/changelogforge --version
args.json 包含完整的参数对象:
{
"version": "1.2.0",
"date": "2026-10-27",
"pull_requests": [
{ "number": 7, "title": "Add export button", "labels": ["feature"] },
{ "number": 12, "title": "Fix crash on empty input", "labels": ["bugfix"] },
{ "number": 15, "title": "Tidy internals" }
]
}
每个拉取请求的 labels 默认为 [],group_order 默认为 ["feature", "bugfix", "documentation", "maintenance"],heading_level 默认为 2。渲染后的章节将以 JSON 格式打印:
{
"version": "1.2.0",
"date": "2026-10-27",
"groups": [
{ "group": "feature", "heading": "feature", "pull_requests": [{ "number": 7, "title": "Add export button" }] },
{ "group": "bugfix", "heading": "bugfix", "pull_requests": [{ "number": 12, "title": "Fix crash on empty input" }] },
{ "group": "other", "heading": "Other changes", "pull_requests": [{ "number": 15, "title": "Tidy internals" }] }
],
"markdown": "## 1.2.0 (2026-10-27)\n\n### feature\n\n- Add export button (#7)\n\n### bugfix\n\n- Fix crash on empty input (#12)\n\n### Other changes\n\n- Tidy internals (#15)",
"total_pull_requests": 3
}
退出代码:成功时为 0;运行时错误(包括输入文件无法读取或无效,以及输入无效)时为 1;用法错误时为 2。
MCP 服务
npx -y @reneturcios/changelogforge mcp
MCP 客户端配置:
{
"mcpServers": {
"changelogforge": {
"command": "npx",
"args": ["-y", "@reneturcios/changelogforge", "mcp"]
}
}
}
工具
-
generate_changelog— 根据已合并的拉取请求生成版本变更日志章节,并按标签分组。version(字符串,必填)— 版本标签,在标题中按原样显示date(字符串,必填)— 版本日期,在标题中按原样显示pull_requests(数组,必填,至少一个)— 已合并的拉取请求,格式为{number, title, labels?}对象;列表中的number必须唯一group_order(字符串数组,可选)— 用于定义分组的标签,按输出顺序排列heading_level(整数,可选,1–5)— 版本标题的 Markdown 标题级别
返回
{version, date, groups, markdown, total_pull_requests}。
Docker
docker run -i ghcr.io/cloudcorprecords/changelogforge
docker run --rm -v "$PWD:/w" ghcr.io/cloudcorprecords/changelogforge generate --input /w/args.json
开发
npm install
npm run build # tsc -> dist/
npm test # tsx --test test/*.test.ts (pure local, no network)
npm run dev # run the CLI from source
许可证
MIT — 版权所有 (c) 2026 Rene Turcios
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。