tesla-mcp
Integrates with the Tesla Fleet API in read-only mode, allowing users to list vehicles, read battery, charging, climate, odometer, and software status, query local SQLite history for mileage and range trends, generate reports such as weekly mileage and low-charge alerts, and optionally wake the vehicle through a budget-gated refresh tool.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@tesla-mcphow charged is my car and how far did I drive this week?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
tesla-grokbot-connector
Read-only Tesla Fleet API MCP for Grok Bot. Each person runs this on their own Grok Bot computer. The Bot starts it as a stdio command. There is no public host and no marketplace tile.
Compatible with Tesla. This project is not affiliated with, endorsed by, or sponsored by Tesla, Inc. Do not name your developer app anything that implies an official Tesla product (use something like “GrokBot Vehicle Bridge”).
Install and attach: follow INSTALL.md. Put the client id,
client secret, and token key on the computer, run tesla-mcp auth with Take
over, then add a custom stdio command in chat.
What it does
Ask how charged the car is, how far it drove this week, or whether range is dropping. The server can:
list vehicles (VIN masked)
read battery, charging, climate, odometer, and software when the car is already online
return the last local snapshot when the car is asleep, without waking it
keep that history in SQLite and answer weekly mileage, range trend, and a low-charge check from it
wake the car only through
tesla_wake_and_refresh, and only inside a small budgetoptionally poll every 1–2 hours, and only if the car is already online
Related MCP server: mcp-teslamate-fleet
What it does not do
The
tesla-mcpserver does not lock, unlock, honk, start climate, or start and stop charging. Those tools are not registered on it. The only Fleet API write on this server iswake_up, and only fromtesla_wake_and_refresh.It does not use a virtual key or
tesla-http-proxy.It does not stream Fleet Telemetry and it does not talk to Tesla Energy products.
It does not request
vehicle_cmdsoruser_data.It does not wake the car for a status question, a report, or
tesla-mcp poll.
Optional vehicle commands
Lock, climate, charge, lights, horn, and sentry on are a separate
program, tesla-commands-mcp. You add it as its own connector,
tesla-commands, beside tesla. It is optional and off by default.
Installing or running tesla-mcp does not add those tools and does not
request vehicle_cmds.
Commands stay in dry-run until TESLA_COMMANDS_DRY_RUN is false, 0,
no, or off. Those are the only values that turn it off. A blank or
unrecognized value stays in dry-run. An empty allowlist allows none of them. Read
docs/COMMANDS.md before you turn one on. That page
covers the risks, the scope, pairing the virtual key, the signing proxy,
and how to remove the key from the car.
Charging history is off. Tesla only exposes it through vehicle_charging_cmds,
which also allows charge control. Turn it on only if you accept that grant.
This server still will not call charge control.
How this compares to other Tesla MCP servers
Several open-source Tesla MCP servers already exist. The notes below are from their READMEs on 22 Oct 2026.
scald/tesla-mcp is a small TypeScript MCP server for Claude Desktop. Its tools wake the car and return basic vehicle info (
wake_up,refresh_vehicles,debug_vehicles).ysrdevs/tesla-mcp is Python. The README describes 96 tools covering the Fleet API, including lock/unlock, climate, and charging commands.
MyTeslaMate/mcp-tesla is mainly a hosted service: you sign in through
https://mcp.myteslamate.com/mcp. The README describes full vehicle-command access plus TeslaMate tools (98 Fleet API tools and 9 TeslaMate tools). Self-hosting is documented as an advanced option.
This project is built for Grok Bot. The tesla-mcp connector is strictly
read-only: it has no command tools, no virtual key, and no
tesla-http-proxy. An optional commands program lives beside it and is off
by default (docs/COMMANDS.md). The read-only connector
runs locally on the Grok Bot computer as a stdio process, with no hosted
server. Wakes go through one tool with a local budget, so Fleet API wake
charges stay capped.
Mileage, range, and low-charge answers come from a SQLite history on that
same computer.
Cost and billing
Prices from the Fleet API pricing page, checked 22 Oct 2026:
Category | Price | Each |
Data | 500 / $1 | $0.002 |
Wakes | 50 / $1 | $0.02 |
Commands (unused) | 1,000 / $1 | $0.001 |
Authentication calls are not billed. Responses under HTTP 500 are billed, including 408 when the car is asleep. There is no sandbox. A live call hits your car and your bill.
A 2-hour poll is about 360 state checks a month, plus about 180 data reads if
the car is online half the time ($1.08). About 10 questions a day add $0.60.
One wake a day adds $0.60. That is about $2.30 / month, inside the $10
monthly discount, so the net is often $0. Which category
GET /vehicles/{vin} and charging history use is per-endpoint in Tesla's docs
and is treated as data here until you confirm it.
Set a billing limit around $10 and add a card. The dashboard default is $0, and an app with no payment method is disabled. Alerts arrive at 80% and 100%. Crossing the limit suspends the API. Payment works in the US and most of Europe, including IE and GB.
Wakes are also capped by Tesla at 3 per minute. A loop at that cap is about $86 a day. This server defaults to 3 wakes in a rolling 24-hour window and 1 wake per 30 minutes. It will not let you configure more than 3 per minute, more than 10 wakes in that window, or a minimum gap longer than 24 hours.
tesla_usage shows the local estimate. It is not Tesla's invoice.
Tools
Tool | What you get |
| Masked VIN, name, model when Tesla sends it, |
| Battery %, range, charging, plugged in, locked. Live or cached. |
| Inside and outside °C, climate on, set points |
| Odometer miles, optional |
| Installed version and pending update fields |
| Local time series |
|
|
| Fresh snapshot. Requires |
| Calls this month, estimated USD, wake budget |
| Opt-in. Coarse (~1 km) unless |
| Opt-in. Charging sessions. Optional |
vin is optional when the account has one car. Pass a display name or the
masked VIN when there are several. Distances from the Fleet API are miles.
Temperatures are Celsius. Every tool is marked read-only. tesla_wake_and_refresh
is also marked non-idempotent because it costs money and wakes the car.
tesla_get_charging_history accepts a date (YYYY-MM-DD) or an ISO 8601 time
for start and end. Leave both out for the last 365 days. A date-only start
is midnight UTC, and a date-only end is 23:59:59 UTC. Tesla rejects a single
request longer than one year (Date range cannot exceed 1 year), so a longer
range is loaded in consecutive windows of at most 365 days, up to 10 years.
Duplicate sessions are dropped and the newest session is returned first. The
start and end in the reply are the UTC times that were queried. When Tesla
rejects a request, the reply includes Tesla's explanation rather than only the
HTTP status.
Scopes
Scope | Default |
| On |
| Off. Set |
| Off. Set |
| Not requested by |
| Never requested |
Granted scopes are read from the access token at startup. A tool whose scope
was not granted is not registered. Run tesla-mcp scopes to see the diff.
Changing scopes needs tesla-mcp auth again (prompt_missing_scopes is set).
Poll and routines
tesla-mcp poll lists vehicles and, only when state is online, reads
vehicle_data. Asleep and offline cars get a state-only row. It never calls
wake_up.
Ask the Bot to run this every 1–2 hours:
uv run --frozen --directory /workspace/tesla-grokbot-connector tesla-mcp polltesla-mcp poll --loop stays in the foreground. Intervals under 1 hour are
raised to 1 hour. A routine that runs the one-shot command is the better fit.
Example routines, all of them using the last snapshot rather than a wake:
Weekly mileage (Monday 08:00):
tesla_reportwithweekly_mileage. Gaps while the car slept are split evenly between readings.Range trend:
tesla_reportwithrange_trend. Rated range is scaled to 100% charge (range / SoC) over 30 and 90 days.Low charge (21:00):
tesla_reportwithlow_charge. Alerts under 30% when the car is unplugged. If the snapshot is older than 6 hours, the report says so.Charging summary (1st of the month): only after the charging-history opt-in. Compares the previous month with the one before it. If Tesla rejects the request, the reply includes Tesla's explanation.
Sign-in and token file
Place | Path |
Data directory on the Grok Bot computer |
|
Encrypted tokens |
|
History |
|
Config | Process environment, |
Override |
|
A .env file in the working directory is not loaded. TESLA_FLEET_API_BASE,
TESLA_TOKEN_URL, and TESLA_AUTH_URL, when set, must be the exact https
endpoint for that setting and TESLA_REGION, on port 443. The Fleet host is
fleet-api.prd.na.vn.cloud.tesla.com, fleet-api.prd.eu.vn.cloud.tesla.com,
or, only when the region is cn, fleet-api.prd.cn.vn.cloud.tesla.cn. Token
and sign-in stay fleet-auth.prd.vn.cloud.tesla.com and auth.tesla.com in
every region. Other hosts are refused at startup.
Client id and secret come from a secret-request or from config.env. The AES
key comes from TESLA_TOKEN_KEY and is not written into the token file.
Refresh tokens are single-use. The new refresh token is saved atomically
before the new access token is used. The previous refresh token stays valid
for 24 hours. A routine at least once a week keeps the chain alive (the poll
does this whenever it runs). 401 login_required means run tesla-mcp auth
again.
Every Bot on your Cursor account shares this computer. Encryption keeps the tokens unreadable without the key. It does not isolate one Bot from another Bot that can read the same secret. That is acceptable here because the scopes are read-only. Say so once.
Regions: TESLA_REGION=na, eu, or cn. A wrong region returns HTTP 421.
Details: docs/partner-registration.md.
Privacy
Location is off unless you opt in. The default precision is about 1 km. Precise coordinates are not written to SQLite. Logs do not contain coordinates or tokens.
Logs are tool name, masked VIN, status, and cost category.
tesla-mcp logoutdeletes the token file. Add--delete-historyto delete snapshots as well.Revoke the app at
https://auth.tesla.com/user/revoke/consent?revoke_client_id=<id>or in the Tesla app under Security & Privacy → Third-Party Apps.The billing limit is a hard spend cap.
See SECURITY.md.
Development
uv sync --locked
make test
make lintTests mock the Fleet API. They do not call Tesla. scripts/live_smoke.py
refuses to run unless TESLA_LIVE_SMOKE=1, and it still does not wake the car.
Expect a few data calls, well under $1.
Before you turn this on
Create the developer app, host the public key, and register the partner domain. docs/partner-registration.md.
Add a card and set a billing limit around $10.
Decide region (
na,eu, orcn), whether location is in, and whether the charging-history scope is worth the broader grant.Confirm localhost is accepted as a redirect URI. If it is not, use
tesla-mcp auth --pastewith the Pagescallback.html.
Unconfirmed with Tesla, as of this version: github.io as a partner domain,
the exact vehicle_data endpoints names, software-update field names on
every firmware, whether home charging appears in charging history, and whether
reading an already-awake car delays sleep. Virtual-key-free vehicle_data is
what Tesla's proxy documents for that endpoint; confirm it on your car.
License
MIT. Copyright (c) 2026 Naoise Irwin. See LICENSE.
Available Tools
9 toolstesla_get_climateTesla Get ClimateARead-onlyIdempotent
Inside and outside temperature in Celsius, and whether climate is on. Does not wake the car.
| Name | Required | Description | Default |
|---|---|---|---|
| vin | No | Vehicle name or masked VIN. Omit this when the account has one car. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly and idempotent, so the bar is lower; the description still adds real value by disclosing that the call does not wake a sleeping vehicle, which is a non-obvious side-effect trait not encoded in any structured field. It stops short of saying what happens if the car is asleep and unreachable.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, zero filler, with the return payload front-loaded and the wake caveat as a trailing qualifier. Nothing to trim.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return shape needn't be described, and the description still previews the payload. For a zero-required-param read tool with full annotation and schema coverage, the only missing piece is behavior when the vehicle is asleep or offline.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single vin parameter is fully documented in-schema, including the 'omit when the account has one car' guidance. The description adds nothing about the parameter, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names the specific resource (climate readings) and enumerates exactly what comes back: inside/outside temperature in Celsius plus climate on/off. That is concrete enough to distinguish it from tesla_get_status or tesla_get_odometer, though it never uses an explicit verb like 'get' and doesn't state the car association directly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The clause 'Does not wake the car' implicitly tells the agent to prefer this over tesla_wake_and_refresh when the vehicle is asleep, but that inference is left to the reader. It never explicitly names tesla_wake_and_refresh or tesla_get_status as alternatives, nor states when this tool is insufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tesla_get_odometerTesla Get OdometerARead-onlyIdempotent
Odometer in miles, plus distance over a period from local snapshots. Does not wake the car.
| Name | Required | Description | Default |
|---|---|---|---|
| vin | No | Vehicle name or masked VIN. Omit this when the account has one car. | |
| period | No | Optional window: 7d, 30d, or this_week. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint, idempotentHint), so the bar is lower, and the description still adds two real behavioral facts: it does not wake the vehicle, and the distance figure comes from local snapshots (implying possible staleness). It does not state how fresh those snapshots are or what happens when no snapshot exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, zero filler, with the core capability stated first and the wake behavior as a secondary qualifier.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-shape explanation is unnecessary, and the description covers both the returned metrics and the non-waking behavior. It could still note snapshot freshness or the no-snapshot fallback, but it is sufficient to invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both vin and period are already documented, including the accepted period values. The description only echoes 'over a period' without adding format or default behavior beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names the specific resource returned (odometer in miles plus distance over a period), which an agent can distinguish from status/climate/software siblings. Units are given explicitly. It lacks a verb and does not explicitly contrast with the closest sibling (tesla_usage or tesla_query_history), so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Does not wake the car' implies this is the non-intrusive read path versus tesla_wake_and_refresh, but the description never states when to choose this over tesla_get_status or tesla_usage. Usage is inferable rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tesla_get_softwareTesla Get SoftwareARead-onlyIdempotent
Installed software version and pending update status. Does not wake the car.
Field names follow vehicle_state.car_version and vehicle_state.software_update. A missing value means this firmware did not return that field.
| Name | Required | Description | Default |
|---|---|---|---|
| vin | No | Vehicle name or masked VIN. Omit this when the account has one car. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, and open-world behavior, while the description adds meaningful context: it does not wake the car and missing fields indicate firmware did not return them. It does not cover auth, rate limits, or error behavior, but it adds useful behavioral detail beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loaded, with the main purpose in the first sentence and useful caveats after it. Every sentence adds information without repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only tool with an output schema, one optional parameter, and safety annotations, the description is largely complete. The main remaining gap is that it does not clarify when to prefer this tool over tesla_get_status for broader vehicle information.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage and fully documents the optional vin parameter. The description adds no parameter-specific details, so the schema appropriately carries parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific resource and return focus: installed software version and pending update status. It also distinguishes itself somewhat from wake-related tools by saying it does not wake the car, though it does not explicitly position itself against tesla_get_status.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase "Does not wake the car" implies a useful context for querying software state without waking the vehicle. However, there is no explicit when-to-use guidance or named alternative such as tesla_get_status for broader vehicle state.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tesla_get_statusTesla Get StatusARead-onlyIdempotent
Battery, range, charging, and lock state. Live when the car is online, otherwise cached.
Distances are miles, as returned by the Fleet API. This does not wake the car.
| Name | Required | Description | Default |
|---|---|---|---|
| vin | No | Vehicle name or masked VIN. Omit this when the account has one car. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, and open-world behavior, so the description wisely adds operational context: live versus cached responses and the fact that the call does not wake the vehicle. It also specifies miles as the distance unit returned by the Fleet API.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loaded with the returned status fields. Each sentence adds useful information: data freshness, distance units, and the non-waking behavior.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the available output schema, rich annotations, and fully documented single parameter, the description provides everything needed for correct invocation. It covers status contents, freshness semantics, units, and wake behavior without redundant return-value explanation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the optional vin parameter is fully documented in the schema as a vehicle name or masked VIN that can be omitted for single-car accounts. The description adds no parameter-specific meaning beyond the schema, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the resource contents: battery, range, charging, and lock state. It is specific enough to distinguish this status tool from siblings like tesla_get_climate, tesla_get_odometer, and tesla_get_software, though it does not explicitly name those alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The note that data is live when the car is online and otherwise cached, plus the statement that it does not wake the car, gives useful contextual guidance. However, it does not explicitly say when to use this versus tesla_wake_and_refresh or when cached data is insufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tesla_list_vehiclesTesla List VehiclesARead-onlyIdempotent
List vehicles on the Tesla account. VINs are masked. This does not wake the car.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the read-only/idempotent safety profile, but the description adds two non-obvious behavioral facts: VINs are masked in the response, and the call avoids the side effect of waking the vehicle. That is valuable context beyond structured fields, though pagination or account-permission behavior is unaddressed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences with zero waste. The purpose comes first, and the two caveats (masked VINs, no wake) follow immediately.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and no parameters, the description carries little burden and covers the key non-obvious behaviors. Only the absence of any note on multi-vehicle/account-scoping ambiguity keeps it from a 5.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4; there is nothing for the description to disambiguate beyond confirming the call is unscoped.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List vehicles on the Tesla account'), which is clearly distinguishable from siblings like tesla_get_status or tesla_get_odometer. It does not explicitly name a sibling to differentiate against, keeping it just below a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'This does not wake the car' implicitly tells the agent to prefer this call over tesla_wake_and_refresh when it just wants a cheap read. It gives a clear usage context but states no explicit exclusions or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tesla_query_historyTesla Query HistoryARead-onlyIdempotent
Time series from the local snapshot database. Does not call Tesla or wake the car.
| Name | Required | Description | Default |
|---|---|---|---|
| end | Yes | End date (YYYY-MM-DD), inclusive, in TESLA_TIMEZONE. | |
| vin | No | Vehicle name or masked VIN. Omit when there is one car. | |
| start | Yes | Start date (YYYY-MM-DD), inclusive, in TESLA_TIMEZONE. | |
| bucket | No | hour, day, or week. | day |
| metric | Yes | battery_level, battery_range, odometer, inside_temp, or outside_temp. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, non-open-world behavior. The description adds meaningful context beyond that: it uses a local snapshot database and avoids calling Tesla or waking the car, which is important operational behavior. It does not describe data freshness or staleness, but it adds real value over the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the data source and followed by the key operational constraint. There is no wasted text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has a complete input schema and an output schema, so return values need not be explained. The description covers the source and non-wake behavior, but it omits any note on snapshot freshness or data lag, which would help an agent decide when local history is appropriate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents metric, dates, bucket, and vin semantics. The description does not add parameter-level meaning beyond the schema, which is acceptable given full schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description identifies the resource as a time series from the local snapshot database and distinguishes it from live/wake tools by saying it does not call Tesla or wake the car. It is clear enough for an agent to recognize historical local data retrieval, though it does not explicitly use a query/retrieve verb.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'Does not call Tesla or wake the car' strongly implies when this tool is preferable: when avoiding vehicle wake-up or live API calls. However, it gives no explicit alternatives or when-not guidance versus siblings like tesla_usage or tesla_get_odometer.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tesla_reportTesla ReportARead-onlyIdempotent
A ready-to-read summary. Local reports do not wake the car.
weekly_mileage uses the last 7 days of odometer snapshots. range_trend compares 30-day and 90-day normalized rated range. low_charge alerts below 30% when unplugged, and says so if the snapshot is older than 6 hours. charging_summary calls Tesla only when charging history is opted in.
| Name | Required | Description | Default |
|---|---|---|---|
| vin | No | Vehicle name or masked VIN. Omit when there is one car. | |
| type | Yes | weekly_mileage, range_trend, charging_summary, or low_charge. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial behavioral context beyond the read-only annotations: it notes that local reports do not wake the car, specifies data windows for weekly_mileage and range_trend, defines the low_charge alert condition and staleness caveat, and clarifies that charging_summary only calls Tesla when opted in. This is exactly the kind of operational detail an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is tightly structured: a two-sentence summary up front, followed by one focused line per report type. There is no redundant filler, and the most important behavioral note (local reports do not wake the car) is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity, the 100% schema coverage, and the presence of an output schema, the description provides everything an agent needs: the report types, their data windows, external-call behavior, and staleness handling. No important call-selection context is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents both parameters. The description goes further by explaining what each type value produces (weekly_mileage, range_trend, charging_summary, low_charge), adding meaningful semantics beyond the schema's short type list.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool produces a ready-to-read summary and enumerates the four report types, which is a specific verb+resource. However, it does not explicitly name or contrast with sibling tools like tesla_query_history or tesla_get_odometer, leaving some differentiation implicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage through phrases like 'ready-to-read summary' and details each report type, but it never explicitly says when to choose this tool over alternatives such as tesla_query_history or tesla_get_odometer. The guidance is implicit rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tesla_usageTesla UsageARead-onlyIdempotent
Calls recorded this month, estimated cost, and the wake budget. Local only.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly, idempotent, and closed-world, so the bar is lowered. The description still adds two things beyond them: the reporting window ('this month') and the 'Local only' guarantee that no vehicle wake or network call occurs — exactly the side-effect detail an agent needs before calling a Tesla tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with what is returned, with the operational constraint last. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be documented. What the tool reports, the time window, and the fact it stays local are all covered; only durability/scope of the recorded history is left unstated, which is minor for a zero-parameter read.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Zero parameters, so the baseline of 4 applies. The description correctly implies no input is needed, consistent with the empty schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the concrete payload (calls this month, estimated cost, wake budget), which is specific enough to tell it apart from the vehicle-data siblings like tesla_get_status or tesla_get_odometer. It lacks an explicit verb ('returns'/'shows'), but the resource and scope are unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Local only' implicitly signals when to prefer this over siblings that touch the vehicle (tesla_wake_and_refresh, tesla_get_status), but no alternative is named and no explicit when/when-not condition is stated. Usage is inferable rather than guided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tesla_wake_and_refreshTesla Wake And RefreshARead-only
Wake the car, then store a fresh snapshot. Refuses unless confirm is true.
Default budget: at most one wake every 30 minutes and 3 wakes in any 24-hour period. A hard cap of 3 wakes per minute cannot be raised. This is the only wake path.
| Name | Required | Description | Default |
|---|---|---|---|
| vin | No | Vehicle name or masked VIN. Omit this when there is one car. | |
| confirm | No | Must be true. A wake is billed and brings the car online. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses real side effects — the wake is billed, it brings the car online, it is rate-limited to one wake per 30 minutes and three per 24 hours, plus a hard 3-per-minute cap — which is exactly the kind of state-changing, cost-incurring behavior readOnlyHint=true denies. The annotation profile directly conflicts with the described semantics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Action and snapshot outcome are front-loaded in the first clause, the confirm gate follows immediately, and the remaining sentences carry only non-obvious operational constraints (budget, hard cap, exclusivity). No filler sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists so snapshot contents need no explanation, parameters are documented, and the rate-limit model is fully spelled out for a tool with side effects. The only remaining gap is guidance on when the car is already awake versus which read tool to use instead.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and both parameters already carry the essential meaning (vin optional for single-car accounts, confirm must be true and is billed). The description's "Refuses unless confirm is true" reinforces the schema but adds no new syntax or edge-case detail beyond it, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific two-step action ("Wake the car, then store a fresh snapshot") with a concrete resource, and explicitly claims exclusivity ("This is the only wake path"), which separates it from the passive getters like tesla_get_status and tesla_get_odometer in the sibling list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clearly establishes the precondition ("Refuses unless confirm is true") and the routing rule that this is the only way to wake a vehicle, so an agent knows to use it when the car is asleep. It stops short of explicitly contrasting with tesla_get_status for the already-awake case, leaving a small inference gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
9 tool updates
v0.1.0- First observed
tesla_get_climate - First observed
tesla_get_odometer - First observed
tesla_get_software - First observed
tesla_get_status - First observed
tesla_list_vehicles - First observed
tesla_query_history - First observed
tesla_report - First observed
tesla_usage - First observed
tesla_wake_and_refresh
TDQS
Scored across 9 tools
Each tool targets a distinct data slice (climate, status, odometer, software, history, usage) and the descriptions repeatedly clarify scope and wake behavior. There is mild overlap between tesla_get_status (battery, range, charging, lock) and the narrower getters (climate, odometer), and between tesla_query_history and tesla_report, but the raw-vs-summary framing keeps them separable.
All tools share a tesla_ prefix and most follow a clean verb_noun pattern (list_vehicles, get_climate, get_status, query_history, wake_and_refresh). tesla_report and tesla_usage break the pattern by being bare verbs/nouns, a minor inconsistency in an otherwise predictable set.
Nine tools is well within the sweet spot for a vehicle telemetry server, with each tool covering a distinct aspect (fleet listing, per-signal reads, history, reports, wake, quota). Nothing feels redundant or padded.
The read/telemetry lifecycle is well covered: vehicles, climate, status, odometer, software, historical time series, summary reports, wake-and-snapshot, and usage/quota. The only gap is that there are no control operations (lock, climate start, charging control), which appears intentional given the strict wake budget and read-only framing, so agents can still answer monitoring questions without dead ends.
Maintenance
Related MCP Connectors
MCP server wrapping the Tesla Fleet API and TeslaMate API
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.
Company filing/CVE snapshots, status and optional feedback. Remote MCP or local stdio. Free Phase A.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceAn MCP server that connects to the Tesla Fleet API, allowing users to control vehicles and retrieve real-time status updates through Claude and other AI assistants. It supports functions such as waking up vehicles, viewing detailed vehicle information, and debugging via both stdio and HTTP/SSE transports.MIT
- AlicenseBqualityDmaintenanceMCP server combining TeslaMate historical analytics with Fleet API live data and commands. Works with Claude Code, Claude Desktop, Cursor, and any MCP-compatible client.292MIT
- AlicenseNot gradedqualityBmaintenanceA Model Context Protocol server for the TeslaFi API that lets MCP clients query live vehicle data, drive and charge history, commute patterns, and optionally send commands.2MIT
- AlicenseAqualityBmaintenanceA local-first, read-only MCP server for vehicle diagnostics that exposes structured OBD-II tools for reading PIDs, DTCs, and ECU snapshots without raw protocol access.7Apache 2.0