목차

로그인과 접근 권한

AI 클라이언트는 OAuth 2.1로 LetKite에 로그인합니다. 각 클라이언트는 한 번 승인하면 되며, 승인할 때 클라이언트가 할 수 있는 일과 접근할 수 있는 기기를 선택하고, 언제든지 그 접근 권한을 회수할 수 있습니다.

탐색

토큰 없이 https://mcp.letkite.com/mcp를 호출한 클라이언트는 보호된 리소스 메타데이터를 가리키는 WWW-Authenticate 헤더와 함께 HTTP 401을 받습니다. 클라이언트는 여기서 인가 서버를 찾습니다:

보호된 리소스 메타데이터https://mcp.letkite.com/.well-known/oauth-protected-resource/mcp
인가 서버 메타데이터https://mcp.letkite.com/.well-known/oauth-authorization-server (/.well-known/openid-configuration에서도 제공)
발급자(Issuer)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에는 미리 등록된 클라이언트가 없습니다. 클라이언트는 다음 두 가지 방법 중 하나로 자신을 식별합니다:

  • 동적 클라이언트 등록(RFC 7591): 클라이언트가 등록 엔드포인트로 메타데이터를 보내고 클라이언트 ID를 받습니다. 클라이언트 시크릿은 client_secret_post 또는 client_secret_basic을 요청한 클라이언트에만 발급되며, 공개 클라이언트는 시크릿을 사용하지 않습니다.
  • 클라이언트 ID 메타데이터 문서: 클라이언트 ID가 클라이언트의 메타데이터를 제공하는 https:// URL입니다. LetKite는 이 문서를 제한 시간 5초, 최대 64 KB로, 리디렉션을 따르지 않고, 공개 주소에서만 가져옵니다.

리디렉션 URI는 https여야 합니다. 단, Claude Code처럼 로컬에서 실행되는 클라이언트는 http를 사용할 수 있으며, 이 경우 주소는 루프백 주소(localhost, 127.0.0.1)여야 하고 포트는 제한이 없습니다(RFC 8252). LetKite는 Claude, ChatGPT 및 기타 알려진 클라이언트의 콜백 주소를 인식하며, 클라이언트의 콜백 주소가 그중 하나가 아니면 로그인 페이지에서 경고를 표시합니다. 거부된 콜백 주소는 감사 로그에 기록됩니다.

인가 흐름

  • 인가 코드 흐름(response_type=code)만 지원하며, 모든 요청에 PKCE S256이 필요합니다.
  • 리소스 표시자(RFC 8707): 클라이언트는 https://mcp.letkite.com/mcp를 리소스로 지정할 수 있습니다. 토큰은 항상 이 리소스용으로 발급됩니다.
  • 인가 응답에는 iss가 포함됩니다(RFC 9207).
  • 그랜트 유형: authorization_code, refresh_token.

로그인은 LetKite의 자체 로그인 페이지(id.letkite.com)에서 이루어지며, 계정에서 요구하는 경우 2단계 인증을 거칩니다. 여러 LetKite 계정에 속해 있다면 그중 하나를 선택합니다. 이어서 동의 페이지에 다음 내용이 표시됩니다:

  • 클라이언트의 이름, 등록 방식, 로그인 후 돌아갈 주소
  • 클라이언트가 요청하는 스코프. 선택을 해제할 수 있습니다(최소 하나는 남아야 합니다)
  • 클라이언트가 접근할 수 있는 기기: 나중에 추가되는 기기를 포함한 모든 기기, 또는 선택한 태그나 ID가 있는 기기만
  • 클라이언트를 제한하는 정책. 계정의 정책 중에서 선택합니다

승인하면 해당 사람, 클라이언트, 스코프 집합, 기기 집합, 정책에 대한 연결(그랜트) 하나가 만들어집니다. 계정 소유자와 여러분에게 새 연결에 관한 이메일이 발송되며, 본인이 한 일이 아니라면 연결을 해지할 수 있는 링크가 포함되어 있습니다.

스코프

스코프허용하는 작업도구(예)
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포트 포워딩과 감사 로그 읽기. 나머지 세 스코프를 포함합니다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는 도구를 호출할 때마다 연결을 다시 확인하므로, 해지된 클라이언트는 토큰 만료를 기다리지 않고 몇 초 안에 거부됩니다. 갱신 토큰이 모두 만료된 지 하루가 지난 연결은, 예약 작업이 사용하지 않는 한 자동으로 삭제됩니다.