tesla-mcp
Provides tools for interacting with a Tesla vehicle through Tesla's Fleet API, including listing vehicles, checking status without waking the car, waking the vehicle, sending signed door-lock commands, checking nightly lock status, and viewing recent audit logs.
This server does not currently have a deployable release on Glama. Follow the repository's setup instructions to install and configure it for your MCP client, including any required credentials and local dependencies.
tesla-mcp
A private Model Context Protocol server for one Tesla owner, running on Cloudflare Workers. It gives an assistant, or any Streamable HTTP MCP client or script, plain tools for the owner's Tesla vehicles, energy products (Powerwall, solar, Wall Connector), and account: status and data, climate, charging, closures, media, security settings, navigation, and energy settings. The server has no schedules or routines of its own: anything recurring, such as a nightly lock, is run by the caller (see Locking on a schedule).
Vehicle commands are sent as signed Vehicle Command Protocol messages (VCSEC for locks and closures, infotainment for the rest), so they work on vehicles that require Tesla's command signing. The signer is a WebCrypto port checked byte for byte against Tesla's Go implementation: every command payload, both domains' handshakes and signatures, and the encrypted replies. GAP.md maps every Tesla capability to a tool, or says why there is none.
Status: owner-only MVP. One owner, one Tesla account. /mcp accepts the static MCP_BEARER_TOKEN or an access
token from the server's own OAuth front door, which the owner approves with a passphrase (see
Connecting MCP clients).
Tools
126 tools. 101 are registered by default; the 25 marked dangerous exist only when
DANGEROUS_COMMANDS_ENABLED is "true". Every command needs confirm: true and accepts dryRun: true; read
tools take neither and never wake the car. Vehicle tools take an optional vehicle_id (the car's id or VIN) and
energy tools an optional energy_site_id. Left out, vehicle tools use DEFAULT_VIN if it is set, otherwise the
account's only car; energy tools use the account's only site. Each tool's description names the Tesla OAuth
scope it needs; see Scopes.
Core
Tool | Kind | What it does |
| read | List the cars on the owner's Tesla account with their id, VIN, name, and whether each is online, asleep, or offline. |
| read | Get the car's current status: online or asleep, and when online whether it is locked, which doors, trunks, or windows are open, battery percent, range, charging state, inside and outside temperature, climate, Sentry Mode, and odometer. |
| command | Wake the car so it can report status or take commands. |
| command | Lock the car's doors with a signed command. |
| read | Report whether the server's Tesla sign-in works (authState ok, reauth_required, or not_configured) and, when ok, the OAuth scopes the sign-in grants. |
| read | Show the most recent entries in the audit log of commands, wakes, and sign-in events, newest first. |
| read | Check that the car is online and accepts this server's signed commands (its virtual key is paired) by sending a signed no-op. |
Doors, closures, and alerts
Tool | Kind | What it does |
| command, dangerous | Unlock the car's doors. |
| command, dangerous | Enable keyless driving (remote start) for two minutes. |
| command | Close the powered doors and lock the car (Model X falcon-wing and front doors). |
| command, dangerous | Open the rear trunk. |
| command | Close a powered rear trunk. |
| command, dangerous | Open the front trunk (frunk). |
| command, dangerous | Open the powered tonneau cover (Cybertruck). |
| command | Close the powered tonneau cover (Cybertruck). |
| command | Stop a moving tonneau cover (Cybertruck). |
| command, dangerous | Vent (slightly open) all windows. |
| command | Close all windows. |
| command, dangerous | Vent the sunroof, on cars with a powered sunroof. |
| command | Close the sunroof, on cars with a powered sunroof. |
| command | Honk the horn once. |
| command | Flash the headlights once. |
Climate and seats
Tool | Kind | What it does |
| command | Turn on climate control (precondition the cabin) at the current settings. |
| command | Turn off climate control. |
| command | Set the driver and passenger cabin temperatures, in Celsius (15-28). |
| command | Turn Defrost (maximum preconditioning) on or off. |
| command | Turn Bioweapon Defense Mode on or off, on cars with a HEPA filter. |
| command | Turn Cabin Overheat Protection on or off, optionally fan only (no A/C). |
| command | Set the temperature at which Cabin Overheat Protection starts: low, medium, or high. |
| command | Set Climate Keeper: off, on (Keep), dog (Dog Mode), or camp (Camp Mode). |
| command | Set seat heater levels for one or more seats. |
| command | Set a front seat's ventilation (cooling) level, on cars with ventilated seats. |
| command | Turn automatic seat heating and cooling on or off for a front seat. |
| command | Turn the steering wheel heater on or off. |
Charging and schedules
Tool | Kind | What it does |
| command | Start charging. |
| command | Stop charging. |
| command | Set the charge limit to the car's standard (daily) level. |
| command | Set the charge limit to maximum range (100%), for trips. |
| command | Set the charge limit, 50 to 100 percent. |
| command | Set the charging current in amps (1-80). |
| command, dangerous | Open the charge port door. |
| command | Close the charge port door. |
| command | Set or turn off the single scheduled charging start time. |
| command | Set the scheduled departure: the car preconditions and/or charges off-peak to be ready by this time. |
| command | Turn off scheduled departure. |
| command | Add or replace a charge schedule (firmware 2024.26+). |
| command | Remove one charge schedule by id. |
| command | Remove all charge schedules at home, work, and/or other locations. |
| command | Add or replace a cabin preconditioning schedule (firmware 2024.26+), applied at the given location. |
| command | Remove one preconditioning schedule by id. |
| command | Remove all preconditioning schedules at home, work, and/or other locations. |
Media and power
Tool | Kind | What it does |
| command | Turn Low Power Mode on or off (Cybertruck). |
| command | Turn Keep Accessory Power on or off (keeps 12 V outlets and accessories powered). |
| command | Set the media volume, 0 to 10. |
| command | Turn the media volume up one step. |
| command | Turn the media volume down one step. |
| command | Play or pause media. |
| command | Skip to the next track. |
| command | Go to the previous track. |
| command | Go to the next favorite station. |
| command | Go to the previous favorite station. |
Security, access, and settings
Tool | Kind | What it does |
| command | Turn Sentry Mode on. |
| command, dangerous | Turn Sentry Mode off. |
| command, dangerous | Turn Valet Mode on with a four-digit PIN. |
| command, dangerous | Turn Valet Mode off. |
| command, dangerous | Clear the Valet Mode PIN. |
| command, dangerous | Turn PIN to Drive on (with a new four-digit PIN) or off (with the current PIN). |
| command, dangerous | Reset the PIN to Drive PIN (owner and fleet manager only). |
| command, dangerous | Turn off PIN to Drive and clear its PIN without the PIN (owner and fleet manager only). |
| command, dangerous | Turn Speed Limit Mode on with its four-digit PIN. |
| command, dangerous | Turn Speed Limit Mode off with its four-digit PIN. |
| command, dangerous | Set the Speed Limit Mode maximum speed, 50 to 120 mph. |
| command, dangerous | Clear the Speed Limit Mode PIN (also turns Speed Limit Mode off). |
| command, dangerous | Clear the Speed Limit Mode PIN without the PIN (owner and fleet manager only; firmware 2023.38+). |
| command, dangerous | Turn Guest Mode on or off. |
| command, dangerous | Erase user data (profiles, settings, linked accounts) from the car. |
| command, dangerous | Trigger HomeLink (garage door or gate). |
| command, dangerous | Schedule installing a downloaded software update after a delay in seconds (0 = now). |
| command | Cancel a scheduled software update that has not started installing. |
| command | Rename the car. |
Vehicle data, sharing, and Fleet Telemetry
Tool | Kind | What it does |
| read | Live vehicle data from the categories you name (vehicle_data). |
| read | The last data the car reported, even while it is asleep or offline (never contacts the car). |
| read | Whether mobile (remote) access is enabled in the car. |
| read | Superchargers and destination chargers near the car's current location, with availability. |
| read | Recent alerts the car has raised. |
| read | Release notes for the car's installed firmware. |
| read | The car's service status (for example an open service visit). |
| read | Firmware version, whether signed commands are required, Fleet Telemetry version, and the number of keys. |
| read | The car's option and configuration details. |
| read | Warranty information for the car. |
| read | Subscriptions the car is eligible for (for example Premium Connectivity). |
| read | Software upgrades the car is eligible for. |
| read | Paid charging history (Supercharger sessions, fees) for the car. |
| read | The car's Fleet Telemetry streaming configuration for this app: whether it is synced and whether the config limit is reached. |
| read | Recent Fleet Telemetry errors the car reported for this app's configuration. |
| command | Remove this app's Fleet Telemetry streaming configuration from the car. |
| read | Drivers who have access to the car through sharing (owner only). |
| command | Remove a shared driver's access to the car. |
| read | Active invitations to share the car. |
| command, dangerous | Create a single-use invitation link (valid 24 hours) that gives whoever redeems it driver access to the car in the Tesla app, including location and remote commands. |
| command | Revoke a share invitation so its link no longer works. |
Navigation and sound
Tool | Kind | What it does |
| command | Send an address or place name to the car's navigation, as sharing it from the Tesla app does. |
| command | Start navigation to coordinates. |
| command | Start navigation to a Supercharger by id (for example from tesla_vehicle_nearby_charging_sites). |
| command | Send a multi-stop route to the car's navigation as Google Maps place ids, in order. |
| command | Play a sound on the external speaker (Boombox): locate_ping or fart. |
Energy (Powerwall, solar, Wall Connector)
Tool | Kind | What it does |
| read | Live power flows (solar, battery, grid, home), battery percent, grid status, and Storm Watch state. |
| read | Site configuration: installed assets, backup reserve, operation mode, tariff, and supported features. |
| read | Battery percent and power, site name, and Storm Watch state. |
| read | Estimated hours the battery can power the home in an outage at the current load. |
| read | Energy produced, consumed, imported, and exported, aggregated by period (Wh). |
| read | Past grid outages (backup events) and their duration. |
| read | Wall Connector charging sessions and energy (Wh). |
| read | Live state and power of the site's Wall Connectors. |
| read | The site's utility rate plan: time-of-use periods and buy and sell prices. |
| command | Set the battery's backup reserve: the percent kept for outages. |
| command | Set the operation mode: self_consumption (self-powered) or autonomous (time-based control). |
| command | Turn Storm Watch on or off (charge fully ahead of severe weather). |
| command | Allow or disallow charging the battery from the grid, and set what may be exported to the grid: pv_only, battery_ok, or never. |
| command | During an outage, stop charging vehicles from the battery below this percent. |
| command | Replace the site's time-of-use tariff with tariff_content_v2 (Tesla's tariff structure: seasons, energy_charges, sell_tariff, currency). |
Account
Tool | Kind | What it does |
| read | Every vehicle and energy product on the account, with energy_site_id values for the energy tools. |
| read | The signed-in account's profile summary. |
| read | The account's region and its Fleet API base URL. |
| read | The account's active vehicle orders. |
| read | Feature flags Tesla sets for the account. |
Related MCP server: Tessie MCP Server
Safety model
Confirmation required. Every state-changing tool refuses to act unless called with
confirm: true, and acceptsdryRun: trueto describe the action without contacting the car. Refusals are audited.Dangerous commands are off by default. Unlock, remote start, opening the trunk, frunk, tonneau, windows, sunroof, or charge port, turning Sentry Mode off, Valet Mode, PIN to Drive, Speed Limit Mode, Guest Mode, data erase, HomeLink, scheduling a software update, and creating a share invite are only registered when
DANGEROUS_COMMANDS_ENABLEDis exactly"true"(default"false"). The server checks the same flag again before sending any of them.Never wakes implicitly. Reads report "asleep" instead of waking the car, and commands to an asleep car fail with
vehicle_asleep. Onlytesla_wakeandtesla_lockwake it.Explicit allowlists. The signer only builds the commands in
SIGNED_COMMANDS, and REST calls only go to the endpoints insrc/tesla/endpoints.ts, from fixed path templates. It is not a generic proxy.Secrets stay secret. Tesla tokens are stored AES-256-GCM encrypted in a Durable Object. Tokens, keys, and raw Tesla responses are never logged or written to the audit log.
Fail closed.
/mcprefuses every request without a validMCP_BEARER_TOKENor OAuth access token, and/authorizeapproves nothing whileOAUTH_ADMIN_PASSPHRASEis unset. A command key that does not match the published public key refuses to sign.
Locking
tesla_lock (with confirm: true) is the one lock, for assistants and scripts alike. If the car is asleep or
offline it is woken and polled until online (up to about 90 seconds), and the lock is retried, up to 4 attempts
within 7 minutes. Failures Tesla marks as not retryable stop at once. If a lock response is lost, the car's lock state
is checked instead of sending the lock again. After Tesla accepts the lock, the car's lock state is read back; a car
that still reports unlocked gets another attempt. The result says locked, confirmed (the car itself reported
locked), woke, and attempts. A failure carries error and a specific reason such as pairing_required,
wake_timeout, still_unlocked, or reauth_required.
Locking on a schedule
The server runs nothing on its own. To lock the car every night (or on any other schedule), let your own scheduler
(cron, a systemd timer, an assistant's routine, a CI job) call the MCP tools at https://<your-domain>/mcp with
Authorization: Bearer <MCP_BEARER_TOKEN> (or an access token for a static client
created for the job):
Optionally call
tesla_auth_status. IfauthStateisreauth_required, alert the owner to sign in again (below) instead of trying to lock.Call
tesla_lockwith{"confirm": true}(andvehicle_idif the account has more than one car andDEFAULT_VINis not set). Allow the call up to about 8 minutes: an asleep car is woken and retried within the 7-minute budget.Treat
locked: trueas success;confirmed: falsemeans Tesla accepted the lock but the car's state could not be read back. OnisError, alert onerrorandreason(for examplereauth_required,pairing_required,wake_timeout,still_unlocked). Do not loop on failures: the tool has already retried.
Every call is in the audit log (tesla_audit_recent).
Scopes
Browser sign-in (/login) asks Tesla for all nine scopes the tools use, with prompt_missing_scopes=true so an
earlier, narrower grant is widened:
openid offline_access vehicle_device_data vehicle_cmds vehicle_location vehicle_charging_cmds user_data energy_device_data energy_cmds.
Your developer app must allow each of them (tick them in the developer portal), or Tesla grants fewer. Tesla may
also let the owner untick some on its consent page. tesla_auth_status lists the scopes the stored sign-in
actually has. openid offline_access vehicle_device_data vehicle_cmds covers every vehicle tool except
tesla_vehicle_charging_history and location data. The rest need:
Scope | Tools |
|
|
|
|
|
|
| the |
| the |
Without them those tools fail with forbidden and name the missing scope. A refresh token from elsewhere
(TESLA_BOOTSTRAP_REFRESH_TOKEN) keeps whatever scopes it was issued with. GAP.md has the full mapping.
Self-hosting
You need a Tesla developer account, a Cloudflare account, and a domain you control (Tesla fetches your public key from it). Node 22 or newer.
Create a Tesla developer application at developer.tesla.com. Set the allowed origin to
https://<your-domain>and the redirect URI tohttps://<your-domain>/callback, the same valueOAUTH_REDIRECT_BASEwill produce (step 3). Tesla's portal rejects domains that contain "tesla". Tick the scopes listed under Scopes: vehicle information, vehicle location, vehicle commands, vehicle charging management, profile information, energy product information, and energy product commands.Generate a P-256 command key somewhere outside this repository (
*.pemandkeys/are gitignored, but keep the private key off disk where you can):openssl ecparam -name prime256v1 -genkey -noout -out private-key.pem openssl ec -in private-key.pem -pubout -out public-key.pemPublish the public key. Put the contents of
public-key.peminTESLA_PUBLIC_KEY_PEMinwrangler.jsonc(newlines as\n). After deploying, it is served athttps://<your-domain>/.well-known/appspecific/com.tesla.3p.public-key.pem. If your account is outside North America, changeTESLA_FLEET_BASE_URLto your region's Fleet API host. SetOAUTH_REDIRECT_BASEtohttps://<your-domain>: browser sign-in sends Tesla${OAUTH_REDIRECT_BASE}/callback. If the account has more than one car, setDEFAULT_VINto the VIN (or Fleet vehicle id) tools should use when called withoutvehicle_id; it must be a car on the account. Left empty, the account's only car is used, and an account with several cars needsvehicle_idon every call (the error lists each car's name, id, and VIN).Set secrets (see
.dev.vars.examplefor what each one is):npx wrangler secret put MCP_BEARER_TOKEN npx wrangler secret put TESLA_CLIENT_ID npx wrangler secret put TESLA_CLIENT_SECRET openssl pkcs8 -topk8 -nocrypt -in private-key.pem -outform DER | base64 | tr -d '\n' \ | npx wrangler secret put TESLA_COMMAND_PRIVATE_KEY_PKCS8_B64 openssl rand -base64 32 | npx wrangler secret put TOKEN_ENCRYPTION_KEY npx wrangler secret put TESLA_BOOTSTRAP_REFRESH_TOKEN # optional, see step 7 npx wrangler secret put OAUTH_ADMIN_PASSPHRASE # approves OAuth clients at /authorizeChoose a long passphrase for
OAUTH_ADMIN_PASSPHRASE(for exampleopenssl rand -base64 24) and keep it in a password manager: anyone who knows it can connect an MCP client. Without it,/authorizerefuses every request.Create the OAuth KV namespace and put the id it prints into
kv_namespacesinwrangler.jsonc(replacingREPLACE_WITH_OAUTH_KV_ID):npx wrangler kv namespace create OAUTH_KVDeploy with
npm ci && npx wrangler deploy, then attach your domain to the Worker (Workers & Pages → your Worker → Domains & Routes → Custom domain). You can smoke-test/healthzon your workers.dev URL first, but Tesla registration needs your own domain.Register as a Tesla partner for your domain (once per region), using a partner token:
PARTNER_TOKEN=$(curl -s -X POST https://fleet-auth.prd.vn.cloud.tesla.com/oauth2/v3/token \ -d grant_type=client_credentials -d client_id="$TESLA_CLIENT_ID" -d client_secret="$TESLA_CLIENT_SECRET" \ -d scope="openid vehicle_device_data vehicle_cmds" \ -d audience=https://fleet-api.prd.na.vn.cloud.tesla.com | jq -r .access_token) curl -s -X POST https://fleet-api.prd.na.vn.cloud.tesla.com/api/1/partner_accounts \ -H "Authorization: Bearer $PARTNER_TOKEN" -H 'Content-Type: application/json' \ -d '{"domain":"<your-domain>"}'Sign in with Tesla. Open
https://<your-domain>/loginin a browser, sign in to Tesla, and approve the scopes. Tesla sends you back to/callback, which exchanges the code, stores the tokens encrypted (replacing any stored ones), and showsTesla sign-in updated, scopes: ...with the scopes Tesla granted. The link from/loginworks once, for ten minutes. The redirect URI sent to Tesla is${OAUTH_REDIRECT_BASE}/callback, from the non-secretOAUTH_REDIRECT_BASEvar inwrangler.jsonc(an https URL; a trailing slash is dropped). It is never taken from the request host, and it must match a redirect URI in the developer app exactly. Tesla rotates refresh tokens and the Worker keeps the newest, so do not share this sign-in with another Tesla tool: whichever one refreshes second is locked out./loginis public, so the server remembers which Tesla account its tokens belong to (the access token'ssub), and/callbackrefuses any other account and changes nothing. ATESLA_BOOTSTRAP_REFRESH_TOKENnot used yet is tried before the code, so it names the account first. On a server that has never held a token, the first sign-in names the account: sign in right after the first deploy (or set the bootstrap token). To move the server to another account, set a refresh token for it withTESLA_BOOTSTRAP_REFRESH_TOKEN(below).Instead of the browser, you can complete Tesla's authorization-code flow elsewhere and store the refresh token with
npx wrangler secret put TESLA_BOOTSTRAP_REFRESH_TOKEN. It seeds the encrypted token store once per distinct value; a browser sign-in supersedes the value set at the time.Moving sign-in to another domain. Set
OAUTH_REDIRECT_BASEinwrangler.jsoncto the newhttps://<base>and deploy, registerhttps://<base>/callbackas a redirect URI (and the origin as an allowed origin) in the developer app at developer.tesla.com, and route the domain to the Worker (Domains & Routes → Custom domain). A/loginlink opened before the change no longer completes; start again at/login. If the var is missing or not an https URL,/loginand/callbackshow a configuration error and change nothing.Signing in again (
reauth_required). If Tesla rejects the stored sign-in (a revoked or expired refresh token), every tool fails withreauth_required, a code-only error is logged, and no further refreshes are tried. Openhttps://<your-domain>/loginagain. Alternatively, runnpx wrangler secret put TESLA_BOOTSTRAP_REFRESH_TOKENwith a new refresh token: any value that has not been seeded before replaces the stored tokens on the next request; setting the same value again does nothing.Pair the virtual key with the car. On the phone with the Tesla app, open
https://tesla.com/_ak/<your-domain>and approve the key. Signed commands fail with "pairing required" until this is done.Connect your MCP client to
https://<your-domain>/mcp: see Connecting MCP clients.
Connecting MCP clients
/mcp accepts either credential in Authorization: Bearer ...:
the static
MCP_BEARER_TOKEN, exactly as before (compared in constant time), for scripts and clients that take a fixed header; oran access token from the server's OAuth 2.1 front door, for clients such as Claude's custom connectors that sign in with OAuth.
A request without a valid one gets 401 with
WWW-Authenticate: Bearer realm="tesla-mcp", resource_metadata="https://<host>/.well-known/oauth-protected-resource/mcp", ...,
where MCP clients start OAuth discovery. The host is the one the request was sent to.
OAuth endpoints
Endpoint | What it is |
| Protected resource metadata (RFC 9728): |
| Authorization server metadata (RFC 8414): |
| Dynamic client registration (RFC 7591). Redirect URIs must be on the allowlist. |
| The approval page: shows the client's name and redirect URI and asks for |
| Exchanges the code (with the PKCE verifier) and refreshes tokens. Refresh tokens rotate: once the new one is used, the old one is dead. Also handles revocation (RFC 7009). |
| Static clients (below). Needs |
Access tokens last an hour and refresh tokens 30 days. Tokens, codes, and client secrets are stored in the OAUTH_KV
namespace only as hashes (by @cloudflare/workers-oauth-provider).
/mcp, /token, /register, and /.well-known/* answer CORS preflights before any authentication, allow the
Authorization, Content-Type, Mcp-Session-Id, and Mcp-Protocol-Version headers, and expose WWW-Authenticate.
The approval page is gated by the OAUTH_ADMIN_PASSPHRASE secret. Each page carries a one-time approval token
bound to that exact request (10 minutes, single use), so a form cannot be replayed or posted from elsewhere. After 5
wrong passphrases from one IP, that IP is refused for 15 minutes. Only approve a connection you just started.
Claude (custom connector)
In Claude, add a custom connector with the URL https://tesla-mcp.sean-1b3.workers.dev/mcp (or
https://<your-domain>/mcp for your own deployment). Then either:
Dynamic registration: leave the OAuth client ID and secret empty. Claude registers itself at
/register, opens/authorize, and you typeOAUTH_ADMIN_PASSPHRASEto approve; orStatic client: create one (below) with the default redirect URIs, and paste its
client_idandclient_secretinto the connector's advanced settings. You still approve once at/authorize.
Static clients (one per agent)
Give each agent or script its own client, so it can be revoked on its own. Create one (the secret is shown once, and stored only as a hash):
curl -s -X POST https://<your-domain>/admin/clients \
-H "Authorization: Bearer $MCP_BEARER_TOKEN" -H 'Content-Type: application/json' \
-d '{"name": "nightly-lock agent", "redirect_uris": ["http://localhost:8976/callback"]}'
# {"client_id":"...","client_secret":"...","redirect_uris":[...],...}redirect_uris is optional and defaults to Claude's two callbacks. The client authenticates at /token with
client_secret_basic or client_secret_post, and still uses PKCE. List clients (ids, names, redirect URIs; never
secrets), including dynamically registered ones:
curl -s https://<your-domain>/admin/clients -H "Authorization: Bearer $MCP_BEARER_TOKEN"Revoke a client: it can no longer sign in or refresh, and every access and refresh token it holds is rejected at once.
curl -s -X DELETE https://<your-domain>/admin/clients/<client_id> -H "Authorization: Bearer $MCP_BEARER_TOKEN"Redirect URI allowlist
Registration (/register and /admin/clients) and every /authorize request accept only:
https://claude.ai/api/mcp/auth_callbackandhttps://claude.com/api/mcp/auth_callback;http://localhost:<any port>/<any path>andhttp://127.0.0.1:<any port>/<any path>, for local MCP clients;any URI listed, comma separated and matched exactly, in the
OAUTH_EXTRA_REDIRECT_URISvar inwrangler.jsonc.
Removing a URI from OAUTH_EXTRA_REDIRECT_URIS stops /authorize from using it for clients registered earlier too.
Development
npm ci
npm run check # typecheck, Biome lint, tests
npm run deploy:dry # bundle without deployingTests run in the Workers runtime against a simulated Tesla (Fleet API, OAuth, energy sites, and a vehicle that runs
real VCSEC and infotainment sessions: ECDH handshakes, signature checks, and encrypted replies). All test credentials
are generated at runtime. The Python cross-check of the VCSEC lock in test/vcp-vectors.test.ts comes from
scripts/vcsec_vectors.py.
bash conformance/run.sh (needs Go and git) checks the shared vectors against Tesla's official Go implementation at
a pinned commit of teslamotors/vehicle-command:
test/vectors/vcsec-lock.jsonandtest/vectors/infotainment-honk.json: key derivation, the handshake, signing, the response request hash, and AES-GCM reply decryption, in both domains, through Tesla's Signer and Verifier.test/vectors/vcp-commands.json: the payload of every signed command, byte for byte, as Tesla's ownpkg/vehiclemethods build it.
CI runs it as the go-conformance job. Without a local Go, docker run --rm -v "$PWD":/repo:ro -w /repo golang:1.27.3 bash conformance/run.sh works too.
License
MIT. See LICENSE.
This server cannot be deployed
Maintenance
Related MCP Connectors
Control your Tesla from your AI assistant - climate, charging, access, and security.
Control your Tesla - wake it, warm it up, unlock and more. Get your developer token at https://Infoseek.ai/mcp. Also requires your own Tesla developer token which is tied to your car/fleet.
Tesla data for your AI: battery, range, charging, tires, alerts, history. Controls off by default.
Tesla Fleet API for AI: send navigation destinations, read battery and location, run car commands.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables control and monitoring of Tesla vehicles through the Tessie API, providing access to vehicle state (battery, location, climate) and commands (lock/unlock, climate control, navigation) with support for both local and Cloudflare Worker deployment.11MIT
- AlicenseAqualityDmaintenanceEnables AI assistants to control and monitor Tesla vehicles via natural language through the Tessie API, supporting battery, climate, security, charging, and more.611MIT
- AlicenseNot gradedqualityDmaintenanceEnables control and monitoring of Tesla vehicles via the Tessie API, providing state and command tools for climate, locks, charging, and navigation.MIT
- AlicenseAqualityAmaintenanceConnects a MyToyota or MyLexus Europe account to Claude and other MCP clients, enabling natural-language access to fuel, range, location, trips, health, climate, charging data, and remote commands such as lock, climate, and charging.261MIT