hiragramhiragram

claude-code-actionの設定でsettings.json側にmcp__github_inline_comment__create_inline_commentを許可してもMCPサーバーが起動しない件を調べた

2026-01-11


何が起きたか

claude-code-action をコードレビューなど複数のジョブで使っていて、ジョブ定義にツールの使用許可などを個別に書くのが面倒だったので .claude/settings.jsonを参照させるように設定していた。

- uses: anthropics/claude-code-action@v1
  with:
    settings: .claude/settings.json

そして、この記事を参考に、PRにインラインコメントを付けさせたくて settings.json にこう書いた。

// .claude/settings.json
{
  "permissions": {
    "allow": ["mcp__github_inline_comment__create_inline_comment"]
  }
}

そして適当なPR上のコメントでClaudeに「インラインコメント使える?」と聞いたら「そんなツール知らない」と言われた。

update_claude_comment は使えるのに、なぜ?

結論

settings.json に書いても MCP サーバーが起動しない。 claude_args に書く必要がある。

# これなら動く
claude_args: "--allowed-tools mcp__github_inline_comment__create_inline_comment"

なぜこうなるのか

settings と claude_args は別ルートで処理される

yaml inputs
    │
    ├─► settings ─► base-action で ~/.claude/settings.json に書き込み
    │                (Claude Code 起動後に読み込まれる)
    │                → ツール許可には使われる
    │                → MCPサーバー起動判定には使われない ❌
    │
    └─► claude_args ─► tag/agent mode で parseAllowedTools()
                       ─► prepareMcpConfig() に渡される
                       ─► MCPサーバー起動判定に使用 ✅

settings.json は Claude Code が起動した後に読み込まれるが、MCPサーバーを起動するかどうかの判定はその前に終わっている。

該当コード

src/modes/tag/index.ts:142-145:

const userClaudeArgs = process.env.CLAUDE_ARGS || "";
const userAllowedMCPTools = parseAllowedTools(userClaudeArgs).filter(
  (tool) => tool.startsWith("mcp__github_"),
);

CLAUDE_ARGS(= yaml の claude_args)からしか取得していない。settings は参照されていない。

この userAllowedMCPToolsprepareMcpConfig() に渡され、MCPサーバー起動の判定に使われる。

src/mcp/install-mcp-server.ts:138-141:

if (
  isEntityContext(context) &&
  context.isPR &&
  (hasGitHubMcpTools || hasInlineCommentTools)  // ← ここで判定
) {
  baseMcpConfig.mcpServers.github_inline_comment = { ... };
}

allowedToolsmcp__github_inline_comment__* がないと、サーバー自体が起動しない。

なぜ update_claude_comment は動くのか

github_comment サーバーは特別扱いされており、tag mode なら常に起動する。

const shouldIncludeCommentServer = !isAgentMode || hasGitHubCommentTools;

そのため settings.json に書かなくても使える。

現状の対処法

settings.json と claude_args の両方に書く。冗長だが仕方ない。

- uses: anthropics/claude-code-action@v1
  with:
    settings: .claude/settings.json
    claude_args: "--allowed-tools mcp__github_inline_comment__create_inline_comment"

これはバグ?

個人的にはバグというより、設計の問題だと思う。

ユーザーから見ると「ツールを許可する設定」は一箇所にまとめたいが、実際は2つのルートがあり、片方だけ書いても動かない。

直すなら、ALL_INPUTS 環境変数から settings を読み、permissions.allow の中身も MCPサーバー起動判定に使うようにすればよいのかなあ。

このエントリーをはてなブックマークに追加

Post