Skip to content

原文(日本語に翻訳)

RemoteTriggerツールの run アクションが空のボディを送信し、サーバーに拒否されていた問題を修正しました。

原文(英語)

Fixed RemoteTrigger tool's run action sending an empty body and being rejected by the server

概要

RemoteTriggerツールの run アクションを実行した際、HTTPリクエストのボディが空で送信されるというバグがありました。サーバー側でボディを必須としている場合、リクエストが拒否されていました。このアップデートにより、run アクションが正しいリクエストボディを送信するようになりました。

基本的な使い方

bash
# RemoteTriggerツールのrunアクション
# 修正前: 空のボディが送信されてサーバーに拒否される
# 修正後: 正しいボディが送信される

# Claude Codeセッション内でRemoteTriggerを使用
# "リモートジョブをトリガーして"
# → 正しいリクエストボディでAPIが呼ばれる

実践例

CI/CDパイプラインのリモートトリガー

bash
# RemoteTriggerでCI/CDをトリガーする設定例

# .claude/settings.json
cat << 'EOF' > .claude/settings.json
{
  "remoteTriggers": [
    {
      "name": "deploy-production",
      "url": "https://api.company.com/triggers/deploy",
      "method": "POST",
      "headers": {
        "Authorization": "Bearer ${CI_TOKEN}",
        "Content-Type": "application/json"
      }
    }
  ]
}
EOF
bash
# Claude Codeでリモートトリガーを実行
claude "本番環境へのデプロイをトリガーして"

# 修正前: 空ボディが送信される
# POST https://api.company.com/triggers/deploy
# Content-Length: 0  ← エラーの原因

# 修正後: 正しいボディが送信される
# POST https://api.company.com/triggers/deploy
# Content-Type: application/json
# {"trigger": "deploy", "environment": "production", "timestamp": "..."}

リモートAPIの呼び出し

python
# RemoteTriggerでPythonスクリプトをリモート実行するサーバー側の実装例
from flask import Flask, request, jsonify

app = Flask(__name__)

@app.route('/triggers/run', methods=['POST'])
def run_trigger():
    # 修正後: リクエストボディが正しく受信される
    data = request.get_json()
    
    if not data:
        return jsonify({"error": "Empty request body"}), 400
    
    task = data.get('task', '')
    parameters = data.get('parameters', {})
    
    print(f"Trigger received: task={task}, params={parameters}")
    
    # タスクを実行
    result = execute_task(task, parameters)
    
    return jsonify({"status": "success", "result": result})

def execute_task(task, params):
    # 実際のタスク実行ロジック
    return f"Task '{task}' completed with params {params}"

if __name__ == '__main__':
    app.run(port=5000)

デバッグと検証

bash
# RemoteTriggerの動作をデバッグするプロキシサーバー
# ngrokやncを使ってリクエストを確認

# リクエストのデバッグ用エコーサーバー
python3 -c "
from http.server import HTTPServer, BaseHTTPRequestHandler
import json

class DebugHandler(BaseHTTPRequestHandler):
    def do_POST(self):
        content_length = int(self.headers.get('Content-Length', 0))
        body = self.rfile.read(content_length)
        
        print(f'Received POST request to {self.path}')
        print(f'Headers: {dict(self.headers)}')
        print(f'Body: {body.decode()}')
        
        # 修正後: ボディが空でないことを確認
        if body:
            try:
                data = json.loads(body)
                print(f'Parsed JSON: {json.dumps(data, indent=2)}')
            except:
                print('Body is not valid JSON')
        else:
            print('WARNING: Empty body received!')
        
        self.send_response(200)
        self.end_headers()
        self.wfile.write(b'{\"status\": \"received\"}')

HTTPServer(('', 8080), DebugHandler).serve_forever()
"

注意点

  • この修正はRemoteTriggerツールの run アクションにのみ影響します
  • 以前は空のボディが原因でサーバーへのリクエストが拒否されていたケースがあります
  • 修正後は適切なリクエストボディが送信されるため、ボディを要求するAPIエンドポイントとの互換性が向上します
  • RemoteTriggerの設定は .claude/settings.json または管理者設定で行います
  • セキュリティのため、APIキーやトークンは環境変数として管理することを推奨します

関連情報