claude-credential-api demo

Claude OAuth 認証情報 (~/.claude/.credentials.json 相当) をリモート保管・配信する開発用 API。
ELC AI Agent for Claude Code の「Element API」認証モードのバックエンドです。
デモ用途: 認証はこのサーバーに固定の Bearer トークン 1 個です。本番運用する場合はトークンのローテーション・クライアント別トークン・監査ログ等を追加してください。 保管される内容は実アカウントの OAuth トークンなので、トークン (とこの URL) の取り扱いには注意してください。

ベース情報

Base URLhttps://claude-credential-api.variety777.site
認証Authorization: Bearer <token>(または X-Element-Token: <token>)。/api/health 以外の全エンドポイントで必須。
形式リクエスト/レスポンスとも JSON (UTF-8)
保存場所サーバー側 storage/envelope.json(docroot 外、flock + atomic rename で排他)

エンドポイント

GET/api/health 認証不要

死活監視。

$ curl https://claude-credential-api.variety777.site/api/health
{ "ok": true, "service": "claude-credential-api", "time": "2026-06-11T00:00:00+00:00" }

GET/api/credentials

保存中の認証情報エンベロープを返します。未保存なら 404 not_found

$ curl -H "Authorization: Bearer $TOKEN" \
    https://claude-credential-api.variety777.site/api/credentials
{
  "ok": true,
  "revision": 3,
  "updated_at": "2026-06-11T02:15:09+00:00",
  "hash": "1a2b3c4d5e6f7a8b",
  "credentials": {
    "claudeAiOauth": {
      "accessToken": "sk-ant-oat01-...",
      "refreshToken": "sk-ant-ort01-...",
      "expiresAt": 1781234567890,
      "scopes": ["user:profile", "user:inference"],
      "subscriptionType": "max"
    },
    "trustedDeviceToken": "..."
  }
}

GET/api/credentials/meta

本体を返さない軽量版。クライアントの変更検知ポーリング用 (hash / revision 比較)。

{ "ok": true, "exists": true, "revision": 3, "updated_at": "...", "hash": "1a2b3c4d5e6f7a8b" }

PUT/api/credentials

認証情報を保存(全置換)。{"credentials": {...}} 形式と、claudeAiOauth を含む生の credentials オブジェクトの両方を受け付けます。revision は保存ごとに +1。

任意項目: base_revision を送ると楽観ロック(サーバーの現 revision と不一致なら 409 revision_conflict)。client は更新元の表示名。

$ curl -X PUT -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
    --data @~/.claude/.credentials.json \
    https://claude-credential-api.variety777.site/api/credentials
{ "ok": true, "revision": 4, "updated_at": "...", "hash": "..." }

DELETE/api/credentials

保存済み認証情報を削除します。

{ "ok": true, "deleted": true }

エラーレスポンス

HTTPerror意味
401unauthorizedBearer トークン欠落・不一致
404not_found認証情報が未保存 (GET)
400invalid_jsonボディが JSON として不正
422invalid_credentialsclaudeAiOauth.accessToken を含まない
409revision_conflictbase_revision がサーバーの現 revision と不一致
405method_not_allowed未対応メソッド

ELC AI Agent (Element API モード) からの利用

  1. 認証情報を持つマシンで初回アップロード:
    curl -X PUT -H "Authorization: Bearer $TOKEN" --data @~/.claude/.credentials.json https://claude-credential-api.variety777.site/api/credentials
    (または Element の設定画面「ローカル認証情報をアップロード」ボタン)
  2. credentials ファイルを持たないサーバーの Element 設定 → 認証 → Element API を選択し、エンドポイント URL とトークンを保存。
  3. 以後 Element は会話のたびにリモートから認証情報を取得(ローカルミラーに同期)し、トークンリフレッシュが発生したら自動で PUT で書き戻します。

挙動の補足