将 Cursor API 转换为 OpenAI/Anthropic 兼容格式的代理服务。
本项目利用 Cursor 文档页面 提供的免费 AI 聊天功能,通过 https://cursor.com/api/chat 接口与后端通信。
关键特点:
- 无需登录 - 文档页面的 AI 聊天功能对所有访问者开放
- 无需 API Key - 不需要 Cursor 账号或付费订阅
- 支持多模型 - 可使用 Claude、GPT、Gemini 等模型
- 纯 HTTP 方案 - 无需浏览器,资源占用低
┌─────────────┐ ┌──────────────┐ ┌─────────────┐
│ 客户端请求 │────▶│ cursor2api │────▶│ Cursor API │
│ (OpenAI/ │ │ (代理转换) │ │ /api/chat │
│ Anthropic) │◀────│ │◀────│ │
└─────────────┘ └──────────────┘ └─────────────┘
Cursor API 会检测请求的 TLS 指纹来判断是否为真实浏览器。本项目使用 surf 库模拟 Chrome 浏览器的 TLS 特征:
client := surf.NewClient().Builder().Impersonate().Chrome().Build()同时模拟完整的 Chrome 请求头:
sec-ch-ua: Chrome 版本信息sec-ch-ua-platform: 操作系统sec-fetch-*: 请求来源信息- 等等...
Cursor 使用 x-is-human 请求头进行人机验证。这个 token 由前端 JavaScript 计算生成,有效期约 25 分钟。
Token 生成流程:
1. 获取 Cursor 验证脚本 (c.js)
GET https://cursor.com/xxx/xxx/c.js?...
2. 注入浏览器环境模拟 (env.js)
- navigator, window, document 等 DOM API
- WebGL 指纹信息
3. 执行脚本生成 token
Node.js 运行组合后的 JS 代码
4. 返回 x-is-human token
每次 API 请求都会生成新的 x-is-human token,避免被 Cursor 检测到 token 重复使用。
将 OpenAI/Anthropic 格式转换为 Cursor 内部格式:
// Anthropic 请求
{
"model": "claude-3.5-sonnet",
"messages": [{"role": "user", "content": "Hello"}]
}
// 转换为 Cursor 格式
{
"model": "claude-3.5-sonnet",
"id": "abc123",
"trigger": "submit-message",
"messages": [{
"role": "user",
"id": "xyz789",
"parts": [{"type": "text", "text": "Hello"}]
}]
}由于 Cursor 文档页 AI 不原生支持工具调用,通过 Prompt 注入 方式实现:
1. 请求带有 tools 定义
↓
2. 将工具定义注入到第一条用户消息
"你有以下工具可用: bash, read_file, write_file..."
↓
3. AI 按照提示格式输出工具调用
<tool_calls>[{"name":"bash","arguments":{"command":"ls"}}]</tool_calls>
↓
4. 解析响应,转换为标准 tool_use 格式返回
- Anthropic Messages API - 完整支持
/v1/messages接口 - OpenAI Chat API - 支持
/v1/chat/completions接口 - 流式响应 - 支持 SSE 流式输出
- 纯 HTTP 实现 - 无需浏览器,内存占用低
- TLS 指纹模拟 - 模拟真实浏览器特征
- Tool Use 协议 - 支持 Anthropic 工具调用协议
cursor2api/
├── cmd/server/ # 程序入口
│ └── main.go
├── internal/ # 内部包
│ ├── client/ # Cursor API 客户端 (TLS 指纹模拟)
│ ├── config/ # 配置管理
│ ├── handler/ # HTTP 处理器 (Anthropic/OpenAI 协议)
│ ├── token/ # Token 生成 (x-is-human)
│ ├── toolify/ # Tool Use 协议 (Prompt 注入 + 解析)
│ └── logger/ # 日志模块
├── jscode/ # JS 脚本
│ ├── env.js # 浏览器环境模拟
│ └── main.js # Token 生成入口
├── static/ # 静态文件
├── config.yaml # 配置文件
└── README.md
- 获取浏览器指纹 - 在浏览器控制台运行以下脚本:
function getBrowserFingerprint() {
const canvas = document.createElement('canvas');
const gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl');
let unmaskedVendor = '', unmaskedRenderer = '';
if (gl) {
const debugInfo = gl.getExtension('WEBGL_debug_renderer_info');
if (debugInfo) {
unmaskedVendor = gl.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL) || '';
unmaskedRenderer = gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL) || '';
}
}
return btoa(JSON.stringify({
"UNMASKED_VENDOR_WEBGL": unmaskedVendor,
"UNMASKED_RENDERER_WEBGL": unmaskedRenderer,
"userAgent": navigator.userAgent
}));
}
console.log('FP:', getBrowserFingerprint());-
获取 ScriptURL - 访问 https://cursor.com/cn/docs,打开开发者工具网络面板,找到类似
https://cursor.com/xxx/xxx/c.js?...的请求 URL -
下载 env.js - 参考
jscode/README.md下载必要的 JS 文件
docker-compose up -d或者使用环境变量:
docker run -d -p 3010:3010 \
-e FP="你的base64指纹" \
-e SCRIPT_URL="https://cursor.com/xxx/xxx/c.js?..." \
cursor2api# 安装依赖
go mod tidy
# 下载 env.js
curl -o jscode/env.js https://raw.githubusercontent.com/jhhgiyv/cursorweb2api/master/jscode/env.js
# 编译
go build -o cursor2api ./cmd/server
# 运行
./cursor2api服务默认运行在 http://localhost:3010
编辑 config.yaml:
# 服务端口
port: 3010
# 请求超时(秒)
timeout: 60
# 代理设置(可选)
# proxy: "http://127.0.0.1:7890"
# Cursor 验证脚本 URL(必须配置)
script_url: "https://cursor.com/xxx/xxx/c.js?i=0&v=3&h=cursor.com"
# 外部 token 计算服务(可选,如果不配置则使用本地 Node.js)
# x_is_human_server_url: ""
# 浏览器指纹配置
fingerprint:
unmasked_vendor_webgl: "Google Inc. (Intel)"
unmasked_renderer_webgl: "ANGLE (Intel, Intel(R) UHD Graphics ...)"
user_agent: "Mozilla/5.0 ..."
# 支持的模型列表
models: "gpt-4o,claude-3.5-sonnet,claude-3.7-sonnet"支持的环境变量:
PORT- 服务端口PROXY- 代理地址SCRIPT_URL- Cursor 验证脚本 URLFP- 浏览器指纹(base64 编码的 JSON)MODELS- 模型列表
curl http://localhost:3010/v1/messages \
-H "Content-Type: application/json" \
-H "x-api-key: any" \
-d '{
"model": "claude-sonnet-4-20250514",
"max_tokens": 1024,
"messages": [{"role": "user", "content": "Hello"}],
"stream": true
}'curl http://localhost:3010/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-4",
"messages": [{"role": "user", "content": "Hello"}],
"stream": true
}'GET /v1/models- 获取模型列表GET /health- 健康检查GET /status- 客户端状态(token 是否有效)
# 设置 API 地址
export ANTHROPIC_BASE_URL=http://localhost:3010
# 运行 Claude Code
claude所有请求统一映射到 claude-opus-4-5-20251101。
- Go 1.21+
- Node.js(用于生成 x-is-human token)
本项目仅供学习和研究目的使用。
- 本项目是一个非官方的第三方工具,与 Cursor 官方无任何关联
- 使用本项目可能违反 Cursor 的服务条款,请自行承担风险
- 本项目不提供任何形式的担保,包括但不限于适销性、特定用途适用性
- 作者不对使用本项目造成的任何直接或间接损失负责
- 请勿将本项目用于商业用途或任何违法活动
使用本项目即表示您已阅读并同意以上声明。
MIT