WindowsでClaude Codeを導入してCrazyrouterに繋ぐまで
タグ: ClaudeCode, Windows, API, トラブルシューティング
初めてClaude Code(AIコーディングツール)を入れたとき、私は同じところで詰まりました。バージョン番号は出ているのに、claudeを起動すると403で拒否されるという状態です。
claude --versionは普通に表示されるのに、起動するとapi.anthropic.comへ繋ぎに行って弾かれます。私は最初「バージョンが古いのか」と思い、npmを3回再インストールしました。原因はただ一つ、設定の変数名を一つ間違えていたことでした。
この記事では、導入からCrazyrouter API(第三者経由のAPIゲートウェイ)への接続、そして実際にモデルが返答するまでを順に書きます。
本記事はWindows 10/11とPowerShellを前提とします。文中の
YOUR_CRAZYROUTER_API_KEYはすべてプレースホルダーです。ご自身で作成したキーに置き換えてください。
この図が出発点です。「インストール成功」と「呼び出し成功」は別の検収です。バージョン番号は最初の検収にすぎません。
1. Claude Codeを動くところまで入れる
手順A:公式のネイティブ方式(推奨)
Windows PowerShellで以下を実行します。
irm https://claude.ai/install.ps1 | iex
ドメインがclaude.aiであることを確認してください。この方式はNode.jsの事前インストールを要求しません。終わったら新しいターミナルで確認します。
claude --version
バージョンが出ればコマンドが使えます。もし「コマンドが見つからない」なら、インストーラーが%USERPROFILE%\.local\binをPATHに入れるよう求めているかもしれません。
スクリプトのダウンロードに失敗し、出力にHTMLや<script>、CAPTCHAが混じったらすぐ止めてください。それはインストールスクリプトではありません。
エラーに<script type="text/javascript">やvarが出るなら、それはWebページをPowerShell構文で解析しようとしている証拠です。
手順B:npm方式(スクリプト失敗時、またはNode.js済み)
Node.js公式からWindows用LTSを入れます。npm方式はNode.js 22以上が必要です。再起動後に確認します。
node --version
npm.cmd --version
両方出れば、以下を実行します。
npm.cmd install -g @anthropic-ai/claude-code
npm.cmdと書くのは、PowerShellが.ps1を優先して実行ポリシーに引っかかるのを避けるためです。その後:
claude.cmd --version
E404が出たら
ネットワークやミラーを疑う前に、エラー内のパッケージ名を一文字ずつ読んでください。
図のパッケージ名は@anthropic-ai/claude-codenpmで、末尾に余計なnpmが付いています。コピー時に二行が繋がったのが原因です。正しい名前は常に@anthropic-ai/claude-codeです。
Gitは必須ではありません。
2. Crazyrouter APIへの接続
Claude Codeだけ入れても、使えるモデル服務を設定しないと何も聞けません。
API Key(アクセスキー)を作る
コンソールでAPIキーを一つ作成します(名前例:claude-code-windows)。Claude Codeが必要なのはここで作るAPI Keyです。
Base URL(APIのルートURL)を間違えない
本記事は東アジア入口https://cn.crazyrouter.comを使います。
| 用途 | アドレス | 書く場所 |
|---|---|---|
| 登録・ログイン | https://crazyrouter.com |
ブラウザ |
| Claude CodeのBase URL | https://cn.crazyrouter.com |
ANTHROPIC_BASE_URL |
| モデル一覧 | https://cn.crazyrouter.com/v1/models |
別途確認 |
| Messages API | https://cn.crazyrouter.com/v1/messages |
クライアントが使用 |
Claude Codeにはルートアドレスを入れ、/v1/messagesは付けません。 OpenAI互換と逆なので注意です。
settings.jsonを書く
パスは%USERPROFILE%\.claude\settings.jsonです。PowerShellで作成します。
New-Item -ItemType Directory -Path "$env:USERPROFILE\.claude" -Force | Out-Null
notepad.exe "$env:USERPROFILE\.claude\settings.json"
中身は以下のようにします(JSONです。PowerShellに直接貼らないでください)。
{
"env": {
"ANTHROPIC_BASE_URL": "https://cn.crazyrouter.com",
"ANTHROPIC_AUTH_TOKEN": "YOUR_CRAZYROUTER_API_KEY"
}
}
なぜANTHROPIC_API_KEYではなくANTHROPIC_AUTH_TOKENか
これが一番覚えておくべき点です。第三者のAnthropic互換端点にはANTHROPIC_AUTH_TOKENを使います。
| 変数 | 実際のリクエストヘッダ | 用途 |
|---|---|---|
ANTHROPIC_API_KEY |
x-api-key: <key> |
Anthropic公式API |
ANTHROPIC_AUTH_TOKEN |
Authorization: Bearer <token> |
カスタム・互換ゲートウェイ |
ANTHROPIC_API_KEYを書くと公式チャネル認証になり、ANTHROPIC_BASE_URLが効かず403になります。私の詰まりはこれでした。
設定を確認する
$settingsPath = Join-Path $env:USERPROFILE '.claude\settings.json'
$ccSettings = Get-Content -Raw -LiteralPath $settingsPath | ConvertFrom-Json
[pscustomobject]@{
BaseURL = $ccSettings.env.ANTHROPIC_BASE_URL
HasAuthToken = -not [string]::IsNullOrWhiteSpace(
[string]$ccSettings.env.ANTHROPIC_AUTH_TOKEN
)
}
Base URLとHasAuthToken: Trueが見えればOKです(キー有効性は未検証)。
モデル一覧は以下で確認できます。
$crBase = ([string]$ccSettings.env.ANTHROPIC_BASE_URL).TrimEnd('/')
$crHeaders = @{ Authorization = "Bearer $($ccSettings.env.ANTHROPIC_AUTH_TOKEN)" }
$crModels = Invoke-RestMethod -Uri "$crBase/v1/models" -Headers $crHeaders -Method Get -TimeoutSec 30
$crModels.data | Select-Object id
3. 403の原因と対処
私が見たエラーは以下の通りです。
Failed to connect to api.anthropic.com: Status 403
三層に分けて読みます。
-
Status 403:リクエストは届いて拒否された。ネット不通ならタイムアウトやDNS失敗で、HTTPコードは出ません。 - ホスト名が
api.anthropic.com:最重要。Crazyrouterを設定したはずなのに公式ドメインへ向かう=クライアントが設定を認めていない。 - バージョン番号が正常だったので、問題は「行き先と認証」にあります。
まずリクエストがどこへ着いたかを確認し、その後で拒否理由を考えてください。
4. 実測記録(2026-09-28)
自環境で実際に取ったデータです。
| 項目 | 結果 |
|---|---|
| OS | Windows 10 |
| ターミナル | Windows PowerShell |
| Node.js | v22.22.2 |
| npm | 10.9.7 |
| Claude Code | 2.1.281 |
| Base URL | https://cn.crazyrouter.com |
| 設定読込 |
settings.json解析可、ANTHROPIC_AUTH_TOKEN設定済、ANTHROPIC_API_KEYは混在せず |
GET /v1/models |
HTTP 200、161件のモデルID、選択モデルは一覧にあり |
POST /v1/messages |
HTTP 200、内容OK、stop_reasonはend_turn
|
| 応答ID | msg_011CfVJqbN2DVuqoYqgLcdNE |
| トークン | 入力18、出力4 |
| 往復時間(直叩き) | 11569 ms |
| クライアント呼出 | exit code 0、is_error=false、subtype=success、返値OK
|
| クライアント時間 | 5103 ms |
| セッションID | a7a76f08-fa36-4a36-8787-3f2b24dad626 |
最小検証のリクエストボディは以下です(HTTP本文であり、settings.jsonではありません)。
{
"model": "claude-fable-5-1",
"max_tokens": 32,
"messages": [
{ "role": "user", "content": "Reply with exactly OK." }
]
}
モデルIDは/v1/modelsとコンソールで都度ご確認ください(クエリ時点で異なる場合があります)。
5. まとめ
目標を小さく分けましょう。バージョン正常→Crazyrouterアカウントとキー用意→JSON解析可→適合モデル選択→完全な返答→バックエンド記録と一致。 前のステップが通らなければ、そこで止めて対処します。403だからといってnpmを何度も再インストールしないように。
参考文献
免責事項:本記事は個人の経験に基づく共有であり、公式ドキュメントではありません。第三者サービス、モデル名、料金、利用可能なモデルはいつでも変更される可能性があります。最新情報は各公式ページとご自身のコンソールで必ずご確認ください。APIエンドポイントと設定パスは、参照時点の公式ドキュメントに従ってください。本記事にアフィリエイト・報酬・スポンサー内容は含まれません。


