chirpstack-mcp-server
An MCP server for ChirpStack v4. It lets an AI agent (Claude Code, Claude Desktop, or any MCP client) manage a LoRaWAN network and — the part that matters while you are building a device application — debug devices live: queue a downlink, watch the uplinks and events as they arrive, iterate a payload codec, and inspect link quality, all from the coding session.
The server talks to ChirpStack's native gRPC API with a single API key. It carries no device- or vendor-specific logic.
Install
uvx chirpstack-mcp-server # run directly (needs uv: https://docs.astral.sh/uv/)
# or
pip install chirpstack-mcp-server
Configure
| Variable | Required | Default | Meaning |
|---|---|---|---|
CHIRPSTACK_SERVER |
yes | — | host:port of the ChirpStack API (the web-UI port, usually 8080) |
CHIRPSTACK_API_KEY |
yes | — | API key from ChirpStack → API keys (tenant or global admin) |
CHIRPSTACK_TOOLSETS |
no | devices,debug,applications,profiles,gateways |
comma-separated toolsets, or all |
CHIRPSTACK_TLS |
no | false |
use TLS instead of plain HTTP/2 |
CHIRPSTACK_TRANSPORT |
no | stdio |
stdio or streamable-http |
CHIRPSTACK_HTTP_PORT |
no | 8000 |
port for streamable-http (bound to 127.0.0.1) |
Claude Code
claude mcp add chirpstack -e CHIRPSTACK_SERVER=192.168.1.10:8080 -e CHIRPSTACK_API_KEY=eyJ... -- uvx chirpstack-mcp-server
Claude Desktop / generic MCP config
{
"mcpServers": {
"chirpstack": {
"command": "uvx",
"args": ["chirpstack-mcp-server"],
"env": {
"CHIRPSTACK_SERVER": "192.168.1.10:8080",
"CHIRPSTACK_API_KEY": "eyJ..."
}
}
}
}
Toolsets
Tools are grouped so an agent only sees what it needs. Names are <toolset>_<verb>.
| Toolset | Default | Tools |
|---|---|---|
devices |
yes | list, get, create, update, delete, set_keys, activate, deactivate, flush_dev_nonces, enqueue, queue_get, queue_flush, metrics |
debug |
yes | server_info, capture_start, capture_read, capture_stop, capture_list, wait_for_event, device_recent_events |
applications |
yes | list, get, create, update, delete, list_device_tags |
profiles |
yes | list, get, create, update, delete, profile_set_codec, list_vendors, list_adr_algorithms |
gateways |
yes | list, get, create, update, delete, metrics |
multicast |
no | group CRUD, add/remove device, enqueue, queue_list, queue_flush |
fuota |
no | deployment CRUD, start, add/remove/list devices, list_jobs |
integrations |
no | integration_list/get/set/delete — one generic set for all ten ChirpStack integration kinds; integration_get redacts stored credentials unless include_secrets=true |
tenants |
no | tenant CRUD, tenant users, API keys |
relay |
no | relay devices and relay gateways |
Enable more with CHIRPSTACK_TOOLSETS=devices,debug,profiles,multicast or CHIRPSTACK_TOOLSETS=all.
server_info is the first call an agent should make to check the connection and the API key;
its chirpstack_version/regions fields may come back null/empty since ChirpStack only serves
those to a logged-in user session, never to an API key.
Live debugging
ChirpStack keeps the last ~10 events per device and streams new ones. The debug toolset
turns that into something an agent can use between tool calls:
capture_start(target, kind)opens a background stream (eventsorframesfor a device,gateway_framesfor a gateway) into a 500-item ring buffer and returns asession_id.device_enqueue(dev_eui, f_port, data_hex=...)queues the downlink.capture_read(session_id, since_seq)returns everything that arrived since the last read — decoded uplinks (f_port,f_cnt,data_hex, codecobject, per-gatewayrssi/snr),ack/txackfor the downlink,logentries when something went wrong.capture_stop(session_id)when done. Idle sessions expire after 30 minutes.
For quick looks: wait_for_event(dev_eui, timeout_s) blocks up to 60 s for the next live event;
device_recent_events(dev_eui) returns the backlog without keeping a session.
Class A devices only receive a downlink after their next uplink; Class C devices get it right away.
Security notes
- The API key is read from the environment and never appears in tool output.
device_gethides root keys unless asked withinclude_keys=true. device_get/multicast_gethide session keys unlessinclude_keys=true.integration_getredacts stored credentials unlessinclude_secrets=true.<redacted>is reserved:integration_set/multicast_updatekeep the stored value wherever it appears (so an edited_getresult can be handed straight back), andintegration_set/multicast_createrefuse it when there is nothing to keep.- Plain HTTP/2 (h2c) is the default because ChirpStack's API port is plain by default. Plain
h2c sends the API key as a cleartext bearer token on the wire; use it only on a trusted LAN,
and set
CHIRPSTACK_TLS=true(behind a TLS-terminating proxy that speaks gRPC) or a VPN elsewhere. streamable-httphas no authentication of its own and binds to127.0.0.1. Do not expose it on a public interface.- The HTTP transport validates
Host/Originheaders (DNS-rebinding protection), so a web page in the operator's browser cannot open an MCP session against the loopback listener. - Destructive tools are annotated (
destructiveHint) so MCP clients can ask before running them. - Enabling the
tenantstoolset lets the agent mint API keys;api_key_createreturns the new token once, in its result.
Development
uv sync
uv run pytest # unit tests
uv run ruff check . && uv run pyright
tests/integration/up.sh # throwaway ChirpStack in Docker + API key
set -a; . .integration/env; set +a
uv run pytest -m integration
tests/integration/down.sh
Design notes live in docs/design.md.
License
MIT © Oldřich Švéda
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file chirpstack_mcp_server-0.1.0.tar.gz.
File metadata
- Download URL: chirpstack_mcp_server-0.1.0.tar.gz
- Upload date:
- Size: 217.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b983831e4f2565e439608dafc912819c20aad212200486f33ab0ac996793b9c5
|
|
| MD5 |
4699003f115469ed325243a07e393515
|
|
| BLAKE2b-256 |
3549633ec431f9d729d198a54122e14afc66c7f87fd8363ea4759755284cb4b1
|
Provenance
The following attestation bundles were made for chirpstack_mcp_server-0.1.0.tar.gz:
Publisher:
publish.yml on oliveres/chirpstack-mcp-server
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
chirpstack_mcp_server-0.1.0.tar.gz -
Subject digest:
b983831e4f2565e439608dafc912819c20aad212200486f33ab0ac996793b9c5 - Sigstore transparency entry: 2642541163
- Sigstore integration time:
-
Permalink:
oliveres/chirpstack-mcp-server@7e3f681e88159b7fb3208814e9375d6d88252ac4 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/oliveres
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@7e3f681e88159b7fb3208814e9375d6d88252ac4 -
Trigger Event:
push
-
Statement type:
File details
Details for the file chirpstack_mcp_server-0.1.0-py3-none-any.whl.
File metadata
- Download URL: chirpstack_mcp_server-0.1.0-py3-none-any.whl
- Upload date:
- Size: 46.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9b12c8178b4b051d1377f5b03e2eab1188a298ac5248c913cf710f9eef6bba12
|
|
| MD5 |
406f880c56c524734718b0f2c7920cbb
|
|
| BLAKE2b-256 |
0ba9994f53891d5d827eee3d4f3d0aaae53c2601cd3986753e610287a83d8ed4
|
Provenance
The following attestation bundles were made for chirpstack_mcp_server-0.1.0-py3-none-any.whl:
Publisher:
publish.yml on oliveres/chirpstack-mcp-server
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
chirpstack_mcp_server-0.1.0-py3-none-any.whl -
Subject digest:
9b12c8178b4b051d1377f5b03e2eab1188a298ac5248c913cf710f9eef6bba12 - Sigstore transparency entry: 2642541218
- Sigstore integration time:
-
Permalink:
oliveres/chirpstack-mcp-server@7e3f681e88159b7fb3208814e9375d6d88252ac4 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/oliveres
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@7e3f681e88159b7fb3208814e9375d6d88252ac4 -
Trigger Event:
push
-
Statement type: