何が起きたか
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 は参照されていない。
この userAllowedMCPTools が prepareMcpConfig() に渡され、MCPサーバー起動の判定に使われる。
src/mcp/install-mcp-server.ts:138-141:
if (
isEntityContext(context) &&
context.isPR &&
(hasGitHubMcpTools || hasInlineCommentTools) // ← ここで判定
) {
baseMcpConfig.mcpServers.github_inline_comment = { ... };
}allowedTools に mcp__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サーバー起動判定に使うようにすればよいのかなあ。
