mcpField
F
Forgejo MCP Server

Forgejo MCP Server

ローカル
codeberg.orgバージョン管理1491 日前に更新

Forgejo MCP Server について

Forgejo MCP Server は REST API を介して、MCP 対応アシスタントを Forgejo インスタンスに接続します。リポジトリ、Issue、プルリクエスト、ファイル、Actions のワークフローを扱い、複数のトランスポートに対応します。

主な機能

  1. 01リポジトリの閲覧と管理
  2. 02Issue の作成と確認
  3. 03プルリクエストの管理
  4. 04リポジトリファイルの読み取り
  5. 05Actions ワークフロー実行の確認

活用シーン

  1. 01AI アシスタントでリポジトリを一覧表示
  2. 02リポジトリの Issue を作成・確認
  3. 03未解決のプルリクエストを確認
  4. 04ブランチ内のファイルを読み取り

MCP 対応

Forgejo REST API の操作を 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 エージェントのどちらからの貢献も歓迎します。

git clone https://git.b4mad.industries/agentic-forges/forgejo-mcp.git

forgejo.b4mad.net を指すリモートやブックマークがある場合、これは以前の名前で運用されていた同じフォージです。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) システムを接続する統合プラグインです。設定すると、Claude、Cursor、VS Code 拡張機能など、MCP 対応の AI アシスタントから Forgejo リポジトリを操作できます。

使用できるコマンドの例:

  • 「自分のリポジトリをすべて一覧表示して」
  • 「タイトルが『Bug in login page』の課題を作成して」
  • 「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. アクセストークンを取得
  1. Forgejo インスタンスにログインします
  2. Settings → Applications → Access Tokens に移動します
  3. 必要な権限(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"
      }
    }
  }
}

streamable HTTP モードの場合(リモート/Claude.ai での利用に推奨):

{
  "mcpServers": {
    "forgejo": {
      "url": "http://localhost:8080/mcp"
    }
  }
}

streamable HTTP モードを使用する場合は、先にサーバーを起動します。

forgejo-mcp --transport http --url https://your-forgejo-instance.org --token <your-token>

マルチテナント HTTP モード(任意):

単一の集中管理された forgejo-mcp インスタンスを実行し、各クライアントが標準の HTTP Authorization ヘッダーを使って独自のトークンを渡すことができます。これにより、1 つのサーバーから複数のユーザーまたはエージェントにサービスを提供できます。

  1. サーバーを起動します(グローバルトークンなしでも起動できます)。
    forgejo-mcp --transport http --url https://your-forgejo-instance.org
    
  2. クライアントは各リクエストに固有のトークンを含めます。
    • 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 クライアントは 6 分後に接続を中断します。そのため、サーバーは --heartbeat の間隔(デフォルトは 30s)ごとに、ストリームへ JSON-RPC の ping を書き込みます。以前のように無通信に戻すには、--heartbeat 0 を設定します。

OAuth リソースサーバーとしてのリモート運用

--auth-mode resource-server を指定すると、MCP 認可仕様の定義に従い、http トランスポートが OAuth 2.0 リソースサーバーになります。クライアントは Forgejo トークンを送信しなくなります。選択した OpenID Connect プロバイダーにログインし、そのプロバイダーの JWT アクセストークンを送信します。サーバーはそのトークンを検証し、呼び出し元向けの有効期間が 5 分の JWT に署名して、Forgejo 16 の Authorized Integration を通じて Forgejo に提示します。Forgejo トークンを設定する必要はなく、呼び出し元のアクセストークンが Forgejo に届くこともありません。

このモードには、次のものが必要です。

  • Forgejo 16.0 以降。
  • JWT アクセストークンを発行し、ユーザーごとのクレーム(デフォルトは forgejo_aud)を追加できる OpenID Connect プロバイダー。そのクレームには、そのユーザーの Authorized Integration のオーディエンスが格納されます。
  • サーバーの公開 HTTPS オリジン。Forgejo がそこからサーバーの issuer ドキュメントを取得するためです。
  • 署名鍵ファイル: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、保護されたリソースのメタデータ、および issuer パス配下のディスカバリードキュメントとキーセットにのみ応答します。安全に提供できない構成では起動を拒否し、修正が必要な設定を示します。署名鍵は、issuer を信頼するすべてのユーザーのために使われるため、置き換え対象となる Forgejo トークンと同様に厳重に管理してください。

  • 運用者ガイド:ID プロバイダーの要件、デプロイの順序、プロキシのルール、鍵のローテーション、Zitadel を使った詳細な例。
  • ユーザーガイド:Authorized Integration の作成、必須の sub クレームルール、MCP クライアントの設定。
4. 使い始める

MCP 対応の AI アシスタントを開いて、次を試してください。

List all my repositories

利用可能なツール

ツール説明
ユーザー
get_my_user_info認証済みユーザーの情報を取得します
check_notificationsユーザー通知を確認して一覧表示します
get_notification_thread1件の通知スレッドの詳細情報を取得します
mark_notification_read1件の通知スレッドを既読にします
mark_all_notifications_readすべての通知を確認済みにします
list_repo_notifications1つのリポジトリに絞り込んで通知を一覧表示します
mark_repo_notifications_read特定のリポジトリのすべての通知を既読にします
search_usersユーザーを検索します
リポジトリ
list_my_repos自分が所有するすべてのリポジトリを一覧表示します
get_repo所有者と名前を指定してリポジトリを1つ取得します
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トピックを1つ追加します
delete_repo_topicトピックを1つ削除します
ブランチ
list_branchesリポジトリ内のすべてのブランチを一覧表示します
create_branch新しいブランチを作成します
delete_branchブランチを削除します
ブランチ保護
list_branch_protectionsリポジトリのブランチ保護ルールを一覧表示します。page(1始まり)+limit(ページサイズ)の範囲で取得します。レスポンスにはpage/limitが含まれるため、呼び出し側は次のページを取得できます。
get_branch_protectionrule名でルールを1つ取得します
create_branch_protectionルールを作成します。branch_nameが必要です。status_check_contextsには、必須チェックのカンマ区切りリスト(例:"ci/build,ci/test")を指定します。
edit_branch_protectionrule名でルールを編集します。渡したフィールドのみが変更され、省略したフィールドは変更されません。
delete_branch_protectionrule名でルールを削除します
Webhook
list_repo_hooksリポジトリのWebhookを一覧表示します。page(デフォルトは1)+limit(デフォルトは30、サーバーによる上限なし)の範囲で取得し、ForgejoがX-Total-Countを返す場合はtotal_countも返します。
get_repo_hookIDでリポジトリのWebhookを1つ取得します
create_repo_hookリポジトリのWebhookを作成します。シークレットは受け付けますが、レスポンスには決して含まれません。
edit_repo_hookリポジトリのWebhookを編集します。渡したフィールドのみが変更され、省略したフィールドは変更されません。
delete_repo_hookIDでリポジトリのWebhookを削除します
test_repo_hookリポジトリのWebhookにテスト配信を実行します — 警告:実際のHTTP配信が発生します
ファイル
get_file_contentファイルの内容を取得します。任意のstart_line/end_lineで、1始まりの両端を含む行範囲を指定できます(ファイルの範囲内に収まるよう調整され、with_metadata=trueの場合は無視されます)。
list_repo_contentsパスにあるファイルとディレクトリを一覧表示します。path=""を指定するとリポジトリのルートを一覧表示します。1階層分を返します。ツリー全体を取得するには、recursive=trueでget_repo_treeを使用します。
get_repo_treeGitツリーを取得します。recursive=trueを指定すると、1回のレスポンスでファイルツリー全体を返します(サーバーのツリーエンドポイントのサイズ上限に従います)。recursive=false(デフォルト)では1階層分を返します。
create_file新しいファイルを作成します。プレーンテキストのcontentまたはバイナリーセーフなcontent_base64(標準Base64形式のみ)のどちらか一方を指定します。
update_file既存のファイルを更新します。プレーンテキストのcontentまたはバイナリーセーフなcontent_base64(標準Base64形式のみ)のどちらか一方を指定します。
delete_fileファイルを削除します
change_filesネイティブのForgejoコミット1件で複数のファイルをアトミックに作成、更新、削除します。作成/更新操作ではcontentまたはcontent_base64を指定できます。
コミット
list_repo_commitsリポジトリ内のコミットを一覧表示します
get_commit_statuses40文字の完全なSHAを指定して、コンテキストごとのコミットステータスを一覧表示します。page(デフォルトは1)+limit(デフォルトは30、最大50)の範囲で取得し、{sha, statuses, page, limit, count, total_count}を返します。total_countはForgejoがX-Total-Countを返す場合のみ含まれます。集計ステータスはコミットステータスリソースに含まれます。Actionsの実行ではありません(list_workflow_runs)。
課題
list_repo_issuesリポジトリの課題を一覧表示します(page/limit)。任意のsortでサーバー側の並べ替えを指定できます:relevance、latest、oldest、recentupdate、leastupdate、mostcomment、leastcomment、nearduedate、farduedate(最後の2つは期限による並べ替え方向です)。
search_issues1人の所有者が持つすべてのリポジトリを対象に課題を検索します(page/limit)。{issues,page,limit,count,has_next,total_count}を返します。total_countはForgejoがX-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_milestonesID付きでマイルストーンを一覧表示します(update_issueと併用)
list_repo_labelsID付きでラベルを一覧表示します。組織所有のリポジトリでは組織レベルのラベルも統合されます(含めない場合はinclude_org_labels=falseを設定)。各項目にはscopeフィールド("repo"または"org")と、exclusiveおよびis_archived(falseも省略されずに含まれます)が含まれます。
list_org_labelsID付きで組織レベルのラベルを一覧表示します。割り当てツールではラベル名を直接指定できるため、このツールはラベルの確認と、リポジトリと組織の両方のスコープに同じ名前が存在するまれなケースに使用します。各項目にはexclusiveとis_archivedが含まれます。
create_repo_labelリポジトリラベルを作成します(name、6桁の16進数形式の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でリポジトリラベルを1つ取得します。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で組織レベルのラベルを1つ取得します。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プルリクエストをマージします(方式:merge/rebase/rebase-merge/squash。任意のtitle/message/delete-branch/force-merge/wait-for-checksを指定できます)。
create_pull_reviewプルリクエストのレビューを作成します(状態:APPROVED/REQUEST_CHANGES/COMMENT)。任意でインラインコメントを指定できます。
submit_pull_review保留中のプルリクエストレビューを送信します
dismiss_pull_reviewプルリクエストのレビューを却下します
delete_pull_review保留中のプルリクエストレビューを削除します
create_review_requests特定のユーザーまたはチームにレビューを依頼します
delete_review_requests保留中のレビュー依頼を取り消します
パッケージ
list_packagesユーザーまたは組織のパッケージバージョンを一覧表示します(バージョンごとに1行)。任意でtypeとqを指定できます。サーバー側でpage/limitによるページネーションを行います(デフォルトは30、最大50)。エンベロープは{packages, page, limit, count, has_next, total_count?}です。所有者が存在しない場合は空のリストではなくエラーになります
get_packageパッケージバージョンを1つ取得します。所有者/作成者のユーザー情報は埋め込まれません
delete_packageパッケージバージョンを1つ削除します(同名のすべてのバージョンではありません)。事前確認は行いません。4xx/5xxはエラーのまま返されます
list_package_filesパッケージバージョン1つのファイルを一覧表示します。クライアント側でpage/limitによるページネーションを行います(デフォルトは30、最大50)。エンベロープは{files, page, limit, count, has_next, total_count}です(total_countは取得したリストの長さです)
Actions
dispatch_workflowworkflow_dispatchイベントでワークフロー実行をトリガーします
list_workflow_runsステータス、イベント、実行番号、またはSHAによる任意の絞り込みを行ってワークフロー実行を一覧表示します
get_workflow_runデータベースIDで特定のワークフロー実行の詳細を取得します
list_action_run_jobsクライアント側のpageおよびlimitの範囲指定で、Forgejo v16以降のワークフロー実行のジョブを一覧表示します
get_action_job_logs再開可能なoffsetとmax_bytesの範囲指定で、Forgejo v16以降のジョブログを読み取ります。デフォルトでは末尾を返します
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_artifactActionsアーティファクト1件のメタデータを取得します。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_entryIDで記録済み時間を1件削除します
start_issue_stopwatch課題またはPRのストップウォッチを開始します
stop_issue_stopwatch実行中のストップウォッチを停止し、経過時間を記録します
cancel_issue_stopwatch実行中のストップウォッチを記録せずにキャンセルします
list_my_stopwatches現在実行中のストップウォッチを一覧表示します
添付ファイル
list_issue_attachments課題またはPRの添付ファイルを一覧表示します
get_issue_attachment課題/PRの添付ファイル1件のメタデータを取得します
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コメントの添付ファイル1件のメタデータを取得します
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リリースの添付ファイル1件のメタデータを取得します
download_release_attachmentリリースの添付ファイルをダウンロードします(1 MiB未満の場合はインラインで返し、それ以外はメタデータとURLを返します)
create_release_attachmentリリースに新しい添付ファイルをアップロードします(Base64コンテンツまたはMCPホスト上のファイルパスを指定できます)
edit_release_attachmentリリースの添付ファイルの名前を変更します
delete_release_attachmentリリースの添付ファイルを削除します — 破壊的操作
Wiki
list_wiki_pagespage/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_revisionspage/limitを使ってリビジョン履歴を一覧表示します。has_nextとtotal_countを返します。total_countはレスポンス本文に報告される、そのページのリビジョン総数です。
create_wiki_pageページを作成し、サーバーで正規化されたpage_nameを返します。スラッシュ区切りのタイトルは階層構造のないフラットなサブページの命名規則であり、親ページは自動作成されません。既存のタイトルは上書きされます。
update_wiki_page正規化されたpage_nameで内容/タイトルを更新します。最後に書き込んだ内容が優先されます。
delete_wiki_page正規化されたpage_nameでページを削除します。
サーバー
get_forgejo_mcp_server_versionMCP サーバーのバージョンを取得します

リソース

MCP リソーステンプレートは、forgejo:// スキームを使用して、Forgejo のエンティティを URI で指定可能なリソースとして公開します。URI スキームはインスタンス間でポータブルなため、同じ形式の URI をあらゆる Forgejo インスタンスで使用でき、Forgejo のウェブリンクとも競合しません。resources/templates/list と resources/read に対応するクライアント(Claude Code、Claude Desktop、Codex、Cursor)は、これらの URI を直接解決できます。リソーステンプレートに対応していないクライアントも、引き続き上記のツールを使用できます。機能が削除されることはありません。

リソースが MCP ツールに置き換わることはありません。既存のすべての list/get ツールは引き続き利用できます。リソースは、LLM コンテキストからの自動解決や、コミットなどの不変エンティティのコンテンツアドレス可能なキャッシュを目的として追加された、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}コミットメタデータsha ごとに不変です。JSON と Markdown のサイドカーを返します。sha は 40 桁の 16 進数である必要があります。
forgejo://repo/{owner}/{repo}/commit/{sha}/statusapplication/jsonsha の 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/jsonIssue の上限付きリストを行形式で返します。インデックス、タイトル、状態、作成者、ラベル、担当者、マイルストーン、コメント数、タイムスタンプ、期限を含み、本文は含みません。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 ref、マージ可能性、上限付きの最近のコメント(上限 30 件。続きがある場合の番兵名は list_issue_comments)とレビュー(上限 30 件。続きがある場合の番兵名は list_pull_reviews)を含みます。
forgejo://repo/{owner}/{repo}/branch_protectionsapplication/jsonブランチ保護ルールの上限付きリストです。
forgejo://repo/{owner}/{repo}/branch_protection/{rule}application/json単一のブランチ保護ルールです。ルール名はブランチパターンなので、リテラルの / は %2F、スペースは %20 にエンコードしてください(release%2Fv1)。生の / では解決されません。
forgejo://repo/{owner}/{repo}/hooksapplication/jsonリポジトリの Webhook の上限付きリストです(上限 30 件。続きがある場合の番兵名は list_repo_hooks)。シークレットは返されません。
forgejo://repo/{owner}/{repo}/hook/{id}application/jsonid で指定する単一のリポジトリ 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 サイドカー)上限付きのリビジョンと、1 MiB を上限とする Markdown を含む Wiki ページです。返された正規化済みの 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/listresources/read
Claude Code対応対応
Claude Desktop対応対応
Codex対応対応
Cursor(現行)対応対応
旧式/最小限のクライアントツールのみツールのみ

デモ

上記のツールをエンドツーエンドで解説する、コピー&ペースト可能な手順は、トピック(ラベル、添付ファイル、時間追跡、通知、組織、I/O 範囲を限定したコードレビュー、トランスポート)ごとにまとめられ、demos/ にあります。各デモでは、codeberg.org に対して実行した ./forgejo-mcp --cli の実際の呼び出しと、その出力を組み合わせています。

CLI モード

MCP サーバーを実行せずに、コマンドラインから任意のツールを直接呼び出せます。シェルスクリプト、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 に書き込まれ、終了コードは 0 以外になります。

設定オプション

コマンドライン引数または環境変数を使用してサーバーを設定できます。

CLI 引数環境変数説明
--urlFORGEJO_URLForgejo インスタンスの URL
--tokenFORGEJO_ACCESS_TOKEN個人用アクセストークン
--debugFORGEJO_DEBUGデバッグモードを有効にします
--transport-トランスポートモード:stdio、sse、または http
--sse-port-SSE モードのポート(デフォルト:8080)
--http-port-ストリーミング可能な HTTP モードのポート(デフォルト:8080)
--hostFORGEJO_MCP_HOSTsse と http のトランスポートがバインドするアドレス(デフォルト:localhost。このマシンからのみ到達可能で、127.0.0.1 と ::1 の両方にバインドします。どちらかのアドレスを指定すると、そのアドレスのアドレスファミリーのみにバインドします)
--allowed-hostsFORGEJO_MCP_ALLOWED_HOSTSこのサーバーが応答する Host 名をカンマ区切りで指定します。--host がループバック以外の場合は必須です
--allowed-originsFORGEJO_MCP_ALLOWED_ORIGINSOrigin ヘッダーの送信を許可する Web オリジンを完全なオリジン(https://console.example.org)でカンマ区切りで指定します。デフォルトは空です
--allow-operator-token-fallbackFORGEJO_MCP_ALLOW_OPERATOR_TOKEN_FALLBACKsse/http で、Authorization ヘッダーのないリクエストをこのサーバー自身のトークンで処理します。デフォルトでは無効です
--heartbeatFORGEJO_MCP_HEARTBEATsse/http が通知ストリームに JSON-RPC の ping を書き込む間隔です。アイドルタイムアウトが設定されたクライアントやプロキシが接続を維持できるようにします(デフォルト:30s。0 の場合は送信しません)
--auth-modeFORGEJO_MCP_AUTH_MODEpassthrough(デフォルト)または resource-server。OAuth リソースサーバーとしてのリモート操作を参照してください
--authorization-serverFORGEJO_MCP_AUTHORIZATION_SERVERresource-server モード:OpenID Connect プロバイダーの発行者 URL。バイト単位で比較されます
--resourceFORGEJO_MCP_RESOURCEresource-server モード:MCP エンドポイントの正規 URI。例:https://mcp.example.org/mcp。パスは /mcp である必要があります
--resource-audienceFORGEJO_MCP_RESOURCE_AUDIENCEresource-server モード:アクセストークンの aud に含まれている必要がある値(デフォルト:--resource の値)
--scopes-supportedFORGEJO_MCP_SCOPES_SUPPORTEDresource-server モード:メタデータおよび 401 チャレンジで公開するスコープをスペース区切りで指定します(デフォルトでは何も公開されません)
--forgejo-audience-claimFORGEJO_MCP_FORGEJO_AUDIENCE_CLAIMresource-server モード:呼び出し元の Forgejo Authorized Integration のオーディエンスを格納するアクセストークンのクレーム(デフォルト:forgejo_aud)
--forgejo-jwt-issuerFORGEJO_MCP_FORGEJO_JWT_ISSUERresource-server モード:サーバーが Forgejo 向け JWT に署名する際の発行者 URL。例:https://mcp.example.org/issuer。末尾にスラッシュのない https URL
--forgejo-jwt-signing-key-fileFORGEJO_MCP_FORGEJO_JWT_SIGNING_KEY_FILEresource-server モード:Forgejo 向け JWT に署名する PEM 秘密鍵(EC P-256 または P-384、Ed25519、または 2048 ビット以上の RSA)
--forgejo-jwt-published-key-filesFORGEJO_MCP_FORGEJO_JWT_PUBLISHED_KEY_FILESresource-server モード:鍵のローテーション用に、署名鍵とともに公開する PEM 鍵をカンマ区切りで指定します
--cli-CLI モードに入り、ツールを直接呼び出します
--user-agentFORGEJO_USER_AGENTHTTP User-Agent ヘッダー(デフォルト:forgejo-mcp/<version>)
-FORGEJO_MCP_ALLOW_FILE_PATH_UPLOADfile_path 添付ファイルのアップロードでホストのファイルシステムを読み取ることを許可します(1/true/yes/on。デフォルトでは無効です)
-FORGEJO_MCP_UPLOAD_ROOTfile_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 クライアントを動かすものに、サーバープロセスが読み取れるあらゆるファイルを読み取る権限を与えることになります。プロンプトインジェクションを受けたエージェントが ~/.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 ファイルが付属し、プロジェクトのリリースキーペアを使って cosign で生成された checksums.txt.sig が任意で付属します。両方のファイルを検証すれば、ダウンロードしたバイナリがプロジェクトのリリースパイプラインでビルドされ、転送中に改ざんされていないことを確認できます。

ご注意ください: 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 とは別のものです。取得方法は 2 つあります。

ブランチ先端(最新の状態。今後の鍵のローテーションにも追従します):

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 provenance を検証する

release-tools コンテナイメージ(Tekton リリースパイプラインで内部的に使用)は、Tekton Chains によって生成された SLSA v1.0 provenance を保持しています。このアテステーションは、イメージのダイジェストを、生成に使用された正確な PipelineRun、git コミット、およびビルダー ID に結び付けます。これにより、cosign 署名だけで証明できる範囲を超えたサプライチェーンの provenance を提供します。

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 provenance アテステーションは、Tekton Chains のサポートが導入された forgejo-mcp-46j 以降のリリースで利用できます。それ以前のイメージタグには 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 provenance を取得します。上記で取得した 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 provenance アテステーションを検証します。

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 は、署名なしの attach sbom アーティファクトではなく、署名済みの in-toto アテステーション(cosign attest)になりました。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 ユーザーエージェントをブロックする場合は、カスタムのものを設定してください。

# 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>

ヘルプの利用

このリポジトリは、ピアツーピアのコードコラボレーションネットワークである 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 のリファクタリング
byteflavourcheck_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 ポートのサポート、バグ修正
ignasgilremove_issue_labels ツール(PR #96)
dmikushin (Dmitry Mikushin)MCP クライアントから渡される文字列形式の数値パラメーターの解析を修正(PR #93)
jiriks74mcp-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 KulkarniArch 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)。X-Total-Count に基づくページネーション付きエンベロープの total_count(PR #507)。create_*_attachment のタイムアウト強化(PR #534、#536)。リポジトリをまたぐ課題の依存関係(PR #535)
BrilliantKahnget_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 からアップロード。ストリーミング形式のマルチパート処理により、大きなリリースアセットを 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(ストリーミング可能な 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 コーディングエージェントからの貢献もありました。通常の PR として提出され、人間がレビューしています。

エージェント役割貢献内容
brenner-axiom (b4-dev, B4arena)AI 開発エージェント組織管理ツール(PR #94)、showboat のデモ(PR #97)、list_repo_milestones および list_repo_labels ツール(PR #83)、競合状態の修正(PR #78)、貢献者向けドキュメント(PR #87、#88)を作成。#76 を報告し、コードレビューも実施
opencodeAI 開発エージェントプルリクエストのレビューとコメントのサポート(PR #51)
claude-codeAI 開発エージェントBrilliantKahn と共同で、get_file_content のプレーンテキストをデフォルトに設定し、list_repo_contents/get_repo_tree ツールを追加(PR #116、#117)
b4mad-release-agentリリース自動化変更履歴の作成とリリースタグ付けを自動化
the #B4mad Renovate bot依存関係の更新依存関係のアップグレードを自動化

貢献してみませんか?課題またはプルリクエストを作成してください。どなたでも歓迎します。

ライセンス

このプロジェクトはオープンソースです。ライセンスの詳細については、リポジトリをご覧ください。

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。