{"id":"2be61ed2-abaa-4490-b597-d8f196a3c76f","entityType":"agent","slug":"clawhub-chrischall-kiaaccess","name":"kiaaccess","canonicalUrl":"https://www.xpersona.co/agent/clawhub-chrischall-kiaaccess","canonicalPath":"/agent/clawhub-chrischall-kiaaccess","generatedAt":"2026-10-10T07:40:48.007Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-10-10T01:57:59.101Z","emptyReason":null},"description":"This skill should be used when the user asks about their Kia vehicle through the Kia Access / Kia Owners account. Triggers on phrases like \"is the car locked\", \"unlock the Kia\", \"start the car's climate\", \"warm up the car\", \"where is my car\", \"what's the EV charge at\", \"check the car's battery\", \"lock the doors\", or any request to read or command a Kia vehicle. Skill: kiaaccess Owner: chrischall Summary: This skill should be used when the user asks about their Kia vehicle through the Kia Access / Kia Owners account. Triggers on phrases like \"is the car locked\", \"unlock the Kia\", \"start the car's climate\", \"warm up the car\", \"where is my car\", \"what's the EV charge at\", \"check the car's battery\", \"lock the doors\", or any request to read or command a Kia vehicle. Tags: latest","descriptionLabel":"Technical summary","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 1.8K downloads reported by the source. Last updated 10/10/2026.","installCommand":"clawhub skill install s17cjx1a349nz5apaqp02vgz4h85728z:kiaaccess","sourceUrl":"https://clawhub.ai/chrischall/kiaaccess","homepage":"https://clawhub.ai/chrischall/skills/kiaaccess","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/chrischall/kiaaccess","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/chrischall/skills/kiaaccess","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":65,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"This skill should be used when the user asks about their Kia vehicle through the Kia Access / Kia Owners account. Triggers on phrases like \"is the car locked\", "},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-10T01:57:59.101Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T01:57:59.101Z","emptyReason":null},"stars":null,"forks":null,"downloads":1790,"packageName":null,"latestVersion":"2.0.0","tractionLabel":"1.8K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T01:57:59.101Z","emptyReason":null},"lastUpdatedAt":"2026-10-10T01:57:59.101Z","lastCrawledAt":"2026-10-10T01:57:59.101Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-11T01:57:59.101Z","lastVerifiedAt":null,"highlights":[{"version":"2.0.0","createdAt":"2026-10-09T23:24:13.194Z","changelog":"kiaaccess 2.0.0 - Updated MFA bootstrap instructions: rmtoken must now be copied manually from a file, and never shared in conversation. - Removed the insecure `kia_export_refresh_token` tool for bypassing MFA. - Tool arguments and documentation clarified — all commands now consistently require `vehicle_key`. - Caution sections improved with stronger warnings and more explicit vehicle key handling. - Removed file: skill-card.md.","fileCount":3,"zipByteSize":5013},{"version":"1.1.5","createdAt":"2026-10-07T13:35:38.058Z","changelog":"- Removed the skill description file skill-card.md. - No feature or functionality changes; this is a documentation/packaging-only update.","fileCount":3,"zipByteSize":4872},{"version":"1.1.4","createdAt":"2026-10-05T02:51:13.967Z","changelog":"- Removed the file: skill-card.md - No changes to core functionality; this is a documentation/metadata cleanup release.","fileCount":3,"zipByteSize":4848},{"version":"1.1.3","createdAt":"2026-10-03T01:41:55.971Z","changelog":"- Removed the file: skill-card.md - No other functional changes in this release","fileCount":3,"zipByteSize":4890},{"version":"1.1.2","createdAt":"2026-09-30T16:57:35.039Z","changelog":"- Removed the file skill-card.md. - No changes to functionality or tooling. Documentation and setup remain unchanged.","fileCount":3,"zipByteSize":4822},{"version":"1.1.1","createdAt":"2026-09-25T16:03:45.995Z","changelog":"- Removed the file: skill-card.md - No functional or user-facing changes; this update only deletes redundant documentation.","fileCount":3,"zipByteSize":4852},{"version":"1.1.0","createdAt":"2026-09-24T15:11:50.024Z","changelog":"- Added confirmation token (\"confirmToken\") requirement to all write actions and account tools, replacing previous confirmation system. - Introduced a new \"Confirmations\" section detailing the confirmation workflow, including \"confirmation-required\" responses and token usage. - Updated tool signatures to use \"confirmToken\" instead of \"confirm\" where appropriate. - Improved explanations and table notes to clarify confirmation-gating and the updated command flow. - Removed the file \"skill-card.md\".","fileCount":3,"zipByteSize":4751},{"version":"1.0.3","createdAt":"2026-09-23T21:39:12.715Z","changelog":"- Removed the `skill-card.md` file. - Updated SKILL.md to clarify the meaning and defaults around the `waitSeconds` parameter for command confirmation. - Added detail to \"Reading a command result\" about client-side command handling, defaults, and the consequences of timeouts. - No functional changes to the code. Documentation only.","fileCount":3,"zipByteSize":4649}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s17cjx1a349nz5apaqp02vgz4h85728z:kiaaccess","setupComplexity":"low","setupSteps":["Setup complexity is classified as HIGH. You must provision dedicated cloud infrastructure or an isolated VM. Do not run this directly on your local workstation.","Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-chrischall-kiaaccess/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-chrischall-kiaaccess/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-chrischall-kiaaccess/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-chrischall-kiaaccess/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-chrischall-kiaaccess/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-chrischall-kiaaccess/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-10T07:40:48.004Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-chrischall-kiaaccess/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-chrischall-kiaaccess/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-chrischall-kiaaccess/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-chrischall-kiaaccess/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"high","updatedAt":"2026-10-10T01:57:59.101Z","emptyReason":null},"readme":"Skill: kiaaccess\n\nOwner: chrischall\n\nSummary: This skill should be used when the user asks about their Kia vehicle through the Kia Access / Kia Owners account. Triggers on phrases like \"is the car locked\", \"unlock the Kia\", \"start the car's climate\", \"warm up the car\", \"where is my car\", \"what's the EV charge at\", \"check the car's battery\", \"lock the doors\", or any request to read or command a Kia vehicle.\n\nTags: latest:2.0.0\n\nVersion history:\n\nv2.0.0 | 2026-10-09T23:24:13.194Z | auto\n\nkiaaccess 2.0.0\n\n- Updated MFA bootstrap instructions: rmtoken must now be copied manually from a file, and never shared in conversation.\n- Removed the insecure `kia_export_refresh_token` tool for bypassing MFA.\n- Tool arguments and documentation clarified — all commands now consistently require `vehicle_key`.\n- Caution sections improved with stronger warnings and more explicit vehicle key handling.\n- Removed file: skill-card.md.\n\nv1.1.5 | 2026-10-07T13:35:38.058Z | auto\n\n- Removed the skill description file skill-card.md.\n- No feature or functionality changes; this is a documentation/packaging-only update.\n\nv1.1.4 | 2026-10-05T02:51:13.967Z | auto\n\n- Removed the file: skill-card.md\n- No changes to core functionality; this is a documentation/metadata cleanup release.\n\nv1.1.3 | 2026-10-03T01:41:55.971Z | auto\n\n- Removed the file: skill-card.md\n- No other functional changes in this release\n\nv1.1.2 | 2026-09-30T16:57:35.039Z | auto\n\n- Removed the file skill-card.md.\n- No changes to functionality or tooling. Documentation and setup remain unchanged.\n\nv1.1.1 | 2026-09-25T16:03:45.995Z | auto\n\n- Removed the file: skill-card.md\n- No functional or user-facing changes; this update only deletes redundant documentation.\n\nv1.1.0 | 2026-09-24T15:11:50.024Z | auto\n\n- Added confirmation token (\"confirmToken\") requirement to all write actions and account tools, replacing previous confirmation system.\n- Introduced a new \"Confirmations\" section detailing the confirmation workflow, including \"confirmation-required\" responses and token usage.\n- Updated tool signatures to use \"confirmToken\" instead of \"confirm\" where appropriate.\n- Improved explanations and table notes to clarify confirmation-gating and the updated command flow.\n- Removed the file \"skill-card.md\".\n\nv1.0.3 | 2026-09-23T21:39:12.715Z | auto\n\n- Removed the `skill-card.md` file.\n- Updated SKILL.md to clarify the meaning and defaults around the `waitSeconds` parameter for command confirmation.\n- Added detail to \"Reading a command result\" about client-side command handling, defaults, and the consequences of timeouts.\n- No functional changes to the code. Documentation only.\n\nv1.0.2 | 2026-09-23T15:43:09.521Z | auto\n\n- Removed the skill-card.md file.  \n- No changes to features or behavior.  \n- Internal documentation cleanup only.\n\nv1.0.1 | 2026-09-21T04:12:54.578Z | auto\n\n- Removed the file skill-card.md.\n- No feature or functional changes in this version.\n\nv1.0.0 | 2026-09-20T02:49:46.836Z | auto\n\n- Removed the file skill-card.md from the project. \n- No other changes were made to the skill's configuration or functionality.\n\nv0.9.0 | 2026-09-17T23:35:48.594Z | auto\n\n- Removed the skill-card.md file from the project.\n- No other user-facing changes in functionality or documentation.\n\nv0.8.2 | 2026-09-14T18:50:12.062Z | auto\n\n- Removed the file skill-card.md.\n- No other functional or documentation changes in this version.\n\nv0.8.1 | 2026-09-10T17:50:40.322Z | auto\n\n- Removed the skill-card.md file.\n- No other functional or behavioral changes.\n\nv0.8.0 | 2026-09-04T22:21:26.344Z | auto\n\n- Removed the file: skill-card.md\n- No changes to functionality or configuration; this is a documentation cleanup only.\n\nv0.7.0 | 2026-08-31T16:38:07.102Z | auto\n\n- Removed the skill-card.md file.\n- No changes to functionality or configuration.\n- Documentation and setup instructions remain unchanged.\n\nv0.6.2 | 2026-08-28T11:35:10.828Z | auto\n\n- Renamed skill from \"kiaaccess-mcp\" to \"kiaaccess\".\n- Updated internal documentation to reflect the new skill name.\n- Removed the redundant skill-card.md file.\n\nv0.6.1 | 2026-08-11T14:19:56.906Z | auto\n\n- Removed the sample file skill-card.md.  \n- No other changes to functionality or documentation.\n\nv0.6.0 | 2026-08-10T19:31:11.140Z | auto\n\n- Added support for bootstrapping on servers without OTP access: can now use exported token via `KIA_RMTOKEN` and `KIA_DEVICE_ID`.\n- Updated documentation to clarify deployment steps for hosted environments.\n- Removed the `skill-card.md` file.\n\nv0.5.1 | 2026-08-09T21:02:33.192Z | auto\n\n- Removed the skill-card.md file.\n- Clarified the purpose of kia_export_refresh_token in SKILL.md: it is now specified as \"Only for moving a locally-bootstrapped session into a hosted deployment.\"\n- No functional changes to skill logic.\n\nv0.5.0 | 2026-07-28T23:29:49.655Z | auto\n\n- Removed the file: skill-card.md\n- No changes to skill functionality or tools.\n- No impacts to setup, commands, or usage.\n\nv0.4.1 | 2026-07-28T21:52:16.374Z | auto\n\n- Removed the skill-card.md file.\n- No changes to the code or documentation except for the file removal.\n\nv0.4.0 | 2026-07-28T19:03:19.328Z | auto\n\n- Removed the sample file skill-card.md.  \n- No changes to features, setup, or user-facing behavior.\n\nv0.3.0 | 2026-07-28T14:34:54.441Z | auto\n\n- Removed the file `skill-card.md`.  \n- No changes to functionality or documentation aside from removal of this file.\n\nv0.2.0 | 2026-07-28T11:24:11.316Z | auto\n\n- Initial public release: provides MCP server integration for the Kia Owners API to access Kia vehicle status, location, EV charge state, and remote commands using a user’s Kia Access account.\n- Supports first-time MFA bootstrap and secure session management.\n- Tools for reading vehicle data (status, location, charge state) and sending remote commands (lock/unlock doors, climate control, charging), with user confirmation required for all actions.\n- Configurable write modes control which commands are enabled: `none`, `comfort`, or `all`.\n- Emphasizes user security—no credential guessing, and confirmation before executing commands.\n\nArchive index:\n\nArchive v2.0.0: 3 files, 5013 bytes\n\nFiles: skill-card.md (2137b), SKILL.md (8102b), _meta.json (128b)\n\nFile v2.0.0:SKILL.md\n\n---\nname: kiaaccess\ndescription: This skill should be used when the user asks about their Kia vehicle through the Kia Access / Kia Owners account. Triggers on phrases like \"is the car locked\", \"unlock the Kia\", \"start the car's climate\", \"warm up the car\", \"where is my car\", \"what's the EV charge at\", \"check the car's battery\", \"lock the doors\", or any request to read or command a Kia vehicle.\n---\n\n# kiaaccess-mcp\n\nMCP server for the Kia Owners API used by the Kia Access app — vehicle status, location, EV charge state, and confirmation-gated door, climate, and charging commands, using the user's own Kia account.\n\n- **npm:** [npmjs.com/package/kiaaccess-mcp](https://www.npmjs.com/package/kiaaccess-mcp)\n- **Source:** [github.com/chrischall/kiaaccess-mcp](https://github.com/chrischall/kiaaccess-mcp)\n\n## Setup\n\nAdd to `.mcp.json` in your project or `~/.claude/mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"kiaaccess\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"kiaaccess-mcp\"],\n      \"env\": {\n        \"KIA_USERNAME\": \"you@example.com\",\n        \"KIA_PASSWORD\": \"your-password\",\n        \"KIA_WRITE_MODE\": \"comfort\"\n      }\n    }\n  }\n}\n```\n\n`KIA_WRITE_MODE` decides which command tools are registered at all: `none` (reads only), `comfort` (climate + charging, the default), `all` (also door lock/unlock). An unrecognised value fails closed to `none`.\n\n## First run — the one-time MFA bootstrap\n\nKia challenges each new device once. Start with `kia_session_status`; if it reports `hasSession: false`:\n\n1. `kia_start_login`, confirmed (see [Confirmations](#confirmations)) → returns `otpKey` + `xid` and the masked destinations Kia has on file.\n2. `kia_send_otp(otpKey, xid, notifyType)` — ask the user whether they can read `SMS` or `EMAIL` right now. The code expires in ~2 minutes.\n3. `kia_verify_otp(otpKey, xid, otp)` — same `otpKey`/`xid`, plus the code the user received.\n4. `kia_list_vehicles` to confirm, and to get the `vehicleKey` every other tool needs.\n\nThe remember-me token is then stored locally and refreshes sessions silently forever; MFA is never needed again on that machine. `kia_forget_session` (confirmation-gated) throws it away so the bootstrap can be repeated.\n\nA server with no one to read an OTP cannot run these steps at all. Bootstrap it elsewhere and have the user copy the `rmtoken` from that machine's `~/.kiaaccess-mcp/session.json` into `KIA_RMTOKEN` themselves (no tool returns it, and it must never pass through the conversation), with `KIA_DEVICE_ID` set to the same uuid on both machines — the token is minted against a device uuid and is worthless with a different one. `KIA_RMTOKEN` wins over the local store.\n\n**If a login is rejected, STOP.** Kia counts failed logins and eventually enforces reCAPTCHA, which breaks server-side login for that account permanently. Tell the user to check the credentials in the Kia Access app and fix the environment — never retry with a guessed password.\n\n## Tools\n\n### Account\n| Tool | Notes |\n|------|-------|\n| `kia_session_status` | Configured? Bootstrapped? Which write mode? No network call, no secrets. Start here when a tool says it is not configured. |\n| `kia_start_login` / `kia_send_otp` / `kia_verify_otp` | The three bootstrap steps above. |\n| `kia_forget_session(confirmToken?)` | Deletes the locally stored session. Local only — Kia is not contacted. |\n\n### Reads\n| Tool | Notes |\n|------|-------|\n| `kia_list_vehicles` | Enrolled vehicles with `vehicleKey`, nickname, model, mileage. VINs masked to 6 chars. |\n| `kia_vehicle_status(vehicle_key, include_raw?)` | Cached status: `doorLock`, `ign3`, the nested `climate` block, and (with `include_raw`) battery/EV detail, doors, tyres. |\n| `kia_refresh_status(vehicle_key)` | Wakes the telematics unit. Slow, draws power, returns no data — re-read `kia_vehicle_status` after. |\n| `kia_vehicle_location(vehicle_key)` | Last reported position + map link. Not a live fix. |\n| `kia_charge_targets(vehicle_key)` | Target state of charge per plug type. |\n\n### Commands (all confirmation-gated, all take `confirmToken?`)\n| Tool | Mode | Notes |\n|------|------|-------|\n| `kia_start_climate(vehicle_key, temperature?, durationMinutes?, defrost?, waitSeconds?, confirmToken?)` | `comfort` | Verified live. Temperature is best-effort — do not promise the user an exact cabin temperature. |\n| `kia_stop_climate(vehicle_key, waitSeconds?, confirmToken?)` | `comfort` | Verified live. |\n| `kia_start_charge` / `kia_stop_charge` / `kia_set_charge_limits` | `comfort` | Verified against a plugged-in car. A success status means Kia accepted the command, not that the car acted — confirm charge start/stop via `kia_vehicle_status` (`evStatus.batteryCharge`), and limits via `kia_charge_targets`. `kia_set_charge_limits` REPLACES the target list, so send both plug types. Starting a charge on an unplugged car succeeds and does nothing. |\n| `kia_lock_doors(vehicle_key, waitSeconds?, confirmToken?)` | `all` | Verified live by re-reading `doorLock`. |\n| `kia_unlock_doors(vehicle_key, waitSeconds?, confirmToken?)` | `all` | Leaves the car unsecured. Only when the user explicitly asked for this vehicle. |\n\n## Confirmations\n\nEvery write — each command, plus `kia_start_login` and `kia_forget_session` — asks the user first. A client that can show a confirmation prompt shows one and the tool proceeds on approval (unless the server sets `MCP_CONFIRM_ELICITATION=off`). Otherwise the first call does nothing and returns `status: \"confirmation-required\"` with a `preview` and a `confirmToken`; show the user the preview, get their approval in chat (under the default `MCP_CONFIRM_MODE=ask-user`), then call the SAME tool again with the SAME arguments plus `confirmToken`. The token works once (`TOKEN_REUSED` after that), expires after `MCP_CONFIRM_TTL_SECONDS` (default 600), and is bound to the exact request: changing anything that would be sent returns `DRAFT_CHANGED` with a fresh preview and token. Under `MCP_CONFIRM_MODE=refuse` such clients get `reason: \"confirmation-unsupported\"` and nothing is sent.\n\n## Reading a command result\n\n- **`status: \"confirmation-required\"` means nothing happened.** The tool made no network call and returned a `preview` of the exact request plus a `confirmToken`. Show the user that preview; never describe it as if the car acted.\n- **`commandAccepted` ≠ `stateConfirmed`.** Kia returning success only means the request was accepted. Only `stateConfirmed: true` means the car actually reads locked / unlocked / climate-on. Changes take 30–60 seconds; `waitSeconds` controls how long the tool keeps re-reading. It defaults to 30 so the call finishes inside a client's own request timeout; an unconfirmed result (or a client-side timeout) still means the command WAS sent — re-read the vehicle status, never re-send the command to \"retry\".\n- **`stateConfirmed: false` is not \"it failed\"** — it means the tool stopped waiting. Say exactly that, and offer to re-read `kia_vehicle_status`.\n- **`alreadyInState: true` weakens `stateConfirmed`.** The cached read already showed the target state before the command, so a matching re-read does not prove the car acted. Say so; if it matters, `kia_refresh_status`, wait, then re-read.\n- **On an EV, `engine` stays false with the climate running.** `ign3` is the ignition proxy. Never report the car as off because `engine` is false.\n- **`syncDate` advances on every read** and proves nothing changed.\n\n## Caution\n\n- **Confirm with the user before every command** — these move a real vehicle. Unlocking especially: it leaves the car open until someone locks it.\n- **Never guess a `vehicleKey`.** Call `kia_list_vehicles` first. Pass it as `vehicle_key` on every tool. The read tools default it to the only car on a one-vehicle account; the command and charging tools always require it, so every command names the car it acts on.\n- **Never retry a rejected login** (see above) and never echo the password, the `rmtoken`, or a session id into the conversation.\n- **A cached read can be stale.** If freshness matters, `kia_refresh_status`, wait, then re-read.\n\nFile v2.0.0:_meta.json\n\n{\n  \"ownerId\": \"kn700jq4sjtf2anb0rk3ft4p7n856872\",\n  \"slug\": \"kiaaccess\",\n  \"version\": \"2.0.0\",\n  \"publishedAt\": 1791588253194\n}\n\nFile v2.0.0:skill-card.md\n\n## Description:\n\nHelps users check Kia vehicle status, location, and charging and request confirmation-gated vehicle commands through their Kia Access account.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[chrischall](https://clawhub.ai/user/chrischall)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nKia owners use this skill to ask an agent about their vehicle's status, location, and EV charging, and to approve climate, charging, or door commands for a selected vehicle.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Vehicle location and Kia account data are sensitive.\n\nMitigation: Install only when comfortable granting access; keep passwords, remember-me tokens, and session files out of chat and shared logs.\n\nRisk: Vehicle commands can change climate, charging, or door lock state; unlocking leaves the vehicle unsecured.\n\nMitigation: Use read-only mode unless writes are needed, restrict write permissions to the required actions, and confirm the selected vehicle and user approval before each command.\n\nRisk: An accepted command or cached status may not reflect the vehicle's current state.\n\nMitigation: Re-read vehicle status to verify changes; do not resend a command merely because confirmation times out.\n\n## Reference(s):\n\n- [kiaaccess on ClawHub](https://clawhub.ai/chrischall/skills/kiaaccess)\n- [kiaaccess-mcp npm package](https://www.npmjs.com/package/kiaaccess-mcp)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Guidance, Configuration instructions]\n\n**Output Format:** [Markdown and structured vehicle tool responses]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Vehicle commands require user confirmation; reported command acceptance does not necessarily confirm the vehicle changed state.]\n\n## Skill Version(s):\n\n2.0.0 (source: ClawHub release evidence)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.1.5: 3 files, 4872 bytes\n\nFiles: skill-card.md (2097b), SKILL.md (7749b), _meta.json (128b)\n\nFile v1.1.5:SKILL.md\n\n---\nname: kiaaccess\ndescription: This skill should be used when the user asks about their Kia vehicle through the Kia Access / Kia Owners account. Triggers on phrases like \"is the car locked\", \"unlock the Kia\", \"start the car's climate\", \"warm up the car\", \"where is my car\", \"what's the EV charge at\", \"check the car's battery\", \"lock the doors\", or any request to read or command a Kia vehicle.\n---\n\n# kiaaccess-mcp\n\nMCP server for the Kia Owners API used by the Kia Access app — vehicle status, location, EV charge state, and confirmation-gated door, climate, and charging commands, using the user's own Kia account.\n\n- **npm:** [npmjs.com/package/kiaaccess-mcp](https://www.npmjs.com/package/kiaaccess-mcp)\n- **Source:** [github.com/chrischall/kiaaccess-mcp](https://github.com/chrischall/kiaaccess-mcp)\n\n## Setup\n\nAdd to `.mcp.json` in your project or `~/.claude/mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"kiaaccess\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"kiaaccess-mcp\"],\n      \"env\": {\n        \"KIA_USERNAME\": \"you@example.com\",\n        \"KIA_PASSWORD\": \"your-password\",\n        \"KIA_WRITE_MODE\": \"comfort\"\n      }\n    }\n  }\n}\n```\n\n`KIA_WRITE_MODE` decides which command tools are registered at all: `none` (reads only), `comfort` (climate + charging, the default), `all` (also door lock/unlock). An unrecognised value fails closed to `none`.\n\n## First run — the one-time MFA bootstrap\n\nKia challenges each new device once. Start with `kia_session_status`; if it reports `hasSession: false`:\n\n1. `kia_start_login`, confirmed (see [Confirmations](#confirmations)) → returns `otpKey` + `xid` and the masked destinations Kia has on file.\n2. `kia_send_otp(otpKey, xid, notifyType)` — ask the user whether they can read `SMS` or `EMAIL` right now. The code expires in ~2 minutes.\n3. `kia_verify_otp(otpKey, xid, otp)` — same `otpKey`/`xid`, plus the code the user received.\n4. `kia_list_vehicles` to confirm, and to get the `vehicleKey` every other tool needs.\n\nThe remember-me token is then stored locally and refreshes sessions silently forever; MFA is never needed again on that machine. `kia_forget_session` (confirmation-gated) throws it away so the bootstrap can be repeated.\n\nA server with no one to read an OTP cannot run these steps at all. Bootstrap it elsewhere and pass the exported token as `KIA_RMTOKEN`, with `KIA_DEVICE_ID` set to the same uuid on both machines — the token is minted against a device uuid and is worthless with a different one. `KIA_RMTOKEN` wins over the local store.\n\n**If a login is rejected, STOP.** Kia counts failed logins and eventually enforces reCAPTCHA, which breaks server-side login for that account permanently. Tell the user to check the credentials in the Kia Access app and fix the environment — never retry with a guessed password.\n\n## Tools\n\n### Account\n| Tool | Notes |\n|------|-------|\n| `kia_session_status` | Configured? Bootstrapped? Which write mode? No network call, no secrets. Start here when a tool says it is not configured. |\n| `kia_start_login` / `kia_send_otp` / `kia_verify_otp` | The three bootstrap steps above. |\n| `kia_forget_session(confirmToken?)` | Deletes the locally stored session. Local only — Kia is not contacted. |\n| `kia_export_refresh_token(confirmToken?)` | Returns the `rmtoken` in plaintext — a full MFA bypass. Only for moving a locally-bootstrapped session into a deployment that cannot bootstrap itself, via `KIA_RMTOKEN`. Never call it to \"check the session\"; use `kia_session_status`. |\n\n### Reads\n| Tool | Notes |\n|------|-------|\n| `kia_list_vehicles` | Enrolled vehicles with `vehicleKey`, nickname, model, mileage. VINs masked to 6 chars. |\n| `kia_vehicle_status(vehicle_key, include_raw?)` | Cached status: `doorLock`, `ign3`, the nested `climate` block, and (with `include_raw`) battery/EV detail, doors, tyres. |\n| `kia_refresh_status(vehicle_key)` | Wakes the telematics unit. Slow, draws power, returns no data — re-read `kia_vehicle_status` after. |\n| `kia_vehicle_location(vehicle_key)` | Last reported position + map link. Not a live fix. |\n| `kia_charge_targets(vinKey)` | Target state of charge per plug type. |\n\n### Commands (all confirmation-gated, all take `confirmToken?`)\n| Tool | Mode | Notes |\n|------|------|-------|\n| `kia_start_climate(vinKey, temperature?, durationMinutes?, defrost?, waitSeconds?, confirmToken?)` | `comfort` | Verified live. Temperature is best-effort — do not promise the user an exact cabin temperature. |\n| `kia_stop_climate(vinKey, waitSeconds?, confirmToken?)` | `comfort` | Verified live. |\n| `kia_start_charge` / `kia_stop_charge` / `kia_set_charge_limits` | `comfort` | Verified against a plugged-in car. A success status means Kia accepted the command, not that the car acted — confirm charge start/stop via `kia_vehicle_status` (`evStatus.batteryCharge`), and limits via `kia_charge_targets`. `kia_set_charge_limits` REPLACES the target list, so send both plug types. Starting a charge on an unplugged car succeeds and does nothing. |\n| `kia_lock_doors(vinKey, waitSeconds?, confirmToken?)` | `all` | Verified live by re-reading `doorLock`. |\n| `kia_unlock_doors(vinKey, waitSeconds?, confirmToken?)` | `all` | Leaves the car unsecured. Only when the user explicitly asked for this vehicle. |\n\n## Confirmations\n\nEvery write — each command, plus `kia_start_login`, `kia_forget_session` and `kia_export_refresh_token` — asks the user first. A client that can show a confirmation prompt shows one and the tool proceeds on approval. Otherwise the first call does nothing and returns `status: \"confirmation-required\"` with a `preview` and a `confirmToken`; show the user the preview, get their approval in chat (under the default `MCP_CONFIRM_MODE=ask-user`), then call the SAME tool again with the SAME arguments plus `confirmToken`. The token works once (`TOKEN_REUSED` after that), expires after `MCP_CONFIRM_TTL_SECONDS` (default 600), and is bound to the exact request: changing anything that would be sent returns `DRAFT_CHANGED` with a fresh preview and token. Under `MCP_CONFIRM_MODE=refuse` such clients get `reason: \"confirmation-unsupported\"` and nothing is sent.\n\n## Reading a command result\n\n- **`status: \"confirmation-required\"` means nothing happened.** The tool made no network call and returned a `preview` of the exact request plus a `confirmToken`. Show the user that preview; never describe it as if the car acted.\n- **`commandAccepted` ≠ `stateConfirmed`.** Kia returning success only means the request was accepted. Only `stateConfirmed: true` means the car actually reads locked / unlocked / climate-on. Changes take 30–60 seconds; `waitSeconds` controls how long the tool keeps re-reading. It defaults to 30 so the call finishes inside a client's own request timeout; an unconfirmed result (or a client-side timeout) still means the command WAS sent — re-read the vehicle status, never re-send the command to \"retry\".\n- **`stateConfirmed: false` is not \"it failed\"** — it means the tool stopped waiting. Say exactly that, and offer to re-read `kia_vehicle_status`.\n- **On an EV, `engine` stays false with the climate running.** `ign3` is the ignition proxy. Never report the car as off because `engine` is false.\n- **`syncDate` advances on every read** and proves nothing changed.\n\n## Caution\n\n- **Confirm with the user before every command** — these move a real vehicle. Unlocking especially: it leaves the car open until someone locks it.\n- **Never guess a `vehicleKey`.** Call `kia_list_vehicles` first.\n- **Never retry a rejected login** (see above) and never echo the password, the `rmtoken`, or a session id into the conversation.\n- **A cached read can be stale.** If freshness matters, `kia_refresh_status`, wait, then re-read.\n\nFile v1.1.5:_meta.json\n\n{\n  \"ownerId\": \"kn700jq4sjtf2anb0rk3ft4p7n856872\",\n  \"slug\": \"kiaaccess\",\n  \"version\": \"1.1.5\",\n  \"publishedAt\": 1791380138058\n}\n\nFile v1.1.5:skill-card.md\n\n## Description:\n\nHelps users check their Kia vehicle and request confirmation-gated climate, charging, and door commands through their Kia account.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[chrischall](https://clawhub.ai/user/chrischall)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nKia account holders use this skill to check vehicle status, location, and EV charging, or to request approved climate, charging, and door actions.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Kia account credentials or exported refresh tokens can provide long-lived access to a real vehicle account.\n\nMitigation: Keep credentials out of project files and committed configuration; treat exported refresh tokens like passwords and use read-only mode unless commands are needed.\n\nRisk: Vehicle commands, especially unlocking doors, can have real-world consequences.\n\nMitigation: Require explicit user confirmation for each command and enable only the write mode needed.\n\nRisk: Cached vehicle status or an accepted command may not reflect the vehicle's current state.\n\nMitigation: Refresh and re-read status when freshness matters; distinguish command acceptance from confirmed state and avoid blindly resending commands.\n\n## Reference(s):\n\n- [ClawHub kiaaccess listing](https://clawhub.ai/chrischall/skills/kiaaccess)\n- [kiaaccess-mcp npm package](https://www.npmjs.com/package/kiaaccess-mcp)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Configuration instructions, Tool calls]\n\n**Output Format:** [Markdown guidance and structured tool responses]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Reports whether a vehicle command was merely accepted or its resulting state was confirmed.]\n\n## Skill Version(s):\n\n1.1.5 (source: ClawHub release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.1.4: 3 files, 4848 bytes\n\nFiles: skill-card.md (2069b), SKILL.md (7749b), _meta.json (128b)\n\nFile v1.1.4:SKILL.md\n\n---\nname: kiaaccess\ndescription: This skill should be used when the user asks about their Kia vehicle through the Kia Access / Kia Owners account. Triggers on phrases like \"is the car locked\", \"unlock the Kia\", \"start the car's climate\", \"warm up the car\", \"where is my car\", \"what's the EV charge at\", \"check the car's battery\", \"lock the doors\", or any request to read or command a Kia vehicle.\n---\n\n# kiaaccess-mcp\n\nMCP server for the Kia Owners API used by the Kia Access app — vehicle status, location, EV charge state, and confirmation-gated door, climate, and charging commands, using the user's own Kia account.\n\n- **npm:** [npmjs.com/package/kiaaccess-mcp](https://www.npmjs.com/package/kiaaccess-mcp)\n- **Source:** [github.com/chrischall/kiaaccess-mcp](https://github.com/chrischall/kiaaccess-mcp)\n\n## Setup\n\nAdd to `.mcp.json` in your project or `~/.claude/mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"kiaaccess\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"kiaaccess-mcp\"],\n      \"env\": {\n        \"KIA_USERNAME\": \"you@example.com\",\n        \"KIA_PASSWORD\": \"your-password\",\n        \"KIA_WRITE_MODE\": \"comfort\"\n      }\n    }\n  }\n}\n```\n\n`KIA_WRITE_MODE` decides which command tools are registered at all: `none` (reads only), `comfort` (climate + charging, the default), `all` (also door lock/unlock). An unrecognised value fails closed to `none`.\n\n## First run — the one-time MFA bootstrap\n\nKia challenges each new device once. Start with `kia_session_status`; if it reports `hasSession: false`:\n\n1. `kia_start_login`, confirmed (see [Confirmations](#confirmations)) → returns `otpKey` + `xid` and the masked destinations Kia has on file.\n2. `kia_send_otp(otpKey, xid, notifyType)` — ask the user whether they can read `SMS` or `EMAIL` right now. The code expires in ~2 minutes.\n3. `kia_verify_otp(otpKey, xid, otp)` — same `otpKey`/`xid`, plus the code the user received.\n4. `kia_list_vehicles` to confirm, and to get the `vehicleKey` every other tool needs.\n\nThe remember-me token is then stored locally and refreshes sessions silently forever; MFA is never needed again on that machine. `kia_forget_session` (confirmation-gated) throws it away so the bootstrap can be repeated.\n\nA server with no one to read an OTP cannot run these steps at all. Bootstrap it elsewhere and pass the exported token as `KIA_RMTOKEN`, with `KIA_DEVICE_ID` set to the same uuid on both machines — the token is minted against a device uuid and is worthless with a different one. `KIA_RMTOKEN` wins over the local store.\n\n**If a login is rejected, STOP.** Kia counts failed logins and eventually enforces reCAPTCHA, which breaks server-side login for that account permanently. Tell the user to check the credentials in the Kia Access app and fix the environment — never retry with a guessed password.\n\n## Tools\n\n### Account\n| Tool | Notes |\n|------|-------|\n| `kia_session_status` | Configured? Bootstrapped? Which write mode? No network call, no secrets. Start here when a tool says it is not configured. |\n| `kia_start_login` / `kia_send_otp` / `kia_verify_otp` | The three bootstrap steps above. |\n| `kia_forget_session(confirmToken?)` | Deletes the locally stored session. Local only — Kia is not contacted. |\n| `kia_export_refresh_token(confirmToken?)` | Returns the `rmtoken` in plaintext — a full MFA bypass. Only for moving a locally-bootstrapped session into a deployment that cannot bootstrap itself, via `KIA_RMTOKEN`. Never call it to \"check the session\"; use `kia_session_status`. |\n\n### Reads\n| Tool | Notes |\n|------|-------|\n| `kia_list_vehicles` | Enrolled vehicles with `vehicleKey`, nickname, model, mileage. VINs masked to 6 chars. |\n| `kia_vehicle_status(vehicle_key, include_raw?)` | Cached status: `doorLock`, `ign3`, the nested `climate` block, and (with `include_raw`) battery/EV detail, doors, tyres. |\n| `kia_refresh_status(vehicle_key)` | Wakes the telematics unit. Slow, draws power, returns no data — re-read `kia_vehicle_status` after. |\n| `kia_vehicle_location(vehicle_key)` | Last reported position + map link. Not a live fix. |\n| `kia_charge_targets(vinKey)` | Target state of charge per plug type. |\n\n### Commands (all confirmation-gated, all take `confirmToken?`)\n| Tool | Mode | Notes |\n|------|------|-------|\n| `kia_start_climate(vinKey, temperature?, durationMinutes?, defrost?, waitSeconds?, confirmToken?)` | `comfort` | Verified live. Temperature is best-effort — do not promise the user an exact cabin temperature. |\n| `kia_stop_climate(vinKey, waitSeconds?, confirmToken?)` | `comfort` | Verified live. |\n| `kia_start_charge` / `kia_stop_charge` / `kia_set_charge_limits` | `comfort` | Verified against a plugged-in car. A success status means Kia accepted the command, not that the car acted — confirm charge start/stop via `kia_vehicle_status` (`evStatus.batteryCharge`), and limits via `kia_charge_targets`. `kia_set_charge_limits` REPLACES the target list, so send both plug types. Starting a charge on an unplugged car succeeds and does nothing. |\n| `kia_lock_doors(vinKey, waitSeconds?, confirmToken?)` | `all` | Verified live by re-reading `doorLock`. |\n| `kia_unlock_doors(vinKey, waitSeconds?, confirmToken?)` | `all` | Leaves the car unsecured. Only when the user explicitly asked for this vehicle. |\n\n## Confirmations\n\nEvery write — each command, plus `kia_start_login`, `kia_forget_session` and `kia_export_refresh_token` — asks the user first. A client that can show a confirmation prompt shows one and the tool proceeds on approval. Otherwise the first call does nothing and returns `status: \"confirmation-required\"` with a `preview` and a `confirmToken`; show the user the preview, get their approval in chat (under the default `MCP_CONFIRM_MODE=ask-user`), then call the SAME tool again with the SAME arguments plus `confirmToken`. The token works once (`TOKEN_REUSED` after that), expires after `MCP_CONFIRM_TTL_SECONDS` (default 600), and is bound to the exact request: changing anything that would be sent returns `DRAFT_CHANGED` with a fresh preview and token. Under `MCP_CONFIRM_MODE=refuse` such clients get `reason: \"confirmation-unsupported\"` and nothing is sent.\n\n## Reading a command result\n\n- **`status: \"confirmation-required\"` means nothing happened.** The tool made no network call and returned a `preview` of the exact request plus a `confirmToken`. Show the user that preview; never describe it as if the car acted.\n- **`commandAccepted` ≠ `stateConfirmed`.** Kia returning success only means the request was accepted. Only `stateConfirmed: true` means the car actually reads locked / unlocked / climate-on. Changes take 30–60 seconds; `waitSeconds` controls how long the tool keeps re-reading. It defaults to 30 so the call finishes inside a client's own request timeout; an unconfirmed result (or a client-side timeout) still means the command WAS sent — re-read the vehicle status, never re-send the command to \"retry\".\n- **`stateConfirmed: false` is not \"it failed\"** — it means the tool stopped waiting. Say exactly that, and offer to re-read `kia_vehicle_status`.\n- **On an EV, `engine` stays false with the climate running.** `ign3` is the ignition proxy. Never report the car as off because `engine` is false.\n- **`syncDate` advances on every read** and proves nothing changed.\n\n## Caution\n\n- **Confirm with the user before every command** — these move a real vehicle. Unlocking especially: it leaves the car open until someone locks it.\n- **Never guess a `vehicleKey`.** Call `kia_list_vehicles` first.\n- **Never retry a rejected login** (see above) and never echo the password, the `rmtoken`, or a session id into the conversation.\n- **A cached read can be stale.** If freshness matters, `kia_refresh_status`, wait, then re-read.\n\nFile v1.1.4:_meta.json\n\n{\n  \"ownerId\": \"kn700jq4sjtf2anb0rk3ft4p7n856872\",\n  \"slug\": \"kiaaccess\",\n  \"version\": \"1.1.4\",\n  \"publishedAt\": 1791168673967\n}\n\nFile v1.1.4:skill-card.md\n\n## Description:\n\nHelps Kia owners check vehicle status, location, and charging and request confirmation-gated vehicle commands through their Kia account.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[chrischall](https://clawhub.ai/user/chrischall)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nKia owners and their assistants use this skill to review vehicle status, location, and EV charging details and, with explicit approval, control doors, climate, or charging.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Kia account credentials and exported session tokens can grant access to sensitive vehicle information and controls.\n\nMitigation: Store credentials in private configuration, never commit or echo them, and export session tokens only with explicit approval.\n\nRisk: Commands can unlock a vehicle or change climate and charging settings.\n\nMitigation: Start with read-only mode when possible; explicitly confirm every command and enable door controls only when needed.\n\nRisk: Cached readings and accepted commands can be mistaken for confirmed vehicle state.\n\nMitigation: Refresh and re-read status when freshness matters; verify state after commands without blindly repeating them.\n\n## Reference(s):\n\n- [kiaaccess ClawHub listing](https://clawhub.ai/chrischall/skills/kiaaccess)\n- [kiaaccess-mcp npm package](https://www.npmjs.com/package/kiaaccess-mcp)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Guidance]\n\n**Output Format:** [Conversational text with vehicle readings and command status]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Vehicle reads may be stale; accepted commands do not guarantee the vehicle changed state.]\n\n## Skill Version(s):\n\n1.1.4 (source: server-resolved release evidence)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.1.3: 3 files, 4890 bytes\n\nFiles: skill-card.md (2091b), SKILL.md (7749b), _meta.json (128b)\n\nFile v1.1.3:SKILL.md\n\n---\nname: kiaaccess\ndescription: This skill should be used when the user asks about their Kia vehicle through the Kia Access / Kia Owners account. Triggers on phrases like \"is the car locked\", \"unlock the Kia\", \"start the car's climate\", \"warm up the car\", \"where is my car\", \"what's the EV charge at\", \"check the car's battery\", \"lock the doors\", or any request to read or command a Kia vehicle.\n---\n\n# kiaaccess-mcp\n\nMCP server for the Kia Owners API used by the Kia Access app — vehicle status, location, EV charge state, and confirmation-gated door, climate, and charging commands, using the user's own Kia account.\n\n- **npm:** [npmjs.com/package/kiaaccess-mcp](https://www.npmjs.com/package/kiaaccess-mcp)\n- **Source:** [github.com/chrischall/kiaaccess-mcp](https://github.com/chrischall/kiaaccess-mcp)\n\n## Setup\n\nAdd to `.mcp.json` in your project or `~/.claude/mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"kiaaccess\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"kiaaccess-mcp\"],\n      \"env\": {\n        \"KIA_USERNAME\": \"you@example.com\",\n        \"KIA_PASSWORD\": \"your-password\",\n        \"KIA_WRITE_MODE\": \"comfort\"\n      }\n    }\n  }\n}\n```\n\n`KIA_WRITE_MODE` decides which command tools are registered at all: `none` (reads only), `comfort` (climate + charging, the default), `all` (also door lock/unlock). An unrecognised value fails closed to `none`.\n\n## First run — the one-time MFA bootstrap\n\nKia challenges each new device once. Start with `kia_session_status`; if it reports `hasSession: false`:\n\n1. `kia_start_login`, confirmed (see [Confirmations](#confirmations)) → returns `otpKey` + `xid` and the masked destinations Kia has on file.\n2. `kia_send_otp(otpKey, xid, notifyType)` — ask the user whether they can read `SMS` or `EMAIL` right now. The code expires in ~2 minutes.\n3. `kia_verify_otp(otpKey, xid, otp)` — same `otpKey`/`xid`, plus the code the user received.\n4. `kia_list_vehicles` to confirm, and to get the `vehicleKey` every other tool needs.\n\nThe remember-me token is then stored locally and refreshes sessions silently forever; MFA is never needed again on that machine. `kia_forget_session` (confirmation-gated) throws it away so the bootstrap can be repeated.\n\nA server with no one to read an OTP cannot run these steps at all. Bootstrap it elsewhere and pass the exported token as `KIA_RMTOKEN`, with `KIA_DEVICE_ID` set to the same uuid on both machines — the token is minted against a device uuid and is worthless with a different one. `KIA_RMTOKEN` wins over the local store.\n\n**If a login is rejected, STOP.** Kia counts failed logins and eventually enforces reCAPTCHA, which breaks server-side login for that account permanently. Tell the user to check the credentials in the Kia Access app and fix the environment — never retry with a guessed password.\n\n## Tools\n\n### Account\n| Tool | Notes |\n|------|-------|\n| `kia_session_status` | Configured? Bootstrapped? Which write mode? No network call, no secrets. Start here when a tool says it is not configured. |\n| `kia_start_login` / `kia_send_otp` / `kia_verify_otp` | The three bootstrap steps above. |\n| `kia_forget_session(confirmToken?)` | Deletes the locally stored session. Local only — Kia is not contacted. |\n| `kia_export_refresh_token(confirmToken?)` | Returns the `rmtoken` in plaintext — a full MFA bypass. Only for moving a locally-bootstrapped session into a deployment that cannot bootstrap itself, via `KIA_RMTOKEN`. Never call it to \"check the session\"; use `kia_session_status`. |\n\n### Reads\n| Tool | Notes |\n|------|-------|\n| `kia_list_vehicles` | Enrolled vehicles with `vehicleKey`, nickname, model, mileage. VINs masked to 6 chars. |\n| `kia_vehicle_status(vehicle_key, include_raw?)` | Cached status: `doorLock`, `ign3`, the nested `climate` block, and (with `include_raw`) battery/EV detail, doors, tyres. |\n| `kia_refresh_status(vehicle_key)` | Wakes the telematics unit. Slow, draws power, returns no data — re-read `kia_vehicle_status` after. |\n| `kia_vehicle_location(vehicle_key)` | Last reported position + map link. Not a live fix. |\n| `kia_charge_targets(vinKey)` | Target state of charge per plug type. |\n\n### Commands (all confirmation-gated, all take `confirmToken?`)\n| Tool | Mode | Notes |\n|------|------|-------|\n| `kia_start_climate(vinKey, temperature?, durationMinutes?, defrost?, waitSeconds?, confirmToken?)` | `comfort` | Verified live. Temperature is best-effort — do not promise the user an exact cabin temperature. |\n| `kia_stop_climate(vinKey, waitSeconds?, confirmToken?)` | `comfort` | Verified live. |\n| `kia_start_charge` / `kia_stop_charge` / `kia_set_charge_limits` | `comfort` | Verified against a plugged-in car. A success status means Kia accepted the command, not that the car acted — confirm charge start/stop via `kia_vehicle_status` (`evStatus.batteryCharge`), and limits via `kia_charge_targets`. `kia_set_charge_limits` REPLACES the target list, so send both plug types. Starting a charge on an unplugged car succeeds and does nothing. |\n| `kia_lock_doors(vinKey, waitSeconds?, confirmToken?)` | `all` | Verified live by re-reading `doorLock`. |\n| `kia_unlock_doors(vinKey, waitSeconds?, confirmToken?)` | `all` | Leaves the car unsecured. Only when the user explicitly asked for this vehicle. |\n\n## Confirmations\n\nEvery write — each command, plus `kia_start_login`, `kia_forget_session` and `kia_export_refresh_token` — asks the user first. A client that can show a confirmation prompt shows one and the tool proceeds on approval. Otherwise the first call does nothing and returns `status: \"confirmation-required\"` with a `preview` and a `confirmToken`; show the user the preview, get their approval in chat (under the default `MCP_CONFIRM_MODE=ask-user`), then call the SAME tool again with the SAME arguments plus `confirmToken`. The token works once (`TOKEN_REUSED` after that), expires after `MCP_CONFIRM_TTL_SECONDS` (default 600), and is bound to the exact request: changing anything that would be sent returns `DRAFT_CHANGED` with a fresh preview and token. Under `MCP_CONFIRM_MODE=refuse` such clients get `reason: \"confirmation-unsupported\"` and nothing is sent.\n\n## Reading a command result\n\n- **`status: \"confirmation-required\"` means nothing happened.** The tool made no network call and returned a `preview` of the exact request plus a `confirmToken`. Show the user that preview; never describe it as if the car acted.\n- **`commandAccepted` ≠ `stateConfirmed`.** Kia returning success only means the request was accepted. Only `stateConfirmed: true` means the car actually reads locked / unlocked / climate-on. Changes take 30–60 seconds; `waitSeconds` controls how long the tool keeps re-reading. It defaults to 30 so the call finishes inside a client's own request timeout; an unconfirmed result (or a client-side timeout) still means the command WAS sent — re-read the vehicle status, never re-send the command to \"retry\".\n- **`stateConfirmed: false` is not \"it failed\"** — it means the tool stopped waiting. Say exactly that, and offer to re-read `kia_vehicle_status`.\n- **On an EV, `engine` stays false with the climate running.** `ign3` is the ignition proxy. Never report the car as off because `engine` is false.\n- **`syncDate` advances on every read** and proves nothing changed.\n\n## Caution\n\n- **Confirm with the user before every command** — these move a real vehicle. Unlocking especially: it leaves the car open until someone locks it.\n- **Never guess a `vehicleKey`.** Call `kia_list_vehicles` first.\n- **Never retry a rejected login** (see above) and never echo the password, the `rmtoken`, or a session id into the conversation.\n- **A cached read can be stale.** If freshness matters, `kia_refresh_status`, wait, then re-read.\n\nFile v1.1.3:_meta.json\n\n{\n  \"ownerId\": \"kn700jq4sjtf2anb0rk3ft4p7n856872\",\n  \"slug\": \"kiaaccess\",\n  \"version\": \"1.1.3\",\n  \"publishedAt\": 1790991715971\n}\n\nFile v1.1.3:skill-card.md\n\n## Description:\n\nHelps Kia owners check vehicle status, location, and EV charging and request confirmation-gated climate, charging, and door commands through their Kia Access account.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[chrischall](https://clawhub.ai/user/chrischall)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nKia owners use the skill to ask an agent about their vehicle's status, location, and charge level, or to request confirmed climate, charging, and door actions.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The integration accesses Kia account credentials and vehicle telemetry, including location.\n\nMitigation: Install only if comfortable granting that access, keep credentials private, and use read-only mode when commands are unnecessary.\n\nRisk: An exported refresh token can retain access to the vehicle account without another MFA challenge.\n\nMitigation: Never share exported tokens and forget the local session when access should end.\n\nRisk: Door commands can leave a vehicle unsecured, and an accepted command may not have taken effect.\n\nMitigation: Enable door commands only when needed, confirm each requested action, and recheck vehicle status rather than blindly retrying.\n\n## Reference(s):\n\n- [Kiaaccess ClawHub listing](https://clawhub.ai/chrischall/skills/kiaaccess)\n- [kiaaccess-mcp npm package](https://www.npmjs.com/package/kiaaccess-mcp)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Guidance, Configuration instructions]\n\n**Output Format:** [Markdown and structured tool responses]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Vehicle readings may be cached; command acceptance does not guarantee the vehicle changed state.]\n\n## Skill Version(s):\n\n1.1.3 (source: ClawHub release evidence)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.1.2: 3 files, 4822 bytes\n\nFiles: skill-card.md (2003b), SKILL.md (7749b), _meta.json (128b)\n\nFile v1.1.2:SKILL.md\n\n---\nname: kiaaccess\ndescription: This skill should be used when the user asks about their Kia vehicle through the Kia Access / Kia Owners account. Triggers on phrases like \"is the car locked\", \"unlock the Kia\", \"start the car's climate\", \"warm up the car\", \"where is my car\", \"what's the EV charge at\", \"check the car's battery\", \"lock the doors\", or any request to read or command a Kia vehicle.\n---\n\n# kiaaccess-mcp\n\nMCP server for the Kia Owners API used by the Kia Access app — vehicle status, location, EV charge state, and confirmation-gated door, climate, and charging commands, using the user's own Kia account.\n\n- **npm:** [npmjs.com/package/kiaaccess-mcp](https://www.npmjs.com/package/kiaaccess-mcp)\n- **Source:** [github.com/chrischall/kiaaccess-mcp](https://github.com/chrischall/kiaaccess-mcp)\n\n## Setup\n\nAdd to `.mcp.json` in your project or `~/.claude/mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"kiaaccess\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"kiaaccess-mcp\"],\n      \"env\": {\n        \"KIA_USERNAME\": \"you@example.com\",\n        \"KIA_PASSWORD\": \"your-password\",\n        \"KIA_WRITE_MODE\": \"comfort\"\n      }\n    }\n  }\n}\n```\n\n`KIA_WRITE_MODE` decides which command tools are registered at all: `none` (reads only), `comfort` (climate + charging, the default), `all` (also door lock/unlock). An unrecognised value fails closed to `none`.\n\n## First run — the one-time MFA bootstrap\n\nKia challenges each new device once. Start with `kia_session_status`; if it reports `hasSession: false`:\n\n1. `kia_start_login`, confirmed (see [Confirmations](#confirmations)) → returns `otpKey` + `xid` and the masked destinations Kia has on file.\n2. `kia_send_otp(otpKey, xid, notifyType)` — ask the user whether they can read `SMS` or `EMAIL` right now. The code expires in ~2 minutes.\n3. `kia_verify_otp(otpKey, xid, otp)` — same `otpKey`/`xid`, plus the code the user received.\n4. `kia_list_vehicles` to confirm, and to get the `vehicleKey` every other tool needs.\n\nThe remember-me token is then stored locally and refreshes sessions silently forever; MFA is never needed again on that machine. `kia_forget_session` (confirmation-gated) throws it away so the bootstrap can be repeated.\n\nA server with no one to read an OTP cannot run these steps at all. Bootstrap it elsewhere and pass the exported token as `KIA_RMTOKEN`, with `KIA_DEVICE_ID` set to the same uuid on both machines — the token is minted against a device uuid and is worthless with a different one. `KIA_RMTOKEN` wins over the local store.\n\n**If a login is rejected, STOP.** Kia counts failed logins and eventually enforces reCAPTCHA, which breaks server-side login for that account permanently. Tell the user to check the credentials in the Kia Access app and fix the environment — never retry with a guessed password.\n\n## Tools\n\n### Account\n| Tool | Notes |\n|------|-------|\n| `kia_session_status` | Configured? Bootstrapped? Which write mode? No network call, no secrets. Start here when a tool says it is not configured. |\n| `kia_start_login` / `kia_send_otp` / `kia_verify_otp` | The three bootstrap steps above. |\n| `kia_forget_session(confirmToken?)` | Deletes the locally stored session. Local only — Kia is not contacted. |\n| `kia_export_refresh_token(confirmToken?)` | Returns the `rmtoken` in plaintext — a full MFA bypass. Only for moving a locally-bootstrapped session into a deployment that cannot bootstrap itself, via `KIA_RMTOKEN`. Never call it to \"check the session\"; use `kia_session_status`. |\n\n### Reads\n| Tool | Notes |\n|------|-------|\n| `kia_list_vehicles` | Enrolled vehicles with `vehicleKey`, nickname, model, mileage. VINs masked to 6 chars. |\n| `kia_vehicle_status(vehicle_key, include_raw?)` | Cached status: `doorLock`, `ign3`, the nested `climate` block, and (with `include_raw`) battery/EV detail, doors, tyres. |\n| `kia_refresh_status(vehicle_key)` | Wakes the telematics unit. Slow, draws power, returns no data — re-read `kia_vehicle_status` after. |\n| `kia_vehicle_location(vehicle_key)` | Last reported position + map link. Not a live fix. |\n| `kia_charge_targets(vinKey)` | Target state of charge per plug type. |\n\n### Commands (all confirmation-gated, all take `confirmToken?`)\n| Tool | Mode | Notes |\n|------|------|-------|\n| `kia_start_climate(vinKey, temperature?, durationMinutes?, defrost?, waitSeconds?, confirmToken?)` | `comfort` | Verified live. Temperature is best-effort — do not promise the user an exact cabin temperature. |\n| `kia_stop_climate(vinKey, waitSeconds?, confirmToken?)` | `comfort` | Verified live. |\n| `kia_start_charge` / `kia_stop_charge` / `kia_set_charge_limits` | `comfort` | Verified against a plugged-in car. A success status means Kia accepted the command, not that the car acted — confirm charge start/stop via `kia_vehicle_status` (`evStatus.batteryCharge`), and limits via `kia_charge_targets`. `kia_set_charge_limits` REPLACES the target list, so send both plug types. Starting a charge on an unplugged car succeeds and does nothing. |\n| `kia_lock_doors(vinKey, waitSeconds?, confirmToken?)` | `all` | Verified live by re-reading `doorLock`. |\n| `kia_unlock_doors(vinKey, waitSeconds?, confirmToken?)` | `all` | Leaves the car unsecured. Only when the user explicitly asked for this vehicle. |\n\n## Confirmations\n\nEvery write — each command, plus `kia_start_login`, `kia_forget_session` and `kia_export_refresh_token` — asks the user first. A client that can show a confirmation prompt shows one and the tool proceeds on approval. Otherwise the first call does nothing and returns `status: \"confirmation-required\"` with a `preview` and a `confirmToken`; show the user the preview, get their approval in chat (under the default `MCP_CONFIRM_MODE=ask-user`), then call the SAME tool again with the SAME arguments plus `confirmToken`. The token works once (`TOKEN_REUSED` after that), expires after `MCP_CONFIRM_TTL_SECONDS` (default 600), and is bound to the exact request: changing anything that would be sent returns `DRAFT_CHANGED` with a fresh preview and token. Under `MCP_CONFIRM_MODE=refuse` such clients get `reason: \"confirmation-unsupported\"` and nothing is sent.\n\n## Reading a command result\n\n- **`status: \"confirmation-required\"` means nothing happened.** The tool made no network call and returned a `preview` of the exact request plus a `confirmToken`. Show the user that preview; never describe it as if the car acted.\n- **`commandAccepted` ≠ `stateConfirmed`.** Kia returning success only means the request was accepted. Only `stateConfirmed: true` means the car actually reads locked / unlocked / climate-on. Changes take 30–60 seconds; `waitSeconds` controls how long the tool keeps re-reading. It defaults to 30 so the call finishes inside a client's own request timeout; an unconfirmed result (or a client-side timeout) still means the command WAS sent — re-read the vehicle status, never re-send the command to \"retry\".\n- **`stateConfirmed: false` is not \"it failed\"** — it means the tool stopped waiting. Say exactly that, and offer to re-read `kia_vehicle_status`.\n- **On an EV, `engine` stays false with the climate running.** `ign3` is the ignition proxy. Never report the car as off because `engine` is false.\n- **`syncDate` advances on every read** and proves nothing changed.\n\n## Caution\n\n- **Confirm with the user before every command** — these move a real vehicle. Unlocking especially: it leaves the car open until someone locks it.\n- **Never guess a `vehicleKey`.** Call `kia_list_vehicles` first.\n- **Never retry a rejected login** (see above) and never echo the password, the `rmtoken`, or a session id into the conversation.\n- **A cached read can be stale.** If freshness matters, `kia_refresh_status`, wait, then re-read.\n\nFile v1.1.2:_meta.json\n\n{\n  \"ownerId\": \"kn700jq4sjtf2anb0rk3ft4p7n856872\",\n  \"slug\": \"kiaaccess\",\n  \"version\": \"1.1.2\",\n  \"publishedAt\": 1790787455039\n}\n\nFile v1.1.2:skill-card.md\n\n## Description:\n\nHelps users check their Kia vehicle's status and location and request confirmation-gated climate, charging, and door commands through their Kia account.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[chrischall](https://clawhub.ai/user/chrischall)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nKia owners and their assistants use this skill to check vehicle status, location, and charging and, with confirmation, control climate, charging, and door locks.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Account credentials and refresh tokens could expose vehicle access if shared.\n\nMitigation: Keep credentials private and never share exported refresh tokens; use a trusted environment.\n\nRisk: Vehicle controls can change climate, charging, or door-lock state; unlocking leaves the vehicle unsecured.\n\nMitigation: Use read-only mode when possible, enable door controls only when needed, and confirm every command with the user.\n\nRisk: Cached status or an accepted command may not reflect the vehicle's current state.\n\nMitigation: Refresh and re-read vehicle status before relying on it; verify outcomes instead of repeating commands.\n\n## Reference(s):\n\n- [kiaaccess ClawHub release](https://clawhub.ai/chrischall/skills/kiaaccess)\n- [kiaaccess-mcp npm package](https://www.npmjs.com/package/kiaaccess-mcp)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Configuration instructions, Guidance]\n\n**Output Format:** [Markdown]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Vehicle readings may be cached; command acceptance does not guarantee the vehicle changed state.]\n\n## Skill Version(s):\n\n1.1.2 (source: ClawHub release evidence)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.1.1: 3 files, 4852 bytes\n\nFiles: skill-card.md (2099b), SKILL.md (7749b), _meta.json (128b)\n\nFile v1.1.1:SKILL.md\n\n---\nname: kiaaccess\ndescription: This skill should be used when the user asks about their Kia vehicle through the Kia Access / Kia Owners account. Triggers on phrases like \"is the car locked\", \"unlock the Kia\", \"start the car's climate\", \"warm up the car\", \"where is my car\", \"what's the EV charge at\", \"check the car's battery\", \"lock the doors\", or any request to read or command a Kia vehicle.\n---\n\n# kiaaccess-mcp\n\nMCP server for the Kia Owners API used by the Kia Access app — vehicle status, location, EV charge state, and confirmation-gated door, climate, and charging commands, using the user's own Kia account.\n\n- **npm:** [npmjs.com/package/kiaaccess-mcp](https://www.npmjs.com/package/kiaaccess-mcp)\n- **Source:** [github.com/chrischall/kiaaccess-mcp](https://github.com/chrischall/kiaaccess-mcp)\n\n## Setup\n\nAdd to `.mcp.json` in your project or `~/.claude/mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"kiaaccess\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"kiaaccess-mcp\"],\n      \"env\": {\n        \"KIA_USERNAME\": \"you@example.com\",\n        \"KIA_PASSWORD\": \"your-password\",\n        \"KIA_WRITE_MODE\": \"comfort\"\n      }\n    }\n  }\n}\n```\n\n`KIA_WRITE_MODE` decides which command tools are registered at all: `none` (reads only), `comfort` (climate + charging, the default), `all` (also door lock/unlock). An unrecognised value fails closed to `none`.\n\n## First run — the one-time MFA bootstrap\n\nKia challenges each new device once. Start with `kia_session_status`; if it reports `hasSession: false`:\n\n1. `kia_start_login`, confirmed (see [Confirmations](#confirmations)) → returns `otpKey` + `xid` and the masked destinations Kia has on file.\n2. `kia_send_otp(otpKey, xid, notifyType)` — ask the user whether they can read `SMS` or `EMAIL` right now. The code expires in ~2 minutes.\n3. `kia_verify_otp(otpKey, xid, otp)` — same `otpKey`/`xid`, plus the code the user received.\n4. `kia_list_vehicles` to confirm, and to get the `vehicleKey` every other tool needs.\n\nThe remember-me token is then stored locally and refreshes sessions silently forever; MFA is never needed again on that machine. `kia_forget_session` (confirmation-gated) throws it away so the bootstrap can be repeated.\n\nA server with no one to read an OTP cannot run these steps at all. Bootstrap it elsewhere and pass the exported token as `KIA_RMTOKEN`, with `KIA_DEVICE_ID` set to the same uuid on both machines — the token is minted against a device uuid and is worthless with a different one. `KIA_RMTOKEN` wins over the local store.\n\n**If a login is rejected, STOP.** Kia counts failed logins and eventually enforces reCAPTCHA, which breaks server-side login for that account permanently. Tell the user to check the credentials in the Kia Access app and fix the environment — never retry with a guessed password.\n\n## Tools\n\n### Account\n| Tool | Notes |\n|------|-------|\n| `kia_session_status` | Configured? Bootstrapped? Which write mode? No network call, no secrets. Start here when a tool says it is not configured. |\n| `kia_start_login` / `kia_send_otp` / `kia_verify_otp` | The three bootstrap steps above. |\n| `kia_forget_session(confirmToken?)` | Deletes the locally stored session. Local only — Kia is not contacted. |\n| `kia_export_refresh_token(confirmToken?)` | Returns the `rmtoken` in plaintext — a full MFA bypass. Only for moving a locally-bootstrapped session into a deployment that cannot bootstrap itself, via `KIA_RMTOKEN`. Never call it to \"check the session\"; use `kia_session_status`. |\n\n### Reads\n| Tool | Notes |\n|------|-------|\n| `kia_list_vehicles` | Enrolled vehicles with `vehicleKey`, nickname, model, mileage. VINs masked to 6 chars. |\n| `kia_vehicle_status(vehicle_key, include_raw?)` | Cached status: `doorLock`, `ign3`, the nested `climate` block, and (with `include_raw`) battery/EV detail, doors, tyres. |\n| `kia_refresh_status(vehicle_key)` | Wakes the telematics unit. Slow, draws power, returns no data — re-read `kia_vehicle_status` after. |\n| `kia_vehicle_location(vehicle_key)` | Last reported position + map link. Not a live fix. |\n| `kia_charge_targets(vinKey)` | Target state of charge per plug type. |\n\n### Commands (all confirmation-gated, all take `confirmToken?`)\n| Tool | Mode | Notes |\n|------|------|-------|\n| `kia_start_climate(vinKey, temperature?, durationMinutes?, defrost?, waitSeconds?, confirmToken?)` | `comfort` | Verified live. Temperature is best-effort — do not promise the user an exact cabin temperature. |\n| `kia_stop_climate(vinKey, waitSeconds?, confirmToken?)` | `comfort` | Verified live. |\n| `kia_start_charge` / `kia_stop_charge` / `kia_set_charge_limits` | `comfort` | Verified against a plugged-in car. A success status means Kia accepted the command, not that the car acted — confirm charge start/stop via `kia_vehicle_status` (`evStatus.batteryCharge`), and limits via `kia_charge_targets`. `kia_set_charge_limits` REPLACES the target list, so send both plug types. Starting a charge on an unplugged car succeeds and does nothing. |\n| `kia_lock_doors(vinKey, waitSeconds?, confirmToken?)` | `all` | Verified live by re-reading `doorLock`. |\n| `kia_unlock_doors(vinKey, waitSeconds?, confirmToken?)` | `all` | Leaves the car unsecured. Only when the user explicitly asked for this vehicle. |\n\n## Confirmations\n\nEvery write — each command, plus `kia_start_login`, `kia_forget_session` and `kia_export_refresh_token` — asks the user first. A client that can show a confirmation prompt shows one and the tool proceeds on approval. Otherwise the first call does nothing and returns `status: \"confirmation-required\"` with a `preview` and a `confirmToken`; show the user the preview, get their approval in chat (under the default `MCP_CONFIRM_MODE=ask-user`), then call the SAME tool again with the SAME arguments plus `confirmToken`. The token works once (`TOKEN_REUSED` after that), expires after `MCP_CONFIRM_TTL_SECONDS` (default 600), and is bound to the exact request: changing anything that would be sent returns `DRAFT_CHANGED` with a fresh preview and token. Under `MCP_CONFIRM_MODE=refuse` such clients get `reason: \"confirmation-unsupported\"` and nothing is sent.\n\n## Reading a command result\n\n- **`status: \"confirmation-required\"` means nothing happened.** The tool made no network call and returned a `preview` of the exact request plus a `confirmToken`. Show the user that preview; never describe it as if the car acted.\n- **`commandAccepted` ≠ `stateConfirmed`.** Kia returning success only means the request was accepted. Only `stateConfirmed: true` means the car actually reads locked / unlocked / climate-on. Changes take 30–60 seconds; `waitSeconds` controls how long the tool keeps re-reading. It defaults to 30 so the call finishes inside a client's own request timeout; an unconfirmed result (or a client-side timeout) still means the command WAS sent — re-read the vehicle status, never re-send the command to \"retry\".\n- **`stateConfirmed: false` is not \"it failed\"** — it means the tool stopped waiting. Say exactly that, and offer to re-read `kia_vehicle_status`.\n- **On an EV, `engine` stays false with the climate running.** `ign3` is the ignition proxy. Never report the car as off because `engine` is false.\n- **`syncDate` advances on every read** and proves nothing changed.\n\n## Caution\n\n- **Confirm with the user before every command** — these move a real vehicle. Unlocking especially: it leaves the car open until someone locks it.\n- **Never guess a `vehicleKey`.** Call `kia_list_vehicles` first.\n- **Never retry a rejected login** (see above) and never echo the password, the `rmtoken`, or a session id into the conversation.\n- **A cached read can be stale.** If freshness matters, `kia_refresh_status`, wait, then re-read.\n\nFile v1.1.1:_meta.json\n\n{\n  \"ownerId\": \"kn700jq4sjtf2anb0rk3ft4p7n856872\",\n  \"slug\": \"kiaaccess\",\n  \"version\": \"1.1.1\",\n  \"publishedAt\": 1790352225995\n}\n\nFile v1.1.1:skill-card.md\n\n## Description:\n\nHelps users check Kia vehicle status, location, and charging and request confirmed remote vehicle commands through their Kia account.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[chrischall](https://clawhub.ai/user/chrischall)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nKia owners and their assistants use this skill to check vehicle condition and location, review EV charging, and request confirmed climate, charging, or door commands.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Account access can expose vehicle location and enable remote commands.\n\nMitigation: Use read-only mode when commands are not needed, and confirm each vehicle command with the user.\n\nRisk: An exported refresh token can retain access without another MFA challenge.\n\nMitigation: Avoid exporting the token unless deployment requires it; forget the local session when access is no longer needed.\n\nRisk: Cached reads or accepted commands can be mistaken for current vehicle state.\n\nMitigation: Refresh and re-read status when freshness matters, and verify a command's effect before reporting it as complete.\n\n## Reference(s):\n\n- [kiaaccess on ClawHub](https://clawhub.ai/chrischall/skills/kiaaccess)\n- [kiaaccess-mcp npm package (linked in skill)](https://www.npmjs.com/package/kiaaccess-mcp)\n- [kiaaccess-mcp project (linked in skill)](https://github.com/chrischall/kiaaccess-mcp)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Guidance]\n\n**Output Format:** [Natural-language responses with vehicle status and command confirmations]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Status and location may be cached; command acceptance does not establish a changed vehicle state.]\n\n## Skill Version(s):\n\n1.1.1 (source: ClawHub release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.1.0: 3 files, 4751 bytes\n\nFiles: skill-card.md (1785b), SKILL.md (7749b), _meta.json (128b)\n\nFile v1.1.0:SKILL.md\n\n---\nname: kiaaccess\ndescription: This skill should be used when the user asks about their Kia vehicle through the Kia Access / Kia Owners account. Triggers on phrases like \"is the car locked\", \"unlock the Kia\", \"start the car's climate\", \"warm up the car\", \"where is my car\", \"what's the EV charge at\", \"check the car's battery\", \"lock the doors\", or any request to read or command a Kia vehicle.\n---\n\n# kiaaccess-mcp\n\nMCP server for the Kia Owners API used by the Kia Access app — vehicle status, location, EV charge state, and confirmation-gated door, climate, and charging commands, using the user's own Kia account.\n\n- **npm:** [npmjs.com/package/kiaaccess-mcp](https://www.npmjs.com/package/kiaaccess-mcp)\n- **Source:** [github.com/chrischall/kiaaccess-mcp](https://github.com/chrischall/kiaaccess-mcp)\n\n## Setup\n\nAdd to `.mcp.json` in your project or `~/.claude/mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"kiaaccess\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"kiaaccess-mcp\"],\n      \"env\": {\n        \"KIA_USERNAME\": \"you@example.com\",\n        \"KIA_PASSWORD\": \"your-password\",\n        \"KIA_WRITE_MODE\": \"comfort\"\n      }\n    }\n  }\n}\n```\n\n`KIA_WRITE_MODE` decides which command tools are registered at all: `none` (reads only), `comfort` (climate + charging, the default), `all` (also door lock/unlock). An unrecognised value fails closed to `none`.\n\n## First run — the one-time MFA bootstrap\n\nKia challenges each new device once. Start with `kia_session_status`; if it reports `hasSession: false`:\n\n1. `kia_start_login`, confirmed (see [Confirmations](#confirmations)) → returns `otpKey` + `xid` and the masked destinations Kia has on file.\n2. `kia_send_otp(otpKey, xid, notifyType)` — ask the user whether they can read `SMS` or `EMAIL` right now. The code expires in ~2 minutes.\n3. `kia_verify_otp(otpKey, xid, otp)` — same `otpKey`/`xid`, plus the code the user received.\n4. `kia_list_vehicles` to confirm, and to get the `vehicleKey` every other tool needs.\n\nThe remember-me token is then stored locally and refreshes sessions silently forever; MFA is never needed again on that machine. `kia_forget_session` (confirmation-gated) throws it away so the bootstrap can be repeated.\n\nA server with no one to read an OTP cannot run these steps at all. Bootstrap it elsewhere and pass the exported token as `KIA_RMTOKEN`, with `KIA_DEVICE_ID` set to the same uuid on both machines — the token is minted against a device uuid and is worthless with a different one. `KIA_RMTOKEN` wins over the local store.\n\n**If a login is rejected, STOP.** Kia counts failed logins and eventually enforces reCAPTCHA, which breaks server-side login for that account permanently. Tell the user to check the credentials in the Kia Access app and fix the environment — never retry with a guessed password.\n\n## Tools\n\n### Account\n| Tool | Notes |\n|------|-------|\n| `kia_session_status` | Configured? Bootstrapped? Which write mode? No network call, no secrets. Start here when a tool says it is not configured. |\n| `kia_start_login` / `kia_send_otp` / `kia_verify_otp` | The three bootstrap steps above. |\n| `kia_forget_session(confirmToken?)` | Deletes the locally stored session. Local only — Kia is not contacted. |\n| `kia_export_refresh_token(confirmToken?)` | Returns the `rmtoken` in plaintext — a full MFA bypass. Only for moving a locally-bootstrapped session into a deployment that cannot bootstrap itself, via `KIA_RMTOKEN`. Never call it to \"check the session\"; use `kia_session_status`. |\n\n### Reads\n| Tool | Notes |\n|------|-------|\n| `kia_list_vehicles` | Enrolled vehicles with `vehicleKey`, nickname, model, mileage. VINs masked to 6 chars. |\n| `kia_vehicle_status(vehicle_key, include_raw?)` | Cached status: `doorLock`, `ign3`, the nested `climate` block, and (with `include_raw`) battery/EV detail, doors, tyres. |\n| `kia_refresh_status(vehicle_key)` | Wakes the telematics unit. Slow, draws power, returns no data — re-read `kia_vehicle_status` after. |\n| `kia_vehicle_location(vehicle_key)` | Last reported position + map link. Not a live fix. |\n| `kia_charge_targets(vinKey)` | Target state of charge per plug type. |\n\n### Commands (all confirmation-gated, all take `confirmToken?`)\n| Tool | Mode | Notes |\n|------|------|-------|\n| `kia_start_climate(vinKey, temperature?, durationMinutes?, defrost?, waitSeconds?, confirmToken?)` | `comfort` | Verified live. Temperature is best-effort — do not promise the user an exact cabin temperature. |\n| `kia_stop_climate(vinKey, waitSeconds?, confirmToken?)` | `comfort` | Verified live. |\n| `kia_start_charge` / `kia_stop_charge` / `kia_set_charge_limits` | `comfort` | Verified against a plugged-in car. A success status means Kia accepted the command, not that the car acted — confirm charge start/stop via `kia_vehicle_status` (`evStatus.batteryCharge`), and limits via `kia_charge_targets`. `kia_set_charge_limits` REPLACES the target list, so send both plug types. Starting a charge on an unplugged car succeeds and does nothing. |\n| `kia_lock_doors(vinKey, waitSeconds?, confirmToken?)` | `all` | Verified live by re-reading `doorLock`. |\n| `kia_unlock_doors(vinKey, waitSeconds?, confirmToken?)` | `all` | Leaves the car unsecured. Only when the user explicitly asked for this vehicle. |\n\n## Confirmations\n\nEvery write — each command, plus `kia_start_login`, `kia_forget_session` and `kia_export_refresh_token` — asks the user first. A client that can show a confirmation prompt shows one and the tool proceeds on approval. Otherwise the first call does nothing and returns `status: \"confirmation-required\"` with a `preview` and a `confirmToken`; show the user the preview, get their approval in chat (under the default `MCP_CONFIRM_MODE=ask-user`), then call the SAME tool again with the SAME arguments plus `confirmToken`. The token works once (`TOKEN_REUSED` after that), expires after `MCP_CONFIRM_TTL_SECONDS` (default 600), and is bound to the exact request: changing anything that would be sent returns `DRAFT_CHANGED` with a fresh preview and token. Under `MCP_CONFIRM_MODE=refuse` such clients get `reason: \"confirmation-unsupported\"` and nothing is sent.\n\n## Reading a command result\n\n- **`status: \"confirmation-required\"` means nothing happened.** The tool made no network call and returned a `preview` of the exact request plus a `confirmToken`. Show the user that preview; never describe it as if the car acted.\n- **`commandAccepted` ≠ `stateConfirmed`.** Kia returning success only means the request was accepted. Only `stateConfirmed: true` means the car actually reads locked / unlocked / climate-on. Changes take 30–60 seconds; `waitSeconds` controls how long the tool keeps re-reading. It defaults to 30 so the call finishes inside a client's own request timeout; an unconfirmed result (or a client-side timeout) still means the command WAS sent — re-read the vehicle status, never re-send the command to \"retry\".\n- **`stateConfirmed: false` is not \"it failed\"** — it means the tool stopped waiting. Say exactly that, and offer to re-read `kia_vehicle_status`.\n- **On an EV, `engine` stays false with the climate running.** `ign3` is the ignition proxy. Never report the car as off because `engine` is false.\n- **`syncDate` advances on every read** and proves nothing changed.\n\n## Caution\n\n- **Confirm with the user before every command** — these move a real vehicle. Unlocking especially: it leaves the car open until someone locks it.\n- **Never guess a `vehicleKey`.** Call `kia_list_vehicles` first.\n- **Never retry a rejected login** (see above) and never echo the password, the `rmtoken`, or a session id into the conversation.\n- **A cached read can be stale.** If freshness matters, `kia_refresh_status`, wait, then re-read.\n\nFile v1.1.0:_meta.json\n\n{\n  \"ownerId\": \"kn700jq4sjtf2anb0rk3ft4p7n856872\",\n  \"slug\": \"kiaaccess\",\n  \"version\": \"1.1.0\",\n  \"publishedAt\": 1790262710024\n}\n\nFile v1.1.0:skill-card.md\n\n## Description:\n\nHelps Kia owners check vehicle status, location, and charge state and request confirmed vehicle commands through their Kia account.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[chrischall](https://clawhub.ai/user/chrischall)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nKia owners use this skill to ask an agent about their vehicle's status, location, and charging, or to approve climate, charging, and door commands.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Account credentials and persistent session tokens could expose vehicle access if shared.\n\nMitigation: Keep MCP configuration out of source control and shared folders, restrict file permissions, and forget the session when access should be removed.\n\nRisk: Vehicle location and enabled remote commands could expose sensitive information or alter the vehicle's state.\n\nMitigation: Use read-only mode until commands are needed, and obtain user confirmation before each enabled command.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/chrischall/skills/kiaaccess)\n- [kiaaccess-mcp npm package (linked in skill)](https://www.npmjs.com/package/kiaaccess-mcp)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Guidance]\n\n**Output Format:** [Markdown]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Reports vehicle information and command outcomes; requests user approval before actions.]\n\n## Skill Version(s):\n\n1.1.0 (source: ClawHub release)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.0.3: 3 files, 4649 bytes\n\nFiles: skill-card.md (2385b), SKILL.md (6751b), _meta.json (128b)\n\nFile v1.0.3:SKILL.md\n\n---\nname: kiaaccess\ndescription: This skill should be used when the user asks about their Kia vehicle through the Kia Access / Kia Owners account. Triggers on phrases like \"is the car locked\", \"unlock the Kia\", \"start the car's climate\", \"warm up the car\", \"where is my car\", \"what's the EV charge at\", \"check the car's battery\", \"lock the doors\", or any request to read or command a Kia vehicle.\n---\n\n# kiaaccess-mcp\n\nMCP server for the Kia Owners API used by the Kia Access app — vehicle status, location, EV charge state, and confirm-gated door, climate, and charging commands, using the user's own Kia account.\n\n- **npm:** [npmjs.com/package/kiaaccess-mcp](https://www.npmjs.com/package/kiaaccess-mcp)\n- **Source:** [github.com/chrischall/kiaaccess-mcp](https://github.com/chrischall/kiaaccess-mcp)\n\n## Setup\n\nAdd to `.mcp.json` in your project or `~/.claude/mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"kiaaccess\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"kiaaccess-mcp\"],\n      \"env\": {\n        \"KIA_USERNAME\": \"you@example.com\",\n        \"KIA_PASSWORD\": \"your-password\",\n        \"KIA_WRITE_MODE\": \"comfort\"\n      }\n    }\n  }\n}\n```\n\n`KIA_WRITE_MODE` decides which command tools are registered at all: `none` (reads only), `comfort` (climate + charging, the default), `all` (also door lock/unlock). An unrecognised value fails closed to `none`.\n\n## First run — the one-time MFA bootstrap\n\nKia challenges each new device once. Start with `kia_session_status`; if it reports `hasSession: false`:\n\n1. `kia_start_login` with `confirm: true` → returns `otpKey` + `xid` and the masked destinations Kia has on file.\n2. `kia_send_otp(otpKey, xid, notifyType)` — ask the user whether they can read `SMS` or `EMAIL` right now. The code expires in ~2 minutes.\n3. `kia_verify_otp(otpKey, xid, otp)` — same `otpKey`/`xid`, plus the code the user received.\n4. `kia_list_vehicles` to confirm, and to get the `vehicleKey` every other tool needs.\n\nThe remember-me token is then stored locally and refreshes sessions silently forever; MFA is never needed again on that machine. `kia_forget_session` (confirm-gated) throws it away so the bootstrap can be repeated.\n\nA server with no one to read an OTP cannot run these steps at all. Bootstrap it elsewhere and pass the exported token as `KIA_RMTOKEN`, with `KIA_DEVICE_ID` set to the same uuid on both machines — the token is minted against a device uuid and is worthless with a different one. `KIA_RMTOKEN` wins over the local store.\n\n**If a login is rejected, STOP.** Kia counts failed logins and eventually enforces reCAPTCHA, which breaks server-side login for that account permanently. Tell the user to check the credentials in the Kia Access app and fix the environment — never retry with a guessed password.\n\n## Tools\n\n### Account\n| Tool | Notes |\n|------|-------|\n| `kia_session_status` | Configured? Bootstrapped? Which write mode? No network call, no secrets. Start here when a tool says it is not configured. |\n| `kia_start_login` / `kia_send_otp` / `kia_verify_otp` | The three bootstrap steps above. |\n| `kia_forget_session(confirm)` | Deletes the locally stored session. Local only — Kia is not contacted. |\n| `kia_export_refresh_token(confirm)` | Returns the `rmtoken` in plaintext — a full MFA bypass. Only for moving a locally-bootstrapped session into a deployment that cannot bootstrap itself, via `KIA_RMTOKEN`. Never call it to \"check the session\"; use `kia_session_status`. |\n\n### Reads\n| Tool | Notes |\n|------|-------|\n| `kia_list_vehicles` | Enrolled vehicles with `vehicleKey`, nickname, model, mileage. VINs masked to 6 chars. |\n| `kia_vehicle_status(vehicle_key, include_raw?)` | Cached status: `doorLock`, `ign3`, the nested `climate` block, and (with `include_raw`) battery/EV detail, doors, tyres. |\n| `kia_refresh_status(vehicle_key)` | Wakes the telematics unit. Slow, draws power, returns no data — re-read `kia_vehicle_status` after. |\n| `kia_vehicle_location(vehicle_key)` | Last reported position + map link. Not a live fix. |\n| `kia_charge_targets(vinKey)` | Target state of charge per plug type. |\n\n### Commands (all take `confirm`)\n| Tool | Mode | Notes |\n|------|------|-------|\n| `kia_start_climate(vinKey, temperature?, durationMinutes?, defrost?, waitSeconds?, confirm)` | `comfort` | Verified live. Temperature is best-effort — do not promise the user an exact cabin temperature. |\n| `kia_stop_climate(vinKey, waitSeconds?, confirm)` | `comfort` | Verified live. |\n| `kia_start_charge` / `kia_stop_charge` / `kia_set_charge_limits` | `comfort` | Verified against a plugged-in car. A success status means Kia accepted the command, not that the car acted — confirm charge start/stop via `kia_vehicle_status` (`evStatus.batteryCharge`), and limits via `kia_charge_targets`. `kia_set_charge_limits` REPLACES the target list, so send both plug types. Starting a charge on an unplugged car succeeds and does nothing. |\n| `kia_lock_doors(vinKey, waitSeconds?, confirm)` | `all` | Verified live by re-reading `doorLock`. |\n| `kia_unlock_doors(vinKey, waitSeconds?, confirm)` | `all` | Leaves the car unsecured. Only when the user explicitly asked for this vehicle. |\n\n## Reading a command result\n\n- **Without `confirm: true` nothing happens.** The tool makes no network call and returns `dryRun: true` with the exact request it would send. Show the user that preview; never describe a dry run as if the car acted.\n- **`commandAccepted` ≠ `stateConfirmed`.** Kia returning success only means the request was accepted. Only `stateConfirmed: true` means the car actually reads locked / unlocked / climate-on. Changes take 30–60 seconds; `waitSeconds` controls how long the tool keeps re-reading. It defaults to 30 so the call finishes inside a client's own request timeout; an unconfirmed result (or a client-side timeout) still means the command WAS sent — re-read the vehicle status, never re-send the command to \"retry\".\n- **`stateConfirmed: false` is not \"it failed\"** — it means the tool stopped waiting. Say exactly that, and offer to re-read `kia_vehicle_status`.\n- **On an EV, `engine` stays false with the climate running.** `ign3` is the ignition proxy. Never report the car as off because `engine` is false.\n- **`syncDate` advances on every read** and proves nothing changed.\n\n## Caution\n\n- **Confirm with the user before every command** — these move a real vehicle. Unlocking especially: it leaves the car open until someone locks it.\n- **Never guess a `vehicleKey`.** Call `kia_list_vehicles` first.\n- **Never retry a rejected login** (see above) and never echo the password, the `rmtoken`, or a session id into the conversation.\n- **A cached read can be stale.** If freshness matters, `kia_refresh_status`, wait, then re-read.\n\nFile v1.0.3:_meta.json\n\n{\n  \"ownerId\": \"kn700jq4sjtf2anb0rk3ft4p7n856872\",\n  \"slug\": \"kiaaccess\",\n  \"version\": \"1.0.3\",\n  \"publishedAt\": 1790199552715\n}\n\nFile v1.0.3:skill-card.md\n\n## Description:\n\nThis skill should be used when the user asks about their Kia vehicle through the Kia Access / Kia Owners account.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[chrischall](https://clawhub.ai/user/chrischall)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nExternal users and agents use this skill to read Kia vehicle status, location, EV charge information, and to perform confirm-gated Kia Access commands such as climate, charging, lock, and unlock actions through the user's own Kia account.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The skill handles Kia account credentials, persistent session tokens, vehicle location data, and remote vehicle commands.\n\nMitigation: Install only in trusted environments, protect MCP configuration files and exported refresh tokens, and use read-only KIA_WRITE_MODE=none unless command tools are required.\n\nRisk: Door, climate, and charging commands can affect a real vehicle, and command acceptance does not always mean the vehicle state changed.\n\nMitigation: Require explicit user confirmation for every command, treat dry runs as previews only, and verify command results by re-reading vehicle status instead of retrying blindly.\n\nRisk: Rejected logins may trigger account protections that block server-side login.\n\nMitigation: Stop after a rejected login, ask the user to verify credentials in the Kia Access app, and avoid guessing or retrying passwords.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/chrischall/skills/kiaaccess)\n- [npm package](https://www.npmjs.com/package/kiaaccess-mcp)\n- [Source repository](https://github.com/chrischall/kiaaccess-mcp)\n\n## Skill Output:\n\n**Output Type(s):** [Guidance, Configuration, API Calls, Text]\n\n**Output Format:** [Markdown guidance and structured MCP tool results]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [May include vehicle status, location links, EV charge details, command previews, and command acceptance or confirmation state.]\n\n## Skill Version(s):\n\n1.0.3 (source: server release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.0.2: 3 files, 4441 bytes\n\nFiles: skill-card.md (2193b), SKILL.md (6521b), _meta.json (128b)\n\nFile v1.0.2:SKILL.md\n\n---\nname: kiaaccess\ndescription: This skill should be used when the user asks about their Kia vehicle through the Kia Access / Kia Owners account. Triggers on phrases like \"is the car locked\", \"unlock the Kia\", \"start the car's climate\", \"warm up the car\", \"where is my car\", \"what's the EV charge at\", \"check the car's battery\", \"lock the doors\", or any request to read or command a Kia vehicle.\n---\n\n# kiaaccess-mcp\n\nMCP server for the Kia Owners API used by the Kia Access app — vehicle status, location, EV charge state, and confirm-gated door, climate, and charging commands, using the user's own Kia account.\n\n- **npm:** [npmjs.com/package/kiaaccess-mcp](https://www.npmjs.com/package/kiaaccess-mcp)\n- **Source:** [github.com/chrischall/kiaaccess-mcp](https://github.com/chrischall/kiaaccess-mcp)\n\n## Setup\n\nAdd to `.mcp.json` in your project or `~/.claude/mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"kiaaccess\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"kiaaccess-mcp\"],\n      \"env\": {\n        \"KIA_USERNAME\": \"you@example.com\",\n        \"KIA_PASSWORD\": \"your-password\",\n        \"KIA_WRITE_MODE\": \"comfort\"\n      }\n    }\n  }\n}\n```\n\n`KIA_WRITE_MODE` decides which command tools are registered at all: `none` (reads only), `comfort` (climate + charging, the default), `all` (also door lock/unlock). An unrecognised value fails closed to `none`.\n\n## First run — the one-time MFA bootstrap\n\nKia challenges each new device once. Start with `kia_session_status`; if it reports `hasSession: false`:\n\n1. `kia_start_login` with `confirm: true` → returns `otpKey` + `xid` and the masked destinations Kia has on file.\n2. `kia_send_otp(otpKey, xid, notifyType)` — ask the user whether they can read `SMS` or `EMAIL` right now. The code expires in ~2 minutes.\n3. `kia_verify_otp(otpKey, xid, otp)` — same `otpKey`/`xid`, plus the code the user received.\n4. `kia_list_vehicles` to confirm, and to get the `vehicleKey` every other tool needs.\n\nThe remember-me token is then stored locally and refreshes sessions silently forever; MFA is never needed again on that machine. `kia_forget_session` (confirm-gated) throws it away so the bootstrap can be repeated.\n\nA server with no one to read an OTP cannot run these steps at all. Bootstrap it elsewhere and pass the exported token as `KIA_RMTOKEN`, with `KIA_DEVICE_ID` set to the same uuid on both machines — the token is minted against a device uuid and is worthless with a different one. `KIA_RMTOKEN` wins over the local store.\n\n**If a login is rejected, STOP.** Kia counts failed logins and eventually enforces reCAPTCHA, which breaks server-side login for that account permanently. Tell the user to check the credentials in the Kia Access app and fix the environment — never retry with a guessed password.\n\n## Tools\n\n### Account\n| Tool | Notes |\n|------|-------|\n| `kia_session_status` | Configured? Bootstrapped? Which write mode? No network call, no secrets. Start here when a tool says it is not configured. |\n| `kia_start_login` / `kia_send_otp` / `kia_verify_otp` | The three bootstrap steps above. |\n| `kia_forget_session(confirm)` | Deletes the locally stored session. Local only — Kia is not contacted. |\n| `kia_export_refresh_token(confirm)` | Returns the `rmtoken` in plaintext — a full MFA bypass. Only for moving a locally-bootstrapped session into a deployment that cannot bootstrap itself, via `KIA_RMTOKEN`. Never call it to \"check the session\"; use `kia_session_status`. |\n\n### Reads\n| Tool | Notes |\n|------|-------|\n| `kia_list_vehicles` | Enrolled vehicles with `vehicleKey`, nickname, model, mileage. VINs masked to 6 chars. |\n| `kia_vehicle_status(vehicle_key, include_raw?)` | Cached status: `doorLock`, `ign3`, the nested `climate` block, and (with `include_raw`) battery/EV detail, doors, tyres. |\n| `kia_refresh_status(vehicle_key)` | Wakes the telematics unit. Slow, draws power, returns no data — re-read `kia_vehicle_status` after. |\n| `kia_vehicle_location(vehicle_key)` | Last reported position + map link. Not a live fix. |\n| `kia_charge_targets(vinKey)` | Target state of charge per plug type. |\n\n### Commands (all take `confirm`)\n| Tool | Mode | Notes |\n|------|------|-------|\n| `kia_start_climate(vinKey, temperature?, durationMinutes?, defrost?, waitSeconds?, confirm)` | `comfort` | Verified live. Temperature is best-effort — do not promise the user an exact cabin temperature. |\n| `kia_stop_climate(vinKey, waitSeconds?, confirm)` | `comfort` | Verified live. |\n| `kia_start_charge` / `kia_stop_charge` / `kia_set_charge_limits` | `comfort` | Verified against a plugged-in car. A success status means Kia accepted the command, not that the car acted — confirm charge start/stop via `kia_vehicle_status` (`evStatus.batteryCharge`), and limits via `kia_charge_targets`. `kia_set_charge_limits` REPLACES the target list, so send both plug types. Starting a charge on an unplugged car succeeds and does nothing. |\n| `kia_lock_doors(vinKey, waitSeconds?, confirm)` | `all` | Verified live by re-reading `doorLock`. |\n| `kia_unlock_doors(vinKey, waitSeconds?, confirm)` | `all` | Leaves the car unsecured. Only when the user explicitly asked for this vehicle. |\n\n## Reading a command result\n\n- **Without `confirm: true` nothing happens.** The tool makes no network call and returns `dryRun: true` with the exact request it would send. Show the user that preview; never describe a dry run as if the car acted.\n- **`commandAccepted` ≠ `stateConfirmed`.** Kia returning success only means the request was accepted. Only `stateConfirmed: true` means the car actually reads locked / unlocked / climate-on. Changes take 30–60 seconds; `waitSeconds` controls how long the tool keeps re-reading.\n- **`stateConfirmed: false` is not \"it failed\"** — it means the tool stopped waiting. Say exactly that, and offer to re-read `kia_vehicle_status`.\n- **On an EV, `engine` stays false with the climate running.** `ign3` is the ignition proxy. Never report the car as off because `engine` is false.\n- **`syncDate` advances on every read** and proves nothing changed.\n\n## Caution\n\n- **Confirm with the user before every command** — these move a real vehicle. Unlocking especially: it leaves the car open until someone locks it.\n- **Never guess a `vehicleKey`.** Call `kia_list_vehicles` first.\n- **Never retry a rejected login** (see above) and never echo the password, the `rmtoken`, or a session id into the conversation.\n- **A cached read can be stale.** If freshness matters, `kia_refresh_status`, wait, then re-read.\n\nFile v1.0.2:_meta.json\n\n{\n  \"ownerId\": \"kn700jq4sjtf2anb0rk3ft4p7n856872\",\n  \"slug\": \"kiaaccess\",\n  \"version\": \"1.0.2\",\n  \"publishedAt\": 1790178189521\n}\n\nFile v1.0.2:skill-card.md\n\n## Description:\n\nThis skill helps an agent use a user's Kia Access / Kia Owners account to read Kia vehicle status, location, EV charge state, and confirm-gated vehicle commands.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[chrischall](https://clawhub.ai/user/chrischall)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nExternal users and agents use this skill to connect to a user's Kia Access account, check vehicle status, location, and EV charging information, and issue explicit confirm-gated commands such as climate, charging, or door lock actions.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Kia account credentials and exported refresh tokens can grant account or session access.\n\nMitigation: Protect any .mcp.json or ~/.claude/mcp.json containing Kia credentials, and avoid exporting or sharing refresh tokens except for deployments you control.\n\nRisk: Vehicle command tools can affect real-world vehicle state, especially door unlock, climate, and charging actions.\n\nMitigation: Use KIA_WRITE_MODE=none unless commands are needed, and require explicit user confirmation before running command tools.\n\nRisk: Cached vehicle status or location can be stale.\n\nMitigation: When freshness matters, refresh the vehicle status and re-read the relevant status or location before relying on it.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/chrischall/skills/kiaaccess)\n- [npm package](https://www.npmjs.com/package/kiaaccess-mcp)\n\n## Skill Output:\n\n**Output Type(s):** [Guidance, Configuration, Shell commands, API calls]\n\n**Output Format:** [Markdown with JSON configuration and tool-use guidance]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [May produce dry-run previews and vehicle status summaries; vehicle commands require explicit confirmation.]\n\n## Skill Version(s):\n\n1.0.2 (source: server release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.0.1: 3 files, 4748 bytes\n\nFiles: skill-card.md (2798b), SKILL.md (6521b), _meta.json (128b)\n\nFile v1.0.1:SKILL.md\n\n---\nname: kiaaccess\ndescription: This skill should be used when the user asks about their Kia vehicle through the Kia Access / Kia Owners account. Triggers on phrases like \"is the car locked\", \"unlock the Kia\", \"start the car's climate\", \"warm up the car\", \"where is my car\", \"what's the EV charge at\", \"check the car's battery\", \"lock the doors\", or any request to read or command a Kia vehicle.\n---\n\n# kiaaccess-mcp\n\nMCP server for the Kia Owners API used by the Kia Access app — vehicle status, location, EV charge state, and confirm-gated door, climate, and charging commands, using the user's own Kia account.\n\n- **npm:** [npmjs.com/package/kiaaccess-mcp](https://www.npmjs.com/package/kiaaccess-mcp)\n- **Source:** [github.com/chrischall/kiaaccess-mcp](https://github.com/chrischall/kiaaccess-mcp)\n\n## Setup\n\nAdd to `.mcp.json` in your project or `~/.claude/mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"kiaaccess\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"kiaaccess-mcp\"],\n      \"env\": {\n        \"KIA_USERNAME\": \"you@example.com\",\n        \"KIA_PASSWORD\": \"your-password\",\n        \"KIA_WRITE_MODE\": \"comfort\"\n      }\n    }\n  }\n}\n```\n\n`KIA_WRITE_MODE` decides which command tools are registered at all: `none` (reads only), `comfort` (climate + charging, the default), `all` (also door lock/unlock). An unrecognised value fails closed to `none`.\n\n## First run — the one-time MFA bootstrap\n\nKia challenges each new device once. Start with `kia_session_status`; if it reports `hasSession: false`:\n\n1. `kia_start_login` with `confirm: true` → returns `otpKey` + `xid` and the masked destinations Kia has on file.\n2. `kia_send_otp(otpKey, xid, notifyType)` — ask the user whether they can read `SMS` or `EMAIL` right now. The code expires in ~2 minutes.\n3. `kia_verify_otp(otpKey, xid, otp)` — same `otpKey`/`xid`, plus the code the user received.\n4. `kia_list_vehicles` to confirm, and to get the `vehicleKey` every other tool needs.\n\nThe remember-me token is then stored locally and refreshes sessions silently forever; MFA is never needed again on that machine. `kia_forget_session` (confirm-gated) throws it away so the bootstrap can be repeated.\n\nA server with no one to read an OTP cannot run these steps at all. Bootstrap it elsewhere and pass the exported token as `KIA_RMTOKEN`, with `KIA_DEVICE_ID` set to the same uuid on both machines — the token is minted against a device uuid and is worthless with a different one. `KIA_RMTOKEN` wins over the local store.\n\n**If a login is rejected, STOP.** Kia counts failed logins and eventually enforces reCAPTCHA, which breaks server-side login for that account permanently. Tell the user to check the credentials in the Kia Access app and fix the environment — never retry with a guessed password.\n\n## Tools\n\n### Account\n| Tool | Notes |\n|------|-------|\n| `kia_session_status` | Configured? Bootstrapped? Which write mode? No network call, no secrets. Start here when a tool says it is not configured. |\n| `kia_start_login` / `kia_send_otp` / `kia_verify_otp` | The three bootstrap steps above. |\n| `kia_forget_session(confirm)` | Deletes the locally stored session. Local only — Kia is not contacted. |\n| `kia_export_refresh_token(confirm)` | Returns the `rmtoken` in plaintext — a full MFA bypass. Only for moving a locally-bootstrapped session into a deployment that cannot bootstrap itself, via `KIA_RMTOKEN`. Never call it to \"check the session\"; use `kia_session_status`. |\n\n### Reads\n| Tool | Notes |\n|------|-------|\n| `kia_list_vehicles` | Enrolled vehicles with `vehicleKey`, nickname, model, mileage. VINs masked to 6 chars. |\n| `kia_vehicle_status(vehicle_key, include_raw?)` | Cached status: `doorLock`, `ign3`, the nested `climate` block, and (with `include_raw`) battery/EV detail, doors, tyres. |\n| `kia_refresh_status(vehicle_key)` | Wakes the telematics unit. Slow, draws power, returns no data — re-read `kia_vehicle_status` after. |\n| `kia_vehicle_location(vehicle_key)` | Last reported position + map link. Not a live fix. |\n| `kia_charge_targets(vinKey)` | Target state of charge per plug type. |\n\n### Commands (all take `confirm`)\n| Tool | Mode | Notes |\n|------|------|-------|\n| `kia_start_climate(vinKey, temperature?, durationMinutes?, defrost?, waitSeconds?, confirm)` | `comfort` | Verified live. Temperature is best-effort — do not promise the user an exact cabin temperature. |\n| `kia_stop_climate(vinKey, waitSeconds?, confirm)` | `comfort` | Verified live. |\n| `kia_start_charge` / `kia_stop_charge` / `kia_set_charge_limits` | `comfort` | Verified against a plugged-in car. A success status means Kia accepted the command, not that the car acted — confirm charge start/stop via `kia_vehicle_status` (`evStatus.batteryCharge`), and limits via `kia_charge_targets`. `kia_set_charge_limits` REPLACES the target list, so send both plug types. Starting a charge on an unplugged car succeeds and does nothing. |\n| `kia_lock_doors(vinKey, waitSeconds?, confirm)` | `all` | Verified live by re-reading `doorLock`. |\n| `kia_unlock_doors(vinKey, waitSeconds?, confirm)` | `all` | Leaves the car unsecured. Only when the user explicitly asked for this vehicle. |\n\n## Reading a command result\n\n- **Without `confirm: true` nothing happens.** The tool makes no network call and returns `dryRun: true` with the exact request it would send. Show the user that preview; never describe a dry run as if the car acted.\n- **`commandAccepted` ≠ `stateConfirmed`.** Kia returning success only means the request was accepted. Only `stateConfirmed: true` means the car actually reads locked / unlocked / climate-on. Changes take 30–60 seconds; `waitSeconds` controls how long the tool keeps re-reading.\n- **`stateConfirmed: false` is not \"it failed\"** — it means the tool stopped waiting. Say exactly that, and offer to re-read `kia_vehicle_status`.\n- **On an EV, `engine` stays false with the climate running.** `ign3` is the ignition proxy. Never report the car as off because `engine` is false.\n- **`syncDate` advances on every read** and proves nothing changed.\n\n## Caution\n\n- **Confirm with the user before every command** — these move a real vehicle. Unlocking especially: it leaves the car open until someone locks it.\n- **Never guess a `vehicleKey`.** Call `kia_list_vehicles` first.\n- **Never retry a rejected login** (see above) and never echo the password, the `rmtoken`, or a session id into the conversation.\n- **A cached read can be stale.** If freshness matters, `kia_refresh_status`, wait, then re-read.\n\nFile v1.0.1:_meta.json\n\n{\n  \"ownerId\": \"kn700jq4sjtf2anb0rk3ft4p7n856872\",\n  \"slug\": \"kiaaccess\",\n  \"version\": \"1.0.1\",\n  \"publishedAt\": 1789963974578\n}\n\nFile v1.0.1:skill-card.md\n\n## Description:\n\nkiaaccess helps agents use a user's Kia Access account to read vehicle status, location, EV charging information, and run confirm-gated vehicle commands through the Kia Owners API.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[chrischall](https://clawhub.ai/user/chrischall)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nExternal users and developers use this skill to let an agent answer questions about their Kia vehicle and perform carefully confirmed remote actions such as climate, charging, and lock commands through the user's own Kia account.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The MCP server needs Kia account credentials or a long-lived refresh token, which can expose vehicle account access if stored in shared or poorly protected configuration.\n\nMitigation: Protect MCP configuration and backups, avoid storing secrets in shared project files, prefer read-only KIA_WRITE_MODE=none unless commands are required, and use kia_forget_session when a machine should no longer be trusted.\n\nRisk: Remote commands can affect a real vehicle, including unlocking doors or changing climate and charging behavior.\n\nMitigation: Require explicit user confirmation for every command, keep write mode scoped to the needed capability, and verify resulting state with vehicle status when the command result is not confirmed.\n\nRisk: Vehicle status and location reads can be stale or sensitive.\n\nMitigation: Explain cached or last-reported data clearly, refresh and re-read when freshness matters, and avoid exposing location or account details unnecessarily.\n\nRisk: Repeated rejected login attempts can trigger Kia account protections that block server-side login.\n\nMitigation: Stop after a rejected login and ask the user to verify credentials in the Kia Access app instead of retrying guessed passwords.\n\n## Reference(s):\n\n- [ClawHub kiaaccess skill page](https://clawhub.ai/chrischall/skills/kiaaccess)\n- [chrischall publisher profile](https://clawhub.ai/user/chrischall)\n- [kiaaccess-mcp npm package](https://www.npmjs.com/package/kiaaccess-mcp)\n\n## Skill Output:\n\n**Output Type(s):** [text, configuration, shell commands, guidance]\n\n**Output Format:** [Markdown with inline JSON configuration and command guidance]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [May guide confirm-gated MCP reads or commands against the user's configured Kia account.]\n\n## Skill Version(s):\n\n1.0.1 (source: server release evidence)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.","readmeExcerpt":"Skill: kiaaccess Owner: chrischall Summary: This skill should be used when the user asks about their Kia vehicle through the Kia Access / Kia Owners account. Triggers on phrases like \"is the car locked\", \"unlock the Kia\", \"start the car's climate\", \"warm up the car\", \"where is my car\", \"what's the EV charge at\", \"check the car's battery\", \"lock the doors\", or any request to read or command a Kia vehicle. Tags: latest","codeSnippets":[],"executableExamples":[{"language":"json","snippet":"{\n  \"mcpServers\": {\n    \"kiaaccess\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"kiaaccess-mcp\"],\n      \"env\": {\n        \"KIA_USERNAME\": \"you@example.com\",\n        \"KIA_PASSWORD\": \"your-password\",\n        \"KIA_WRITE_MODE\": \"comfort\"\n      }\n    }\n  }\n}"},{"language":"json","snippet":"{\n  \"mcpServers\": {\n    \"kiaaccess\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"kiaaccess-mcp\"],\n      \"env\": {\n        \"KIA_USERNAME\": \"you@example.com\",\n        \"KIA_PASSWORD\": \"your-password\",\n        \"KIA_WRITE_MODE\": \"comfort\"\n      }\n    }\n  }\n}"},{"language":"json","snippet":"{\n  \"mcpServers\": {\n    \"kiaaccess\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"kiaaccess-mcp\"],\n      \"env\": {\n        \"KIA_USERNAME\": \"you@example.com\",\n        \"KIA_PASSWORD\": \"your-password\",\n        \"KIA_WRITE_MODE\": \"comfort\"\n      }\n    }\n  }\n}"},{"language":"json","snippet":"{\n  \"mcpServers\": {\n    \"kiaaccess\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"kiaaccess-mcp\"],\n      \"env\": {\n        \"KIA_USERNAME\": \"you@example.com\",\n        \"KIA_PASSWORD\": \"your-password\",\n        \"KIA_WRITE_MODE\": \"comfort\"\n      }\n    }\n  }\n}"},{"language":"json","snippet":"{\n  \"mcpServers\": {\n    \"kiaaccess\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"kiaaccess-mcp\"],\n      \"env\": {\n        \"KIA_USERNAME\": \"you@example.com\",\n        \"KIA_PASSWORD\": \"your-password\",\n        \"KIA_WRITE_MODE\": \"comfort\"\n      }\n    }\n  }\n}"},{"language":"json","snippet":"{\n  \"mcpServers\": {\n    \"kiaaccess\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"kiaaccess-mcp\"],\n      \"env\": {\n        \"KIA_USERNAME\": \"you@example.com\",\n        \"KIA_PASSWORD\": \"your-password\",\n        \"KIA_WRITE_MODE\": \"comfort\"\n      }\n    }\n  }\n}"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: kiaaccess\ndescription: This skill should be used when the user asks about their Kia vehicle through the Kia Access / Kia Owners account. Triggers on phrases like \"is the car locked\", \"unlock the Kia\", \"start the car's climate\", \"warm up the car\", \"where is my car\", \"what's the EV charge at\", \"check the car's battery\", \"lock the doors\", or any request to read or command a Kia vehicle.\n---\n\n# kiaaccess-mcp\n\nMCP server for the Kia Owners API used by the Kia Access app — vehicle status, location, EV charge state, and confirmation-gated door, climate, and charging commands, using the user's own Kia account.\n\n- **npm:** [npmjs.com/package/kiaaccess-mcp](https://www.npmjs.com/package/kiaaccess-mcp)\n- **Source:** [github.com/chrischall/kiaaccess-mcp](https://github.com/chrischall/kiaaccess-mcp)\n\n## Setup\n\nAdd to `.mcp.json` in your project or `~/.claude/mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"kiaaccess\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"kiaaccess-mcp\"],\n      \"env\": {\n        \"KIA_USERNAME\": \"you@example.com\",\n        \"KIA_PASSWORD\": \"your-password\",\n        \"KIA_WRITE_MODE\": \"comfort\"\n      }\n    }\n  }\n}\n```\n\n`KIA_WRITE_MODE` decides which command tools are registered at all: `none` (reads only), `comfort` (climate + charging, the default), `all` (also door lock/unlock). An unrecognised value fails closed to `none`.\n\n## First run — the one-time MFA bootstrap\n\nKia challenges each new device once. Start with `kia_session_status`; if it reports `hasSession: false`:\n\n1. `kia_start_login`, confirmed (see [Confirmations](#confirmations)) → returns `otpKey` + `xid` and the masked destinations Kia has on file.\n2. `kia_send_otp(otpKey, xid, notifyType)` — ask the user whether they can read `SMS` or `EMAIL` right now. The code expires in ~2 minutes.\n3. `kia_verify_otp(otpKey, xid, otp)` — same `otpKey`/`xid`, plus the code the user received.\n4. `kia_list_vehicles` to confirm, and to get the `vehicleKey` every other tool needs.\n\nThe remember-me token is then stored locally and refreshes sessions silently forever; MFA is never needed again on that machine. `kia_forget_session` (confirmation-gated) throws it away so the bootstrap can be repeated.\n\nA server with no one to read an OTP cannot run these steps at all. Bootstrap it elsewhere and have the user copy the `rmtoken` from that machine's `~/.kiaaccess-mcp/session.json` into `KIA_RMTOKEN` themselves (no tool returns it, and it must never pass through the conversation), with `KIA_DEVICE_ID` set to the same uuid on both machines — the token is minted against a device uuid and is worthless with a different one. `KIA_RMTOKEN` wins over the local store.\n\n**If a login is rejected, STOP.** Kia counts failed logins and eventually enforces reCAPTCHA, which breaks server-side login for that account permanently. Tell the user to check the credentials in the Kia Access app and fix the environment — never retry with a guessed password.\n\n## Tools\n\n### Account\n| Tool | Notes |\n|------|-------|\n| `k"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn700jq4sjtf2anb0rk3ft4p7n856872\",\n  \"slug\": \"kiaaccess\",\n  \"version\": \"2.0.0\",\n  \"publishedAt\": 1791588253194\n}"},{"path":"skill-card.md","content":"## Description:\n\nHelps users check Kia vehicle status, location, and charging and request confirmation-gated vehicle commands through their Kia Access account.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[chrischall](https://clawhub.ai/user/chrischall)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nKia owners use this skill to ask an agent about their vehicle's status, location, and EV charging, and to approve climate, charging, or door commands for a selected vehicle.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Vehicle location and Kia account data are sensitive.\n\nMitigation: Install only when comfortable granting access; keep passwords, remember-me tokens, and session files out of chat and shared logs.\n\nRisk: Vehicle commands can change climate, charging, or door lock state; unlocking leaves the vehicle unsecured.\n\nMitigation: Use read-only mode unless writes are needed, restrict write permissions to the required actions, and confirm the selected vehicle and user approval before each command.\n\nRisk: An accepted command or cached status may not reflect the vehicle's current state.\n\nMitigation: Re-read vehicle status to verify changes; do not resend a command merely because confirmation times out.\n\n## Reference(s):\n\n- [kiaaccess on ClawHub](https://clawhub.ai/chrischall/skills/kiaaccess)\n- [kiaaccess-mcp npm package](https://www.npmjs.com/package/kiaaccess-mcp)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Guidance, Configuration instructions]\n\n**Output Format:** [Markdown and structured vehicle tool responses]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Vehicle commands require user confirmation; reported command acceptance does not necessarily confirm the vehicle changed state.]\n\n## Skill Version(s):\n\n2.0.0 (source: ClawHub release evidence)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment."}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":"This skill should be used when the user asks about their Kia vehicle through the Kia Access / Kia Owners account. Triggers on phrases like \"is the car locked\", \"unlock the Kia\", \"start the car's climate\", \"warm up the car\", \"where is my car\", \"what's the EV charge at\", \"check the car's battery\", \"lock the doors\", or any request to read or command a Kia vehicle. Skill: kiaaccess Owner: chrischall Summary: This skill should be used when the user asks about their Kia vehicle through the Kia Access / Kia Owners account. Triggers on phrases like \"is the car locked\", \"unlock the Kia\", \"start the car's climate\", \"warm up the car\", \"where is my car\", \"what's the EV charge at\", \"check the car's battery\", \"lock the doors\", or any request to read or command a Kia vehicle. Tags: latest","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":1372,"uniquenessScore":45,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-10T01:57:59.101Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-10T01:57:59.101Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-10T07:40:48.007Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}