Skip to main content
Pre-release

This release is a pre-release and may not be stable for production use.

licli

licli is a CLI for Li Auto (LiXiang) vehicle APIs. It covers auth, real-time status, travel history, control commands, an HTTP API server, and an MCP server.

Run it without installing anything (PyPI via uvx, or npm via npx):

alias licli='uvx liauto'
licli help

# or

alias licli='npx -y @liauto/cli'
licli version

Commands

licli activate          # activate the current device (first activation or re-activation)
licli login             # device login, prints an OAuth URL, then persists the pasted token JSON
licli vehicles          # list cached vehicles
licli status <VIN>      # query vehicle state (--json/--raw)
licli travel <VIN> [YYYY-MM]   # monthly travel history; with YYYY-MM, that month's detail
licli control <VIN> <action>   # lock/unlock/find/wake + ac <on|off|auto|temp|fast-cool|fast-heat> + seat-vent/seat-heat [pos] <1-3|off> + wheel-heat <on|off> + window [pos] <0-99> + trunk <open|close> (action: result <id>)
licli version           # print version
licli serve             # HTTP API server (default 127.0.0.1:18001; --addr/--token/--allow-control)
licli mcp               # MCP server, stdio (default) or --transport http (default 127.0.0.1:18002)

Run licli with no arguments (or licli <unknown>) to print the command list.

Global flags: --json (JSON output), -v / --verbose (verbose logging to stderr).

Exit codes: 0 success, 1 user input error, 2 network failure, 3 HTTP non-200, 4 activation failure, 5 config permission/corrupt, 6 missing/invalid/expired activation code, or code bound to a VIN not in this account.

Activation code

Running licli requires a valid activation code, set as an environment variable:

export LICLI_CODE=<activation code>
licli activate    # activate the device (onboarding; also done automatically by login)
licli login       # establish the account (auto-activates a device if needed)
licli vehicles    # list vehicles (also tells you your VIN)

activate, login, vehicles, version, and help work without a code. Every other command requires one.

A code is issued by the tool's publisher (offline license-keygen --vin <VIN>) and is bound to a VIN: it is admitted only when that VIN appears in the vehicle list of the account you are logged in to. It is an Ed25519-signed token: the binary only verifies it with the built-in public key and cannot forge codes. A missing/invalid/expired code, or a code bound to a VIN not in this account, exits with code 6.

A code may also carry an optional tier (license-keygen --vin <VIN> --tier air|pro), recorded for reference only. The tier is not enforced: it changes nothing about which commands run, and a code without one is valid.

HTTP API server (serve)

licli serve runs a foreground HTTP server (default 127.0.0.1:18001, override with --addr). Bind to a loopback address, set --token, or pass --allow-control to enable the control endpoints.

Endpoints:

Method Path Description
GET /healthz Liveness probe (unauthenticated)
GET /vehicles List vehicles; query limit (default 20), offset, refresh=true
GET /vehicles/{vin}/status Vehicle state (state, platform, fetched_at, location when available)
GET /vehicles/{vin}/travel Travel month history (months)
GET /vehicles/{vin}/travel/{ym} One month's detail; {ym} is YYYY-MM
POST /vehicles/{vin}/control Send a control command
GET /vehicles/{vin}/control/{requestId} Query a prior command's result

All endpoints except /healthz require Authorization: Bearer <token> when a token is configured. The two control endpoints return 403 control_disabled unless the control gate is open (loopback bind, a configured token, or --allow-control).

POST /control body (strict JSON, unknown fields rejected):

{ "action": "lock", "temp": 22.5, "pos": "fl", "level": 2, "open": true }

action is one of lock, unlock, find, wake, ac_on, ac_off, ac_auto, ac_temp, ac_fast_cool, ac_fast_heat, seat_vent, seat_heat, wheel_heat, window, trunk. The other fields are per-action; unset fields take the action's default:

Field Applies to Values
temp ac_temp number, 16–32
pos seat_vent fl | fr
pos seat_heat fl | fr | rl | rr
pos window fl | fr | rl | rr | all
level seat_vent, seat_heat int, 0–3 (0 = off)
level window int, 0–99
open trunk bool

pos is only valid for seat_vent/seat_heat/window; any other action rejects it. Errors use a unified envelope {"ok": false, "error": {"code", "message", "retryable"}}.

MCP server (mcp)

licli mcp serves the Model Context Protocol over stdio (default) or Streamable HTTP (--transport http, default 127.0.0.1:18002). It exposes six tools: vehicles, status, travel_months, travel_month, control, control_result. The two control* tools are enabled by default under stdio; under --transport http they require --allow-control or --token.

Register it with Claude Code (no install needed):

claude mcp add licli -- uvx liauto mcp

Configuration

Credentials are stored under the XDG config directory (~/.config/licli by default, or $XDG_CONFIG_HOME/licli) with 0700 directory and 0600 file permissions:

  • device.json — activated device + key suite
  • auth.json — API token, ID token, refresh token, expiry

Docker Compose deployment

Run the HTTP API server (serve) and MCP server (mcp) in containers sharing the host config:

services:
  licli-api: &licli
    build:
      dockerfile_inline: |
        FROM ghcr.io/astral-sh/uv:python3.13-alpine
        RUN uv tool install liauto
        RUN ln -sf /usr/local/bin/liauto /bin/licli
        ENV PATH="/root/.local/bin:$${PATH}"
        ENV XDG_CONFIG_HOME=/config
        ENV LICLI_SERVE_ADDR=0.0.0.0:18001
        ENV LICLI_MCP_ADDR=0.0.0.0:18002
        ENV LICLI_MCP_TRANSPORT=http
        ENTRYPOINT ["liauto"]
    command: ["serve", "--allow-control"]
    ports:
      - "18001:18001"
    environment:
      LICLI_CODE: ${LICLI_CODE:-}
      LICLI_SERVE_TOKEN: ${LICLI_SERVE_TOKEN:-}
    volumes:
      - ${LICLI_CONFIG_DIR:-~/.config/licli}:/config/licli
    restart: unless-stopped

  licli-mcp:
    <<: *licli
    command: ["mcp", "--allow-control"]
    ports:
      - "18002:18002"

licli-api shares its build, env, volume and restart policy with licli-mcp via the &licli anchor. Both read the same host credentials (auth.json / device.json under ~/.config/licli, or $LICLI_CONFIG_DIR). The containers bind non-loopback addresses, so --allow-control enables the control endpoints and LICLI_SERVE_TOKEN gates them behind a bearer token.

Log in once before starting the stack — the interactive login writes auth.json / device.json into the mounted config volume, and both services pick them up:

docker compose run --rm -it licli-api login

Metadata

Release files for liauto 0.1.1b0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Built distributions (wheels)

Table of built distributions (wheels) for liauto 0.1.1b0
File Actions
liauto-0.1.1b0-py3-none-win_amd64.whl Python 3 none Windows x86-64 Details for liauto-0.1.1b0-py3-none-win_amd64.whl
liauto-0.1.1b0-py3-none-musllinux_1_2_x86_64.whl Python 3 none Linux musl 1.2+ x86-64 Details for liauto-0.1.1b0-py3-none-musllinux_1_2_x86_64.whl
liauto-0.1.1b0-py3-none-musllinux_1_2_aarch64.whl Python 3 none Linux musl 1.2+ ARM64 Details for liauto-0.1.1b0-py3-none-musllinux_1_2_aarch64.whl
liauto-0.1.1b0-py3-none-manylinux_2_17_x86_64.whl Python 3 none Linux glibc 2.17+ x86-64 Details for liauto-0.1.1b0-py3-none-manylinux_2_17_x86_64.whl
liauto-0.1.1b0-py3-none-manylinux_2_17_aarch64.whl Python 3 none Linux glibc 2.17+ ARM64 Details for liauto-0.1.1b0-py3-none-manylinux_2_17_aarch64.whl
liauto-0.1.1b0-py3-none-macosx_11_0_arm64.whl Python 3 none macOS 11.0+ ARM64 Details for liauto-0.1.1b0-py3-none-macosx_11_0_arm64.whl
liauto-0.1.1b0-py3-none-macosx_10_9_x86_64.whl Python 3 none macOS 10.9+ x86-64 Details for liauto-0.1.1b0-py3-none-macosx_10_9_x86_64.whl

Total release size: 48.0 MB

Release files / liauto-0.1.1b0-py3-none-win_amd64.whl

Download URL liauto-0.1.1b0-py3-none-win_amd64.whl
Size 7.7 MB
Tags Python 3 Windows x86-64
SHA-256 checksum
How to use checksums
76a45b6ba6069684b28a1e8ab714ede5c3a2a35305d40ab45f1feeb027dde99f
BLAKE2b-256 checksum
How to use checksums
799ef5c7f75bb3a4afbccba8db34d4a0d1b2bc75fb8e43aee4674ecb17c4ca74
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.13.5

Release files / liauto-0.1.1b0-py3-none-musllinux_1_2_x86_64.whl

Download URL liauto-0.1.1b0-py3-none-musllinux_1_2_x86_64.whl
Size 7.0 MB
Tags Linux musl 1.2+ x86-64 Python 3
SHA-256 checksum
How to use checksums
6e2033c2b6fe2bdad65ef27bffb6c47061cb2b1054e919ecb7cd90e2e2431511
BLAKE2b-256 checksum
How to use checksums
f63451b5f8cee4128e355b432da8f94e2dfc24eb6f8aeee7b1fcae299063478e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.13.5

Release files / liauto-0.1.1b0-py3-none-musllinux_1_2_aarch64.whl

Download URL liauto-0.1.1b0-py3-none-musllinux_1_2_aarch64.whl
Size 6.4 MB
Tags Linux musl 1.2+ ARM64 Python 3
SHA-256 checksum
How to use checksums
dae71642e88753a271ff0fcc5936e38a1bf4ae4d8dee1493eaa7664c41d35c0f
BLAKE2b-256 checksum
How to use checksums
c9136df53c81477e90e521c895f0904f7ae3835efbdf892d1513b7f32d30a724
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.13.5

Release files / liauto-0.1.1b0-py3-none-manylinux_2_17_x86_64.whl

Download URL liauto-0.1.1b0-py3-none-manylinux_2_17_x86_64.whl
Size 7.0 MB
Tags Linux glibc 2.17+ x86-64 Python 3
SHA-256 checksum
How to use checksums
3271ec955aca75a6eeec2c7bef674906a7955f4c92fc825be84a5069667d72ed
BLAKE2b-256 checksum
How to use checksums
104bdc94e63dd03c86781e4e524bf4fddc4cdfd18a3ebf3fa48a7de960d9d76d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.13.5

Release files / liauto-0.1.1b0-py3-none-manylinux_2_17_aarch64.whl

Download URL liauto-0.1.1b0-py3-none-manylinux_2_17_aarch64.whl
Size 6.4 MB
Tags Linux glibc 2.17+ ARM64 Python 3
SHA-256 checksum
How to use checksums
00a390c8fe47a914c660bc215a5897b42d2dc72e62c0f3930c4326268fe63fe5
BLAKE2b-256 checksum
How to use checksums
b046110073b6a1aaa4a1c549bd63414a064270a78a20cdb25ec57a7b8cbaaf50
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.13.5

Release files / liauto-0.1.1b0-py3-none-macosx_11_0_arm64.whl

Download URL liauto-0.1.1b0-py3-none-macosx_11_0_arm64.whl
Size 6.6 MB
Tags Python 3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
5f56e1186545d0357263e1fb011a156ac06d304508ef934c2cad66ef083ed0e2
BLAKE2b-256 checksum
How to use checksums
97fcb4edab9fd77c60d5ec2bc18ee2c45e9dba7225d7c83fa648e7b530e17a20
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.13.5

Release files / liauto-0.1.1b0-py3-none-macosx_10_9_x86_64.whl

Download URL liauto-0.1.1b0-py3-none-macosx_10_9_x86_64.whl
Size 7.1 MB
Tags Python 3 macOS 10.9+ x86-64
SHA-256 checksum
How to use checksums
ef3455be9d140d9c100b872f1cc28d0246e86989cc79ece69a9f287a943bb261
BLAKE2b-256 checksum
How to use checksums
d1ac56c6a31f6af5697e86e7fb298f641186990d12c81b689f45ab78c1258feb
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.13.5

Security for liauto 0.1.1b0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page