原文(日本語訳)
- Stdio MCPサーバーのサブプロセスが、環境変数として
CLAUDE_CODE_SESSION_IDとCLAUDECODE=1を受け取るようになりました。 claude mcp list/getコマンドで、未承認の.mcp.jsonサーバーが自動承認・接続される代わりに⏸ 承認待ちとして表示されるようになりました(出力がパイプされている場合)。
原文(英語)
- Stdio MCP server subprocesses now receive
CLAUDE_CODE_SESSION_IDandCLAUDECODE=1in their environment. claude mcp list/getnow show unapproved.mcp.jsonservers as⏸ Pending approvalinstead of auto-approving and connecting when output is piped.
概要
Stdio MCPサーバーのサブプロセスに、セッションIDを表す CLAUDE_CODE_SESSION_ID と、Claude Code から起動されたことを示す CLAUDECODE=1 の2つの環境変数が自動的に渡されるようになりました。これにより、MCPサーバー側でClaude Codeからの接続かどうかの識別やセッション追跡が容易になります。また、claude mcp list / get コマンドのパイプ実行時に、未承認の .mcp.json サーバーが自動的に接続される代わりに ⏸ Pending approval として表示されるようになり、セキュリティが向上しました。
基本的な使い方
MCPサーバー内で環境変数を参照する
Node.jsで実装したMCPサーバーから、Claude Codeのセッション情報を取得できます。
javascript
// mcp-server.js
const sessionId = process.env.CLAUDE_CODE_SESSION_ID;
const isClaudeCode = process.env.CLAUDECODE === '1';
if (isClaudeCode) {
console.error(`Claude Code から接続されました。セッションID: ${sessionId}`);
}承認待ちサーバーの確認
bash
# パイプ経由でMCPサーバー一覧を取得
claude mcp list | grep "Pending"
# => ⏸ Pending approval my-server (.mcp.json)実践例
セッションIDを使ったログトレーシング
MCPサーバーのログにセッションIDを含めることで、複数の同時セッションのログを区別できます。
python
# mcp_server.py
import os
import logging
SESSION_ID = os.environ.get('CLAUDE_CODE_SESSION_ID', 'unknown')
IS_CLAUDE_CODE = os.environ.get('CLAUDECODE') == '1'
logging.basicConfig(
format=f'[%(asctime)s][session:{SESSION_ID}] %(levelname)s: %(message)s'
)
logger = logging.getLogger(__name__)
def handle_tool_call(tool_name, params):
logger.info(f"ツール実行開始: {tool_name}, パラメータ: {params}")
# ... 処理 ...
logger.info(f"ツール実行完了: {tool_name}")Claude Code 専用の処理分岐
MCPサーバーが複数のクライアントから呼ばれる場合、Claude Codeからの接続かどうかで処理を切り替えられます。
typescript
// server.ts
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
const isClaudeCode = process.env.CLAUDECODE === '1';
const sessionId = process.env.CLAUDE_CODE_SESSION_ID;
const server = new Server(
{ name: 'my-mcp-server', version: '1.0.0' },
{ capabilities: { tools: {} } }
);
server.setRequestHandler('tools/call', async (request) => {
if (isClaudeCode) {
// Claude Code 向けの拡張レスポンスを返す
console.error(`[${sessionId}] Claude Code からのリクエスト: ${request.params.name}`);
return enhancedResponse(request);
}
return standardResponse(request);
});セッションごとの一時ファイル管理
セッションIDを使って、セッションごとに独立した一時ファイルやキャッシュを管理できます。
bash
#!/bin/bash
# mcp-tool-script.sh
SESSION_ID="${CLAUDE_CODE_SESSION_ID:-default}"
WORK_DIR="/tmp/mcp-sessions/${SESSION_ID}"
mkdir -p "$WORK_DIR"
# セッション固有の一時ファイルを作成
TEMP_FILE="${WORK_DIR}/context.json"
echo '{"initialized": true}' > "$TEMP_FILE"
# 処理実行
process_request "$@"
# セッション終了時のクリーンアップ(別途実装)未承認MCPサーバーの安全な確認
スクリプトやCI環境でMCPサーバーの状態を確認する際、未承認サーバーが自動接続されなくなったため、安全に一覧取得ができます。
bash
#!/bin/bash
# check-mcp-servers.sh
echo "=== 承認済みMCPサーバー ==="
claude mcp list | grep -v "Pending approval"
echo ""
echo "=== 承認待ちMCPサーバー ==="
claude mcp list | grep "Pending approval"
# 承認待ちサーバーがあれば警告
PENDING_COUNT=$(claude mcp list | grep -c "Pending approval")
if [ "$PENDING_COUNT" -gt 0 ]; then
echo "警告: ${PENDING_COUNT}個の未承認サーバーがあります"
echo "承認するには: claude mcp approve <server-name>"
fi注意点
CLAUDE_CODE_SESSION_IDはセッションごとに一意の識別子です。同じセッション内での複数のMCPツール呼び出しでは同じIDが使われます。CLAUDECODE=1は、Claude Code以外のMCPクライアントからの接続と区別するためのフラグです。この環境変数の存在はClaude Codeからの起動を保証しますが、値は将来変更される可能性があります(=== '1'で確認することを推奨)。claude mcp list/getのパイプ時の動作変更はセキュリティ上の改善です。CI/CDパイプラインでMCPサーバー一覧を取得していたスクリプトでは、未承認サーバーが⏸ Pending approvalと表示されることに注意してください。.mcp.jsonのサーバーを承認するには、対話的な Claude Code セッション内で承認操作を行う必要があります。