1. 问题现象
~/.kimi-code/mcp.json 中配置了 Figma 远程 MCP:
{
"mcpServers": {
"figma": {
"transport": "http",
"url": "https://mcp.figma.com/mcp"
}
}
}
服务器显示 needs-auth,执行登录(如 /mcp-config 或 mcp__figma__authenticate)后报错:
failed to start OAuth flow for "figma": HTTP 403: Invalid OAuth error response:
SyntaxError: Unexpected token 'F', "Forbidden" is not valid JSON. Raw body: Forbidden
浏览器授权页面根本不会弹出——请求在 OAuth 动态客户端注册(RFC 7591) 这一步就被拒了。
2. 根因
Figma 的 Remote MCP Server 使用 OAuth 2.0 + PKCE 认证,但对动态注册的客户端做了
client_name 白名单。目前白名单内只有 Codex(OpenAI Codex CLI 注册时用的名字),
这就是 codex mcp login figma 一路通畅的原因。
其他 MCP 客户端(Kimi Code、OpenCode、Cline 等)注册时发送自己的名字,不在白名单中,
Figma 的注册端点(https://api.figma.com/v1/oauth/mcp/register)直接返回 403。
Kimi Code 侧的情况(从其二进制确认):
-
注册时固定发送
client_name: "kimi-code (<serverName>)",没有配置项可以修改; -
因此无法通过配置绕过,只能在客户端外部完成 OAuth 流程,再把 token 交给 Kimi Code 使用。
3. 修复原理
社区(最早出自 @connorads 的 opencode fork,后由 @sdaoudi 封装为 mcp-auth-helper)发现:
-
Figma 的白名单只校验注册请求里的
client_name字符串,并不验证申请者是否真的是 Codex; -
RFC 7591 允许客户端在动态注册时自报名称,所以注册时填
client_name: "Codex"即可通过; -
注册成功后拿到的是标准 OAuth token,不绑定具体客户端工具,任何 MCP 客户端都能使用。
于是修复思路为:在 Kimi Code 之外,以 Codex 之名手动跑一遍标准
"动态注册 → PKCE 授权码 → 换 token" 流程,然后把注册信息与 token 按
Kimi Code 原生的凭据格式写入它的凭据目录。Kimi Code 下次启动时会像对待自己完成的
登录一样读取这些凭据,包括后续的 refresh token 自动续期。
4. 快速修复(TL;DR)
前置条件:Node.js ≥ 18(用到全局 fetch),无需任何 npm 依赖;已按上文配置好 mcp.json。
node figma-mcp-auth.mjs
-
脚本会自动打开浏览器(macOS;其他平台请手动复制输出的
AUTHORIZATION_URL=之后的链接); -
在浏览器中登录 Figma 并点击 Allow;
-
看到
DONE即成功,凭据已写入~/.kimi-code/credentials/mcp/; -
在 Kimi Code 中
/new开新会话(或重启kimi-code)——MCP 服务器在会话启动时加载,
figma 工具会以 mcp__figma__* 的形式出现。
环境变量:
-
KIMI_CODE_HOME:若你自定义了 Kimi Code 的数据目录,脚本会跟随该变量; -
SERVER_NAME:必须与mcp.json里的服务器名一致(默认figma)。改了名字的,
例如 "figma-remote": { ... },运行时用 SERVER_NAME=figma-remote node figma-mcp-auth.mjs。
附件📎
- 修复脚本: figma-mcp-auth.mjs