返回 MCP 目录
public公开dns本地运行

tesla-streamable-mcp-server

一个基于Tessie API的Tesla车辆控制MCP服务器,支持本地Node.js和Cloudflare Workers双运行时,提供车辆状态查询和远程控制功能。

article

README

🚀 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 密钥以秘密方式存储,客户端使用单独的承载令牌进行身份验证。
  • 反馈清晰:提供详细的指令执行结果和车辆状态信息。

📦 安装指南

前提条件

运行方式(任选其一)

  1. 本地开发 — 使用承载令牌认证的标准设置。
  2. Cloudflare Worker(本地开发) — 在本地进行 Worker 测试。
  3. Cloudflare Worker(部署到生产环境) — 用于远程生产环境。

1. 本地开发 — 快速开始

  1. 获取 Tessie 凭证:
    • 访问 developer.tessie.com
    • 进入 开发者设置生成访问令牌
    • 复制你的访问令牌。
    • 记录你的车辆 VIN 码。
  2. 配置环境:
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
  1. 运行:
bun dev
# MCP: http://127.0.0.1:3000/mcp

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(部署到生产环境)

  1. 创建用于会话存储的 KV 命名空间:
bun x wrangler kv:namespace create TOKENS

输出结果会显示:

将以下内容添加到你的 wrangler.toml 文件中:
[[kv_namespaces]]
binding = "TOKENS"
id = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
  1. 使用你的 KV 命名空间 ID 更新 wrangler.toml 文件:
[[kv_namespaces]]
binding = "TOKENS"
id = "your-kv-namespace-id-from-step-1"
  1. 设置机密信息:
# 生成用于客户端认证的随机令牌
openssl rand -hex 32
bun x wrangler secret put BEARER_TOKEN
# 提示时粘贴生成的令牌

# Tessie API 凭证
bun x wrangler secret put TESSIE_ACCESS_TOKEN
# 提示时粘贴你的 Tessie 令牌

bun x wrangler secret put TESSIE_VIN
# 提示时粘贴你的 VIN 码
  1. 部署:
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
# 连接到:http://localhost:3000/mcp(本地)或 https://your-worker.workers.dev/mcp(远程)

工具说明

tesla_state

获取特斯拉车辆的当前状态。

// 输入
{}

// 输出
{
  display_name: string;           // 车辆名称
  battery_level: number;          // 电池电量百分比(0 - 100%)
  battery_range_km: number;       // 估计续航里程(公里)
  charging: {
    state: string;                // 充电状态("Disconnected", "Charging", "Complete", "Stopped")
    minutes_remaining: number | null;
    charge_limit: number;         // 充电限制百分比
  };
  location: {
    latitude: number;
    longitude: number;
    heading: number;              // 行驶方向(0 - 359°)
    speed: number | null;         // 车速(公里/小时),停车时为 null
  };
  locked: boolean;
  sentry_mode: boolean;
  climate: {
    is_on: boolean;
    inside_temp: number;          // 车内温度(°C)
    outside_temp: number;         // 车外温度(°C)
    target_temp: number;          // 目标温度(°C)
    is_defrosting: boolean;
  };
  doors: {
    front_left: boolean;          // 左前门状态(true = 打开)
    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;           // ISO 8601 格式的最后更新时间
}

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;           // set_temperature 指令所需参数(15 - 28°C)
  destination?: string;           // share 指令所需参数
  locale?: string;                // share 指令可选参数(例如,"en-US")
}

// 输出
{
  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 # 进行 TypeScript 检查
bun run lint      # 代码 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 许可证。

help

运行方式说明

cloud

托管运行

托管运行通常表示这个 MCP Server 由服务方环境承载,用户一般按页面提供的连接方式或授权流程接入,不需要在本地长期启动一个 MCP 进程

  1. 打开服务方连接页
  2. 完成授权或复制端点
  3. 在 MCP 客户端中连接
terminal

本地运行 / 其它方式

本地运行通常需要用户在自己的电脑或服务器上安装依赖,把 server_config 复制到 MCP 客户端,并按 env_schema 补齐环境变量、密钥或其它配置

  1. 复制 server_config
  2. 安装所需依赖
  3. 补齐环境变量后重启客户端