关于 Forgejo MCP Server
Forgejo MCP Server 通过 REST API 将 MCP 客户端连接到 Forgejo 实例,可处理仓库、议题、拉取请求、文件和 Actions 工作流任务,并支持多种传输方式。
主要功能
- 01浏览和管理仓库
- 02创建及查看议题
- 03管理拉取请求
- 04读取仓库文件
- 05查看 Actions 工作流运行
适用场景
- 01通过 AI 助手列出仓库
- 02创建或查看仓库议题
- 03检查未关闭的拉取请求
- 04读取分支中的文件
MCP 相关
将 Forgejo REST API 操作作为 MCP 工具和资源提供给 MCP 客户端,支持 stdio、HTTP 和 SSE 传输。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
我们还没有获取到这个服务的安装包或远程地址,请按项目 README 中的说明安装。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
Forgejo MCP 服务
📦 此项目已迁移。 开发、问题、发行版本和容器镜像现已托管在 https://git.b4mad.industries/agentic-forges/forgejo-mcp。 Codeberg 仓库
codeberg.org/goern/forgejo-mcp仅作为只读镜像保留,其容器注册表不再发布镜像 — 请改为从git.b4mad.industries/agentic-forges/forgejo-mcp拉取。迁移前后的问题编号保持不变。欢迎人类和 AI Agent 在新位置参与贡献。git clone https://git.b4mad.industries/agentic-forges/forgejo-mcp.git如果你的远程仓库或书签指向
forgejo.b4mad.net,那与之前名称下的 Forge 完全相同 — 于 2026-07-29 更名,并非再次迁移。旧名称仍可解析,且通过同一个主机密钥提供 2222 端口服务,因此现有克隆仍可正常使用;你可以方便时再更新它们的地址:git remote set-url origin \ ssh://[email protected]:2222/agentic-forges/forgejo-mcp.git ssh-keyscan -p 2222 git.b4mad.industries >> ~/.ssh/known_hosts
将 AI 助手连接到 Forgejo 仓库。通过自然语言管理问题、拉取请求、文件等。
功能介绍
Forgejo MCP 服务是一个集成插件,可将 Forgejo 与 Model Context Protocol (MCP) 系统连接起来。配置完成后,你可以通过任何兼容 MCP 的 AI 助手(例如 Claude、Cursor 或 VS Code 扩展)与 Forgejo 仓库交互。
你可以使用的示例命令:
- “列出我的所有仓库”
- “创建一个标题为‘登录页面中的错误’的问题”
- “显示 my-org/my-repo 中尚未关闭的拉取请求”
- “获取 main 分支中 README.md 的内容”
- “显示 agentic-forges/forgejo-mcp 中最新的 Actions 工作流运行记录”
快速开始
1. 安装
选项 A:使用 Go(推荐)
git clone https://git.b4mad.industries/agentic-forges/forgejo-mcp.git
cd forgejo-mcp
go install .
确保 $GOPATH/bin(通常为 ~/go/bin)位于 PATH 中。
**注意:**你也可以直接从模块路径安装,无需克隆:
go install git.b4mad.industries/agentic-forges/forgejo-mcp/v3@latest
选项 B:下载二进制文件
从发行版本页面下载最新版本。
对于 Arch Linux,请使用你偏好的 AUR 助手:
yay -S forgejo-mcp # builds from source
yay -S forgejo-mcp-bin # uses pre-built binary
选项 C:Nix / NixOS
你可以使用 Nix 包管理器直接运行服务端:
nix-shell -p forgejo-mcp
也可以使用 Flakes:
nix run nixpkgs#forgejo-mcp
注意:
forgejo-mcp目前仅在unstable通道中提供,尚未纳入 25.11 稳定版。
选项 D:容器镜像
每次发布时,都会将经过签名的多阶段 OCI 镜像发布到
git.b4mad.industries/agentic-forges/forgejo-mcp。无需从源代码构建即可运行服务:
# Latest release
podman run --rm -i \
-e FORGEJO_ACCESS_TOKEN="<your personal access token>" \
git.b4mad.industries/agentic-forges/forgejo-mcp:latest \
--transport stdio --url https://your-forgejo-instance.org
# Or pin a specific version
podman run --rm -i git.b4mad.industries/agentic-forges/forgejo-mcp:v3.1.0 --help
| 标签 | 含义 |
|---|---|
vMAJOR.MINOR.PATCH | 不可变 — 对应确切的发行版本(例如 v3.1.0)。用于生产环境。 |
latest | 会变动 — 始终指向最新发行版本。仅为方便使用。 |
该镜像为单架构(linux/amd64),使用 cosign 签名,并附带 CycloneDX SBOM。运行前,请参阅验证容器镜像检查签名和来源证明。
2. 获取访问令牌
- 登录你的 Forgejo 实例
- 前往 设置 → 应用程序 → 访问令牌
- 创建一个具有所需权限(repo、issue 等)的新令牌
3. 配置 AI 助手
将以下内容添加到 MCP 配置文件中:
stdio 模式(最常见):
{
"mcpServers": {
"forgejo": {
"command": "forgejo-mcp",
"args": [
"--transport", "stdio",
"--url", "https://your-forgejo-instance.org"
],
"env": {
"FORGEJO_ACCESS_TOKEN": "<your personal access token>",
"FORGEJO_USER_AGENT": "forgejo-mcp/1.0.0"
}
}
}
}
可流式传输的 HTTP 模式(推荐用于远程访问/Claude.ai):
{
"mcpServers": {
"forgejo": {
"url": "http://localhost:8080/mcp"
}
}
}
使用可流式传输的 HTTP 模式时,请先启动服务:
forgejo-mcp --transport http --url https://your-forgejo-instance.org --token <your-token>
多租户 HTTP 模式(可选):
你可以运行单个集中式 forgejo-mcp 实例,让每个客户端通过标准 HTTP Authorization 标头提供自己的令牌。这样便可通过一个服务为多个用户或 Agent 提供服务。
- 启动服务(可以不设置全局令牌):
forgejo-mcp --transport http --url https://your-forgejo-instance.org - 客户端在每个请求中都包含自己的令牌:
Authorization: token <token>(Forgejo 风格)Authorization: Bearer <token>(OAuth2/MCP 风格)- 注意:方案名称(
token或Bearer)不区分大小写。
请参阅 demos/multi-tenant-http.md,了解可直接复制粘贴使用的操作指南。
将服务暴露到网络
默认情况下,sse 和 http 传输仅监听回环地址,因此这台机器之外的任何设备都无法访问它们。这符合 Model Context Protocol 对本地运行服务的指导原则,也是行为上的一项变更:早期版本会监听所有网络接口。默认值 localhost 会绑定两个回环地址族,因此客户端将 localhost 解析为 127.0.0.1 或 ::1 时都可以连接。如果任一地址族上的端口已被占用,服务将拒绝启动,而不会仅在另一个地址族上提供服务,导致部分客户端连接到占用该端口的其他程序。若机器完全无法使用某个地址族(例如 IPv6 已禁用),则会跳过该地址族,并在启动日志中说明。
请传入地址而非名称,例如 --host 127.0.0.1 或 --host ::1,以仅绑定对应的地址族。当另一个地址族在这台机器上不可用,但服务无法将其识别为“不存在”时,请使用此方式;否则服务会拒绝启动。
如果你在容器中运行服务,或为远程客户端提供服务,现在必须明确指定。 默认设置不会接受来自本机之外的连接;在容器中运行时,也不会接受来自容器之外的连接:
- 将
--host设置为网络可访问的地址(容器中通常使用0.0.0.0,以监听所有接口); - 并将
--allowed-hosts设置为客户端使用的主机名。此项为必需,而非可选:如果网络可访问的地址未配置此项,服务会拒绝启动,而不是启动后拒绝所有请求。
如果请求的 Host 标头不在你声明的列表中,服务将返回 403 Forbidden。在回环监听器上始终接受回环名称,因此声明代理的主机名不会妨碍你从同一台机器直接连接。
浏览器客户端。 除非请求中包含的 Origin 已列在 --allowed-origins 中,否则该请求将被拒绝;该选项默认值为空。系统会完整比对来源,包括方案、主机和端口,因为 Origin 中的端口属于发起请求的页面,而非本服务。完全不带 Origin 标头的请求不受影响,这也是通常情况:MCP 客户端不是浏览器。
sse 和 http 上的身份验证
在这些传输方式下,每个请求都必须携带自己的 Authorization 标头。不带标头的请求会被拒绝,并返回 401 Unauthorized,而不会使用服务器自身配置的令牌来处理。这正是上述多租户设置所预期的行为,也因此可以安全地公开该设置。
在 stdio 上,若标头缺失,仍会像以前一样使用已配置的令牌。stdio 不会有任何变化。
如果你通过 sse 或 http 运行单用户部署,并希望恢复旧行为,--allow-operator-token-fallback 可以实现这一点。使用前请先了解其含义:任何能连接到该端口的客户端,无需提供凭据,就能以你的令牌所代表的身份行事。启用此选项时,启动日志会醒目地提示这一点。
SSE 模式下(旧版基于 HTTP):
{
"mcpServers": {
"forgejo": {
"url": "http://localhost:8080/sse"
}
}
}
使用 SSE 模式时,请先启动服务器:
forgejo-mcp --transport sse --url https://your-forgejo-instance.org --token <your-token>
通知流与心跳
在 sse 和 http 上,服务器会保持一个流处于打开状态,用于传递自身消息(通知、进度和服务器请求)。会话空闲时,该流不会传输任何内容;静默时间过长时,客户端、代理和 NAT 设备会断开流;有一个 MCP 客户端会在六分钟后中止连接。因此,服务器会按 --heartbeat 指定的间隔向流中写入 JSON-RPC ping,默认间隔为 30s。设置 --heartbeat 0 可恢复此前的静默行为。
作为 OAuth 资源服务器进行远程操作
使用 --auth-mode resource-server 时,http 传输会按照 MCP 授权规范的定义,成为 OAuth 2.0 资源服务器。客户端不再发送 Forgejo 令牌,而是登录你选择的 OpenID Connect 提供商,并发送其 JWT 访问令牌。服务器会验证该令牌,为调用方签发一个有效期为五分钟的 JWT,并通过 Forgejo 16 Authorized Integration 将其提供给 Forgejo。任何位置都不会配置 Forgejo 令牌,调用方的访问令牌也绝不会传给 Forgejo。
此模式需要:
- Forgejo 16.0 或更高版本;
- 能签发 JWT 访问令牌且可添加按用户设置的声明的 OpenID Connect 提供商(默认声明为
forgejo_aud),该声明用于保存此用户的 Authorized Integration 的受众; - 服务器的公开 HTTPS 来源,因为 Forgejo 会从中获取服务器的颁发者文档;
- 一个签名密钥文件:EC P-256 或 P-384、Ed25519,或至少 2048 位的 RSA。
forgejo-mcp --transport http --url https://forgejo.example.org \
--host 0.0.0.0 --allowed-hosts mcp.example.org \
--auth-mode resource-server \
--authorization-server https://id.example.org \
--resource https://mcp.example.org/mcp \
--forgejo-jwt-issuer https://mcp.example.org/issuer \
--forgejo-jwt-signing-key-file /run/credentials/forgejo-mcp.service/signing-key
此模式为可选启用:未指定 --auth-mode 时,上述行为都与之前一致。在此模式下,服务器只响应 /mcp、受保护资源元数据,以及颁发者路径下的发现文档和密钥集。若配置无法安全提供服务,服务器会拒绝启动,并指出需要修正的设置。签名密钥代表所有信任该颁发者的用户的集成行事,因此必须像保护它所取代的 Forgejo 令牌一样妥善保管。
- 运维指南:身份提供商要求、部署顺序、代理规则、密钥轮换,以及完整的 Zitadel 示例。
- 用户指南:创建 Authorized Integration、必需的
sub声明规则,以及配置 MCP 客户端。
4. 开始使用
打开兼容 MCP 的 AI 助手并尝试:
List all my repositories
可用工具
| 工具 | 描述 |
|---|---|
| 用户 | |
get_my_user_info | 获取已认证用户的信息 |
check_notifications | 检查并列出用户通知 |
get_notification_thread | 获取单个通知会话的详细信息 |
mark_notification_read | 将单个通知会话标记为已读 |
mark_all_notifications_read | 确认所有通知 |
list_repo_notifications | 筛选范围限定为单个仓库的通知 |
mark_repo_notifications_read | 将特定仓库中的所有通知标记为已读 |
search_users | 搜索用户 |
| 仓库 | |
list_my_repos | 列出你拥有的所有仓库 |
get_repo | 根据所有者和名称获取单个仓库 |
create_repo | 创建新仓库 |
fork_repo | 派生仓库 |
edit_repo | 编辑仓库设置。只会更改你传入的字段;未提供的字段保持不变。未提供任何字段时会报错。 |
search_repos | 搜索仓库 |
| 主题 | |
list_repo_topics | 列出仓库的主题。受 page(默认值为 1)和 limit(默认值为 100)限制;返回 {topics, page, limit, count}。 |
set_repo_topics | 替换所有主题。topics 是必填的逗号分隔字符串;空字符串会清除主题。无效名称会在发送请求前被拒绝。 |
add_repo_topic | 添加一个主题 |
delete_repo_topic | 删除一个主题 |
| 分支 | |
list_branches | 列出仓库中的所有分支 |
create_branch | 创建新分支 |
delete_branch | 删除分支 |
| 分支保护 | |
list_branch_protections | 列出仓库的分支保护规则。受 page(从 1 开始)和 limit(每页大小)限制;响应会回显 page/limit,方便调用方获取下一页。 |
get_branch_protection | 根据 rule 名称获取单条规则 |
create_branch_protection | 创建规则。需要提供 branch_name;status_check_contexts 是必需检查项的逗号分隔列表(例如 "ci/build,ci/test")。 |
edit_branch_protection | 根据 rule 名称编辑规则。只会更改你传入的字段;未提供的字段保持不变。 |
delete_branch_protection | 根据 rule 名称删除规则 |
| Webhook | |
list_repo_hooks | 列出仓库 Webhook。受 page(默认值为 1)和 limit(默认值为 30,服务器不设上限)限制;当 Forgejo 返回 X-Total-Count 时会返回 total_count。 |
get_repo_hook | 根据 ID 获取单个仓库 Webhook |
create_repo_hook | 创建仓库 Webhook。接受密钥,但响应中绝不会回显该密钥。 |
edit_repo_hook | 编辑仓库 Webhook。只会更改你传入的字段;未提供的字段保持不变。 |
delete_repo_hook | 根据 ID 删除仓库 Webhook |
test_repo_hook | 触发仓库 Webhook 的测试投递——警告:会触发实际的 HTTP 投递 |
| 文件 | |
get_file_content | 获取文件内容。可选的 start_line/end_line 用于请求从 1 开始计数、包含首尾行的行范围(超出文件范围时会截断;with_metadata=true 时会忽略)。 |
list_repo_contents | 列出指定路径下的文件和目录。path="" 会列出仓库根目录。只返回一层;如需完整目录树,请使用 get_repo_tree 并设置 recursive=true。 |
get_repo_tree | 获取 Git 树。recursive=true 会在一个响应中返回完整文件树(受服务器树端点大小上限限制);recursive=false(默认值)只返回一层。 |
create_file | 创建新文件。必须且只能提供纯文本 content 或二进制安全的 content_base64(严格标准 Base64)之一。 |
update_file | 更新现有文件。必须且只能提供纯文本 content 或二进制安全的 content_base64(严格标准 Base64)之一。 |
delete_file | 删除文件 |
change_files | 在一次原生 Forgejo 提交中,以原子方式创建、更新和删除多个文件;创建/更新操作接受 content 或 content_base64。 |
| 提交 | |
list_repo_commits | 列出仓库中的提交 |
get_commit_statuses | 列出完整 40 个字符 SHA 的各上下文提交状态。受 page(默认值为 1)和 limit(默认值为 30,最大值为 50)限制;返回 {sha, statuses, page, limit, count, total_count}——只有在 Forgejo 返回 X-Total-Count 时才会包含 total_count。合并后的汇总状态仍属于提交状态资源。不是 Actions 运行(请使用 list_workflow_runs)。 |
| 议题 | |
list_repo_issues | 列出仓库中的议题(page/limit)。可选的 sort 可在服务器端排序:relevance、latest、oldest、recentupdate、leastupdate、mostcomment、leastcomment、nearduedate、farduedate(最后两个表示截止日期的排序方向)。 |
search_issues | 搜索某个所有者的所有仓库中的议题(page/limit);返回 {issues,page,limit,count,has_next,total_count}——只有在 Forgejo 返回 X-Total-Count 时才会包含 total_count |
get_issue_by_index | 获取特定议题 |
create_issue | 创建新议题。可选的 labels(逗号分隔的名称或 ID)、assignees(逗号分隔的用户名)和 milestone(数字 ID)会随创建议题的同一请求一起应用。 |
add_issue_labels | 为议题添加标签。labels 接受逗号分隔的标签名称或数字 ID;无法识别名称时会报错,且不会应用任何标签。 |
remove_issue_labels | 从议题中移除标签。labels 接受逗号分隔的标签名称或数字 ID。 |
update_issue | 更新现有议题(需要数字里程碑 ID)。due_date 用于设置截止日期(RFC3339);clear_due_date=true 用于移除截止日期。两者不能同时使用——同时设置会报错,两者都不提供则截止日期保持不变。set_labels 会替换议题的整个标签集合(名称或 ID);空字符串会清除所有标签。 |
issue_state_change | 打开或关闭议题 |
list_issue_dependencies | 列出给定议题所依赖的议题。受 page(从 1 开始)和 limit(每页大小)限制;响应会回显 page/limit,方便调用方获取下一页。 |
list_issue_dependents | 列出依赖给定议题的议题。受 page(从 1 开始)和 limit(每页大小)限制;响应会回显 page/limit,方便调用方获取下一页。 |
add_issue_dependency | 使一个议题依赖另一个议题。依赖项可以位于不同的仓库中:可选的 depends_on_owner/depends_on_repo 默认使用 owner/repo。 |
remove_issue_dependency | 移除议题的一项依赖。对于跨仓库依赖,可选的 dependency_owner/dependency_repo 默认使用 owner/repo。 |
list_repo_milestones | 列出里程碑及其 ID(与 update_issue 配合使用) |
list_repo_labels | 列出标签及其 ID。对于组织拥有的仓库,会合并组织级标签(设置 include_org_labels=false 可选择不包含)。每个条目都包含 scope 字段("repo" 或 "org"),以及 exclusive 和 is_archived(值为 false 时也会返回,不会省略)。 |
list_org_labels | 列出组织级标签及其 ID。分配工具接受标签名称,因此此工具用于查找标签,以及处理名称同时存在于仓库和组织范围内的少数情况。每个条目都包含 exclusive 和 is_archived。 |
create_repo_label | 创建仓库标签(name、6 位十六进制的 color,以及可选的 description、exclusive、is_archived)。exclusive=true 时名称必须带有范围前缀(包含 /,且 / 不能位于首尾)。返回数字 id;add_issue_labels 也接受名称。 |
edit_repo_label | 编辑仓库标签(PATCH——只更改提供的字段:name、color、description、exclusive、is_archived)。仅编辑 exclusive 时不会重新读取当前名称。 |
delete_repo_label | 删除仓库标签。默认情况下,如果标签正在使用中(会报告数量),则拒绝删除;设置 delete_mode=force 可强制删除。 |
get_repo_label | 根据数字 id 获取单个仓库标签。包含 exclusive 和 is_archived。 |
create_org_label | 创建组织级标签。字段与 create_repo_label 相同。 |
edit_org_label | 编辑组织级标签(采用 PATCH 语义,包括 exclusive 和 is_archived)。 |
delete_org_label | 删除组织级标签。使用中检查会统计可见组织仓库中的使用情况(尽力而为);delete_mode=force 可强制删除。 |
get_org_label | 根据数字 id 获取单个组织级标签。包含 exclusive 和 is_archived。 |
| 评论 | |
list_issue_comments | 列出议题或 PR 下的评论 |
get_issue_comment | 获取特定评论 |
create_issue_comment | 在议题或 PR 下添加评论 |
edit_issue_comment | 编辑评论 |
delete_issue_comment | 删除评论 |
| 拉取请求 | |
list_repo_pull_requests | 列出仓库中的拉取请求 |
get_pull_request_by_index | 获取特定拉取请求 |
create_pull_request | 创建新的拉取请求 |
update_pull_request | 更新现有拉取请求 |
list_pull_reviews | 列出拉取请求的评审 |
get_pull_review | 获取特定拉取请求评审 |
list_pull_review_comments | 列出拉取请求评审中的评论 |
list_pull_request_files | 列出拉取请求中更改的文件(分页)。将返回的文件名作为 get_pull_request_diff 的 file_path 参数。 |
get_pull_request_diff | 获取拉取请求的统一差异。可选的 file_path 仅返回该文件的差异块(可匹配重命名前或重命名后的路径)。 |
merge_pull_request | 合并拉取请求(style:merge/rebase/rebase-merge/squash;可选 title/message/delete-branch/force-merge/wait-for-checks)。 |
create_pull_review | 在拉取请求上创建评审(state:APPROVED/REQUEST_CHANGES/COMMENT),可选添加行内评论。 |
submit_pull_review | 提交待处理的拉取请求评审 |
dismiss_pull_review | 驳回拉取请求评审 |
delete_pull_review | 删除待处理的拉取请求评审 |
create_review_requests | 请求特定用户或团队进行评审 |
delete_review_requests | 取消待处理的评审请求 |
| 软件包 | |
list_packages | 列出用户或组织的软件包版本(每个版本一行)。可选的 type 和 q。通过 page/limit 在服务器端分页(默认值为 30,最大值为 50)。封装格式为 {packages, page, limit, count, has_next, total_count?}。缺少所有者时会报错,而非返回空列表 |
get_package | 获取单个软件包版本。不嵌入所有者/创建者用户信息 |
delete_package | 删除单个软件包版本(而非该名称的所有版本)。不进行预检。4xx/5xx 响应仍会作为错误处理 |
list_package_files | 列出单个软件包版本的文件。通过 page/limit 在客户端分页(默认值为 30,最大值为 50);封装格式为 {files, page, limit, count, has_next, total_count}(total_count 是获取的列表长度) |
| Actions | |
dispatch_workflow | 通过 workflow_dispatch 事件触发工作流运行 |
list_workflow_runs | 列出工作流运行,可按状态、事件、运行编号或 SHA 筛选 |
get_workflow_run | 根据数据库 ID 获取特定工作流运行的详细信息 |
list_action_run_jobs | 列出 Forgejo v16+ 工作流运行的任务,可在客户端设置 page 和 limit 的范围 |
get_action_job_logs | 读取 Forgejo v16+ 任务日志,支持通过 offset 和 max_bytes 限制进行续读;默认读取末尾内容 |
cancel_workflow_run | 取消待处理或正在运行的工作流运行。已结束的运行也会返回成功(HTTP 204);运行状态不会更改 |
delete_workflow_run | 删除已完成的工作流运行。正在运行的任务会导致 API 错误。此操作会移除运行及其任务日志;Forgejo 会将该运行的构件标记为已删除 |
list_action_run_artifacts | 列出工作流运行的构件。通过 page/limit 在服务器端分页(默认值为 30,最大值为 50);可选的 name 筛选器。封装格式为 {artifacts, page, limit, count, total_count?} |
get_action_artifact | 获取单个 Actions 构件的元数据。不下载 zip 文件 |
list_repo_action_secrets | 列出仓库的 Actions 密钥(仅名称;Forgejo 绝不返回密钥值)。通过 page/limit 在客户端分页(默认值为 30,最大值为 50) |
create_or_update_repo_action_secret | 创建或更新仓库 Actions 密钥。同名的现有密钥会被覆盖;不会回显密钥值 |
delete_repo_action_secret | 删除仓库 Actions 密钥 |
list_org_action_secrets | 列出组织的 Actions 密钥(仅名称;Forgejo 绝不返回密钥值)。通过 page/limit 在客户端分页(默认值为 30,最大值为 50) |
create_or_update_org_action_secret | 创建或更新组织 Actions 密钥。同名的现有密钥会被覆盖;不会回显密钥值 |
delete_org_action_secret | 删除组织 Actions 密钥 |
| 组织 | |
list_my_orgs | 列出我的组织 |
list_user_orgs | 列出用户的组织 |
get_org | 获取组织详细信息 |
create_org | 创建组织 |
edit_org | 编辑组织设置 |
delete_org | 删除组织——具有破坏性且不可逆:所有仓库、团队和数据都将被永久移除 |
list_org_members | 列出组织成员 |
check_org_membership | 检查用户是否为组织成员 |
remove_org_member | 将成员从组织中移除 |
list_org_teams | 列出组织中的团队 |
search_org_teams | 搜索组织中的团队 |
create_org_team | 在组织中创建团队 |
add_team_member | 将用户添加到团队 |
remove_team_member | 将用户从团队中移除 |
add_team_repo | 将仓库添加到团队 |
remove_team_repo | 将仓库从团队中移除 |
| 时间跟踪 | |
list_issue_tracked_times | 列出议题或 PR 上记录的时间条目 |
list_repo_tracked_times | 列出仓库中记录的时间条目 |
list_my_tracked_times | 列出你自己记录的时间条目 |
add_issue_time | 在议题或 PR 上记录时间(接受秒数或类似 15m 的时长) |
reset_issue_time | 删除议题或 PR 上的所有时间记录(具有破坏性) |
delete_issue_time_entry | 根据 ID 删除单条时间记录 |
start_issue_stopwatch | 在议题或 PR 上启动秒表 |
stop_issue_stopwatch | 停止运行中的秒表并记录经过的时间 |
cancel_issue_stopwatch | 取消运行中的秒表,不记录时间 |
list_my_stopwatches | 列出当前运行中的秒表 |
| 附件 | |
list_issue_attachments | 列出议题或 PR 中的附件 |
get_issue_attachment | 获取单个议题/PR 附件的元数据 |
download_issue_attachment | 下载议题/PR 附件(小于 1 MiB 时内联返回;否则返回元数据和 URL) |
create_issue_attachment | 为议题或 PR 上传新附件(Base64 内容或 MCP 主机上的文件路径) |
edit_issue_attachment | 重命名议题/PR 附件 |
delete_issue_attachment | 删除议题/PR 附件 |
list_comment_attachments | 列出议题/PR 评论中的附件 |
get_comment_attachment | 获取单个评论附件的元数据 |
download_comment_attachment | 下载评论附件(小于 1 MiB 时内联返回;否则返回元数据和 URL) |
create_comment_attachment | 为议题/PR 评论上传新附件(Base64 内容或 MCP 主机上的文件路径) |
edit_comment_attachment | 重命名评论附件 |
delete_comment_attachment | 删除评论附件 |
| 发行版 | |
list_releases | 列出仓库发行版(page/limit 加客户端 state 筛选:all/draft/prerelease/published) |
get_release_by_id | 根据数字 ID 获取发行版 |
get_release_by_tag | 根据标签名称获取发行版 |
get_latest_release | 获取最新的非草稿、非预发布发行版 |
create_release | 创建新发行版(传入 target_commitish 还会创建标签) |
edit_release | 更新现有发行版的字段(只会发送提供的字段) |
delete_release | 根据数字 ID 删除发行版——具有破坏性 |
delete_release_by_tag | 根据标签名称删除发行版——具有破坏性,请核实标签 |
list_release_attachments | 列出发行版中的附件(完整获取响应后在客户端切片) |
get_release_attachment | 获取单个发行版附件的元数据 |
download_release_attachment | 下载发行版附件(小于 1 MiB 时内联返回;否则返回元数据和 URL) |
create_release_attachment | 为发行版上传新附件(Base64 内容或 MCP 主机上的文件路径) |
edit_release_attachment | 重命名发行版附件 |
delete_release_attachment | 删除发行版附件——具有破坏性 |
| Wiki | |
list_wiki_pages | 使用 page/limit 列出页面;返回 has_next,并在 Forgejo 返回 X-Total-Count 时返回 total_count。total_count 统计上游原始 Wiki 树条目数,因此对于含有子目录的 Wiki,该数值可能大于列出的页面数;这是上限,而非精确总数。 |
get_wiki_page | 读取解码后的 Markdown;可选的 start_line/end_line,始终返回 total_lines。 |
get_wiki_revisions | 使用 page/limit 列出修订历史;返回 has_next 和 total_count,即响应正文报告的页面总修订数。 |
create_wiki_page | 创建页面并返回服务器规范化后的 page_name;以斜杠分隔的标题是一种扁平子页面命名约定(没有层级,也不会自动创建父页面),若标题已存在则会覆盖。 |
update_wiki_page | 根据规范化后的 page_name 更新内容/标题;以最后写入者为准。 |
delete_wiki_page | 根据规范化后的 page_name 删除页面。 |
| 服务器 | |
get_forgejo_mcp_server_version | 获取 MCP 服务版本 |
资源
MCP 资源模板使用 forgejo:// 方案,将 Forgejo 实体公开为可通过 URI 访问的资源。该 URI 方案可跨实例使用——相同的 URI 格式适用于任何 Forgejo 实例——且不会与 Forgejo 网页链接冲突。支持 resources/templates/list 和 resources/read 的客户端(Claude Code、Claude Desktop、Codex、Cursor)可以直接解析这些 URI。不支持资源模板的客户端仍可使用上述工具,不会移除任何功能。
资源不会取代任何 MCP 工具——所有现有的 list/get 工具仍然可用;资源是额外提供的、可通过 URI 访问的读取接口,旨在支持从大模型上下文中自动解析,以及对提交等不可变实体进行内容寻址缓存。
包含列表(issue、pr)的资源会将嵌入数组限制为 30 项。截断时,JSON 负载会包含一个标记,指出调用方应使用对应的 list_* 工具获取完整列表。
**何时使用资源,何时使用工具:**手头已有特定的 sha 或索引时,优先使用资源;需要列出或搜索时,优先使用工具。
| URI 模板 | 实体 | 说明 |
|---|---|---|
forgejo://owner/{owner} | application/json | 通过登录名指定的用户或组织资料;先解析用户,找不到时再解析组织。 |
forgejo://repo/{owner}/{repo} | application/json | 仓库概览:身份信息及计数,不包含嵌入式列表。 |
forgejo://repo/{owner}/{repo}/commit/{sha} | Commit metadata | 每个 sha 的内容不可变。返回 JSON 和 Markdown 辅助内容。sha 必须是 40 位十六进制字符。 |
forgejo://repo/{owner}/{repo}/commit/{sha}/status | application/json | 某个 sha 的综合 CI 状态:汇总状态及数量受限的各上下文状态(最多 30 条,哨兵名称为工具 get_commit_statuses)。 |
forgejo://repo/{owner}/{repo}/issue/{index} | application/json(附带 text/markdown 辅助内容) | Issue 元数据、渲染后的正文及数量受限的近期评论(最多 30 条,哨兵名称为 list_issue_comments)。 |
forgejo://repo/{owner}/{repo}/issues{?state,labels,page,limit} | application/json | 数量受限的 Issue 列表,以行形式返回:索引、标题、状态、作者、标签、受理人、里程碑、评论数、时间戳、截止日期,且不包含正文。state ∈ {open, closed, all}(默认为 open);labels 以逗号分隔;最多 30 条,哨兵名称为 list_repo_issues。如需正文,请读取单个 Issue 资源。 |
forgejo://repo/{owner}/{repo}/{kind}/{index}/comment/{id} | application/json(附带 text/markdown 辅助内容) | 按 id 获取单条评论;kind ∈ {issue, pr}。 |
forgejo://repo/{owner}/{repo}/{kind}/{index}/comments{?page,limit} | application/json | 数量受限的评论串,包含完整正文(单个 Issue 资源会将正文截取至 200 个字符);kind ∈ {issue, pr};最多 30 条,哨兵名称为 list_issue_comments。 |
forgejo://repo/{owner}/{repo}/pr/{index} | application/json(附带 text/markdown 辅助内容) | PR 元数据、head/base 引用、可合并状态、数量受限的近期评论(最多 30 条,哨兵名称为 list_issue_comments)和评审(最多 30 条,哨兵名称为 list_pull_reviews)。 |
forgejo://repo/{owner}/{repo}/branch_protections | application/json | 数量受限的分支保护规则列表。 |
forgejo://repo/{owner}/{repo}/branch_protection/{rule} | application/json | 单条分支保护规则。规则名称是分支模式,因此字面量 / 需编码为 %2F,空格需编码为 %20(release%2Fv1);原始 / 无法解析。 |
forgejo://repo/{owner}/{repo}/hooks | application/json | 数量受限的仓库 Webhook 列表(最多 30 条,哨兵名称为 list_repo_hooks)。绝不会返回密钥。 |
forgejo://repo/{owner}/{repo}/hook/{id} | application/json | 按 id 获取单个仓库 Webhook。绝不会返回密钥。 |
forgejo://repo/{owner}/{repo}/label/{id} | application/json | 按数字 id 获取单个仓库标签。 |
forgejo://repo/{owner}/{repo}/labels{?page,limit} | application/json | 数量受限的仓库标签列表(最多 30 条,哨兵名称为 list_repo_labels)。 |
forgejo://org/{org}/labels{?page,limit} | application/json | 数量受限的组织级标签列表(最多 30 条,哨兵名称为 list_org_labels)。 |
forgejo://repo/{owner}/{repo}/wiki/{pageName} | application/json(附带 text/markdown 辅助内容) | Wiki 页面,包含数量受限的修订记录;Markdown 上限为 1 MiB。请使用返回的规范化 page_name;在 URI 中将字面量 / 编码为 %2F,空格编码为 %20(不要对已规范化的名称重复编码)。 |
以斜杠分隔的标题(如 Guides/Setup)适合作为子页面命名约定,
但 Forgejo 会将页面存储在扁平列表中:它既不会自动创建 Guides,也不会记录父子关系。若读者需要父页面,请单独创建;后续调用务必使用创建或列表操作返回的规范化 page_name。
此处记录的 Wiki REST 行为已在 Forgejo
15.0.4+gitea-1.22.0 上进行实时测试;完整的 MCP 演示也已在
16.0.0+gitea-1.22.0 上成功重放。这是已测试的范围,并不保证适用于所有中间版本
或采用不同代理配置的部署。
客户端兼容性
| 客户端 | resources/templates/list | resources/read |
|---|---|---|
| Claude Code | 支持 | 支持 |
| Claude Desktop | 支持 | 支持 |
| Codex | 支持 | 支持 |
| Cursor(当前版本) | 支持 | 支持 |
| 较旧 / 精简客户端 | 仅支持工具 | 仅支持工具 |
演示
上述工具的端到端、可直接复制粘贴的操作指南按主题分组(标签、附件、时间跟踪、通知、组织、有界 I/O 代码审查、传输),请参阅 demos/。每个演示都将实际的 ./forgejo-mcp --cli 调用与其针对 codeberg.org 执行后生成的输出配对展示。
CLI 模式
无需运行 MCP 服务,即可直接从命令行调用任何工具。这适用于 shell 脚本、CI/CD 流水线和 Claude Code 技能。
# List all available tools (grouped by domain)
forgejo-mcp --cli list
# Invoke a tool with JSON arguments
forgejo-mcp --cli get_issue_by_index --args '{"owner":"goern","repo":"forgejo-mcp","index":1}'
# Pipe JSON arguments via stdin
echo '{"owner":"goern","repo":"forgejo-mcp"}' | forgejo-mcp --cli list_repo_issues
# List recent workflow runs (text output)
forgejo-mcp --cli list_workflow_runs \
--args '{"owner":"goern","repo":"forgejo-mcp"}' \
--output=text
# List only failed runs
forgejo-mcp --cli list_workflow_runs \
--args '{"owner":"goern","repo":"forgejo-mcp","status":"failure"}' \
--output=text
# Run-scoped tools (list_action_run_jobs, cancel_workflow_run, ...) take the
# database run ID printed by list_workflow_runs (e.g. #2671), not the per-repo run
# number in the web URL (.../actions/runs/222). To map a web-URL number to a
# run ID, add "run_number":222 to the list_workflow_runs args.
# List jobs and inspect the tail of a failed job (Forgejo v16+)
forgejo-mcp --cli list_action_run_jobs \
--args '{"owner":"goern","repo":"forgejo-mcp","run_id":123}' \
--output=text
forgejo-mcp --cli get_action_job_logs \
--args '{"owner":"goern","repo":"forgejo-mcp","job_id":456,"max_bytes":32768}' \
--output=text
# Forgejo's run-wide ZIP log endpoint has no Range support. Enumerate jobs and
# fetch their bounded plaintext logs instead.
# List artifacts of a run, then read one artifact's metadata (no zip download)
forgejo-mcp --cli list_action_run_artifacts \
--args '{"owner":"goern","repo":"forgejo-mcp","run_id":123,"limit":30}' \
--output=text
forgejo-mcp --cli get_action_artifact \
--args '{"owner":"goern","repo":"forgejo-mcp","artifact_id":789}' \
--output=text
# List package versions for an owner, then inspect one version's files
forgejo-mcp --cli list_packages \
--args '{"owner":"OWNER","type":"container","limit":30}' \
--output=text
forgejo-mcp --cli get_package \
--args '{"owner":"OWNER","type":"container","name":"app","version":"1.0.0"}' \
--output=text
forgejo-mcp --cli list_package_files \
--args '{"owner":"OWNER","type":"container","name":"app","version":"1.0.0"}' \
--output=text
# delete_package removes one version. Do not invoke it against a registry you do not own.
# cancel_workflow_run is 204 even when the run already finished.
# delete_workflow_run only succeeds for a completed run; a live run is an error.
# Show a tool's parameters
forgejo-mcp --cli create_issue --help
# Control output format (json or text)
forgejo-mcp --cli list --output=json
forgejo-mcp --cli get_my_user_info --args '{}' --output=text
CLI 模式要求与 MCP 服务模式使用相同的 FORGEJO_URL 和 FORGEJO_ACCESS_TOKEN 配置。默认情况下,工具结果以 JSON 格式写入 stdout;错误会写入 stderr,并以非零退出代码结束。
配置选项
你可以通过命令行参数或环境变量配置服务:
| CLI 参数 | 环境变量 | 说明 |
|---|---|---|
--url | FORGEJO_URL | Forgejo 实例的 URL |
--token | FORGEJO_ACCESS_TOKEN | 你的个人访问令牌 |
--debug | FORGEJO_DEBUG | 启用调试模式 |
--transport | - | 传输模式:stdio、sse 或 http |
--sse-port | - | SSE 模式的端口(默认:8080) |
--http-port | - | 可流式传输的 HTTP 模式的端口(默认:8080) |
--host | FORGEJO_MCP_HOST | sse 和 http 传输绑定到的地址(默认:localhost,仅本机可访问,同时绑定 127.0.0.1 和 ::1;传入其中一个地址即可仅绑定对应地址族) |
--allowed-hosts | FORGEJO_MCP_ALLOWED_HOSTS | 以逗号分隔的 Host 名称列表,本服务会响应这些名称;当 --host 不是环回地址时必须设置 |
--allowed-origins | FORGEJO_MCP_ALLOWED_ORIGINS | 允许发送 Origin 标头的 Web 来源,以完整来源表示(https://console.example.org)。默认为空 |
--allow-operator-token-fallback | FORGEJO_MCP_ALLOW_OPERATOR_TOKEN_FALLBACK | 在 sse/http 模式下,使用本服务自身的令牌处理未带 Authorization 标头的请求。默认关闭 |
--heartbeat | FORGEJO_MCP_HEARTBEAT | sse/http 向通知流写入 JSON-RPC ping 的间隔,以便客户端和具有空闲超时的代理保持连接(默认:30s;0 表示不发送) |
--auth-mode | FORGEJO_MCP_AUTH_MODE | passthrough(默认)或 resource-server;参见作为 OAuth 资源服务器进行远程操作 |
--authorization-server | FORGEJO_MCP_AUTHORIZATION_SERVER | resource-server 模式:OpenID Connect 提供方的签发者 URL,逐字节比较 |
--resource | FORGEJO_MCP_RESOURCE | resource-server 模式:MCP 端点的规范 URI,例如 https://mcp.example.org/mcp;其路径必须为 /mcp |
--resource-audience | FORGEJO_MCP_RESOURCE_AUDIENCE | resource-server 模式:访问令牌的 aud 必须包含的值(默认:--resource 的值) |
--scopes-supported | FORGEJO_MCP_SCOPES_SUPPORTED | resource-server 模式:元数据和 401 挑战中发布的、以空格分隔的范围(默认:不发布任何范围) |
--forgejo-audience-claim | FORGEJO_MCP_FORGEJO_AUDIENCE_CLAIM | resource-server 模式:包含调用方 Forgejo Authorized Integration 受众的访问令牌声明(默认:forgejo_aud) |
--forgejo-jwt-issuer | FORGEJO_MCP_FORGEJO_JWT_ISSUER | resource-server 模式:服务为 Forgejo 签署 JWT 时使用的签发者 URL,例如 https://mcp.example.org/issuer;必须使用 https,且末尾不能有斜杠 |
--forgejo-jwt-signing-key-file | FORGEJO_MCP_FORGEJO_JWT_SIGNING_KEY_FILE | resource-server 模式:用于为 Forgejo 签署 JWT 的 PEM 私钥(EC P-256 或 P-384、Ed25519,或至少 2048 位的 RSA) |
--forgejo-jwt-published-key-files | FORGEJO_MCP_FORGEJO_JWT_PUBLISHED_KEY_FILES | resource-server 模式:以逗号分隔的 PEM 密钥列表,与签名密钥一同发布,用于密钥轮换 |
--cli | - | 进入 CLI 模式,直接调用工具 |
--user-agent | FORGEJO_USER_AGENT | HTTP User-Agent 标头(默认:forgejo-mcp/<version>) |
| - | FORGEJO_MCP_ALLOW_FILE_PATH_UPLOAD | 允许 file_path 附件上传读取主机文件系统(1/true/yes/on;默认关闭) |
| - | FORGEJO_MCP_UPLOAD_ROOT | 将 file_path 上传限制在此目录内(默认:进程可读取的任意位置) |
命令行参数优先于环境变量。
在 passthrough 模式下,不允许使用 resource-server 设置;因此,如果配置了这些设置却忘记指定 --auth-mode resource-server,服务将无法启动。
从主机文件系统上传附件
create_issue_attachment、create_comment_attachment 和
create_release_attachment 接受 base64 content,也接受运行
forgejo-mcp 的机器上的 file_path。使用路径形式可避免通过 MCP 传输扩展
大型发布制品的 base64 数据。
默认关闭,因为这会让 MCP 客户端所控制的任何对象都能读取服务器进程可读取的任意文件——遭到提示词注入的 Agent 可能会将 ~/.ssh/id_ed25519 上传为公开的发布资产。请谨慎启用,并尽量限制其访问范围:
export FORGEJO_MCP_ALLOW_FILE_PATH_UPLOAD=1
export FORGEJO_MCP_UPLOAD_ROOT=/home/you/build/dist # optional but recommended
设置 FORGEJO_MCP_UPLOAD_ROOT 后,若路径解析到该目录之外——无论是因为路径为绝对路径、包含 ..,还是经过符号链接——都会在读取任何内容之前被拒绝。base64 content 上传不受这两个变量的影响。
验证发布版本
发布归档附带 checksums.txt 文件,以及可选的 checksums.txt.sig 文件;后者由 cosign 使用项目的发布密钥对生成。验证这两个文件,即可确认你下载的二进制文件由项目的发布流水线构建,且在传输过程中未遭篡改。
注意: cosign 签名于 2026 年年中引入。签名机制接入前发布的标签不会附带
.sig文件——验证仅适用于v2.23.x及之后的版本,且仅限发布时已配置COSIGN_PRIVATE_KEY密钥的情况。
1. 安装 cosign
请按照适用于你平台的上游 cosign 安装指南 进行安装。快速安装方式:
# Linux/macOS — pinned binary
COSIGN_VERSION=v2.4.1
curl -sSfL -o /usr/local/bin/cosign \
"https://github.com/sigstore/cosign/releases/download/${COSIGN_VERSION}/cosign-linux-amd64"
chmod +x /usr/local/bin/cosign
# macOS via Homebrew
brew install cosign
# Arch Linux
sudo pacman -S cosign
确认安装:
cosign version
2. 获取公钥
cosign 公钥的权威来源是
op1st-emea-b4mad
GitOps 仓库——它也是在运行发布流水线的 op1st-pipelines 命名空间中配置
cosign-signing-key-artifacts Secret 的唯一可信来源。这是用于签署发布文件(checksums.txt.sig)的制品签名密钥,与下文第 5–6 节中使用的镜像签名密钥 cosign-signing-key-images.pub 不同。获取方式有两种:
分支最新版本(实时更新,跟随未来的密钥轮换):
curl -sSfL -o cosign.pub \
https://codeberg.org/operate-first/op1st-emea-b4mad/raw/branch/main/manifests/applications/op1st-pipelines-tokens/cosign-signing-key-artifacts.pub
固定到特定提交(可检测篡改,推荐用于 CI/脚本):
curl -sSfL -o cosign.pub \
https://codeberg.org/operate-first/op1st-emea-b4mad/raw/commit/cd3715fa8283a2069a2e3e299744a7b55b1b0260/manifests/applications/op1st-pipelines-tokens/cosign-signing-key-artifacts.pub
固定到提交的永久链接会将文件内容的哈希值纳入 URL——如果有人重写该提交中的文件,下载就会失败或内容不匹配。在自动化中采用此密钥之前,请固定到你信任的最新提交。
3. 下载发布制品
选择你安装的标签(例如 v3.1.0),并下载校验和文件、其签名和二进制归档:
TAG=v3.1.0
VERSION="${TAG#v}"
BASE="https://git.b4mad.industries/agentic-forges/forgejo-mcp/releases/download/${TAG}"
curl -sSfLO "${BASE}/forgejo-mcp_${VERSION}_checksums.txt"
curl -sSfLO "${BASE}/forgejo-mcp_${VERSION}_checksums.txt.sig"
curl -sSfLO "${BASE}/forgejo-mcp_${VERSION}_linux_amd64.tar.gz" # adjust os/arch
4. 验证签名,然后验证校验和
Cosign 会验证 checksums.txt 是否由持有与 cosign.pub 匹配的私钥的人签名。信任校验和文件后,再通过普通的 sha256sum -c 检查确认归档的完整性。
# Verify checksums.txt against the signature.
cosign verify-blob \
--key cosign.pub \
--signature "forgejo-mcp_${VERSION}_checksums.txt.sig" \
"forgejo-mcp_${VERSION}_checksums.txt"
# Expected: "Verified OK"
# Verify the downloaded archive against the (now-trusted) checksums.
sha256sum --ignore-missing -c "forgejo-mcp_${VERSION}_checksums.txt"
# Expected: "<archive>: OK"
校验和链会传递覆盖 SBOM 和其他按归档提供的资产——验证一次 checksums.txt,即可验证其中列出的所有内容。
5. 验证 release-tools 镜像的 SLSA 来源证明
release-tools 容器镜像(供 Tekton 发布流水线内部使用)携带由 Tekton Chains 生成的 SLSA v1.0 来源证明。此证明将镜像摘要绑定到生成该镜像的确切 PipelineRun、git 提交和构建器身份,提供超出 cosign 签名本身可证明范围的供应链来源信息。
获取 cosign-signing-key-images 公钥(与上文的制品签名密钥不同):
curl -sSfL -o cosign-images.pub \
https://codeberg.org/operate-first/op1st-emea-b4mad/raw/branch/main/manifests/applications/op1st-pipelines-tokens/cosign-signing-key-images.pub
针对指定镜像标签验证证明:
IMAGE_TAG=v1.0.0 # substitute the release-tools tag you want to verify
cosign verify-attestation \
--type slsaprovenance \
--key cosign-images.pub \
"codeberg.org/operate-first/release-tools:${IMAGE_TAG}" \
| jq .
成功运行后会打印解码后的 in-toto 声明(JSON)。请检查 predicate.buildDefinition.externalParameters.runSpec.params 是否引用预期的 git 修订版本,并确认 predicate.runDetails.builder.id 显示的是 Tekton Chains 构建器。
注意: SLSA 来源证明适用于 forgejo-mcp-46j(Tekton Chains 支持)合并后构建的发布版本。更早的镜像标签仅携带 cosign 签名;它们没有
verify-attestation载荷。
6. 验证容器镜像
git.b4mad.industries/agentic-forges/forgejo-mcp 应用镜像(选项 D)由与 release-tools 镜像相同的 cosign-signing-key-images 密钥签名,附带 CycloneDX SBOM,并通过 Tekton Chains 获取 SLSA v1.0 来源证明。请重用上文获取的 cosign-images.pub 密钥。
验证签名:
IMAGE_TAG=v3.1.0 # substitute the release you are pulling
cosign verify \
--key cosign-images.pub \
"git.b4mad.industries/agentic-forges/forgejo-mcp:${IMAGE_TAG}" \
| jq .
验证 SLSA 来源证明:
cosign verify-attestation \
--type slsaprovenance \
--key cosign-images.pub \
"git.b4mad.industries/agentic-forges/forgejo-mcp:${IMAGE_TAG}" \
| jq .
验证并下载已签名的 CycloneDX SBOM 证明:
cosign verify-attestation \
--type cyclonedx \
--key cosign-images.pub \
"git.b4mad.industries/agentic-forges/forgejo-mcp:${IMAGE_TAG}" \
| jq -r '.payload | @base64d | fromjson | .predicate' > forgejo-mcp.cdx.json
SBOM 现在是已签名的 in-toto 证明(
cosign attest),而不是未签名的attach sbom制品。cosign download sbom已不再适用。
由于发布流水线按摘要推送镜像,并且只有在签名和附加 SBOM 成功后才会提升 vX.Y.Z / latest 标签,因此你能拉取的任何标签都保证已签名。
验证故障排查
Error: no matching signatures—.sig文件来自其他发布版本,或者cosign.pub密钥不正确。请从同一个标签重新下载两者。Error: cannot read file: checksums.txt.sig— 发布版本早于启用 cosign 签名的时间,或者由于该次运行未设置密钥,签名被跳过。请退回到仅验证校验和(sha256sum -c);这仍能检测传输过程中的损坏,但无法检测篡改。cosign.pub与签名不匹配 — 请确认你获取的公钥来自包含发布时正在使用的密钥的提交。如不确定,请从branch/main获取。
故障排查
启用调试模式以查看详细日志:
forgejo-mcp --transport sse --url <url> --token <token> --debug
或者设置环境变量:
export FORGEJO_DEBUG=true
自定义 User-Agent:如果你的 Forgejo 实例或代理屏蔽默认的 go-http-client user agent,请设置自定义值:
# Via environment variable
export FORGEJO_USER_AGENT="forgejo-mcp/1.0.0"
# Or via CLI flag
forgejo-mcp --user-agent "forgejo-mcp/1.0.0" --transport sse --url <url> --token <token>
获取帮助
- 报告问题 — 错误、疑问、功能请求
- 发现安全问题? 请勿使用问题跟踪器。有关如何私下报告,请参阅 SECURITY.md。
- 查看源代码
- 在 Matrix 上交流 —
#forgejo-mcp:b4mad.net
此仓库也镜像在 Radicle 上,这是一个点对点代码协作网络。使用以下命令克隆:
rad clone rad:z4PdPpsH9iJQcWfqTbxpFcWaZ9zPL
面向开发者
请参阅 DEVELOPER.md,了解构建说明、架构概览和贡献指南。
已知问题
-
从旧的 Codeberg 模块路径安装 —
go install codeberg.org/goern/forgejo-mcp/v2@latest仍然可以解析,但会指向只读镜像,而该镜像落后于当前版本。请改用git.b4mad.industries/agentic-forges/forgejo-mcp/v3@latest。此条目之前提到,在某个版本包含重命名后的
go.mod之前,新路径无法安装。该版本现已发布 — 从v3.0.0起,声明的模块路径为module git.b4mad.industries/agentic-forges/forgejo-mcp/v3— 因此新路径可以正常安装。此前由replace指令导致的阻碍(#67) 也已解决;go.mod中不再包含该指令。
贡献者
forgejo-mcp 的发展离不开每一位提交问题、编写代码、审查 PR 并推动项目向前发展的贡献者。感谢大家。🙏
代码贡献者
| 贡献者 | 亮点 |
|---|---|
| goern(Christoph Görn) | 项目创建者和维护者 |
| Ronmi Ren | 联合创建者;SSE/HTTP 传输、问题阻塞、CI/CD 改进、徽标、Glama 规范 |
| twstagg(Tristin Stagg) | 支持配置用户代理(PR #89) |
| mattdm(Matthew Miller) | 日志改进、FORGEJO_* 迁移、README、URL 重构 |
| byteflavour | check_notifications + 完整的通知管理 API(PR #84、#86);HTTP/SSE 传输的无状态逐请求身份验证(PR #138);NixOS 安装文档(PR #146);网络传输加固——默认绑定到回环地址、Host/Origin 检查、逐请求凭据(PR #545,合入为 #573;#586、#585、#589);OAuth 资源服务器模式——入站 JWT 验证和出站 Forgejo 16 Authorized Integration 签名,附带运维人员和用户指南以及 40 个带锚点的演示场景(PR #584,研究见 #582);开发环境 FORGEJO_MCP_EXEC(PR #580);功能请求 #80、#85 |
| jesterret | 支持拉取请求评审和评论(PR #51) |
| appleboy | 支持自定义 SSE 端口、错误修复 |
| ignasgil | remove_issue_labels 工具(PR #96) |
| dmikushin(Dmitry Mikushin) | 修复从 MCP 客户端解析字符串编码的数字参数的问题(PR #93) |
| jiriks74 | 更新 mcp-go v0.44.0 依赖项(PR #90) |
| th(Tomi Haapaniemi) | update_pull_request 工具 |
| hiifong | 早期错误修复和更新 |
| Lunny Xiao | 早期贡献 |
| techknowlogick | 早期贡献 |
| yp05327 | 早期贡献 |
| mw75 | 支持在创建仓库时指定所有者/组织(PR #18) |
| Dax Kelson | 问题评论管理(PR #34) |
| Guruprasad Kulkarni | Arch Linux AUR 安装文档(PR #69) |
| Mario Wolff | 贡献 |
| Massimo Fraschetti | 贡献 |
| synath(David Paul Turley) | 通过 ServerVersion 探测支持仓库级令牌(PR #112);合并时检查状态码(PR #113);Claude Desktop Extension(.mcpb)打包(PR #118、#123);问题 due_date + 服务端排序(PR #483);有界的问题列表和评论串资源(PR #487);分页封套中的 total_count 取自 X-Total-Count(PR #507);增强 create_*_attachment 的超时处理(PR #534、#536);跨仓库问题依赖关系(PR #535) |
| BrilliantKahn | get_file_content 默认返回纯文本(PR #116);list_repo_contents 和 get_repo_tree 工具(PR #117)。首次开源贡献——欢迎加入!🎉 |
| nesvet(Eugene Nesvetaev) | get_repo/edit_repo(PR #527);仓库主题工具(PR #528);取消/删除 Actions 运行以及获取运行构件(PR #533);get_commit_statuses(PR #542);软件包列表/获取/删除/文件工具(PR #543);创建问题、分配问题和替换标签时可使用标签名称(PR #591);创建、编辑和读取标签时支持 exclusive 和 is_archived(PR #592) |
| pisco(Marco Pisco) | 为问题、评论和发行版附件上传支持 file_path,并使用流式 multipart 处理,因此大型发行版资源不再需要经 base64 往返转换(PR #481) |
| paulgit(Paul Git) | 为每个工具声明准确的 MCP 注释和标题,并在 DEVELOPER.md 中提供分类准则(PR #633,取代 #602) |
| derliebemarcus(Marcus Pauli) | change_files 原子多文件提交,以及 create_file/update_file 中支持二进制安全的 content_base64(PR #628);apply_diff_patch 原生差异补丁写入(PR #629) |
| MaherMakerHallerErne(Maher Al Sairawan) | 问题依赖关系工具——list_issue_dependencies、list_issue_dependents、add_issue_dependency、remove_issue_dependency——遵循正确的 Forgejo API 契约(PR #335) |
| woozar(Johannes Herrmann) | 通过直接 REST API 支持 Wiki——页面列表/获取/创建/更新/删除和修订,并强化契约和分页处理(PR #379) |
| dismantl(Dan Staples) | 有界的 Forgejo v16+ 工作流作业日志——list_action_run_jobs、get_action_job_logs(PR #378) |
| matheusalves96(Matheus Alves) | 仓库和组织 Actions 密钥工具——列表、创建或更新、删除(PR #605) |
社区贡献者
提出问题并参与讨论、共同塑造项目发展方向的人:
| 贡献者 | 贡献 |
|---|---|
| byteflavour | 提交了 #80(发现里程碑/标签)、#85(通知 API 提案);积极参与讨论并担任评审 |
| choucavalier | 提交了 #82(修复技能)、#70(macOS arm64 版本)、#62(二进制版本和 mise 支持) |
| MalcolmMielle | 提交了 #59(PR 评审工具——现已实现) |
| redbeard | 提交了 #60(Actions 支持——现已实现) |
| c6sepl6p | 提交了 #72(base64 编码)、#54(合并拉取请求——现已实现) |
| malik | 提交了 #73(版本标志)、#47(修复 Nix 构建) |
| a2800276 | 提交了 #74(OpenAI 兼容性) |
| simenandre | 提交了 #49(go install 支持) |
| BasdP | 提交了 #42(Projects 支持) |
| BoBeR182 | 提交了 #32(wiki 支持) |
| ignasgil | 提交了 #95(remove_issue_labels 功能请求) |
| Vokuar | 提交了 #99(支持 streamable HTTP 传输) |
| janbaer | 提交了 #98(回复评审评论) |
| fraschm98 | 早期问题报告 |
| heathen711 | 提交了 #106(问题/评论附件——现已实现);参与设计 1 MiB 内嵌上限和 browser_download_url 回退方案 |
| decarvalhoaa (Antonio De Carvalho) | 基于 Open WebUI 后端发生的真实上下文窗口溢出问题,提交了 #593(服务端响应大小上限),并提供测量数据,促成了 #596 中 list_repo_pull_requests 的负载调整 |
| chris420 (Chris Oloff) | 提交了 #452(组织范围的问题搜索——现已作为 search_issues 实现);在 PR #458 中参与设计评审,推动以实例上限强制机制取代下一页探测,并发现响应封装错误地报告了自身的 limit |
赛博格贡献者
本项目也收到了 AI 编码 Agent 的贡献——这些贡献以常规 PR 的形式提交,并由人工评审:
| Agent | 角色 | 贡献 |
|---|---|---|
| brenner-axiom (b4-dev, B4arena) | AI 开发 Agent | 组织管理工具(PR #94);showboat 演示(PR #97);list_repo_milestones、list_repo_labels 工具(PR #83);竞态条件修复(PR #78);贡献者文档(PR #87、#88);提交了 #76;代码评审 |
| opencode | AI 开发 Agent | 支持拉取请求评审和评论(PR #51) |
| claude-code | AI 开发 Agent | 与 BrilliantKahn 合作,提供 get_file_content 纯文本默认行为以及 list_repo_contents/get_repo_tree 工具(PR #116、#117) |
| b4mad-release-agent | 发布自动化 | 自动生成变更日志并添加发布标签 |
| the #B4mad Renovate bot | 依赖更新 | 自动升级依赖项 |
想要贡献?欢迎提交问题或拉取请求,所有贡献都受欢迎。
许可证
本项目为开源项目。许可证详情请参阅代码库。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。