Kuksa MCP Server
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Kuksa MCP Server What is the current vehicle speed?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Kuksa MCP Server
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.jsoncfor 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 --insecure2. Install & Run
pip install kuksa-mcp-server
kuksa-mcpOr from source:
git clone https://github.com/mikehaller/kuksa-mcp-server.git
cd kuksa-mcp-server
pip install -e ".[dev]"
kuksa-mcp3. 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 |
| stdio (subprocess) | enabled | Local dev, single-user, auto-managed |
| SSE (HTTP) | disabled | Multi-user, containerized, remote databroker |
Start the remote variant manually:
kuksa-mcp --transport sse --host 0.0.0.0 --port 8765CLI 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 Databroker host |
|
| Kuksa Databroker gRPC port |
| (none) | JWT token for authorization |
Tools
Tool | API | Description |
| Kuksa V2 | Get current value of one VSS signal |
| Kuksa V2 | Get current values of multiple signals |
| Kuksa V2 | Set an actuator target value |
| Kuksa V2 | Publish a sensor reading (provider role) |
| V1 (deprecated) | List signals and metadata under a branch |
| V1 (deprecated) | Count signals matching a filter |
| V1 (deprecated) | Read actuator target/desired values |
| V1 (deprecated) | Get data types for one or more signals |
| V1 (deprecated) | Get databroker name, version, address |
Resources
URI | Description |
| Server and tool reference |
| Signal info (redirects to tool) |
| 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.pyDocker
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 8765The 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 toolscount_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
Scored across 9 tools
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.
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.
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.
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
Related MCP Connectors
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with yo…
MCP server for AI dialogue using various LLM models via AceDataCloud
An MCP server that provides an API to LLMs to manage their JumpCloud resources.
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to control Unreal E…
Related MCP Servers
- AlicenseBqualityDmaintenanceAn educational implementation of a Model Context Protocol server that demonstrates how to build a functional MCP server for integrating with various LLM clients like Claude Desktop.1161MIT
- AlicenseBqualityDmaintenanceAn educational implementation of a Model Context Protocol server that demonstrates how to build a functional MCP server integrating with various LLM clients.2MIT
- AlicenseNot gradedqualityDmaintenanceA 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.2MIT
- FlicenseNot gradedqualityDmaintenanceA 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.-