サインインとアクセス
AI クライアントは OAuth 2.1 で LetKite にサインインします。各クライアントは一度だけ承認し、そのときにクライアントができることとアクセスできるマシンを選びます。このアクセスはいつでも取り消せます。
ディスカバリー
トークンなしで https://mcp.letkite.com/mcp を呼び出したクライアントは、HTTP 401 と、保護リソースメタデータを指す WWW-Authenticate ヘッダーを受け取ります。クライアントはそこから認可サーバーを見つけます:
| 保護リソースメタデータ | https://mcp.letkite.com/.well-known/oauth-protected-resource/mcp |
|---|---|
| 認可サーバーメタデータ | https://mcp.letkite.com/.well-known/oauth-authorization-server(/.well-known/openid-configuration でも取得できます) |
| 発行者 | https://mcp.letkite.com |
| 認可エンドポイント | https://mcp.letkite.com/oauth/authorize |
| トークンエンドポイント | https://mcp.letkite.com/oauth/token |
| 取り消しエンドポイント | https://mcp.letkite.com/oauth/revoke(リフレッシュトークン用) |
| 登録エンドポイント | https://mcp.letkite.com/oauth/register |
クライアント登録
LetKite には事前登録されたクライアントはありません。クライアントは、次の 2 つのいずれかの方法で自身を識別します:
- 動的クライアント登録(RFC 7591):クライアントが登録エンドポイントにメタデータを送信し、クライアント ID を受け取ります。クライアントシークレットは、
client_secret_postまたはclient_secret_basicを求めるクライアントにのみ発行されます。パブリッククライアントはシークレットを使いません。 - クライアント ID メタデータドキュメント:クライアント ID が、クライアントのメタデータを提供する
https://URL になっています。LetKite はこれを、タイムアウト 5 秒、最大 64 KB、リダイレクトをたどらず、公開アドレスからのみ取得します。
リダイレクト URI は https である必要があります。http はループバックアドレス(localhost、127.0.0.1)でのみ使え、Claude Code のようなローカルのクライアント向けです。この場合、ポートは任意です(RFC 8252)。LetKite は Claude、ChatGPT などの既知のクライアントのコールバックを認識し、クライアントのコールバックがそのいずれでもない場合は、サインインページで警告します。拒否されたコールバックは監査ログに記録されます。
認可フロー
- 認可コードフローのみ(
response_type=code)で、すべてのリクエストで PKCES256が必須です。 - リソースインジケーター(RFC 8707):クライアントはリソースとして
https://mcp.letkite.com/mcpを指定できます。トークンは常にこのリソース向けに発行されます。 - 認可レスポンスには
issが含まれます(RFC 9207)。 - グラント:
authorization_codeとrefresh_token。
承認する内容
サインインは LetKite 自身のサインインページ(id.letkite.com)で行い、アカウントで必要とされている場合は 2 段階認証も行います。複数の LetKite アカウントに所属している場合は、1 つを選びます。続いて、同意画面に次の内容が表示されます:
- クライアントの名前、登録方法、サインイン後の戻り先
- クライアントが求めるスコープ(チェックを外せますが、少なくとも 1 つは残ります)
- クライアントがアクセスできるマシン:後から追加されるものも含むすべてのマシン、または選んだタグや ID のマシンのみ
- クライアントを制限するポリシー(アカウントのポリシーから選択)
承認すると、その人、クライアント、スコープの組み合わせ、マシンの範囲、ポリシーに対して、1 つの接続(グラント)が作成されます。アカウントのオーナーとあなたには、新しい接続についてのメールが届きます。メールには、あなた自身による操作でなかった場合に接続を取り消すためのリンクが含まれます。
スコープ
| スコープ | 許可される操作 | ツール(例) |
|---|---|---|
fleet.read | マシンの一覧表示、ファイルの読み取り、ログとジョブの状態の確認 | list_hosts、host_facts、read_file、list_dir、job_status、log_read |
fleet.exec | コマンドの実行、シェルとターミナルを開く操作、ジョブと定期実行の開始、スリープ中のマシンの起動 | exec、shell_run、job_start、terminal_open、schedule_create |
fleet.write | ファイルの書き込み、アップロード、コピー、削除 | write_file、delete_path、transfer_start |
fleet.admin | ポート転送と監査ログの読み取り。ほかの 3 つのスコープを含みます | tunnel_open、tunnel_http、audit_tail |
offline_access | 受け付けます。リフレッシュトークンはいずれの場合も発行されます |
各ツールに必要なスコープは、ツールページにある各ツールの説明に記載されています。スコープがない呼び出しは token lacks fleet.… で失敗します。
トークン
| アクセストークン | 15 分。https://mcp.letkite.com/mcp 向けの署名付き JWT(RS256)で、Authorization: Bearer として送信します |
|---|---|
| リフレッシュトークン | 30 日。使用するたびに新しいものに置き換わります。古いトークンを再使用すると、チェーン全体が失効します |
| 認可コード | 2 分。使えるのは 1 回だけです。コードが再使用されると、そのコードから発行されたトークンが失効します |
アクセスの取り消し
- コンソールの接続(https://dashboard.letkite.com/connections)で、自分の接続を切断できます。オーナーと管理者は、すべての人の接続を切断できます。
- 新しい接続の通知メールにあるリンクを使います。
LetKite はツールが呼び出されるたびに接続を読み直すため、切断されたクライアントは、トークンの期限切れを待たずに数秒以内に拒否されます。すべてのリフレッシュトークンが期限切れになってから 1 日たった接続は、定期実行で使われていない限り、自動的に削除されます。