Kia Access MCP
This server connects an MCP client (e.g., Claude) to your own Kia vehicle via the Kia Owners API, enabling status reads and confirmation-gated remote commands.
Read vehicle data: list enrolled vehicles, cached status (doors, ignition, climate, EV battery/odometer via raw), refresh status, last known location, and EV charge targets.
Manage the Kia session: check session status, run the one-time MFA bootstrap (start login, send/verify OTP), forget the stored session, or export the refresh token for deployments.
Diagnose connectivity: kia_healthcheck verifies credentials and upstream reachability without exposing secrets.
Comfort commands (default): start/stop climate, start/stop charging, and set charge limits.
Door commands (only with KIA_WRITE_MODE=all): lock and unlock the doors.
All write commands are confirmation-gated and report whether the car accepted the command versus actually confirming the state change.
Provides tools for interacting with Kia vehicles through the Kia Owners API, enabling vehicle status reads (location, odometer, EV charge state) and confirm-gated commands (climate control, charging, door lock/unlock).
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., "@Kia Access MCPWhat's my EV range and odometer?"
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.
Kia Access MCP
A Model Context Protocol server that connects Claude to your own Kia vehicle through the Kia Owners API the Kia Access mobile app uses: vehicle status, location, odometer, EV charge state, and confirmation-gated door, climate, and charging commands.
AI-developed project. This codebase was built and is maintained by Claude Code. No human has audited the implementation. Review the code and the tool permissions before pointing it at a real car.
This server can move a two-tonne object and can unlock your car. Every command tool asks you to confirm before it acts — with a confirmation prompt where the client supports one, otherwise a preview plus a one-time token that only a repeat call can use (see Confirmations) — and door lock/unlock is not even registered unless you opt in with KIA_WRITE_MODE=all. Read Vehicle commands before changing that.
What you can do
Ask Claude things like:
"Is the EV9 locked, and what's the charge at?"
"Warm the car up to 72 for ten minutes"
"Where did I leave the car?"
"Refresh the car's status, then tell me the odometer"
Related MCP server: Tesla MCP Server
Requirements
Node.js 22.5 or later
A Kia Owners / Kia Access account with an enrolled vehicle, and its password
A phone or mailbox you can read once, for the one-time MFA passcode
Acknowledgement of terms
By using this server you accept that:
It uses your own Kia account credentials to talk to the same private API the Kia Access app uses. It cannot reach anyone else's vehicle or account.
Kia's terms govern your use of it, exactly as they govern your use of the app. This is not an official or supported integration and is not affiliated with, endorsed by, or sponsored by Kia.
Commands act on a real vehicle in the physical world. Unlocking leaves the car unsecured until someone locks it; climate preconditioning runs the HVAC and draws power. You are responsible for every command you confirm.
Failed logins have a permanent cost. Kia counts them (
loginAttempt) and eventually setsenforceRecaptcha, after which server-side login for that account is impossible. This server therefore never retries a rejected credential — see If login fails.
Installation
1. Clone and build
git clone https://github.com/chrischall/kiaaccess-mcp.git
cd kiaaccess-mcp
npm install
npm run build2. Configure credentials
cp .env.example .env
# Edit .env: KIA_USERNAME, KIA_PASSWORD (and optionally KIA_WRITE_MODE,
# KIA_DEVICE_ID, KIA_RMTOKEN — see .env.example).env is gitignored. The server never logs credentials, and no tool ever returns your password.
3. Register with Claude Code
{
"mcpServers": {
"kiaaccess": {
"command": "npx",
"args": ["-y", "kiaaccess-mcp"],
"env": {
"KIA_USERNAME": "you@example.com",
"KIA_PASSWORD": "your-password",
"KIA_WRITE_MODE": "comfort"
}
}
}
}Missing credentials do not stop the server from booting — it starts, answers tools/list, and only reports the configuration error when a tool actually needs to call Kia. Run kia_session_status to see what it thinks it has.
The one-time MFA bootstrap
Kia challenges every new device with a one-time passcode. This server bootstraps once, stores the resulting remember-me token (rmtoken) under ~/.kiaaccess-mcp/session.json, and from then on mints fresh sessions silently — Kia does not rotate the token and does not challenge again.
Run it through Claude, in this order:
kia_session_status— confirms credentials are present. If it reportshasSession: false, continue.kia_start_login(asks you to confirm first) — sends your credentials, returns anotpKeyand anxid, plus the masked phone/email Kia has on file.kia_send_otp— pickSMSorEMAIL. The passcode expires in about two minutes.kia_verify_otp— hand it the passcode. The token is stored locally and is deliberately not returned.kia_list_vehicles— confirms the session works and gives you thevehicleKeyevery other tool takes.
To start over (revoked token, changed password, handing the machine on), run kia_forget_session (asks you to confirm first) and repeat from step 2.
Running it somewhere with no phone to read
The bootstrap needs a human once. A deployment that has no one to read an OTP — a remote host — cannot run it at all, so bootstrap on a machine that can and move the token:
Set
KIA_DEVICE_IDto a fixed uuid before the bootstrap, on both machines. Thermtokenis minted against a device uuid and is worthless with a different one, andkia_session_statusonly ever reports a truncated prefix — so if you let it be generated, you cannot read back the value you need.Bootstrap as above, then run
kia_export_refresh_tokenand confirm it.Give the remote deployment that value as
KIA_RMTOKEN, alongsideKIA_USERNAME,KIA_PASSWORDand the sameKIA_DEVICE_ID.
KIA_RMTOKEN takes precedence over anything in the local session store, so the deployment's session is whatever you handed it rather than whatever it last wrote. Treat the value like the password it stands in for: it bypasses MFA, and with the account password it grants full control of the vehicle.
If login fails
Do not retry. Kia increments loginAttempt on every rejection and eventually sets enforceRecaptcha, which breaks server-side login for that account permanently. Verify the email and password in the Kia Access app first, fix .env, restart, and only then try again.
Vehicle commands
KIA_WRITE_MODE decides which command tools are registered at all. This is a structural gate, not a runtime check: a tool that was never registered cannot be invoked by any host permission setting or by an instruction injected into the conversation.
| Registers |
| Nothing but the read tools and the account tools |
| Climate start/stop and the charging commands |
| Also |
An unrecognised value fails closed to none and warns on stderr — a typo must never silently grant the ability to unlock a car.
Two more rules hold for every command:
Confirmation-gated. Nothing is sent until you confirm. The confirmation shows the exact request that would be sent; until then there is no network call at all. See Confirmations.
Accepted is not confirmed. Kia answering "success" only means the request was accepted. The only proof a command took effect is re-reading the vehicle and diffing the field, so results report
commandAcceptedandstateConfirmedseparately. Observed changes took 30–60 seconds.
Confirmations
Every write tool (the commands above, plus kia_start_login, kia_forget_session and kia_export_refresh_token) asks you to confirm before it acts. A client that can show a confirmation prompt (Claude Code) shows one, with the exact request. A client that cannot (claude.ai, Claude Desktop) gets a two-step flow instead: the first call does nothing and returns a preview plus a confirmToken, and only a repeat call carrying that token proceeds. The token is bound to the exact request previewed — change an argument and it is refused (DRAFT_CHANGED) with a fresh preview; use it twice and the second call is refused (TOKEN_REUSED).
variable | default | |
|
| What a write does on a client that cannot show a confirmation prompt (claude.ai, Claude Desktop). |
|
| How long a token stays valid. |
| random per process | Signing key; set it only if tokens must survive a server restart. |
Tools
Account and session
Tool | Notes |
| Configured? Bootstrapped? Which write mode? No network call, no secrets — the email is masked and the device id truncated. |
| Step 1 of the MFA bootstrap. Confirmation-gated, because a rejection has a permanent cost. |
| Step 2 — delivers the passcode by |
| Step 3 — exchanges the passcode for a stored session. Returns no secret. |
| Discards the stored token so the bootstrap can be re-run. Local only; confirmation-gated. |
| Returns the |
Reads
Tool | Notes |
| Every enrolled vehicle with its |
| Cached status: door lock, ignition ( |
| Wakes the telematics unit for a fresh reading. Slower, draws a little power, and returns no data itself — read |
| Last reported position plus a map link. Not a live GPS fix. |
| Target state of charge per plug type. |
Commands
Tool | Mode | Notes |
|
| Preconditioning. Temperature is best-effort: the car may report its own last-set target instead of the one requested. |
|
| Verified by re-reading |
|
| Verified. Needs the car plugged in — unplugged, Kia accepts the request and nothing happens. Confirm via |
|
| Verified. Confirm via |
|
| Verified, and re-read against |
|
| Verified by re-reading |
|
| Leaves the car physically unsecured. Only run it when the user explicitly asked. |
Every endpoint here was verified live against a 2024 EV9 — the reads and the four door/climate commands on 2026-07-27, and the three evc/* charging commands on 2026-07-28 against a plugged-in car. Each was proven by re-reading state, never by the success status: Kia answers statusCode: 0 the moment it accepts a command, seconds before the car acts, and on an unplugged car it answers success and does nothing at all. Every command result therefore reports "accepted" and "confirmed" separately. The full protocol write-up is in docs/KIA-API.md.
Development
npm test # unit tests (no network — fetch is mocked throughout)
npm run test:coverage # the same, with the enforced 100% thresholds
npm run build # tsc + esbuild bundleLicense
Available Tools
17 toolskia_charge_targetsARead-only
Read the EV charge targets (evc/gts): the target state of charge per plug type (one entry for AC, one for DC). Verified live against a real vehicle. Read-only — makes no changes.
| Name | Required | Description | Default |
|---|---|---|---|
| vinKey | Yes | Vehicle key (the `vehicleKey` from the vehicle-list tool). Not the VIN. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint=true, so the 'Read-only' statement is redundant. However, the description adds valuable non-annotation context: it reveals the return contents (target state of charge per plug type, AC and DC) and a provenance claim ('Verified live against a real vehicle'). This is meaningful for an agent because there is no output schema.
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 no fluff. The core action and resource are front-loaded, the output detail is compact, and the read-only note and verification claim each add relevant context. Every sentence earns its place.
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 single-parameter read tool, the description is complete: the only parameter is fully documented in the schema, read-only behavior is declared in both annotations and description, and the output is described (charge targets per plug type) even though no output schema exists. An agent has everything needed to call it 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%, and the vinKey property is well-documented ('Vehicle key... Not the VIN'). The description adds no parameter-level detail, but because the schema already fully covers the parameter semantics, the baseline of 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 verb ('Read'), a specific resource ('EV charge targets (`evc/gts`)'), and the output shape ('target state of charge per plug type... AC, one for DC'). Clearly distinguishes from sibling write tools like kia_start_charge, kia_stop_charge, and kia_set_charge_limits by emphasizing read-only.
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 gives clear context: this is a read operation for charge targets and explicitly says it 'makes no changes'. This implicitly excludes using it to modify targets, and the read-only framing separates it from write siblings. It does not name an explicit alternative tool or state when-not-to-use it, so it stops short of a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kia_export_refresh_tokenADestructiveIdempotent
Return the stored Kia remember-me token (rmtoken) IN PLAINTEXT. This is a CREDENTIAL: it bypasses MFA entirely and, with the account password, grants full control of the vehicle — including unlocking it. It exists for one purpose: moving a locally-bootstrapped session into a hosted deployment, which stores it in the user's encrypted credentials. Do NOT call it to "check the session" (use kia_session_status), and never display or log the value except where the user explicitly asked for it. Asks the user to confirm first: a confirmation prompt where the client supports one; otherwise the first call makes NO network call and returns a preview plus a confirmToken, and only a repeat call with that token proceeds (see MCP_CONFIRM_MODE). Until it is confirmed the token is not even read.
| Name | Required | Description | Default |
|---|---|---|---|
| confirmToken | No | ONLY for the two-step confirmation fallback (a client without MCP elicitation). The confirmToken from this same tool's phase-1 "confirmation-required" response, passed back ONLY after the user has seen that preview and explicitly approved it in chat — never on the first call, never invented, never reused. Call again with the same arguments. Ignored when the client supports elicitation. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses the token's MFA-bypassing severity, vehicle-control implications, the prohibition on logging/displaying the value, and the two-phase confirmation behavior where the first call makes no network call. This is rich behavioral context that directly informs safe agent behavior and does not contradict 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?
Every sentence carries necessary security or usage information, and the most critical warning is front-loaded. Despite length, there is no filler; the structure flows from threat level to purpose to exclusions to confirmation protocol.
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 credential-sensitive nature, the two-step confirmation flow, and the absence of an output schema, the description is remarkably complete. It describes both phases of the fallback flow, the expected return pieces, and the constraints an agent must respect, leaving no critical gap for correct invocation.
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 schema already documents confirmToken with 100% coverage, and the description adds crucial operational semantics: it is only for the two-step fallback, must come from this same tool's phase-1 response, must never be invented or reused, and is ignored for clients supporting elicitation. This goes well beyond the 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 states a specific verb and resource: 'Return the stored Kia remember-me token (rmtoken) IN PLAINTEXT.' It also clearly differentiates this tool from kia_session_status by naming the session-checking sibling as the wrong tool for that use.
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 explicitly says when to use this tool ('moving a locally-bootstrapped session into a hosted deployment') and when not to ('Do NOT call it to "check the session" (use kia_session_status)'). It also provides detailed confirmation-flow instructions, leaving no ambiguity about the correct calling pattern.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kia_forget_sessionAIdempotent
Discard the locally stored Kia session (the remember-me token), so the next Kia call needs the one-time MFA bootstrap again. This is the recovery path when the stored token no longer works — Kia revoked it, the password changed, or the account moved to another device — and the only alternative is deleting the session file by hand. It makes NO network call: Kia is not told anything, only this machine forgets. Asks the user to confirm first: a confirmation prompt where the client supports one; otherwise the first call makes NO network call and returns a preview plus a confirmToken, and only a repeat call with that token proceeds (see MCP_CONFIRM_MODE). Nothing is deleted until it is confirmed.
| Name | Required | Description | Default |
|---|---|---|---|
| confirmToken | No | ONLY for the two-step confirmation fallback (a client without MCP elicitation). The confirmToken from this same tool's phase-1 "confirmation-required" response, passed back ONLY after the user has seen that preview and explicitly approved it in chat — never on the first call, never invented, never reused. Call again with the same arguments. Ignored when the client supports elicitation. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate idempotentHint=true and destructiveHint=false, but the description goes beyond by stating it makes NO network call and includes a confirmation step, which is critical behavioral context. Some ambiguity about the confirmation flow (client-dependent) is acknowledged, but the description handles this well.
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 verbose but each sentence carries essential information about system behavior and confirmation. It could be tightened slightly, but given the complexity of the confirmation protocol and the need to prevent misuse, the length is justified.
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 only one parameter, no output schema, and the description covers all necessary information: what the tool does, when to use it, the confirmation flow, and the absence of network calls. Nothing critical is missing for correct invocation.
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%, but the description adds crucial semantics for confirmToken: it explains when to use it (two-step fallback), when not to use it (never on first call, never invented), and the lifecycle (passed back after user approval). This goes beyond just 'only for confirmation' to cover the exact protocol.
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 (locally stored Kia session/remember-me token) and the action (discard). It also differentiates from siblings by stating the only alternative (manual file deletion) and the recovery context (token revoked, password changed).
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?
Explicitly describes when to use this tool (when stored token no longer works due to revocation, password change, or device change) and what it does NOT do (makes no network call, Kia is not told). It also mentions the alternative (manual file deletion) and the confirmation flow, providing clear usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kia_healthcheckVerify credentials and upstream reachabilityARead-onlyIdempotent
Resolves the credential the way real tools do, then makes one authenticated request to Kia Connect. Reports which source supplied the credential, whether Kia Connect accepted it, the round-trip time, and a plain-English hint distinguishing 'no credential' from 'credential rejected' from 'a Kia Connect-side problem'. Read-only; never returns the credential itself. Call this when a real tool fails and you want to know which hop broke.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnly, idempotent, and openWorld hints, but the description adds meaningful behavioral detail beyond those: it states that exactly one authenticated request is made, that the credential itself is never returned, and that the output classifies failure modes ('no credential' vs 'credential rejected' vs 'Kia Connect-side problem'). This gives agents a clear safety and side-effect profile not available from the annotations alone.
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 ~100 words, front-loads the core action, then reports the output, then the read-only/security note, and ends with the usage trigger. Every sentence carries distinct information; no filler or 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?
With no output schema, the description compensates by detailing what the tool reports (credential source, acceptance, RTT, hint) and what it never returns. Combined with the input-free schema and annotations, an agent has all necessary information to invoke this tool correctly and interpret its result.
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 has zero parameters and the schema coverage is 100%, so there are no parameter semantics to explain. The baseline of 4 applies, and the description accurately avoids inventing any parameter-related content.
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 opens with a specific verb and resource ('Resolves the credential... makes one authenticated request to Kia Connect') and enumerates the exact outputs (credential source, acceptance, RTT, plain-English hint). It also positions itself against siblings via 'Call this when a real tool fails' and its read-only diagnostic nature, clearly distinguishing it from vehicle command, auth-flow, and session tools.
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 gives a clear trigger condition: 'Call this when a real tool fails and you want to know which hop broke.' This is strong when-to-use guidance. It does not explicitly name alternatives or state when-not-to-use, but the diagnostic purpose is unambiguous in context with the sibling list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kia_list_vehiclesARead-onlyIdempotent
List the vehicles enrolled on this Kia Owners account (ownr/gvl). Returns each vehicleKey — the id every other Kia tool takes — plus nickname, model year/name/trim, mileage, fuel type and telematics unit. VINs are masked to their last 6 characters.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnly, openWorld, and idempotent hints. The description adds useful context like VIN masking and the list of returned fields, which goes beyond 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 concise sentences that front-load the purpose and key outputs, with no unnecessary words or redundancy.
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 zero parameters and no output schema, the description fully explains the tool's behavior, including what fields are returned and the VIN masking policy.
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?
With zero parameters, the baseline is 4. The description adequately explains that no input is needed, and schema coverage is 100%, so no further param info is required.
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 'List the vehicles enrolled on this Kia Owners account' with a specific verb and resource, and distinguishes itself from sibling tools by highlighting that it returns the vehicleKey needed by other tools.
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 that this tool is a prerequisite because it returns 'the id every other Kia tool takes,' but it does not explicitly state when to use versus alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kia_refresh_statusARead-onlyIdempotent
Ask the car for a fresh reading (rems/rvs, requestType 0). This WAKES THE TELEMATICS UNIT, so it is much slower than kia_vehicle_status and draws a little power — prefer the cached read unless staleness matters. Kia only acknowledges the request; it does not return the new data and gives no completion signal, so read kia_vehicle_status afterwards to see the refreshed values.
| Name | Required | Description | Default |
|---|---|---|---|
| vehicle_key | No | vehicleKey from kia_list_vehicles. Optional: defaults to the only vehicle when the account has exactly one. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations, it discloses that the call wakes the telematics unit, is slower, draws power, and that Kia only acknowledges the request without returning data or a completion signal. This paints a clear behavioral model beyond readOnly/idempotent hints and does not contradict them.
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 dense sentences front-load the purpose, then cover latency/power trade-off, usage preference, and asynchronous behavior. Every sentence earns its place with 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?
The described async/no-return behavior compensates for the missing output schema, and the follow-up instruction to read kia_vehicle_status completes the workflow. With one optional, well-documented parameter, nothing critical 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% and the sole parameter is already fully documented with type, source, and default behavior. The description does not add parameter-specific meaning, but none is needed.
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 action ('Ask the car for a fresh reading'), the target resource (rems/rvs, requestType 0), and distinguishes it from kia_vehicle_status. It is immediately clear this is a refresh trigger versus the cached read.
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?
Explicitly contrasts with kia_vehicle_status, states when to prefer the cached read ('unless staleness matters'), and instructs to call kia_vehicle_status afterwards to observe results. This is unambiguous guidance on when and how to use the tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kia_send_otpADestructive
Step 2 of the Kia MFA bootstrap (cmm/sendOTP): deliver a one-time passcode to the account by SMS or email. Takes the otpKey and xid from kia_start_login — it cannot run without them, which is why it has no separate confirmation gate. Ask the user which channel they want (kia_start_login reports the masked destinations Kia has on file). The passcode expires in about two minutes; expiresAt reports when.
| Name | Required | Description | Default |
|---|---|---|---|
| xid | Yes | The `xid` returned by kia_start_login. Sent with every OTP call. | |
| otpKey | Yes | The `otpKey` returned by kia_start_login. | |
| notifyType | Yes | Delivery channel. Ask the user; do not guess which destination they can read right now. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds behavioral context beyond annotations: it notes the passcode expires in about two minutes and that expiresAt reports when, and that it lacks a separate confirmation gate. The annotation destructiveHint=true indicates potential side effects, but the description does not contradict this. However, it doesn't elaborate on the destructive nature (e.g., sending SMS may incur costs), so minor gap remains.
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 concise but rich: it conveys the step, dependencies, user interaction, expiration, and reporting in four sentences. It is front-loaded with the purpose and dependency, making it easy to scan. Every sentence adds value, and there is no fluff.
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 description covers the key aspects: prerequisites (otpKey, xid), user interaction (ask channel), expiration, and result (expiresAt). With no output schema, it hints at the response containing expiresAt, which is useful. It could mention error handling or what happens if the OTP is not sent, but for a step in a multi-step flow, it's sufficiently complete.
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%, with each parameter already described. The tool description reinforces the dependency on otpKey and xid from kia_start_login, adding slightly more context about their source. For notifyType, it reiterates the instruction to ask the user, aligning with the schema. Since the schema is thorough, the added value is modest but not redundant.
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 it is 'Step 2 of the Kia MFA bootstrap (cmm/sendOTP)' and that it delivers a one-time passcode via SMS or email. It distinguishes itself from kia_start_login and kia_verify_otp by explicitly referencing the flow order, making its purpose 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?
The description explicitly says it 'cannot run without' the otpKey and xid from kia_start_login, making the dependency clear. It also instructs the agent to ask the user which channel to use and not to guess, which is crucial for correct usage. It does not explicitly name alternatives, but given the MFA bootstrap context, it's evident when to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kia_session_statusARead-onlyIdempotent
Whether this server is configured and logged in to Kia: are credentials present, has the one-time MFA bootstrap been completed on this device, and which vehicle commands are registered (KIA_WRITE_MODE). Makes NO network call and returns no secret — the account email is masked, the device id is truncated, and neither the session id nor the remember-me token is ever included. Start here when a Kia tool reports it is not configured.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations (readOnlyHint, idempotentHint), the description adds that the tool makes no network call, returns no secret, masks sensitive data (email, device id), and never includes session id or remember-me token. This fully discloses behavior without contradiction.
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 two sentences, front-loaded with purpose, then security details. Every word is valuable, no redundancy. Highly concise and well-structured.
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 zero parameters and no output schema, the description fully covers the tool's purpose, behavior, security posture, and usage context. No gaps remain.
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?
With zero parameters and 100% schema coverage, the description does not need to add parameter info. It focuses on the output behavior, which is appropriate. Baseline 4 for zero parameters.
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 checks server configuration and login status for Kia, including credentials, MFA bootstrap, and registered commands. It distinguishes itself by noting it makes no network call and returns no secret, setting it apart from siblings.
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 explicitly says 'Start here when a Kia tool reports it is not configured,' providing clear guidance on when to use this tool. It does not explicitly mention when not to use it, but the context is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kia_set_charge_limitsAIdempotent
Set the target state of charge per plug type (evc/sts). Verified against a real vehicle. The write is checked: afterwards the targets are re-read from evc/gts and compared, and the result reports whether the change actually landed. Send BOTH plug types — the list replaces the stored one, so omitting an entry drops that target. Asks the user to confirm first: a confirmation prompt where the client supports one; otherwise the first call makes NO network call and returns a preview plus a confirmToken, and only a repeat call with that token proceeds (see MCP_CONFIRM_MODE). The preview step makes no call at all, not even the baseline read.
| Name | Required | Description | Default |
|---|---|---|---|
| verify | No | Re-read evc/gts afterwards to check the change landed. Defaults to true. | |
| vinKey | Yes | Vehicle key (the `vehicleKey` from the vehicle-list tool). Not the VIN. | |
| targets | Yes | One entry per plug type. Read the current targets first and change only what you mean to. | |
| confirmToken | No | ONLY for the two-step confirmation fallback (a client without MCP elicitation). The confirmToken from this same tool's phase-1 "confirmation-required" response, passed back ONLY after the user has seen that preview and explicitly approved it in chat — never on the first call, never invented, never reused. Call again with the same arguments. Ignored when the client supports elicitation. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint=false, destructiveHint=false, idempotentHint=true), the description adds crucial behavior: the write is verified by re-reading evc/gts, the first call in fallback mode makes no network call and returns a preview+confirmToken, and the preview step makes no call at all. This fully discloses the side effects and state changes, far exceeding annotation coverage.
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 dense but every sentence earns its place: the core action, verification behavior, list-replacement warning, confirmation flow, and fallback detail. It is front-loaded with the purpose and proceeds logically. No wasted words.
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 complexity (confirmation, verification, replacement semantics), the description covers all necessary context. It explains the two-phase behavior, the impact of omitting entries, and the verification step. With no output schema, it also describes what the preview response contains. Nothing essential 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 description coverage is 100%, so the baseline is 3. The tool description does not add new parameter-level meaning beyond what the schema already provides (e.g., plugType mapping, targetSOClevel range, confirmToken usage). The schema itself is detailed, so the description correctly relies on it without redundancy.
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 opens with a precise verb-resource pair: 'Set the target state of charge per plug type'. It clearly distinguishes this from the sibling kia_charge_targets (likely a read operation) and from start/stop charge tools. The purpose is unmistakable.
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 provides explicit usage instructions: send BOTH plug types because the list replaces the stored one, read current targets first (echoed in schema), and handle the confirmation flow. It explains the two-step fallback and when the confirmToken is needed, leaving no ambiguity about how to invoke the tool correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kia_start_chargeAIdempotent
Ask the vehicle to start charging (evc/charge). Verified against a plugged-in vehicle: evStatus.batteryCharge goes true within ~30-60s. Requires the car to be plugged in — on an unplugged car Kia still accepts the request and nothing happens. Confirm with kia_vehicle_status rather than trusting the success status. Asks the user to confirm first: a confirmation prompt where the client supports one; otherwise the first call makes NO network call and returns a preview plus a confirmToken, and only a repeat call with that token proceeds (see MCP_CONFIRM_MODE).
| Name | Required | Description | Default |
|---|---|---|---|
| vinKey | Yes | Vehicle key (the `vehicleKey` from the vehicle-list tool). Not the VIN. | |
| chargeRatio | No | Charge up to this percentage, 10–100. Defaults to 100. | |
| confirmToken | No | ONLY for the two-step confirmation fallback (a client without MCP elicitation). The confirmToken from this same tool's phase-1 "confirmation-required" response, passed back ONLY after the user has seen that preview and explicitly approved it in chat — never on the first call, never invented, never reused. Call again with the same arguments. Ignored when the client supports elicitation. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses several critical behaviors: the call is a no-op on an unplugged car, the first call may make no network request and instead return a preview with confirmToken, a second call with that token is required, and the battery charge state can take 30–60 seconds to update. It also warns not to trust the success status, which is valuable operational context. No contradiction with the annotations 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?
The description is dense but every sentence earns its place: purpose, expected behavior, prerequisite, verification instruction, and confirmation mechanics. It is front-loaded with the core action and each subsequent detail addresses a real operational risk or workflow requirement. There is no filler or redundant restatement of the tool name.
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?
Despite having no output schema, the description supplies the essential response-level information: a preview plus confirmToken on the fallback path, the observable success signal (evStatus.batteryCharge), the timing, and the need to verify with kia_vehicle_status. For a mutating, user-confirmation-gated tool, this is sufficient for an agent to select and invoke it 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?
The input schema already provides 100% parameter coverage with clear descriptions, so the baseline is 3. The description adds meaningful workflow semantics around confirmToken: it explains that the token comes from a phase-1 preview response, must be passed back only after explicit user approval, and only with the same arguments. This goes beyond the schema by connecting the parameters to the two-step confirmation behavior.
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 states a specific action ('Ask the vehicle to start charging') tied to a concrete endpoint (`evc/charge`), and it is clearly distinguishable from sibling tools like kia_stop_charge and kia_vehicle_status. It leaves no doubt about what resource is being acted on and what the intended outcome is.
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?
It gives strong contextual guidance: the car must be plugged in, otherwise the request is accepted but does nothing; the tool should not be trusted for confirmation, with kia_vehicle_status named as the verification path; and user confirmation is required first. It does not explicitly compare against alternatives like kia_stop_charge, but the constraints and workflow are clear enough for an agent to decide when to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kia_start_climateAIdempotent
Start remote climate control / preconditioning (Kia rems/start, live-verified). Asks the user to confirm first: a confirmation prompt where the client supports one; otherwise the first call makes NO network call and returns a preview plus a confirmToken, and only a repeat call with that token proceeds (see MCP_CONFIRM_MODE). Once confirmed it sends the command and re-reads cmm/gvi until the NESTED climate.airCtrl reads true (there is no flat airCtrlOn field). On an EV engine stays false while climate runs — ign3 is the ignition proxy and is reported alongside. commandAccepted (Kia took the request) and stateConfirmed (the car actually reads running) are separate; state changes were observed to take 30–60s. TEMPERATURE IS BEST-EFFORT AND UNCONFIRMED: per docs/KIA-API.md a start requesting 70°F still read back 72°F, so the car may report its own last-set target rather than the requested one — do not promise the user a specific cabin temperature. Seat and steering-wheel/rear-window heating are not sent at all: the request body deliberately omits heatVentSeat (Kia validates seat capability per car) and leaves every heatingAccessory field at 0.
| Name | Required | Description | Default |
|---|---|---|---|
| vinKey | Yes | The vehicle key (`vehicleKey` from the vehicle-list tool), used as the `vinkey` header. Not the VIN. | |
| defrost | No | Run front defrost (default false). | |
| temperature | No | Target cabin temperature in °F, 62–82, or the sentinel "LOW"/"HIGH" for the ends of the range (default 70). A quoted whole number ("72") is accepted and treated as the number. BEST-EFFORT / UNCONFIRMED — see docs/KIA-API.md. | |
| waitSeconds | No | How long to keep re-reading cmm/gvi for proof the command landed (default 30). Observed changes took 30–60s, so an unconfirmed result is common — re-read the vehicle status rather than re-sending the command. Values above ~45 can outlast an MCP client's own request timeout (often 60s), which then reports a failure for a command that WAS sent. 0 checks once and returns immediately — the command may still land afterwards. | |
| confirmToken | No | ONLY for the two-step confirmation fallback (a client without MCP elicitation). The confirmToken from this same tool's phase-1 "confirmation-required" response, passed back ONLY after the user has seen that preview and explicitly approved it in chat — never on the first call, never invented, never reused. Call again with the same arguments. Ignored when the client supports elicitation. | |
| durationMinutes | No | Minutes the ignition stays on (default 5). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, it discloses major behaviors: the first call may make no network call, a repeat call with confirmToken is required, the tool re-reads cmm/gvi until nested climate.airCtrl is true, EV ignition behaves differently, and temperature is best-effort. It also documents that seat and accessory heating are deliberately omitted from the request.
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 long but every clause earns its place, covering confirmation, verification, EV quirks, timing, temperature fidelity, and omitted features. The core action is front-loaded and the supporting caveats are ordered logically 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?
Given the tool's complexity, the lack of an output schema, and the need to safely handle confirmation and idempotency, this description is unusually complete. It explains response phases, acceptance-vs-confirmation semantics, timing expectations, and what the tool does not do, so an agent has enough context to invoke it 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 coverage is 100% and the schema fields are already richly described. The description adds extra semantic nuance on top: temperature is unconfirmed, waitSeconds above ~45 can outlast client timeouts, and confirmToken must only be reused after explicit user approval. This goes beyond the baseline, though not every parameter receives extra description-level detail.
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 opening sentence states a specific verb and resource: "Start remote climate control / preconditioning (Kia `rems/start`, live-verified)." This clearly distinguishes it from siblings like kia_stop_climate and kia_start_charge by domain, action, and endpoint.
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 gives strong operational guidance: when to expect a preview and confirmToken, when to re-read instead of re-sending, and how to handle unconfirmed results. However, it never explicitly names when to choose this over sibling tools, relying on the purpose statement to imply the use case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kia_start_loginADestructive
Step 1 of the ONE-TIME Kia MFA bootstrap (prof/authUser): send the configured credentials and get back the otpKey and xid the next two steps need. Only needed when kia_session_status reports hasSession:false — once the bootstrap is done the stored remember-me token refreshes sessions silently forever. Asks the user to confirm first: a confirmation prompt where the client supports one; otherwise the first call makes NO network call and returns a preview plus a confirmToken, and only a repeat call with that token proceeds (see MCP_CONFIRM_MODE). The gate is real: Kia counts failed logins and eventually enforces reCAPTCHA, which breaks server-side login for this account PERMANENTLY — so a rejection is never retried, and a wrong password must be fixed in the environment rather than guessed at.
| Name | Required | Description | Default |
|---|---|---|---|
| confirmToken | No | ONLY for the two-step confirmation fallback (a client without MCP elicitation). The confirmToken from this same tool's phase-1 "confirmation-required" response, passed back ONLY after the user has seen that preview and explicitly approved it in chat — never on the first call, never invented, never reused. Call again with the same arguments. Ignored when the client supports elicitation. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description reveals a two-phase confirmation flow, no network call on first invocation in fallback mode, and a severe failure mode: failed logins can trigger reCAPTCHA that permanently breaks server-side login. It explains that rejections are never retried, which is exactly the kind of context annotations alone cannot provide.
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 dense but every sentence carries necessary risk or flow information. It front-loads the purpose and usage condition before explaining the confirmation fallback and consequences, and uses the warning at the end to justify caution without padding.
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 one-parameter tool with no output schema, the description covers the trigger condition, expected return values (otpKey, xid, preview, confirmToken), the repeat-call protocol, and the high-consequence failure behavior. There is no critical gap an agent would need in order to call this 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?
The schema already describes confirmToken in detail, so the baseline is 3. The description adds meaning by tying the token to the two-step confirmation mode, noting it is ignored when the client supports elicitation, and reinforcing that a repeat call must use the same arguments. This clarifies when and how the parameter should be used.
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 opens with a specific verb and resource: Step 1 of the Kia MFA bootstrap, sends configured credentials, and returns otpKey plus xid for the next two steps. This clearly distinguishes it from sibling session/token tools like kia_session_status and kia_send_otp.
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?
It states explicitly that the tool is only needed when kia_session_status reports hasSession:false and that the bootstrap happens once, after which the stored remember-me token refreshes sessions silently. The confirmation requirement is also described, eliminating ambiguity about when a second call may occur.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kia_stop_chargeAIdempotent
Ask the vehicle to stop charging (evc/cancel). Verified against a charging vehicle: evStatus.batteryCharge goes false within ~30-60s. Confirm with kia_vehicle_status rather than trusting the success status. Asks the user to confirm first: a confirmation prompt where the client supports one; otherwise the first call makes NO network call and returns a preview plus a confirmToken, and only a repeat call with that token proceeds (see MCP_CONFIRM_MODE).
| Name | Required | Description | Default |
|---|---|---|---|
| vinKey | Yes | Vehicle key (the `vehicleKey` from the vehicle-list tool). Not the VIN. | |
| confirmToken | No | ONLY for the two-step confirmation fallback (a client without MCP elicitation). The confirmToken from this same tool's phase-1 "confirmation-required" response, passed back ONLY after the user has seen that preview and explicitly approved it in chat — never on the first call, never invented, never reused. Call again with the same arguments. Ignored when the client supports elicitation. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite annotations indicating readOnlyHint=false and destructiveHint=false (it's a state-changing but non-destructive operation), the description goes beyond annotations by disclosing the confirmation behavior: it may return a preview and confirmToken without making a network call, and that a repeat call is needed. It also warns about not trusting success status and suggests verifying with a sibling tool. This fully discloses the tool's side effects and asynchronous nature.
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 three sentences long but packed with essential information: primary action, verification advice, and confirmation flow. It is front-loaded with the core purpose, then provides critical usage details. Every sentence earns its place; no fluff or redundant phrasing.
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 tool with no output schema and 2 parameters, the description is comprehensive. It covers the action, the confirmation caveat, the verification step, and the exact scenario for using confirmToken. Given the tool's moderate complexity (state-changing, confirmation-dependent), the description leaves no critical gaps for an agent to call it 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?
The input schema already provides descriptions for both parameters, including the pattern and that vinKey is not the VIN. The description adds important context for `confirmToken`: it clarifies that it is only for non-elicitation clients, must not be invented or reused, and is ignored with elicitation. This adds meaning beyond the schema, justifying a score above baseline 3 (schema coverage is 100%).
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's primary function (ask vehicle to stop charging) and specifies the underlying command (`evc/cancel`), distinguishing it from siblings like `kia_start_charge` and `kia_set_charge_limits`. The verb 'stop' and resource 'charging' are precise, and the verification hint adds context.
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 provides explicit guidance on when to use this tool (to stop charging), and explicitly recommends confirming via `kia_vehicle_status` instead of trusting success status, which differentiates it from siblings. It also details the two-step confirmation protocol, clarifying when the first call makes no network call and when a repeat call with confirmToken is needed, guiding the agent on the correct invocation sequence.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kia_stop_climateAIdempotent
Stop remote climate control (Kia rems/stop, live-verified). Asks the user to confirm first: a confirmation prompt where the client supports one; otherwise the first call makes NO network call and returns a preview plus a confirmToken, and only a repeat call with that token proceeds (see MCP_CONFIRM_MODE). Once confirmed it sends the command and re-reads cmm/gvi until the NESTED climate.airCtrl reads false (there is no flat airCtrlOn field); ign3 — the EV ignition proxy — is reported alongside. commandAccepted (Kia took the request) and stateConfirmed (the car actually reads stopped) are separate. State changes were observed to take 30–60s.
| Name | Required | Description | Default |
|---|---|---|---|
| vinKey | Yes | The vehicle key (`vehicleKey` from the vehicle-list tool), used as the `vinkey` header. Not the VIN. | |
| waitSeconds | No | How long to keep re-reading cmm/gvi for proof the command landed (default 30). Observed changes took 30–60s, so an unconfirmed result is common — re-read the vehicle status rather than re-sending the command. Values above ~45 can outlast an MCP client's own request timeout (often 60s), which then reports a failure for a command that WAS sent. 0 checks once and returns immediately — the command may still land afterwards. | |
| confirmToken | No | ONLY for the two-step confirmation fallback (a client without MCP elicitation). The confirmToken from this same tool's phase-1 "confirmation-required" response, passed back ONLY after the user has seen that preview and explicitly approved it in chat — never on the first call, never invented, never reused. Call again with the same arguments. Ignored when the client supports elicitation. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations already present, the description still adds substantial behavioral context: the no-network-call first phase, re-reading cmm/gvi until the NESTED `climate.airCtrl` reads false (warning there is no flat `airCtrlOn` field), the separate `commandAccepted` vs `stateConfirmed` semantics, and observed 30–60s state-change latency. The idempotentHint=true annotation aligns with the advice to re-read status rather than re-send, and no contradiction 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?
A single dense paragraph around 120 words with no filler; purpose is front-loaded, and the flow (confirm → verify → result semantics → timing) reads naturally. Given the genuinely complex behavior being encoded — two confirmation modes, polling, nested fields — the length is earned, though headers could marginally improve scannability.
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 complex action tool with no output schema, the description compensates by naming the key result concepts agents must interpret: preview, confirmToken, commandAccepted, stateConfirmed, and ign3, plus the nested-field gotcha and timing expectations. It doesn't enumerate every possible failure mode (e.g., expired Kia session), but the essentials for correct invocation and result interpretation are covered.
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% — vinKey, waitSeconds, and confirmToken each have thorough schema descriptions including the timeout behavior and the token lifecycle. The main description adds no parameter-level meaning beyond what the schema already provides, so the high-coverage baseline of 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?
The description states a specific verb and resource — "Stop remote climate control (Kia `rems/stop`, live-verified)" — naming the underlying endpoint and the verification behavior. This unequivocally distinguishes it from siblings like kia_start_climate and the charge tools even before considering the confirmation-flow details.
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?
Explicitly explains the confirmation requirement and the two distinct invocation paths: a client-supported prompt versus the two-step token fallback, including exactly when a repeat call is allowed and that the first call makes NO network call. It misses explicit when-not-to-use guidance or named alternatives, but the confirmation protocol is the central usage decision and it is fully specified.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kia_vehicle_locationARead-onlyIdempotent
The vehicle's last known location, from the location block of the cached cmm/gvi read. This is where the telematics unit last reported being, not a live GPS fix — run kia_refresh_status first for a recent one. Latitude/longitude and a map link are derived when the block carries coord.lat/coord.lon; otherwise the raw block is returned as-is (its exact field names are not verified).
| Name | Required | Description | Default |
|---|---|---|---|
| vehicle_key | No | vehicleKey from kia_list_vehicles. Optional: defaults to the only vehicle when the account has exactly one. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Even though annotations already declare readOnlyHint and idempotentHint, the description adds meaningful behavioral context: the data is cached and not a live fix, derived output only appears when coord.lat/coord.lon exist, and the raw fallback has unverified field names. This goes beyond what annotations convey and helps an agent set expectations about freshness and output variability.
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 sentences, each earning its place: the first states the data source, the second clarifies freshness and points to the refresh sibling, the third explains derived vs. raw output. No fluff or repetition of schema/annotation content.
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 read-only, single-optional-parameter tool, the description covers the essential context: data provenance, staleness, prerequisite action for recent data, output derivation rule, and the fallback behavior. There's no output schema, but the description itself sufficiently describes what the caller will receive.
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% — the sole optional vehicle_key parameter is fully described in the schema, including its default behavior for single-vehicle accounts. The tool description itself doesn't add parameter-level detail, so the baseline score of 3 is appropriate; there's nothing missing but also nothing extra to credit.
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 (the vehicle's last known location from the cached cmm/gvi read's `location` block) and explicitly contrasts it with a live GPS fix, which distinguishes it from any sibling that might report real-time data. It also names the source and the derived lat/lon/map-link output, leaving no ambiguity about what the tool does.
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 gives an explicit usage directive: run kia_refresh_status first for a recent location. It also implies that this tool is for cached last-known data rather than fresh data. It doesn't enumerate when not to use it or compare against kia_vehicle_status, but the context is clear enough for an agent to select it appropriately.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kia_vehicle_statusARead-onlyIdempotent
Read the vehicle's CACHED status (cmm/gvi): door lock, ignition, and the remote-climate block. Fast, but it reports whatever the telematics unit last uploaded — use kia_refresh_status first when freshness matters. Requested with airTempRange/seatHeatCoolOption = "1" so the nested climate object is present; when it is still absent the result says so rather than reporting climate as off. Note ign3 (not engine) is the ignition on an EV, and syncDate advances on every read, so it never proves anything changed. Per-seat heat/vent state is reported under climate.seats as the RAW numbers Kia sends: the heatVentType/heatVentLevel encoding is UNVERIFIED, so do not tell the user a seat is heating, ventilating or off based on them. An absent seat block means this read carried no seat data — it does NOT mean the car lacks heated seats, which this server cannot currently determine. Pass include_raw for the untrimmed status block (battery/EV detail, doors, tyres, …).
| Name | Required | Description | Default |
|---|---|---|---|
| include_raw | No | Include the full vehicleStatus block as `raw` (default false). | |
| vehicle_key | No | vehicleKey from kia_list_vehicles. Optional: defaults to the only vehicle when the account has exactly one. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnly/idempotent/openWorld hints. The description adds substantial non-obvious behavior: cached data may be stale, syncDate advances on every read (so it never proves change), seat heatVentType/heatVentLevel encoding is UNVERIFIED, and an absent seat block does not mean the car lacks heated seats. This materially prevents misuse.
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 long and dense, but it front-loads the core purpose ('CACHED status') and every sentence carries a caveat or clarification that prevents incorrect agent behavior. It could be trimmed slightly (e.g., the airTempRange/seatHeatCoolOption implementation detail), but the length is justified by the tool's complexity.
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 no output schema, the description carries the burden of explaining return semantics. It covers what fields appear, the meaning of absent climate/seat blocks, EV ignition naming, and what include_raw returns. It also addresses the freshness limitation and data reliability, making it complete for correct invocation.
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 baseline is 3. The description adds value by elaborating on include_raw ('untrimmed status block (battery/EV detail, doors, tyres, …)'), which is not in the schema. It does not discuss vehicle_key further, but the schema already covers it.
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 opens with a specific verb and resource ('Read the vehicle's CACHED status') and names the concrete fields (door lock, ignition, remote-climate block). It explicitly contrasts itself with kia_refresh_status by highlighting cached vs. fresh data, so an agent can distinguish siblings immediately.
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 gives explicit when-to-use guidance: 'use kia_refresh_status first when freshness matters' names the alternative and the condition that selects it. It also instructs when to pass include_raw, and warns about interpreting seat data, making the call context clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kia_verify_otpADestructive
Step 3 of the Kia MFA bootstrap (cmm/verifyOTP): exchange the passcode for a session. The resulting remember-me token is stored locally and is NOT returned — from here on every Kia tool refreshes its own session silently and MFA is never needed again on this device. Takes the otpKey and xid from kia_start_login plus the code the user received.
| Name | Required | Description | Default |
|---|---|---|---|
| otp | Yes | The one-time passcode Kia sent to the user — 6 digits in every observed case. | |
| xid | Yes | The `xid` returned by kia_start_login. Sent with every OTP call. | |
| otpKey | Yes | The `otpKey` returned by kia_start_login. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses important behavioral side effects: the remember-me token is stored locally and NOT returned, every Kia tool will silently refresh the session thereafter, and MFA is never needed again on this device. This is significant state-changing behavior that directly explains the destructiveHint annotation without contradicting it.
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 compact but information-dense. It front-loads the primary purpose, then explains the critical side effects, and finally connects the parameters to their source. Every sentence earns its place with no redundant 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?
For a state-changing authentication step with no output schema, the description is complete: it states the result (session established, token not returned), the side effects (silent refresh, MFA no longer needed), and the required inputs and their source. An agent has enough context to invoke it correctly and understand its consequences.
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 already covers all parameters with 100% description coverage. The description adds value by explaining the origin and relationship of otpKey and xid to kia_start_login and clarifies that otp is the code the user received, which is beyond what the schema states.
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's purpose with a specific verb and resource: 'exchange the passcode for a session' and identifies it as 'Step 3 of the Kia MFA bootstrap'. It also distinguishes the tool's role from siblings like kia_start_login and kia_session_status by describing its outcome.
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 provides clear context for when to use the tool: after kia_start_login, using the otpKey and xid returned by that step, and after the user receives a code. It implies sequencing through 'Step 3' but does not explicitly state when not to use it or name alternative tools.
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.
8 tool updates
v1.1.0- Changed
kia_export_refresh_token2 fields changed- removed
Input schema / properties / confirmRemoved value: -{ - "description": "Must be true to proceed. Without this, the tool returns a preview.", - "type": "boolean" -} - added
Input schema / properties / confirmTokenAdded value: +{ + "description": "ONLY for the two-step confirmation fallback (a client without MCP elicitation). The confirmToken from this same tool's phase-1 \"confirmation-required\" response, passed back ONLY after the user has seen that preview and explicitly approved it in chat — never on the first call, never invented, never reused. Call again with the same arguments. Ignored when the client supports elicitation.", + "type": "string" +}
- Changed
kia_forget_session2 fields changed- removed
Input schema / properties / confirmRemoved value: -{ - "description": "Must be true to proceed. Without this, the tool returns a preview.", - "type": "boolean" -} - added
Input schema / properties / confirmTokenAdded value: +{ + "description": "ONLY for the two-step confirmation fallback (a client without MCP elicitation). The confirmToken from this same tool's phase-1 \"confirmation-required\" response, passed back ONLY after the user has seen that preview and explicitly approved it in chat — never on the first call, never invented, never reused. Call again with the same arguments. Ignored when the client supports elicitation.", + "type": "string" +}
- Changed
kia_set_charge_limits2 fields changed- removed
Input schema / properties / confirmRemoved value: -{ - "description": "Must be true to proceed. Without this, the tool returns a preview.", - "type": "boolean" -} - added
Input schema / properties / confirmTokenAdded value: +{ + "description": "ONLY for the two-step confirmation fallback (a client without MCP elicitation). The confirmToken from this same tool's phase-1 \"confirmation-required\" response, passed back ONLY after the user has seen that preview and explicitly approved it in chat — never on the first call, never invented, never reused. Call again with the same arguments. Ignored when the client supports elicitation.", + "type": "string" +}
- Changed
kia_start_charge2 fields changed- removed
Input schema / properties / confirmRemoved value: -{ - "description": "Must be true to proceed. Without this, the tool returns a preview.", - "type": "boolean" -} - added
Input schema / properties / confirmTokenAdded value: +{ + "description": "ONLY for the two-step confirmation fallback (a client without MCP elicitation). The confirmToken from this same tool's phase-1 \"confirmation-required\" response, passed back ONLY after the user has seen that preview and explicitly approved it in chat — never on the first call, never invented, never reused. Call again with the same arguments. Ignored when the client supports elicitation.", + "type": "string" +}
- Changed
kia_start_climate2 fields changed- removed
Input schema / properties / confirmRemoved value: -{ - "description": "Must be true to proceed. Without this, the tool returns a preview.", - "type": "boolean" -} - added
Input schema / properties / confirmTokenAdded value: +{ + "description": "ONLY for the two-step confirmation fallback (a client without MCP elicitation). The confirmToken from this same tool's phase-1 \"confirmation-required\" response, passed back ONLY after the user has seen that preview and explicitly approved it in chat — never on the first call, never invented, never reused. Call again with the same arguments. Ignored when the client supports elicitation.", + "type": "string" +}
- Changed
kia_start_login2 fields changed- removed
Input schema / properties / confirmRemoved value: -{ - "description": "Must be true to proceed. Without this, the tool returns a preview.", - "type": "boolean" -} - added
Input schema / properties / confirmTokenAdded value: +{ + "description": "ONLY for the two-step confirmation fallback (a client without MCP elicitation). The confirmToken from this same tool's phase-1 \"confirmation-required\" response, passed back ONLY after the user has seen that preview and explicitly approved it in chat — never on the first call, never invented, never reused. Call again with the same arguments. Ignored when the client supports elicitation.", + "type": "string" +}
- Changed
kia_stop_charge2 fields changed- removed
Input schema / properties / confirmRemoved value: -{ - "description": "Must be true to proceed. Without this, the tool returns a preview.", - "type": "boolean" -} - added
Input schema / properties / confirmTokenAdded value: +{ + "description": "ONLY for the two-step confirmation fallback (a client without MCP elicitation). The confirmToken from this same tool's phase-1 \"confirmation-required\" response, passed back ONLY after the user has seen that preview and explicitly approved it in chat — never on the first call, never invented, never reused. Call again with the same arguments. Ignored when the client supports elicitation.", + "type": "string" +}
- Changed
kia_stop_climate2 fields changed- removed
Input schema / properties / confirmRemoved value: -{ - "description": "Must be true to proceed. Without this, the tool returns a preview.", - "type": "boolean" -} - added
Input schema / properties / confirmTokenAdded value: +{ + "description": "ONLY for the two-step confirmation fallback (a client without MCP elicitation). The confirmToken from this same tool's phase-1 \"confirmation-required\" response, passed back ONLY after the user has seen that preview and explicitly approved it in chat — never on the first call, never invented, never reused. Call again with the same arguments. Ignored when the client supports elicitation.", + "type": "string" +}
2 tool updates
v1.0.3- Changed
kia_start_climate2 fields changed- changed
Input schema / properties / waitSeconds / defaultPrevious value: -60New value: +30 - changed
Input schema / properties / waitSeconds / descriptionPrevious value: -"How long to keep re-reading cmm/gvi for proof the command landed (default 60). Observed changes took 30–60s. 0 checks once and returns immediately — the command may still land afterwards."New value: +"How long to keep re-reading cmm/gvi for proof the command landed (default 30). Observed changes took 30–60s, so an unconfirmed result is common — re-read the vehicle status rather than re-sending the command. Values above ~45 can outlast an MCP client's own request timeout (often 60s), which then reports a failure for a command that WAS sent. 0 checks once and returns immediately — the command may still land afterwards."
- Changed
kia_stop_climate2 fields changed- changed
Input schema / properties / waitSeconds / defaultPrevious value: -60New value: +30 - changed
Input schema / properties / waitSeconds / descriptionPrevious value: -"How long to keep re-reading cmm/gvi for proof the command landed (default 60). Observed changes took 30–60s. 0 checks once and returns immediately — the command may still land afterwards."New value: +"How long to keep re-reading cmm/gvi for proof the command landed (default 30). Observed changes took 30–60s, so an unconfirmed result is common — re-read the vehicle status rather than re-sending the command. Values above ~45 can outlast an MCP client's own request timeout (often 60s), which then reports a failure for a command that WAS sent. 0 checks once and returns immediately — the command may still land afterwards."
15 tool updates
v0.9.0- Changed
kia_charge_targets1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
kia_export_refresh_token1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
kia_forget_session1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
kia_healthcheck1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
kia_refresh_status1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
kia_send_otp1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
kia_set_charge_limits1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
kia_start_charge1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
kia_start_climate1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
kia_start_login1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
kia_stop_charge1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
kia_stop_climate1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
kia_vehicle_location1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
kia_vehicle_status1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
kia_verify_otp1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
1 tool update
v0.7.0- Added
kia_healthcheck
2 tool updates
v0.6.1- Changed
kia_set_charge_limits1 field changed- changed
Input schema / properties / targets / items / properties / plugType / descriptionPrevious value: -"Plug type, 0 or 1 — one entry per plug type (AC and DC). Which number is which is NOT verified: read the current targets first and mirror the plugType values it returns."New value: +"Plug type: 1 = AC, 0 = DC per the open-source Kia client, though this server has not confirmed it against a vehicle (both targets were set and restored together during verification, so the two were never distinguished). Safest usage is unchanged: read the current targets first and mirror the plugType values it returns. Note evc/sts REPLACES the list, so send an entry for BOTH plug types."
- Changed
kia_start_climate2 fields changed- changed
Input schema / properties / temperature / anyOfPrevious value: -[ - { - "maximum": 82, - "minimum": 62, - "type": "integer" - }, - { - "enum": [ - "LOW", - "HIGH" - ], - "type": "string" - } -]New value: +[ + { + "maximum": 82, + "minimum": 62, + "type": "integer" + }, + { + "enum": [ + "LOW", + "HIGH" + ], + "type": "string" + }, + { + "pattern": "^\\d+$", + "type": "string" + } +] - changed
Input schema / properties / temperature / descriptionPrevious value: -"Target cabin temperature in °F, 62–82, or the sentinel \"LOW\"/\"HIGH\" for the ends of the range (default 70). BEST-EFFORT / UNCONFIRMED — see docs/KIA-API.md."New value: +"Target cabin temperature in °F, 62–82, or the sentinel \"LOW\"/\"HIGH\" for the ends of the range (default 70). A quoted whole number (\"72\") is accepted and treated as the number. BEST-EFFORT / UNCONFIRMED — see docs/KIA-API.md."
16 tool updates
v0.1.0- First observed
kia_charge_targets - First observed
kia_export_refresh_token - First observed
kia_forget_session - First observed
kia_list_vehicles - First observed
kia_refresh_status - First observed
kia_send_otp - First observed
kia_session_status - First observed
kia_set_charge_limits - First observed
kia_start_charge - First observed
kia_start_climate - First observed
kia_start_login - First observed
kia_stop_charge - First observed
kia_stop_climate - First observed
kia_vehicle_location - First observed
kia_vehicle_status - First observed
kia_verify_otp
TDQS
Scored across 17 tools
Every tool targets a distinct resource or action: the MFA flow is spread across start_login, send_otp, and verify_otp with explicit ordering, session introspection cleanly splits local (session_status) from network (healthcheck), and ambiguous reads like refresh_status vs vehicle_status are clearly differentiated by freshness intent. Even the paired start/stop commands are unambiguous because the target (climate vs charge) is embedded in the name.
All tools share the kia_ prefix with underscore-separated names, but conventions split: actions use verb_noun (start_climate, set_charge_limits, forget_session) while passive reads use bare noun phrases (vehicle_status, session_status, charge_targets, healthcheck) without a get_ or read_ prefix. kia_healthcheck also breaks the pattern as a compound noun rather than a verb-initial name.
At 17 tools this is slightly above the typical 3-15 sweet spot, but the breadth of the domain justifies it: MFA bootstrap requires three sequential steps, session management needs status/forget/export operations, and vehicle control requires read/write and start/stop pairs for both climate and charging. Each tool earns its place with a distinct role.
Core workflows are well covered: full session lifecycle (bootstrap, verify, status, forget, export, healthcheck), vehicle state (list, cached status, refresh, location), charging (targets read/write, start/stop), and climate (start/stop). Obvious gaps like door lock/unlock or remote horn/light commands are absent, but the server's apparent scope of climate, charging, status, and session management is complete.
Maintenance
Related MCP Connectors
MCP server wrapping the Tesla Fleet API and TeslaMate API
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with yo…
Hosted MCP server connecting claude.ai, ChatGPT and other AI apps to your own computer
Remote streamable-HTTP MCP server running on a single Cloudflare Worker. Your assistant gets live Airbnb, Amazon, Booking.com, Google Flights, Maps and Reddit data, social search on X, Instagram and TikTok, the Meta Ad Library, and image/video generation without any keys. Connect your own accounts to let it send WhatsApp or Telegram messages, work an IMAP inbox, manage Meta Ads campaigns and publish to X and LinkedIn. OAuth 2.1 with PKCE; stored credentials are AES-256-GCM encrypted.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceA Model Context Protocol server that connects to the Tesla Fleet API, allowing AI assistants like Claude to control Tesla vehicles and access vehicle information through natural language commands.16MIT
- 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 gradedqualityDmaintenanceAn MCP (Model Context Protocol) server that exposes Polestar 2 vehicle data to AI assistants like Claude. Query your car's battery status, vehicle info, and health data through natural conversation.1MIT