Skip to main content
Glama

Kia Access MCP

CI npm license

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 confirm-gated door, climate, and charging commands.

WARNING

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.

CAUTION

This server can move a two-tonne object and can unlock your car. Every command tool is confirm-gated — without confirm: true it makes no network call at all and returns a dry-run preview — 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:

  1. 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.

  2. 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.

  3. 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.

  4. Failed logins have a permanent cost. Kia counts them (loginAttempt) and eventually sets enforceRecaptcha, 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 build

2. 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:

  1. kia_session_status — confirms credentials are present. If it reports hasSession: false, continue.

  2. kia_start_login (needs confirm: true) — sends your credentials, returns an otpKey and an xid, plus the masked phone/email Kia has on file.

  3. kia_send_otp — pick SMS or EMAIL. The passcode expires in about two minutes.

  4. kia_verify_otp — hand it the passcode. The token is stored locally and is deliberately not returned.

  5. kia_list_vehicles — confirms the session works and gives you the vehicleKey every other tool takes.

To start over (revoked token, changed password, handing the machine on), run kia_forget_session with confirm: true 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:

  1. Set KIA_DEVICE_ID to a fixed uuid before the bootstrap, on both machines. The rmtoken is minted against a device uuid and is worthless with a different one, and kia_session_status only ever reports a truncated prefix — so if you let it be generated, you cannot read back the value you need.

  2. Bootstrap as above, then run kia_export_refresh_token with confirm: true.

  3. Give the remote deployment that value as KIA_RMTOKEN, alongside KIA_USERNAME, KIA_PASSWORD and the same KIA_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.

KIA_WRITE_MODE

Registers

none

Nothing but the read tools and the account tools

comfort (default)

Climate start/stop and the charging commands

all

Also kia_lock_doors and kia_unlock_doors

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:

  • Confirm-gated. Without confirm: true there is no network call at all, just a preview of the exact request that would be sent.

  • 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 commandAccepted and stateConfirmed separately. Observed changes took 30–60 seconds.

Tools

Account and session

Tool

Notes

kia_session_status

Configured? Bootstrapped? Which write mode? No network call, no secrets — the email is masked and the device id truncated.

kia_start_login

Step 1 of the MFA bootstrap. Confirm-gated, because a rejection has a permanent cost.

kia_send_otp

Step 2 — delivers the passcode by SMS or EMAIL.

kia_verify_otp

Step 3 — exchanges the passcode for a stored session. Returns no secret.

kia_forget_session

Discards the stored token so the bootstrap can be re-run. Local only; confirm-gated.

kia_export_refresh_token

Returns the rmtoken in plaintext — a full MFA bypass. Exists only to move a locally-bootstrapped session into a deployment that cannot run the bootstrap itself, via KIA_RMTOKEN. Confirm-gated.

Reads

Tool

Notes

kia_list_vehicles

Every enrolled vehicle with its vehicleKey, nickname, model, mileage. VINs are masked to the last 6 characters.

kia_vehicle_status

Cached status: door lock, ignition (ign3 — on an EV engine stays false), the nested climate block, and more with include_raw. Fast, but only as fresh as the last upload.

kia_refresh_status

Wakes the telematics unit for a fresh reading. Slower, draws a little power, and returns no data itself — read kia_vehicle_status afterwards.

kia_vehicle_location

Last reported position plus a map link. Not a live GPS fix.

kia_charge_targets

Target state of charge per plug type.

Commands

Tool

Mode

Notes

kia_start_climate

comfort

Preconditioning. Temperature is best-effort: the car may report its own last-set target instead of the one requested.

kia_stop_climate

comfort

Verified by re-reading climate.airCtrl.

kia_start_charge

comfort

Verified. Needs the car plugged in — unplugged, Kia accepts the request and nothing happens. Confirm via evStatus.batteryCharge.

kia_stop_charge

comfort

Verified. Confirm via evStatus.batteryCharge.

kia_set_charge_limits

comfort

Verified, and re-read against evc/gts afterwards. Send both plug types — the list replaces the stored one.

kia_lock_doors

all

Verified by re-reading doorLock.

kia_unlock_doors

all

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 bundle

License

MIT

Available Tools

17 tools
kia_charge_targetsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
vinKeyYesVehicle key (the `vehicleKey` from the vehicle-list tool). Not the VIN.

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond annotations (readOnlyHint, openWorldHint), the description discloses that the tool reads the 'evc/gts' endpoint, returns one entry per plug type, and is verified live. It reinforces the read-only nature, providing full transparency for safe usage.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two concise sentences with no filler. It front-loads the core action and adds essential details (endpoint reference, per-plug-type output, verification, read-only nature) efficiently.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only tool with one parameter and no output schema, the description adequately explains the return structure (entries for AC and DC) and confirms live verification. It covers everything an agent needs to invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description covers the single parameter (vinKey) fully, so baseline is 3. The tool description does not add any additional meaning about the parameter, but also does not contradict or degrade the schema information.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool reads EV charge targets, specifying the verb 'Read' and the resource 'EV charge targets'. It further explains scope: per plug type (AC and DC), distinguishing it from sibling write tools like kia_set_charge_limits.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implicitly guides usage by stating it is read-only, which contrasts with sibling tools that modify. However, it lacks explicit direction like 'use when you need to view charge targets, not to modify them'. The read-only hint and context from siblings make the purpose clear, but explicit alternatives would improve it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

kia_export_refresh_tokenA
Idempotent

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. Without confirm:true the token is not even read.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmNoMust be true to proceed. Without this, the tool returns a preview.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses critical behavioral traits beyond the annotations: it returns a plaintext credential, bypasses MFA, grants full vehicle control, and requires confirm:true to even read the token. It also warns against displaying or logging the value. This far exceeds the annotation signals and thoroughly clarifies the security implications.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Despite its length, every sentence serves a purpose: action, security warning, use case, exclusion, and behavior without confirmation. It is front-loaded with the core purpose and avoids fluff, maintaining high information density without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a credential-export tool with no output schema, the description fully covers purpose, use case, security impact, exclusion, and confirmation requirement. The absence of output schema is compensated by the thorough behavioral description, making the tool's behavior predictable and safe.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already documents the single confirm parameter with a clear description, so baseline is 3. The tool description adds value by explaining the consequence of omitting confirm:true ('the token is not even read') and the preview behavior, reinforcing and extending the schema. This extra context warrants a 4.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states the specific action ('Return the stored Kia remember-me token (rmtoken) IN PLAINTEXT') and clearly distinguishes it from sibling tools by explicitly forbidding its use for session checks and directing to kia_session_status. The verb+resource is highly specific and unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit when-to-use context: 'moving a locally-bootstrapped session into a hosted deployment'. It also gives a clear when-not-to-use directive with an alternative tool named: 'Do NOT call it to "check the session" (use kia_session_status)'. This is exemplary guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

kia_forget_sessionA
Idempotent

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. Without confirm:true nothing is deleted and you get a preview instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmNoMust be true to proceed. Without this, the tool returns a preview.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses that the tool makes no network call and only forgets locally, beyond the idempotentHint annotation. It also explains the preview behavior without confirm:true.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, containing only essential information in a clear structure. It covers purpose, use cases, behavior, and parameter effect without extraneous content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (one optional boolean parameter, no output schema), the description is fully complete. It covers all necessary context: local action, no network call, recovery use case, and confirm behavior.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The single parameter 'confirm' is well-described in the schema, but the description adds important context about its effect: without it, nothing is deleted and a preview is returned. This adds value beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool discards the locally stored Kia session to force re-authentication. It distinguishes from sibling tools like kia_session_status and kia_start_login by specifying it is for forgetting the session.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when to use it: as a recovery path when the stored token no longer works due to revocation, password change, or device move. It also notes the only alternative is manual file deletion, providing clear guidance.

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 reachabilityA
Read-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'. Call this when a real tool fails and you want to know which hop broke. Read-only; never returns the credential itself.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, and openWorld hints. The description adds valuable behavioral context: it mimics real credential resolution, performs exactly one authenticated request, reports the credential source, acceptance, round-trip time, and a distinction among failure modes, and guarantees that the credential itself is never returned. This goes well 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three sentences with no filler. It front-loads the core behavior, then the output payload, then the usage trigger. Every sentence earns its place and the length is appropriate for the tool's simplicity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter, read-only healthcheck tool with no output schema, the description is complete: it explains what the tool does, what it reports, when to use it, and a key privacy guarantee. An agent has enough context to select and invoke it correctly without additional documentation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters and schema description coverage is 100%, so the schema already fully documents the input contract. Per the baseline rule for zero-parameter tools, a 4 is appropriate; the description doesn't need to explain parameters, and it doesn't misleadingly mention any.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description begins with a specific action ('Resolves the credential... makes one authenticated request to Kia Connect') and clearly defines the tool's diagnostic purpose. It distinguishes itself from the sibling session/login/vehicle tools by focusing on reachability and credential validation rather than on performing operations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives an explicit trigger: 'Call this when a real tool fails and you want to know which hop broke.' This tells an agent exactly when to invoke it, though it does not name specific alternatives or state when not to use it. The context is still clear enough to route correctly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

kia_list_vehiclesA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_statusA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
vehicle_keyNovehicleKey from kia_list_vehicles. Optional: defaults to the only vehicle when the account has exactly one.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses critical behavioral traits: wakes the telematics unit, slower and draws power, only acknowledges request without returning data, and no completion signal. Annotations provide readOnlyHint and idempotentHint, but description adds nuance about side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, no wasted words. Front-loaded with purpose, then behavioral details and usage guidance. Highly concise and well-structured.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (1 optional param, no output schema, but side effects and reliance on another tool), the description covers all necessary context: purpose, cost, workaround, and follow-up action.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and already describes the optional vehicle_key with defaults. Description adds no extra parameter information beyond what the schema provides, so baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states it asks for a fresh reading from the car, distinguishing it from the cached kia_vehicle_status tool. The verb 'refresh' and resource 'status' are specific.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says to prefer the cached read unless staleness matters, highlights slower speed and power draw, and advises reading kia_vehicle_status afterwards to see refreshed values. Also mentions it only acknowledges the request.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

kia_send_otpA

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 confirm 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
xidYesThe `xid` returned by kia_start_login. Sent with every OTP call.
otpKeyYesThe `otpKey` returned by kia_start_login.
notifyTypeYesDelivery channel. Ask the user; do not guess which destination they can read right now.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses that the passcode expires in ~2 minutes and reports expiresAt, and that it has no confirm gate. Annotations already indicate non-readOnly; description adds useful context 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three brief sentences covering purpose, dependency, channel guidance, and expiry. No wasted words, front-loaded with core purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Adequately covers prerequisite, channel selection, and expiry. Lacks explicit description of response format (e.g., success/expiresAt), but sufficient for a simple send tool with no output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%. Description adds context on where otpKey and xid come from (kia_start_login) and that notifyType should be determined by asking the user, which goes beyond schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states it's Step 2 of MFA bootstrap, delivers a one-time passcode via SMS or email. Distinguishes from siblings by specifying dependency on kia_start_login and its place in the flow.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says it requires otpKey and xid from kia_start_login, advises asking user for channel, and notes expiration. Does not explicitly state when not to use it, but provides clear context on prerequisites.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

kia_session_statusA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_limitsA
Idempotent

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. Without confirm:true it makes NO network call (not even the baseline read) and returns a dry-run preview of exactly what would be sent.

ParametersJSON Schema
NameRequiredDescriptionDefault
verifyNoRe-read evc/gts afterwards to check the change landed. Defaults to true.
vinKeyYesVehicle key (the `vehicleKey` from the vehicle-list tool). Not the VIN.
confirmNoMust be true to proceed. Without this, the tool returns a preview.
targetsYesOne entry per plug type. Read the current targets first and change only what you mean to.

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (readOnlyHint: false, idempotentHint: true), the description reveals critical behavioral traits: the write is verified by re-reading evc/gts and comparing, the tool makes NO network call without confirm:true, and omitting a plug type drops that target. These details are not inferable from annotations or schema and are essential for safe use.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and information-dense, with four sentences that each convey a distinct critical fact: purpose, verification, replacement semantics, and dry-run behavior. It is front-loaded with the core action and avoids repetition or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the rich schema and annotations, the description covers the essential context: how targets are replaced, the verification readback, and the dry-run mode. It does not explicitly mention authentication prerequisites, but that is implicitly handled by the sibling login tools and the schema's reference to vehicleKey from the vehicle-list tool, so it remains adequately complete for an agent to call the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already covers all parameters with detailed descriptions (100% coverage), including the meaning of confirm, verify, and the replacement behavior of targets. The description reinforces key points like 'Send BOTH plug types' and 'dry-run preview', but adds little new semantic information beyond what the schema already provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's action: 'Set the target state of charge per plug type', which is specific and distinguishes it from read-only tools like kia_charge_targets. It also names the underlying API resource (`evc/sts`), leaving no ambiguity about what is being set.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear operational guidance: 'Send BOTH plug types — the list replaces the stored one' and explains the safety behavior of dry-run without confirm:true. It doesn't explicitly name alternative tools, but the write vs. read distinction is implied by the action verb and sibling tool names, so usage context is mostly clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

kia_start_chargeA
Idempotent

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. Without confirm:true it makes NO network call and returns a dry-run preview of exactly what would be sent.

ParametersJSON Schema
NameRequiredDescriptionDefault
vinKeyYesVehicle key (the `vehicleKey` from the vehicle-list tool). Not the VIN.
confirmNoMust be true to proceed. Without this, the tool returns a preview.
chargeRatioNoCharge up to this percentage, 10–100. Defaults to 100.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond annotations, it reveals that without confirm:true it's a dry-run preview, describes timing (~30-60s for batteryCharge to go true), and clarifies that the tool accepts requests even when not plugged in but no action occurs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four sentences each adding distinct value: action, verification, prerequisite, and dry-run behavior. No filler, well-organized.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers prerequisites, behavior, verification method, and confirmation nuance. Without an output schema, it provides enough info on expected state changes and how to confirm success.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema already covers all three parameters with descriptions (100% coverage). The description adds context about the confirm flag's behavior and chargeRatio's default, but schema is already strong.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States 'start charging' with specific verb and resource, mentions underlying API endpoint, and clearly differentiates from siblings like kia_stop_charge or kia_set_charge_limits.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states that the car must be plugged in, warns that an unplugged car accepts the request but does nothing, recommends confirming with kia_vehicle_status, and explains the confirm:true parameter's role in making a network call.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

kia_start_climateA
Idempotent

Start remote climate control / preconditioning (Kia rems/start, live-verified). Without confirm:true this makes NO network call and returns a dry-run preview of the exact body; with confirm:true 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
vinKeyYesThe vehicle key (`vehicleKey` from the vehicle-list tool), used as the `vinkey` header. Not the VIN.
confirmNoMust be true to proceed. Without this, the tool returns a preview.
defrostNoRun front defrost (default false).
temperatureNoTarget 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.
waitSecondsNoHow 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.
durationMinutesNoMinutes the ignition stays on (default 5).

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes far beyond annotations, disclosing the nested `climate.airCtrl` field, EV-specific `engine`/`ign3` behavior, separation of `commandAccepted` vs `stateConfirmed`, observed 30–60s delay, and the unconfirmed temperature behavior. It also reveals that seat/steering heating is deliberately not sent. This is rich, high-value behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but every sentence earns its place: it front-loads the core purpose, then packs essential caveats (dry-run, nested fields, EV behavior, timing, temperature unreliability, omitted heating) without redundancy. The structure is logical and information-dense.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (6 params, nested response semantics, no output schema), the description is remarkably complete. It explains success criteria (`climate.airCtrl` true), distinguishes request acceptance from state confirmation, warns about timing, and documents the lack of temperature/certain accessory support. This covers the likely failure modes and user expectations.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

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 beyond property descriptions: it explains `confirm`'s dry-run vs real execution, `temperature` is best-effort and may be overridden by the car, `waitSeconds` reflects observed timing, and `durationMinutes` controls ignition duration. This meaningfully improves parameter understanding.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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: 'Start remote climate control / preconditioning (Kia `rems/start`, live-verified).' This clearly states what the tool does and distinguishes it from sibling tools like kia_stop_climate by naming the API operation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains the critical usage distinction between dry-run (without confirm:true) and actual execution (with confirm:true), and warns about temperature best-effort and omitted seat heating. It does not explicitly name alternative tools for exclusion (e.g., 'use kia_stop_climate to stop'), but the context is clear and sufficient for selecting this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

kia_start_loginA

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. Without confirm:true it makes NO network call and returns a dry-run preview. 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmNoMust be true to proceed. Without this, the tool returns a preview.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses that without confirm:true no network call is made, that failed logins count and can cause permanent reCAPTCHA lockout, and that credentials must be pre-configured. Annotations only provide readOnlyHint and idempotentHint, which are insufficient; description fills the gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Five sentences, each adding unique value: purpose, precondition, dry-run behavior, warning, and required state. No redundancy. Front-loaded with the most critical information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity (MFA bootstrap, permanent lockout) and lack of output schema, the description covers purpose, preconditions, dry-run mode, return values (otpKey, xid), and critical warnings. Adequately prepares the agent for safe invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Only parameter 'confirm' is well-described in schema (must be true to proceed). Description adds context about dry-run preview and network call behavior, reinforcing the schema. Schema coverage is 100%, so baseline 3; description adds meaningful usage context.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states it's Step 1 of a one-time MFA bootstrap, identifies the verb ('start login') and resource ('Kia MFA bootstrap'), and distinguishes from sibling tools like kia_send_otp and kia_verify_otp.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly specifies preconditions: only needed when kia_session_status shows hasSession:false. Explains dry-run behavior with confirm:false and warns against repeated failures due to permanent lockout risk.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

kia_stop_chargeA
Idempotent

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. Without confirm:true it makes NO network call and returns a dry-run preview of exactly what would be sent.

ParametersJSON Schema
NameRequiredDescriptionDefault
vinKeyYesVehicle key (the `vehicleKey` from the vehicle-list tool). Not the VIN.
confirmNoMust be true to proceed. Without this, the tool returns a preview.

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses that the effect (batteryCharge going false) takes 30-60s, warns not to trust success status, and explains dry-run behavior. Goes well beyond annotations which only indicate idempotent and non-read-only.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three concise sentences, each adding critical information. No redundancy or waste.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers usage, behavior, return expectations, and verification. Even without an output schema, the description fully prepares the agent for invocation and follow-up.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

For `vinKey`, notes it is not the VIN; for `confirm`, explains its role in enabling vs previewing the call. This adds value beyond the schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'stop charging' and specifies the API endpoint `evc/cancel`. This distinguishes it from sibling tools like `kia_start_charge`.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit guidance: confirm with `kia_vehicle_status` to verify effect, and explains that `confirm:true` is required for actual execution; without it, a dry-run preview is returned.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

kia_stop_climateA
Idempotent

Stop remote climate control (Kia rems/stop, live-verified). Without confirm:true this makes NO network call and returns a dry-run preview; with confirm:true 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
vinKeyYesThe vehicle key (`vehicleKey` from the vehicle-list tool), used as the `vinkey` header. Not the VIN.
confirmNoMust be true to proceed. Without this, the tool returns a preview.
waitSecondsNoHow 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.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses the two-phase execution (preview vs actual), polling mechanism for airCtrl, separation of commandAccepted and stateConfirmed, and observed delay. Adds substantial context beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Concise at ~80 words, front-loaded with purpose. Somewhat dense with technical details but no wasted sentences.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers all parameters, return fields (commandAccepted, stateConfirmed, ign3), polling logic, and timing. Adequate given no output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, but description adds practical context: vinKey is vehicleKey, confirm must be true, waitSeconds default/max/observed. Extra value beyond schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states 'Stop remote climate control' with specific endpoint and live-verified status. Unambiguous verb-resource pairing and distinguishable from sibling 'kia_start_climate'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explains the critical confirm:true requirement and the dry-run behavior without it. Includes observed timings but lacks explicit when-to-use guidance versus alternatives beyond start/stop.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

kia_vehicle_locationA
Read-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).

ParametersJSON Schema
NameRequiredDescriptionDefault
vehicle_keyNovehicleKey from kia_list_vehicles. Optional: defaults to the only vehicle when the account has exactly one.

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond annotations (readOnlyHint, openWorldHint, idempotentHint), the description discloses that the data is cached, not live, and that the return format depends on presence of coordinates. This adds significant behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three sentences, all essential, with the main purpose front-loaded. No superfluous information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, the description explains both possible return forms (with/without coordinates) adequately. It covers key behavioral nuances, though it could briefly note that the block structure is from cmm/gvi read.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with a single parameter (vehicle_key) already described in the schema. The description adds no additional parameter meaning beyond what the schema provides, so a baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool returns the vehicle's last known location from cached data, distinguishing it from a live GPS fix and referencing kia_refresh_status for a recent update. It also explains the conditional derivation of latitude/longitude and map link.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly advises to run kia_refresh_status first for a recent location, implying this tool is for cached data. While it doesn't list all alternative tools, the guidance is clear for the key decision point.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

kia_vehicle_statusA
Read-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, …).

ParametersJSON Schema
NameRequiredDescriptionDefault
include_rawNoInclude the full vehicleStatus block as `raw` (default false).
vehicle_keyNovehicleKey from kia_list_vehicles. Optional: defaults to the only vehicle when the account has exactly one.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, openWorld, and idempotent hints, but the description adds substantial behavioral context: cached data semantics, the climate object's conditional presence via airTempRange/seatHeatCoolOption, the EV-specific ign3 field, syncDate advancing on every read, and unverified seat heat/vent encoding. This goes well 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but every sentence conveys a critical caveat necessary for correct interpretation. It is front-loaded with the primary purpose and then systematically addresses freshness, climate presence, EV ignition, seat data encoding, and the meaning of absent seat blocks. Slightly long but disciplined.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, yet the description fully compensates by explaining the most important return-value pitfalls: cached vs fresh, climate object presence, ign3 vs engine, syncDate semantics, raw seat heat/vent codes being unverified, and the meaning of absent seat data. This is comprehensive for a complex telematics tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 100% schema coverage, the baseline is 3. The description adds value by explaining include_raw returns the untrimmed status block (battery/EV detail, doors, tyres) and by detailing the internal request behavior that controls whether the nested climate object appears. The vehicle_key parameter is already well described in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it reads the vehicle's cached status (cmm/gvi) and lists the specific data areas: door lock, ignition, and remote-climate block. It differentiates itself from the sibling kia_refresh_status by positioning itself as the fast, cached alternative.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly advises using kia_refresh_status first when freshness matters, giving a concrete alternative. It also clarifies when to use include_raw and warns against interpreting seat-heat codes, providing clear usage boundaries.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

kia_verify_otpA

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
otpYesThe one-time passcode Kia sent to the user — 6 digits in every observed case.
xidYesThe `xid` returned by kia_start_login. Sent with every OTP call.
otpKeyYesThe `otpKey` returned by kia_start_login.

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description reveals that the remember-me token is stored locally and not returned, sessions refresh silently, and MFA becomes permanent – all beyond the annotations. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences: first gives purpose, second explains behavior and effect. No wasted words, efficiently communicates critical information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool is part of a multi-step MFA process, the description covers prerequisites, effect on state, and future behavior. No output schema needed as the description explains return value (none). Fully complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with good descriptions. The tool description adds context about sourcing otpKey and xid from kia_start_login but does not significantly supplement the schema. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states this is 'Step 3 of the Kia MFA bootstrap' with the verb 'exchange' and resources 'passcode' and 'session'. It distinguishes from sibling tools by indicating its position in a sequence and referencing kia_start_login.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description says the resulting token is stored locally and MFA is never needed again, implying when to use it (after login, before other tools). It does not explicitly state when not to use, but the context is clear enough.

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. Dates show when Glama detected each change.

  1. 1 tool updatev0.7.0
    • Addedkia_healthcheck
  2. 2 tool updatesv0.6.1
    • Changedkia_set_charge_limits1 field changed
      • changedInput schema / properties / targets / items / properties / plugType / description
        Previous 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."
    • Changedkia_start_climate2 fields changed
      • changedInput schema / properties / temperature / anyOf
        Previous 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"
        +  }
        +]
      • changedInput schema / properties / temperature / description
        Previous 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."
  3. 16 tool updatesv0.1.0
    • First observedkia_charge_targets
    • First observedkia_export_refresh_token
    • First observedkia_forget_session
    • First observedkia_list_vehicles
    • First observedkia_refresh_status
    • First observedkia_send_otp
    • First observedkia_session_status
    • First observedkia_set_charge_limits
    • First observedkia_start_charge
    • First observedkia_start_climate
    • First observedkia_start_login
    • First observedkia_stop_charge
    • First observedkia_stop_climate
    • First observedkia_vehicle_location
    • First observedkia_vehicle_status
    • First observedkia_verify_otp

TDQS

A4.7/5.0
Disambiguation5/5

Each tool has a clearly distinct purpose, with descriptive names and explanations that prevent confusion. Paired tools like start/stop are differentiated by action, and session management tools are well-separated.

Naming Consistency5/5

All tools follow the pattern `kia_verb_noun` in snake_case, providing a predictable and consistent naming structure across the entire set.

Tool Count5/5

16 tools cover the necessary operations for Kia vehicle access, including authentication, vehicle info, climate control, and charging. The count is appropriate for the domain without being overwhelming.

Completeness4/5

Core functionalities are well-covered, including login flow, vehicle status, location, climate, and charging control. Missing is door lock/unlock, but the primary use cases (EV climate and charging) are fully addressed.

Maintenance

ActivityActive
ResponsivenessResponsive

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    A 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.
    15
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    An 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
  • A
    license
    B
    quality
    D
    maintenance
    MCP server combining TeslaMate historical analytics with Fleet API live data and commands. Works with Claude Code, Claude Desktop, Cursor, and any MCP-compatible client.
    29
    2
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    An 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.
    MIT

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/chrischall/kiaaccess-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server