Vercel
vercel
by byungkyu
|
安装
claude skill add --url https://github.com/openclaw/skills文档
Vercel
Access the Vercel API with managed OAuth authentication. Manage projects, deployments, domains, teams, and environment variables.
Quick Start
# List projects
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/vercel/v9/projects?limit=10')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
Base URL
https://gateway.maton.ai/vercel/{native-api-path}
Replace {native-api-path} with the actual Vercel API endpoint path (e.g., v9/projects, v6/deployments). The gateway proxies requests to api.vercel.com and automatically injects your OAuth token.
Authentication
All requests require the Maton API key in the Authorization header:
Authorization: Bearer $MATON_API_KEY
Environment Variable: Set your API key as MATON_API_KEY:
export MATON_API_KEY="YOUR_API_KEY"
Getting Your API Key
- Sign in or create an account at maton.ai
- Go to maton.ai/settings
- Copy your API key
Connection Management
Manage your Vercel OAuth connections at https://ctrl.maton.ai.
List Connections
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://ctrl.maton.ai/connections?app=vercel&status=ACTIVE')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
Create Connection
python <<'EOF'
import urllib.request, os, json
data = json.dumps({'app': 'vercel'}).encode()
req = urllib.request.Request('https://ctrl.maton.ai/connections', data=data, method='POST')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Content-Type', 'application/json')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
Get Connection
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://ctrl.maton.ai/connections/{connection_id}')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
Response:
{
"connection": {
"connection_id": "cf5e9c78-dff3-495f-a1d4-e0c6eeeafa9a",
"status": "ACTIVE",
"creation_time": "2025-12-08T07:20:53.488460Z",
"last_updated_time": "2026-01-31T20:03:32.593153Z",
"url": "https://connect.maton.ai/?session_token=...",
"app": "vercel",
"metadata": {}
}
}
Open the returned url in a browser to complete OAuth authorization.
Delete Connection
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://ctrl.maton.ai/connections/{connection_id}', method='DELETE')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
Specifying Connection
If you have multiple Vercel connections, specify which one to use with the Maton-Connection header:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/vercel/v9/projects')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Maton-Connection', 'cf5e9c78-dff3-495f-a1d4-e0c6eeeafa9a')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
If omitted, the gateway uses the default (oldest) active connection.
API Reference
User
Get Current User
GET /vercel/v2/user
Response:
{
"user": {
"id": "srL5ucia16R88imgFgrn9XHH",
"email": "user@example.com",
"username": "username",
"name": "User Name",
"avatar": null,
"defaultTeamId": "team_abc123",
"billing": {
"plan": "hobby",
"status": "active"
}
}
}
Teams
List Teams
GET /vercel/v2/teams
Response:
{
"teams": [
{
"id": "team_1xPDNnVvmKxzxPs2x2XQRoKu",
"slug": "my-team",
"name": "My Team",
"createdAt": 1732138693523,
"membership": {
"role": "OWNER"
},
"billing": {
"plan": "hobby",
"status": "active"
}
}
],
"pagination": {
"count": 1,
"next": null,
"prev": null
}
}
Projects
List Projects
GET /vercel/v9/projects?limit=20
Response:
{
"projects": [
{
"id": "prj_ET9o8o6WAQTfWbtF8NeFe4XF9uYG",
"name": "my-project",
"accountId": "team_abc123",
"framework": "nextjs",
"nodeVersion": "22.x",
"createdAt": 1733304037737,
"updatedAt": 1766947708146,
"targets": {},
"latestDeployments": []
}
],
"pagination": {
"count": 20,
"next": 1733304037737,
"prev": null
}
}
Get Project
GET /vercel/v9/projects/{projectId}
Response:
{
"id": "prj_ET9o8o6WAQTfWbtF8NeFe4XF9uYG",
"name": "my-project",
"accountId": "team_abc123",
"framework": "nextjs",
"nodeVersion": "22.x",
"createdAt": 1733304037737,
"updatedAt": 1766947708146,
"buildCommand": null,
"devCommand": null,
"installCommand": null,
"outputDirectory": null,
"rootDirectory": null,
"serverlessFunctionRegion": "iad1"
}
Create Project
POST /vercel/v9/projects
Content-Type: application/json
{
"name": "my-new-project",
"framework": "nextjs",
"gitRepository": {
"type": "github",
"repo": "username/repo"
}
}
Update Project
PATCH /vercel/v9/projects/{projectId}
Content-Type: application/json
{
"name": "updated-project-name",
"buildCommand": "npm run build"
}
Delete Project
DELETE /vercel/v9/projects/{projectId}
Deployments
List Deployments
GET /vercel/v6/deployments?limit=20
Query Parameters:
limit- Number of results (default: 20)projectId- Filter by project IDtarget- Filter by target (production,preview)state- Filter by state (BUILDING,READY,ERROR,CANCELED)
Response:
{
"deployments": [
{
"uid": "dpl_8gFe6M8XZsQ1ohP86VWTemcBAmZJ",
"name": "my-project",
"url": "my-project-abc123.vercel.app",
"created": 1759739951209,
"state": "READY",
"readyState": "READY",
"target": "production",
"source": "git",
"creator": {
"uid": "srL5ucia16R88imgFgrn9XHH",
"username": "username"
},
"meta": {
"githubCommitRef": "main",
"githubCommitSha": "6e88c2d..."
}
}
],
"pagination": {
"count": 20,
"next": 1759739951209,
"prev": null
}
}
Get Deployment
GET /vercel/v13/deployments/{deploymentId}
Response:
{
"id": "dpl_8gFe6M8XZsQ1ohP86VWTemcBAmZJ",
"name": "my-project",
"url": "my-project-abc123.vercel.app",
"created": 1759739951209,
"buildingAt": 1759739952144,
"ready": 1759740085170,
"state": "READY",
"readyState": "READY",
"target": "production",
"source": "git",
"creator": {
"uid": "srL5ucia16R88imgFgrn9XHH",
"username": "username"
}
}
Get Deployment Build Logs
GET /vercel/v3/deployments/{deploymentId}/events
Response:
[
{
"created": 1759739951860,
"deploymentId": "dpl_8gFe6M8XZsQ1ohP86VWTemcBAmZJ",
"text": "Running build in Washington, D.C., USA (East) – iad1",
"type": "stdout",
"info": {
"type": "build",
"name": "bld_b3go7zd2k"
}
}
]
Cancel Deployment
PATCH /vercel/v12/deployments/{deploymentId}/cancel
Environment Variables
List Environment Variables
GET /vercel/v10/projects/{projectId}/env
Response:
{
"envs": [
{
"id": "6EwQRCd32PVNHORP",
"key": "API_KEY",
"value": "...",
"type": "encrypted",
"target": ["production", "preview", "development"],
"createdAt": 1732148489672,
"updatedAt": 1745542152381
}
]
}
Create Environment Variable
POST /vercel/v10/projects/{projectId}/env
Content-Type: application/json
{
"key": "MY_ENV_VAR",
"value": "my-value",
"type": "encrypted",
"target": ["production", "preview"]
}
Update Environment Variable
PATCH /vercel/v10/projects/{projectId}/env/{envId}
Content-Type: application/json
{
"value": "updated-value"
}
Delete Environment Variable
DELETE /vercel/v10/projects/{projectId}/env/{envId}
Domains
List Domains
GET /vercel/v5/domains
Response:
{
"domains": [
{
"name": "example.com",
"apexName": "example.com",
"projectId": "prj_abc123",
"verified": true,
"createdAt": 1732138693523
}
],
"pagination": {
"count": 10,
"next": null,
"prev": null
}
}
Get Domain
GET /vercel/v5/domains/{domain}
Add Domain
POST /vercel/v5/domains
Content-Type: application/json
{
"name": "example.com"
}
Remove Domain
DELETE /vercel/v6/domains/{domain}
Artifacts (Remote Caching)
Get Artifacts Status
GET /vercel/v8/artifacts/status
Response:
{
"status": "enabled"
}
Pagination
Vercel uses cursor-based pagination with next and prev cursors:
GET /vercel/v9/projects?limit=20&until=1733304037737
Parameters:
limit- Results per page (varies by endpoint, typically max 100)until- Cursor for next page (usenextfrom response)since- Cursor for previous page (useprevfrom response)
Response includes:
{
"pagination": {
"count": 20,
"next": 1733304037737,
"prev": 1759739951209
}
}
Code Examples
JavaScript
const response = await fetch(
'https://gateway.maton.ai/vercel/v9/projects?limit=10',
{
headers: {
'Authorization': `Bearer ${process.env.MATON_API_KEY}`
}
}
);
const data = await response.json();
Python
import os
import requests
response = requests.get(
'https://gateway.maton.ai/vercel/v9/projects',
headers={'Authorization': f'Bearer {os.environ["MATON_API_KEY"]}'},
params={'limit': 10}
)
data = response.json()
List Deployments for a Project
import os
import requests
project_id = 'prj_abc123'
response = requests.get(
'https://gateway.maton.ai/vercel/v6/deployments',
headers={'Authorization': f'Bearer {os.environ["MATON_API_KEY"]}'},
params={'projectId': project_id, 'limit': 10}
)
deployments = response.json()['deployments']
Notes
- API versions vary by endpoint (v2, v5, v6, v9, v10, v13, etc.)
- Timestamps are in milliseconds since Unix epoch
- Project IDs start with
prj_, deployment IDs start withdpl_, team IDs start withteam_ - Deployment states:
BUILDING,READY,ERROR,CANCELED,QUEUED - Environment variable types:
plain,encrypted,secret,sensitive - Environment targets:
production,preview,development - IMPORTANT: When using curl commands, use
curl -gwhen URLs contain brackets to disable glob parsing - IMPORTANT: When piping curl output to
jq, environment variables may not expand correctly in some shells
Error Handling
| Status | Meaning |
|---|---|
| 400 | Missing Vercel connection or invalid request |
| 401 | Invalid or missing Maton API key |
| 403 | Insufficient permissions |
| 404 | Resource not found |
| 429 | Rate limited |
| 4xx/5xx | Passthrough error from Vercel API |
Resources
相关 Skills
环境密钥管理
by alirezarezvani
统一梳理dev/staging/prod的.env和密钥流程,自动生成.env.example、校验必填变量、扫描Git历史泄漏,并联动Vault、AWS SSM、1Password、Doppler完成轮换。
✎ 统一管理环境变量、密钥与配置,减少泄露和部署混乱,安全治理与团队协作一起做好,DevOps 场景很省心。
可观测性设计
by alirezarezvani
面向生产系统规划可落地的可观测性体系,串起指标、日志、链路追踪与 SLI/SLO、错误预算、告警和仪表盘设计,适合搭建监控平台与优化故障响应。
✎ 把监控、日志、链路追踪串起来,帮助团队从设计阶段构建可观测性,排障更快、系统演进更稳。
更新日志
by alirezarezvani
基于 Conventional Commits 自动解析提交记录、判断语义化版本升级并生成规范 changelog,适合在 CI、发版前检查提交格式并批量输出可审计发布说明。
✎ 自动生成和管理更新日志与发布说明,帮团队把版本变更说清楚;聚焦版本化与流程自动化,省时又更规范。
相关 MCP 服务
kubefwd
编辑精选by txn2
kubefwd 是让 AI 帮你批量转发 Kubernetes 服务到本地的开发神器。
✎ 微服务开发者最头疼的本地调试问题,它一键搞定——自动分配 IP 避免端口冲突,还能用自然语言查询状态。但依赖 AI 工作流,纯命令行爱好者可能觉得不够直接。
Cloudflare
编辑精选by Cloudflare
Cloudflare MCP Server 是让你用自然语言管理 Workers、KV 和 R2 等云资源的工具。
✎ 这个工具解决了开发者频繁切换控制台和文档的痛点,特别适合那些在 Cloudflare 上部署无服务器应用、需要快速调试或管理配置的团队。不过,由于它依赖多个子服务器,初次设置可能有点繁琐,建议先从 Workers Bindings 这类核心功能入手。
Terraform
编辑精选by hashicorp
Terraform MCP Server 是让 AI 助手直接操作 Terraform Registry 和 HCP Terraform 的桥梁。
✎ 如果你经常在 Terraform 里翻文档找模块配置,这个服务器能省不少时间——直接问 Claude 就能生成准确的代码片段。最适合管理多云基础设施的团队,但注意它目前只适合本地使用,别在生产环境里暴露 HTTP 端点。
相关资讯
Vercel CEO Guillermo Rauch 接受 TechCrunch 采访,讨论了智能体在生产环境中的现实挑战:数据安全、审计追踪、工具调用权限。他提出模型与智能体应解耦,Vercel 的 Eve 框架和 Sandbox 产品旨在提供灵活的“插拔”架构。同时他观察到,谷歌 Gemini、DeepSeek 等模型因性价比而崛起,客户正从单一模型合作伙伴转向多模型策略。
Vercel 首席软件官 Andrew Qu 在访谈中阐述了 Agent 作为一种新软件形态的独特需求,并分享了 Vercel 从构建内部 Agent 到推出框架 eve 的历程。他强调了 Skills 在知识校正、Sandbox 在安全执行中的作用,并预测未来网站需要为 Agent 提供机器可读的界面。
Vercel 发布开源框架 eve,将 agent 视为文件目录,支持 MCP、子 agent、人工审批和 OpenTelemetry 追踪。内部已有 100+ agent 运行,平台 29% 的部署由 agent 触发。