Skip to main content
Glama
Kuksa MCP Server

Kuksa MCP Server

by mikehaller

Kuksa MCP Server

License Python

A Model Context Protocol (MCP) server that connects LLMs to vehicle data via the Eclipse Kuksa Databroker. Enables AI assistants to read and write vehicle signals using the standardized COVESA Vehicle Signal Specification (VSS).

Features

  • Read signals — Get current or target values of any VSS signal

  • Batch reads — Fetch multiple signals in a single call

  • Write actuators — Set actuator targets or publish sensor readings

  • Browse the VSS tree — List or count signals under any branch, with substring filtering

  • Inspect types — Query data types for any signal path

  • Server introspection — Name, version, signal count at startup

  • Per-request logging — Every tool call logged with params, timing, and result summary

  • Dual transport — stdio (default) and SSE (HTTP)

  • OpenCode ready — Pre-configured opencode.jsonc for local and remote variants

Related MCP server: MCP Server Sample

Quick Start

1. Start a Kuksa Databroker

docker run -d --rm -p 55555:55555 --name kuksa-databroker \
  ghcr.io/eclipse-kuksa/kuksa-databroker:main --insecure

2. Install & Run

pip install kuksa-mcp-server
kuksa-mcp

Or from source:

git clone https://github.com/mikehaller/kuksa-mcp-server.git
cd kuksa-mcp-server
pip install -e ".[dev]"
kuksa-mcp

3. Configure your MCP client

{
  "mcpServers": {
    "kuksa": {
      "command": "kuksa-mcp"
    }
  }
}
{
  "mcpServers": {
    "kuksa-local": {
      "type": "local",
      "command": ["kuksa-mcp", "--log-file", "./kuksa-mcp.log"],
      "enabled": true,
      "timeout": 10000
    }
  }
}
{
  "mcpServers": {
    "kuksa-remote": {
      "type": "remote",
      "url": "http://127.0.0.1:8765/sse",
      "enabled": false,
      "timeout": 10000
    }
  }
}

OpenCode MCP Server Variants

The project ships with two entries in opencode.jsonc:

Variant

Transport

Default

Use case

kuksa-local

stdio (subprocess)

enabled

Local dev, single-user, auto-managed

kuksa-remote

SSE (HTTP)

disabled

Multi-user, containerized, remote databroker

Start the remote variant manually:

kuksa-mcp --transport sse --host 0.0.0.0 --port 8765

CLI Reference

kuksa-mcp [options]

Options:
  --transport <stdio|sse>   Transport protocol (default: stdio)
  --host <ip>               Bind address for SSE (default: 127.0.0.1)
  --port <port>             Port for SSE (default: 8765)
  --kuksa-host <host>       Databroker host (overrides KUKSA_HOST env)
  --kuksa-port <port>       Databroker port (overrides KUKSA_PORT env)
  --log-file <path>         File path for request logging (also written to stderr)

Environment Variables

Variable

Default

Description

KUKSA_HOST

127.0.0.1

Kuksa Databroker host

KUKSA_PORT

55555

Kuksa Databroker gRPC port

KUKSA_TOKEN

(none)

JWT token for authorization

Tools

Tool

API

Description

get_signal(path)

Kuksa V2

Get current value of one VSS signal

get_signals(paths)

Kuksa V2

Get current values of multiple signals

set_signal(path, value, datatype)

Kuksa V2

Set an actuator target value

publish_value(path, value, datatype)

Kuksa V2

Publish a sensor reading (provider role)

list_signals(branch, query)

V1 (deprecated)

List signals and metadata under a branch

count_signals(branch, query)

V1 (deprecated)

Count signals matching a filter

get_target_values(paths)

V1 (deprecated)

Read actuator target/desired values

get_value_types(paths)

V1 (deprecated)

Get data types for one or more signals

server_info()

V1 (deprecated)

Get databroker name, version, address

Resources

URI

Description

kuksa://info

Server and tool reference

kuksa://signals/{path}

Signal info (redirects to tool)

kuksa://branches/{path}

Branch listing (redirects to tool)

Startup Output

On startup the server prints a banner with version, databroker info, and catalog stats:

======================================================
  Kuksa Databroker MCP Server
  Version : 0.1.0
  Built   : 2026-06-24
======================================================
  Backend : databroker
  Address : 127.0.0.1:55555
  Version : 0.7.0-dev.0
  Status  : connected
  Signals : 1263 total
  Types   : ACTUATOR=643, ATTRIBUTE=130, SENSOR=490
======================================================

Every tool call is logged:

09:45:12 [INFO] Processing request of type ListToolsRequest
09:45:12 [INFO] Processing request of type CallToolRequest
09:45:12 [INFO] get_signal(args={'path': 'Vehicle.Speed'}) -> ok [0.023s]
09:45:15 [INFO] list_signals(args={'branch': 'Vehicle.Cabin', 'query': ''}) -> 490 results [0.045s]

Development

pip install -e ".[dev]"
pytest
kuksa-mcp --transport sse
python examples/local_test.py

Docker

The server is published as a Docker image on GitHub Container Registry:

docker pull ghcr.io/mikehaller/kuksa-mcp-server:latest

# Run with SSE transport
docker run --rm -p 8765:8765 \
  -e KUKSA_HOST=host.docker.internal \
  ghcr.io/mikehaller/kuksa-mcp-server:latest \
  --transport sse --host 0.0.0.0 --port 8765

The image uses a non-root kuksa user and is built from python:3.12-slim (~200 MB).

License

Apache 2.0 — see LICENSE.

Available Tools

9 tools
count_signalsA

[Kuksa V1 / sdv.databroker.v1 API — DEPRECATED] Count signals under a VSS branch.

Same search parameters as list_signals, but returns only the count. Useful for quickly checking how many signals exist without fetching details.

Note: This tool internally uses the deprecated sdv.databroker.v1.ListMetadata RPC.

Args: branch: VSS branch path (e.g. 'Vehicle', 'Vehicle.Cabin', 'Vehicle.Powertrain'). query: Optional substring to filter signal paths (e.g. 'Speed', 'Door', 'Temperature').

Inputs: query, branch. Returns: result

get_signalA

[Kuksa V2 API] Get the current value of a single VSS vehicle signal.

Args: path: VSS signal path (e.g. 'Vehicle.Speed', 'Vehicle.Cabin.Door.Row1.Left.IsOpen').

Inputs: path (required). Returns: result

get_signalsA

[Kuksa V2 API] Get current values of multiple VSS vehicle signals at once.

Args: paths: List of VSS signal paths (e.g. ['Vehicle.Speed', 'Vehicle.Cabin.Door.Row1.Left.IsOpen']).

Inputs: paths (required). Returns: result

get_target_valuesA

[Kuksa V1 / sdv.databroker.v1 API — DEPRECATED] Get the target (desired) values of actuator signals.

The target value is the value the actuator should assume, as opposed to the current (sensed) value returned by get_signal.

Note: This tool internally uses the deprecated sdv.databroker.v1 VAL.Get RPC with View.TARGET_VALUE. For reading actuation targets, prefer the Kuksa V2 Actuate flow (set_signal/get_signal) when possible.

Args: paths: List of VSS signal paths (e.g. ['Vehicle.Body.Windshield.Front.Wiping.System.TargetPosition']).

Inputs: paths (required). Returns: result

get_value_typesA

[Kuksa V1 / sdv.databroker.v1 API — DEPRECATED] Get the data types of one or more VSS signals.

Useful for determining how to interpret or set a signal value.

Note: This tool internally uses the deprecated sdv.databroker.v1 VAL.Get RPC. Data type information is also available in the metadata returned by list_signals.

Args: paths: List of VSS signal paths (e.g. ['Vehicle.Speed', 'Vehicle.Cabin.Door.Row1.Left.IsOpen']).

Inputs: paths (required). Returns: result

list_signalsA

[Kuksa V1 / sdv.databroker.v1 API — DEPRECATED] List signals and their metadata under a given VSS branch.

Use 'branch' to scope the search (e.g. 'Vehicle.Cabin' returns only cabin signals). Use 'query' to filter results by substring match on the signal path (case-insensitive). Leave both empty or use 'Vehicle' for the full tree.

Note: This tool internally uses the deprecated sdv.databroker.v1.ListMetadata RPC. Prefer browsing signals via get_signal / get_signals with known paths when possible.

Args: branch: VSS branch path (e.g. 'Vehicle', 'Vehicle.Cabin', 'Vehicle.Powertrain'). query: Optional substring to filter signal paths (e.g. 'Speed', 'Door', 'Temperature').

Inputs: query, branch. Returns: result

publish_valueA

[Kuksa V2 API] Publish a current value for a signal (provider role).

Unlike set_signal which sets the target for an actuator, publish_value directly sets the current value as reported by a sensor or provider. Use this when you are acting as a data provider feeding sensor readings into the databroker.

Args: path: VSS signal path (e.g. 'Vehicle.Speed'). value: The current value to publish. datatype: The data type ('string', 'bool', 'int32', 'int64', 'uint32', 'uint64', 'float', 'double').

Inputs: path (required), value (required), datatype. Returns: result

server_infoA

[Kuksa V1 / sdv.databroker.v1 API — DEPRECATED] Get information about the connected Kuksa Databroker server.

Note: This tool internally uses the deprecated sdv.databroker.v1 GetServerInfo RPC.

Inputs: no named parameters. Returns: result

set_signalA

[Kuksa V2 API] Set the target value of an actuator or attribute signal.

Internally prefers the kuksa.val.v2 Actuate path; falls back to sdv.databroker.v1 if unavailable.

Args: path: VSS signal path (e.g. 'Vehicle.Body.Windshield.Front.Wiping.System.TargetPosition'). value: The value to set (as a string representation). datatype: The data type of the value ('string', 'bool', 'int32', 'int64', 'uint32', 'uint64', 'float', 'double').

Inputs: path (required), value (required), datatype. Returns: result

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A4.2/5.0

    Scored across 9 tools

    Disambiguation4/5

    Most tools target distinct operations, but get_signal and get_signals are essentially the same action with singular/plural variance, and get_target_values versus get_signal requires careful reading to distinguish target from current values. The deprecated V1 tools also add some overlap with V2 tools, though descriptions mostly clarify the differences.

    Naming Consistency4/5

    The set mostly follows a clear verb_noun pattern with snake_case (get_signals, set_signal, list_signals, publish_value). Minor inconsistencies exist: server_info is a noun-only name, and get_signal vs get_signals uses inconsistent singular/plural forms.

    Tool Count5/5

    Nine tools is a well-scoped size for a vehicle signal databroker MCP server. The deprecated V1 helpers add some redundancy, but each still serves a different purpose (listing, counting, target values, types, server info) without bloating the surface.

    Completeness4/5

    The core signal lifecycle is covered: reading current values, setting actuator targets, publishing sensor values, listing/counting signals, and fetching data types. Missing subscription/streaming capabilities and V2-native metadata listing are minor gaps but not blocking for basic read/write workflows.

    Maintenance

    ActivityInactive
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      Not graded
      quality
      D
      maintenance
      A high-performance Model Context Protocol (MCP) server designed for large language models, enabling real-time communication between AI models and applications with support for session management and intelligent tool registration.
      2
      MIT
    • F
      license
      Not graded
      quality
      D
      maintenance
      A Model Context Protocol server that bridges MCP clients with local LLM services, enabling seamless integration with MCP-compatible applications through standard tools like chat completion, model listing, and health checks.
      -