🚀 Tesla MCP Server
Tesla MCP Server 是一个可流式传输的 HTTP MCP 服务器,借助 Tessie API 实现对特斯拉车辆的控制。
作者:overment
⚠️ 重要提示
你需自行承担将此服务器连接到 MCP 客户端的责任。语言模型可能会出错、误解指令或执行意外操作。在执行命令之前,请务必进行验证,特别是对于解锁、打开后备箱或发送导航目的地等操作。
HTTP 层是为开发过程中的便利性而设计的,并非具备生产级别的安全性。如果要进行远程部署,请加强安全措施,包括进行适当的令牌验证、安全存储、TLS 终止、严格的 CORS/源检查、速率限制和审计日志记录。
🚀 快速开始
本项目有两种运行方式:
- 作为 Node/Hono 服务器,适用于本地工作流程。
- 作为 Cloudflare Worker,用于远程交互。
✨ 主要特性
- ✅ 状态监测 — 可获取电池电量、续航里程、车辆位置、车内气候、车门状态和充电状态等信息。
- ✅ 指令控制 — 支持锁定/解锁车辆、调节车内气候、控制后备箱、开启哨兵模式和设置导航等指令。
- ✅ 位置感知 — 提供 GPS 坐标,实现基于位置的交互。
- ✅ 双运行环境 — 支持在 Node.js/Bun 或 Cloudflare Workers 环境中运行。
设计原则
- 对大语言模型友好:提供两个统一的工具,而非 1:1 的 API 镜像。
- 便于监控:专为具有位置上下文的 AI 代理设计。
- 安全可靠:Tessie API 密钥以秘密方式存储,客户端使用单独的承载令牌进行身份验证。
- 反馈清晰:提供详细的指令执行结果和车辆状态信息。
📦 安装指南
前提条件
运行方式(任选其一)
- 本地开发 — 使用承载令牌认证的标准设置。
- Cloudflare Worker(本地开发) — 在本地进行 Worker 测试。
- Cloudflare Worker(部署到生产环境) — 用于远程生产环境。
1. 本地开发 — 快速开始
- 获取 Tessie 凭证:
- 配置环境:
cd tesla-mcp
bun install
cp .env.example .env
编辑 .env 文件:
PORT=3000
AUTH_ENABLED=true
AUTH_STRATEGY=bearer
# 使用以下命令生成:openssl rand -hex 32
BEARER_TOKEN=your-random-auth-token
# Tessie 凭证
TESSIE_ACCESS_TOKEN=your-tessie-access-token
TESSIE_VIN=your-vehicle-vin
- 运行:
bun dev
Claude Desktop / Cursor 配置:
{
"mcpServers": {
"tesla": {
"command": "npx",
"args": ["mcp-remote", "http://localhost:3000/mcp", "--transport", "http-only"],
"env": { "NO_PROXY": "127.0.0.1,localhost" }
}
}
}
2. Cloudflare Worker(本地开发)
bun x wrangler dev --local | cat
创建 .dev.vars 文件存储本地机密信息:
BEARER_TOKEN=your_random_auth_token
TESSIE_ACCESS_TOKEN=your_tessie_token
TESSIE_VIN=your_vehicle_vin
端点地址:http://127.0.0.1:8787/mcp
3. Cloudflare Worker(部署到生产环境)
- 创建用于会话存储的 KV 命名空间:
bun x wrangler kv:namespace create TOKENS
输出结果会显示:
将以下内容添加到你的 wrangler.toml 文件中:
[[kv_namespaces]]
binding = "TOKENS"
id = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
- 使用你的 KV 命名空间 ID 更新
wrangler.toml 文件:
[[kv_namespaces]]
binding = "TOKENS"
id = "your-kv-namespace-id-from-step-1"
- 设置机密信息:
openssl rand -hex 32
bun x wrangler secret put BEARER_TOKEN
bun x wrangler secret put TESSIE_ACCESS_TOKEN
bun x wrangler secret put TESSIE_VIN
- 部署:
bun x wrangler deploy
端点地址:https://<worker-name>.<account>.workers.dev/mcp
💻 使用示例
1. 获取车辆状态
{
"name": "tesla_state",
"arguments": {}
}
2. 锁定车辆
{
"name": "tesla_command",
"arguments": {
"command": "lock"
}
}
3. 将温度设置为 22°C
{
"name": "tesla_command",
"arguments": {
"command": "set_temperature",
"temperature": 22
}
}
4. 在出发前开启车内气候控制
{
"name": "tesla_command",
"arguments": {
"command": "start_climate"
}
}
5. 导航到目的地
{
"name": "tesla_command",
"arguments": {
"command": "share",
"destination": "Golden Gate Bridge, San Francisco"
}
}
📚 详细文档
客户端配置
Alice 应用
添加为 MCP 服务器,配置如下:
- URL:
https://your-worker.workers.dev/mcp
- 类型:
streamable-http
- 请求头:
Authorization: Bearer <your-BEARER_TOKEN>
Claude Desktop / Cursor(本地服务器)
{
"mcpServers": {
"tesla": {
"command": "npx",
"args": ["mcp-remote", "http://127.0.0.1:3000/mcp", "--transport", "http-only"],
"env": { "NO_PROXY": "127.0.0.1,localhost" }
}
}
}
Claude Desktop / Cursor(Cloudflare Worker)
{
"mcpServers": {
"tesla": {
"command": "npx",
"args": ["mcp-remote", "https://your-worker.workers.dev/mcp", "--transport", "http-only"]
}
}
}
MCP 检查器(快速测试)
bunx @modelcontextprotocol/inspector
工具说明
tesla_state
获取特斯拉车辆的当前状态。
{}
{
display_name: string;
battery_level: number;
battery_range_km: number;
charging: {
state: string;
minutes_remaining: number | null;
charge_limit: number;
};
location: {
latitude: number;
longitude: number;
heading: number;
speed: number | null;
};
locked: boolean;
sentry_mode: boolean;
climate: {
is_on: boolean;
inside_temp: number;
outside_temp: number;
target_temp: number;
is_defrosting: boolean;
};
doors: {
front_left: boolean;
front_right: boolean;
rear_left: boolean;
rear_right: boolean;
frunk: boolean;
trunk: boolean;
charge_port: boolean;
};
state: "online" | "asleep" | "offline";
odometer_km: number;
last_updated: string;
}
tesla_command
在特斯拉车辆上执行指令。
{
command: "lock" | "unlock" | "start_climate" | "stop_climate" |
"set_temperature" | "start_defrost" | "stop_defrost" |
"open_frunk" | "open_trunk" | "open_charge_port" |
"close_charge_port" | "enable_sentry" | "disable_sentry" |
"flash" | "honk" | "share";
temperature?: number;
destination?: string;
locale?: string;
}
{
success: boolean;
command: string;
message: string;
}
指令参考:
| 指令 |
描述 |
参数 |
lock |
锁定车辆 |
— |
unlock |
解锁车辆 |
— |
start_climate |
开启车内气候控制 |
— |
stop_climate |
关闭车内气候控制 |
— |
set_temperature |
设置车内温度 |
temperature(15 - 28°C) |
start_defrost |
开启最大除霜功能 |
— |
stop_defrost |
关闭除霜功能 |
— |
open_frunk |
打开前备箱 |
— |
open_trunk |
打开或关闭后备箱 |
— |
open_charge_port |
打开充电口门 |
— |
close_charge_port |
关闭充电口门 |
— |
enable_sentry |
开启哨兵模式 |
— |
disable_sentry |
关闭哨兵模式 |
— |
flash |
闪烁车灯 |
— |
honk |
鸣笛 |
— |
share |
发送目的地到导航 |
destination, locale? |
认证流程
┌─────────────────────────────────────────────────────────────────┐
│ 客户端(Alice 应用、Claude Desktop) │
│ │ │
│ │ Authorization: Bearer <BEARER_TOKEN> │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ Cloudflare Worker / Node.js 服务器 │ │
│ │ │ │
│ │ 1. 验证 BEARER_TOKEN(客户端认证) │ │
│ │ 2. 使用 TESSIE_ACCESS_TOKEN(内部 API 密钥) │ │
│ │ │ │
│ │ env.TESSIE_ACCESS_TOKEN ──┐ │ │
│ │ env.TESSIE_VIN ───────────┼──► TessieClient │ │
│ │ │ │ │ │
│ │ │ ▼ │ │
│ │ │ api.tessie.com │ │
│ └─────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
关键点:
BEARER_TOKEN:你生成的随机令牌,用于客户端向 MCP 服务器进行身份验证。
TESSIE_ACCESS_TOKEN:你的 Tessie API 密钥,由服务器内部使用。
- 客户端永远不会看到你的 Tessie 凭证。
HTTP 端点
| 端点 |
方法 |
用途 |
/mcp |
POST |
MCP JSON-RPC 2.0 |
/health |
GET |
健康检查 |
开发命令
bun dev
bun run typecheck
bun run lint
bun run build
bun start
项目架构
src/
├── shared/
│ └── tools/
│ ├── tesla-state.ts # 获取车辆状态
│ └── tesla-command.ts # 执行指令
├── services/
│ └── tessie.service.ts # Tessie API 客户端
├── schemas/
│ ├── commands.ts # 指令定义
│ ├── outputs.ts # 工具输出模式
│ └── tessie.ts # Tessie API 响应模式
├── config/
│ └── metadata.ts # 服务器和工具描述
├── index.ts # Node.js 入口文件
└── worker.ts # Workers 入口文件
环境变量
Node.js(.env)
| 变量 |
是否必需 |
描述 |
TESSIE_ACCESS_TOKEN |
✓ |
Tessie API 访问令牌 |
TESSIE_VIN |
✓ |
特斯拉车辆 VIN 码 |
BEARER_TOKEN |
✓ |
MCP 客户端认证令牌 |
PORT |
|
服务器端口(默认:3000) |
HOST |
|
服务器主机(默认:127.0.0.1) |
AUTH_ENABLED |
|
启用认证(默认:true) |
AUTH_STRATEGY |
|
bearer(默认) |
Cloudflare Workers(wrangler.toml + 机密信息)
wrangler.toml 变量:
AUTH_ENABLED = "true"
AUTH_STRATEGY = "bearer"
机密信息(通过 wrangler secret put 设置):
BEARER_TOKEN — 客户端随机认证令牌
TESSIE_ACCESS_TOKEN — Tessie API 访问令牌
TESSIE_VIN — 你的车辆 VIN 码
KV 命名空间:
[[kv_namespaces]]
binding = "TOKENS"
id = "your-kv-namespace-id"
故障排除
| 问题 |
解决方案 |
| 401 Unauthorized |
检查 BEARER_TOKEN 是否已设置,并且客户端发送了 Authorization: Bearer <token> 请求头 |
| "TESSIE_ACCESS_TOKEN not configured" |
设置机密信息:wrangler secret put TESSIE_ACCESS_TOKEN |
| "TESSIE_VIN not configured" |
设置机密信息:wrangler secret put TESSIE_VIN |
| "Tessie API error" |
在 developer.tessie.com 上验证 TESSIE_ACCESS_TOKEN 是否有效 |
| 车辆未找到 |
检查 TESSIE_VIN 是否正确(应为 17 位字符) |
| 车辆离线 |
车辆可能处于深度睡眠状态。执行指令会唤醒它(大约需要 30 秒) |
| 指令超时 |
Tessie 最多会等待 90 秒让车辆唤醒。请重试 |
| KV 命名空间错误 |
运行 wrangler kv:namespace create TOKENS 并更新 wrangler.toml 文件 |
| "ReadableStream is not defined" |
Node.js 版本过旧(需要 18 及以上版本)。使用较新版本的 Node.js 完整路径 |
| "spawn bunx ENOENT" |
Claude Desktop 找不到 bunx。请使用 npx 代替 |
调试方法
使用 MCP 检查器进行测试:
bunx @modelcontextprotocol/inspector
查看 Worker 日志:
wrangler tail
📄 许可证
本项目采用 MIT 许可证。