HTTP から直接呼び出す(ベータ)

はじめにお読みください

このページの内容はベータ扱いです。ここで説明しているのは MCP(Model Context Protocol)の通信内容そのもので、予告なく変更される場合があります。プロトコルの仕様変更や chiyo-co 側の実装変更にともない、リクエストの形式・ヘッダ・レスポンスの構造が変わることがあります。

継続的にご利用になる場合は、MCP 連携ガイドに記載の各クライアント(Claude Code / Cursor / VS Code / Gemini CLI)をお使いいただくことを推奨します。これらのクライアントは仕様変更に追随するため、お客様側での対応が不要です。

※このページの手順で不具合が生じた場合、クライアント経由での利用を優先してサポートいたします。

こんなときに

MCP クライアントを介さず、シェルスクリプトや CI から直接解析を投入したい場合の手順です。

  • CI のパイプラインで、記事の公開前に自動でコピペチェックをかけたい
  • 社内ツールから chiyo-co を呼び出したい
  • MCP に対応していない環境から使いたい

API キーはMCP 接続の画面で発行したものをそのまま使えます。消費するカウントも画面から実行する場合と同じです。

通信の形式

エンドポイントは 1 つで、すべての操作を POST で送ります。

https://kagemusya.biz-samurai.com/mcp

本文は JSON-RPC 2.0 形式です。送るヘッダは次の 3 つです(必須は AuthorizationContent-Type の 2 つ)。

ヘッダ 説明
Authorization Bearer <YOUR_API_KEY> 発行した API キー
Content-Type application/json 本文の形式
Accept application/json, text/event-stream MCP の仕様で推奨される指定です。application/json*/* のどちらも含まない値を送ると 406 になります

解析を投入する

もっとも短い例です。<YOUR_API_KEY> は発行したキーに置き換えてください。

curl -X POST https://kagemusya.biz-samurai.com/mcp \
  -H "Authorization: Bearer <YOUR_API_KEY>" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
      "name": "chiyoco_run_check",
      "arguments": {
        "text": "チェックしたい本文をここに入れます。この例文は空白と改行を除いて 51 文字以上になるように書いてあるので、そのまま実行して動作を確かめられます。",
        "check_type": "kagemusha",
        "idempotency_key": "ci-20260731-001",
        "max_ticket_cost": 10
      }
    }
  }'

成功すると次のような応答が返ります。

{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "structuredContent": {
      "analytic_id": 671,
      "status": "running",
      "ticket_cost": 1,
      "tickets_remaining": 967
    },
    "content": [{ "type": "text", "text": "{\"analytic_id\":671,...}" }]
  }
}

引数の決まり

引数 決まり
text 空白と改行を除いて 51 文字以上、20,000 文字以内。50 文字ちょうどでは通りません
idempotency_key 半角英数字と - _ のみ、64 文字以内。日本語や空白を含むと invalid_input になります
check_type kagemusha(影武者)など。使える値は tools/list で確認できます
max_ticket_cost この解析で消費してよいカウントの上限。必須

応答の読み方

result.structuredContent に構造化されたデータが入ります。result.content[].text にも同じ内容が文字列で入っていますが、プログラムから読む場合は structuredContent をお使いください。

まず result.isError を見てください。これが true のときはエラーで、structuredContent は付きません。内容は result.content[0].text の JSON に error.code として入ります。

idempotency_key は再試行時の二重投入を防ぐためのものです。同じキーで再度送っても新しい解析は作られず、最初の解析 ID が返ります(カウントも消費しません)。ネットワークエラーで応答を受け取れなかったときに、そのまま同じリクエストを送り直せます。

max_ticket_cost は消費してよいカウントの上限です。超える場合は投入されず ticket_cost_exceeded が返るため、見積もりの確認にも使えます。

状態を確認する

解析は非同期で、数分から数十分かかります。chiyoco_get_status で確認します。

curl -X POST https://kagemusya.biz-samurai.com/mcp \
  -H "Authorization: Bearer <YOUR_API_KEY>" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{
    "jsonrpc": "2.0",
    "id": 2,
    "method": "tools/call",
    "params": {
      "name": "chiyoco_get_status",
      "arguments": { "analytic_id": 671 }
    }
  }'

statussucceeded になったら結果を取得できます。※確認の間隔は 30 秒以上を空けてください。

結果を取得する

curl -X POST https://kagemusya.biz-samurai.com/mcp \
  -H "Authorization: Bearer <YOUR_API_KEY>" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{
    "jsonrpc": "2.0",
    "id": 3,
    "method": "tools/call",
    "params": {
      "name": "chiyoco_get_result",
      "arguments": { "analytic_id": 671, "detail": "summary" }
    }
  }'

detailsummary を指定すると全体のスコアと上位のターゲットが返ります。一致した箇所の詳細が必要な場合は markers を指定してください(応答が大きくなるためページングされます)。

残りカウントを確認する

今月のカウントの付与数・消費数・残数は chiyoco_get_quota で取得できます。引数はありません。

curl -X POST https://kagemusya.biz-samurai.com/mcp \
  -H "Authorization: Bearer <YOUR_API_KEY>" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{
    "jsonrpc": "2.0",
    "id": 4,
    "method": "tools/call",
    "params": {
      "name": "chiyoco_get_quota",
      "arguments": {}
    }
  }'

次のような応答が返ります。

{
  "jsonrpc": "2.0",
  "id": 4,
  "result": {
    "structuredContent": {
      "plan_name": "スタンダードプラン",
      "plan_tickets": 1000,
      "tickets_granted": 1000,
      "tickets_added": 0,
      "tickets_consumed": 33,
      "tickets_remaining": 967
    },
    "content": [{ "type": "text", "text": "{\"plan_name\":\"スタンダードプラン\",...}" }]
  }
}

カウントは毎月 1 日にリセットされ、前月分は繰り越されません。※超過利用が可能な契約では tickets_remaining が負の値になることがあります。

使えるツールを調べる

利用できる操作の一覧と、それぞれの引数の形式は tools/list で取得できます。

curl -X POST https://kagemusya.biz-samurai.com/mcp \
  -H "Authorization: Bearer <YOUR_API_KEY>" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":5,"method":"tools/list","params":{}}'

API キーに与えたスコープによって、返るツールが変わります。「解析結果の参照」のみを許可したキーでは chiyoco_run_check は含まれません。

エラーへの対処

状況 応答 対処
キーが違う / 失効している HTTP 401 MCP 接続の画面でキーの状態をご確認ください
短時間に呼びすぎた(tools/call HTTP 200 + rate_limited details.retry_after の秒数だけ待ってから再送してください
短時間に呼びすぎた(それ以外) HTTP 429 + Retry-After Retry-After の秒数だけ待ってから再送してください
引数が正しくない invalid_input details.field に問題のある項目名が入ります
カウントの上限を超える ticket_cost_exceeded details に必要なカウント数が入ります(今月の残数も、取得できた場合は入ります)
同じキーで違う本文を送った idempotency_conflict 本文を変えるときは idempotency_key も新しくしてください
同じキーの解析がまだ処理中 in_progress 少し待ってから同じ内容で送り直してください

呼び出し回数の上限

1 分あたりユーザーごとに 30 回、API キーごとに 20 回までです。これとは別に、接続元ごとに 1 分あたり 60 回の上限があります。

上限の超え方によって応答の形が変わります。解析の投入や状態確認(tools/call)で超えた場合は HTTP 200 が返り、その中に rate_limited が入ります。HTTP のステータスだけを見ていると成功と区別できないのでご注意ください。

{
  "jsonrpc": "2.0",
  "id": 21,
  "result": {
    "content": [{
      "type": "text",
      "text": "{\"error\":{\"code\":\"rate_limited\",\"message\":\"...\",\"retryable\":true,\"details\":{\"retry_after\":31,\"scope\":\"key\"}}}"
    }],
    "isError": true
  }
}

エラーのときは structuredContent が付きません。result.isErrortrue かどうかで判定し、内容は result.content[0].text の JSON を読んでください。details.scope にどの上限に当たったか(user / key / ip)が入ります。

tools/list のような tools/call 以外の呼び出しで超えた場合は HTTP 429Retry-After ヘッダが返ります。

再試行するときは

投入(chiyoco_run_check)を再試行する場合は、必ず同じ idempotency_key を使ってください。キーを変えると別の解析として扱われ、カウントを二重に消費します。

お問い合わせ

ご不明な点はお問い合わせよりご連絡ください。MCP 連携ガイドもあわせてご覧ください。