目录

登录与访问

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 没有预先注册的客户端。客户端通过以下两种方式之一表明身份:

  • 动态客户端注册(RFC 7591):客户端把自己的元数据提交到注册端点,获得客户端 ID。只有请求 client_secret_post 或 client_secret_basic 的客户端才会获得客户端密钥;公共客户端不使用密钥。
  • 客户端 ID 元数据文档:客户端 ID 是一个提供该客户端元数据的 https:// 地址。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)上进行,账户要求时还需两步验证。如果你属于多个 LetKite 账户,需要选择其中一个。随后授权页面会显示:

  • 客户端的名称、注册方式,以及它会把你送回的地址;
  • 它请求的权限范围,你可以取消勾选(至少保留一项);
  • 它能访问的机器:所有机器(包括之后添加的),或只限带有指定标签或 ID 的机器;
  • 限制它的策略,从你账户的策略中选择。

批准后,会为这个人、这个客户端、这组权限范围、这组机器和这个策略创建一个连接(即一项授权)。账户的所有者和你都会收到关于新连接的邮件,邮件中附有链接,如果不是你本人操作,可以用它撤销。

权限范围

权限范围允许工具(示例)
fleet.read列出机器、读取文件、查看日志和后台任务状态list_hosts、host_facts、read_file、list_dir、job_status、log_read
fleet.exec执行命令、打开 shell 和终端、启动后台任务和定时任务、唤醒机器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 分钟,签名的 JWT(RS256),面向 https://mcp.letkite.com/mcp,以 Authorization: Bearer 发送
刷新令牌30 天,每次使用后轮换;再次使用旧令牌会吊销整条令牌链
授权码2 分钟,一次性;被重放的授权码会使由它签发的令牌被吊销

收回权限

LetKite 在每次工具调用时都会重新读取连接,因此被断开的客户端会在几秒内被拒绝,无需等待它的令牌过期。如果一个连接的所有刷新令牌都已过期满一天,它会被自动移除,除非有定时任务在使用它。