{"name":"io.github.oliveres/chirpstack-mcp-server","slug":"oliveres-chirpstack-mcp-server","title":"ChirpStack","description":"Manage and live-debug LoRaWAN devices on a ChirpStack v4 network server over its gRPC API","url":"https://mcp.market/server/oliveres-chirpstack-mcp-server","rating":null,"grade":"B","score":83,"certified":false,"status":"active","category":"other","tags":[],"presence":{"score":22,"stars":0,"forks":0,"downloads_week":30,"last_push_at":"2026-08-30T11:14:06.000Z","license":"MIT"},"uptime":null,"claimed":false,"transport":"pypi","callable_via_gateway":false,"default_price_micros":0,"repository":"https://github.com/oliveres/chirpstack-mcp-server","website":null,"version":"0.1.1","remotes":[],"packages":[{"registryType":"pypi","identifier":"chirpstack-mcp-server","version":"0.1.1","runtimeHint":"uvx","transport":{"type":"stdio"},"environmentVariables":[{"description":"host:port of the ChirpStack API (the web-UI port, usually 8080)","isRequired":true,"format":"string","name":"CHIRPSTACK_SERVER"},{"description":"ChirpStack API key (tenant or global admin)","isRequired":true,"format":"string","isSecret":true,"name":"CHIRPSTACK_API_KEY"},{"description":"Comma-separated toolsets to enable, or 'all' (default: devices,debug,applications,profiles,gateways)","format":"string","name":"CHIRPSTACK_TOOLSETS"},{"description":"Use TLS instead of plain h2c (default: false)","format":"boolean","name":"CHIRPSTACK_TLS"}]}],"tools":[{"name":"api_key_create","description":"Create an API key. The token is shown once, here; store it securely.","write_action":true,"price_micros":0,"input_schema":null},{"name":"api_key_delete","description":"Revoke an API key.","write_action":true,"price_micros":0,"input_schema":null},{"name":"api_key_list","description":"List API keys: names, ids, and permission/tenant metadata; tokens are never retrievable.","write_action":false,"price_micros":0,"input_schema":null},{"name":"application_create","description":"Create an application in a tenant.","write_action":true,"price_micros":0,"input_schema":null},{"name":"application_delete","description":"Delete an application and all of its devices.","write_action":true,"price_micros":0,"input_schema":null},{"name":"application_get","description":"Get an application.","write_action":false,"price_micros":0,"input_schema":null},{"name":"application_list","description":"List applications of a tenant.","write_action":false,"price_micros":0,"input_schema":null},{"name":"application_list_device_tags","description":"List the distinct device tag keys and values used inside an application.","write_action":false,"price_micros":0,"input_schema":null},{"name":"application_update","description":"Update only the given fields of an application. Supplying `tags` replaces the whole tag map.","write_action":true,"price_micros":0,"input_schema":null},{"name":"capture_list","description":"List capture sessions, including ones stopped by a terminal error (`stream_state` starts with `stopped:`).","write_action":false,"price_micros":0,"input_schema":null},{"name":"capture_read","description":"Read captured items with seq > since_seq. Remember last_seq and pass it back next time. Check stream_state for reconnects. Each item carries `live`: false means ChirpStack replayed it from before the session started, true means it happened while the session was open.","write_action":false,"price_micros":0,"input_schema":null},{"name":"capture_start","description":"Start a background capture of a device's events/frames or a gateway's frames. Returns a session_id; read incrementally with capture_read. Sessions idle for 30 minutes are dropped.","write_action":false,"price_micros":0,"input_schema":null},{"name":"capture_stop","description":"Stop a capture session and discard its buffer.","write_action":false,"price_micros":0,"input_schema":null},{"name":"device_activate","description":"ABP-activate a device (or reset an OTAA session). For LoRaWAN 1.0.x pass nwk_s_enc_key only; the other two network keys default to it.","write_action":false,"price_micros":0,"input_schema":null},{"name":"device_create","description":"Create a device. Set OTAA keys afterwards with device_set_keys, or ABP session with device_activate.","write_action":true,"price_micros":0,"input_schema":null},{"name":"device_deactivate","description":"Drop the device session; an OTAA device must re-join before it can communicate.","write_action":true,"price_micros":0,"input_schema":null},{"name":"device_delete","description":"Delete a device and everything ChirpStack stores about it.","write_action":true,"price_micros":0,"input_schema":null},{"name":"device_enqueue","description":"Queue a downlink. Give the payload as data_hex, data_base64, or object (encoded by the profile codec). Class A devices receive it after their next uplink.","write_action":false,"price_micros":0,"input_schema":null},{"name":"device_flush_dev_nonces","description":"Forget used DevNonces so a device whose join-requests are rejected as replays can join again.","write_action":false,"price_micros":0,"input_schema":null},{"name":"device_get","description":"Get a device with its current activation (session) and, if include_keys, its OTAA root keys. include_keys also reveals the session keys in `activation`.","write_action":false,"price_micros":0,"input_schema":null},{"name":"device_list","description":"List devices in an application (optionally filtered by a search string).","write_action":false,"price_micros":0,"input_schema":null},{"name":"device_metrics","description":"Link quality (RSSI, SNR, packets per frequency/DR, errors) plus codec-defined device metrics. Defaults to the last 24 hours.","write_action":false,"price_micros":0,"input_schema":null},{"name":"device_queue_flush","description":"Discard every queued downlink for a device.","write_action":false,"price_micros":0,"input_schema":null},{"name":"device_queue_get","description":"Show downlinks waiting for (or pending confirmation from) a device.","write_action":false,"price_micros":0,"input_schema":null},{"name":"device_recent_events","description":"One-shot look at the last few events (or frames) ChirpStack still holds for a device - typically the last 10.","write_action":false,"price_micros":0,"input_schema":null},{"name":"device_set_keys","description":"Create or replace the OTAA root keys. LoRaWAN 1.0.x devices use nwk_key only (their AppKey goes in nwk_key).","write_action":true,"price_micros":0,"input_schema":null},{"name":"device_update","description":"Update only the given fields of a device; omitted fields keep their current values. Supplying `tags` replaces the whole tag map. Supplying `variables` replaces the whole variable map.","write_action":true,"price_micros":0,"input_schema":null},{"name":"fuota_add_devices","description":"Add devices to a deployment.","write_action":false,"price_micros":0,"input_schema":null},{"name":"fuota_create","description":"Create a FUOTA deployment from FuotaDeployment fields (snake_case, enums by name) plus the firmware as payload_hex or payload_base64. Byte fields (payload, fragmentation_descriptor) must come through payload_hex/payload_base64 and fragmentation_descriptor_hex, not `deployment`.","write_action":true,"price_micros":0,"input_schema":null},{"name":"fuota_delete","description":"Delete a FUOTA deployment.","write_action":true,"price_micros":0,"input_schema":null},{"name":"fuota_get","description":"Get a FUOTA deployment (payload is returned as hex).","write_action":false,"price_micros":0,"input_schema":null},{"name":"fuota_list","description":"List FUOTA deployments of an application.","write_action":false,"price_micros":0,"input_schema":null},{"name":"fuota_list_devices","description":"List devices in a deployment with their per-device progress.","write_action":false,"price_micros":0,"input_schema":null},{"name":"fuota_list_jobs","description":"List the scheduler jobs of a deployment with attempts, warnings and errors.","write_action":false,"price_micros":0,"input_schema":null},{"name":"fuota_remove_devices","description":"Remove devices from a deployment.","write_action":true,"price_micros":0,"input_schema":null},{"name":"fuota_start","description":"Start a FUOTA deployment (schedules the multicast setup, fragmentation and transfer jobs).","write_action":false,"price_micros":0,"input_schema":null},{"name":"fuota_update","description":"Merge fields and/or replace the firmware payload of a deployment that has not started yet. Byte fields (payload, fragmentation_descriptor) must come through payload_hex/ payload_base64 and fragmentation_descriptor_hex, not `changes`. Map and repeated fields you supply in `changes` replace the whole field; omitted fields are kept.","write_action":true,"price_micros":0,"input_schema":null},{"name":"gateway_create","description":"Register a gateway; location is set only when coordinates are given.","write_action":true,"price_micros":0,"input_schema":null},{"name":"gateway_delete","description":"Delete a gateway.","write_action":true,"price_micros":0,"input_schema":null},{"name":"gateway_get","description":"Get a gateway with its last-seen time and location.","write_action":false,"price_micros":0,"input_schema":null},{"name":"gateway_list","description":"List gateways (all tenants when tenant_id is empty and the key is a global admin key).","write_action":false,"price_micros":0,"input_schema":null},{"name":"gateway_metrics","description":"RX/TX packet counts per frequency, DR and status, plus duty-cycle usage. Defaults to the last 24 hours.","write_action":false,"price_micros":0,"input_schema":null},{"name":"gateway_update","description":"Update only the given fields of a gateway. Supplying `tags` replaces the whole tag map.","write_action":true,"price_micros":0,"input_schema":null},{"name":"integration_delete","description":"Remove an integration from an application.","write_action":true,"price_micros":0,"input_schema":null},{"name":"integration_get","description":"Get one integration's configuration. Stored credentials (tokens, passwords, header values, etc.) are redacted unless include_secrets is true.","write_action":false,"price_micros":0,"input_schema":null},{"name":"integration_list","description":"List which integrations an application has configured. `manageable` says whether integration_get/set/delete accept that `kind`.","write_action":false,"price_micros":0,"input_schema":null},{"name":"integration_set","description":"Create or update an integration.","write_action":true,"price_micros":0,"input_schema":null},{"name":"multicast_add_device","description":"Add a device to a multicast group.","write_action":false,"price_micros":0,"input_schema":null},{"name":"multicast_create","description":"Create a multicast group from MulticastGroup fields (snake_case; enums by name: region \"EU868\", group_type \"CLASS_C\").","write_action":true,"price_micros":0,"input_schema":null},{"name":"multicast_delete","description":"Delete a multicast group.","write_action":true,"price_micros":0,"input_schema":null},{"name":"multicast_enqueue","description":"Queue a multicast downlink (raw bytes only; multicast has no codec).","write_action":false,"price_micros":0,"input_schema":null},{"name":"multicast_get","description":"Get a multicast group. include_keys also reveals mc_nwk_s_key/mc_app_s_key.","write_action":false,"price_micros":0,"input_schema":null},{"name":"multicast_list","description":"List multicast groups of an application.","write_action":false,"price_micros":0,"input_schema":null},{"name":"multicast_queue_flush","description":"Discard queued multicast downlinks.","write_action":false,"price_micros":0,"input_schema":null},{"name":"multicast_queue_list","description":"Show queued multicast downlinks.","write_action":false,"price_micros":0,"input_schema":null},{"name":"multicast_remove_device","description":"Remove a device from a multicast group.","write_action":true,"price_micros":0,"input_schema":null},{"name":"multicast_update","description":"Merge the given MulticastGroup fields into an existing group; other fields are kept. Map and repeated fields you supply replace the whole field; omitted fields are kept. Session keys left as `<redacted>` (what multicast_get returns by default) keep the key already stored.","write_action":true,"price_micros":0,"input_schema":null},{"name":"profile_create","description":"Create a device profile from a dict of DeviceProfile fields (snake_case; enums by name, e.g. region \"EU868\", mac_version \"LORAWAN_1_0_3\", reg_params_revision \"A\"). Required: tenant_id, name, region, mac_version, reg_params_revision.","write_action":true,"price_micros":0,"input_schema":null},{"name":"profile_delete","description":"Delete a device profile (fails while devices still use it).","write_action":true,"price_micros":0,"input_schema":null},{"name":"profile_get","description":"Get a device profile including its payload codec script.","write_action":false,"price_micros":0,"input_schema":null},{"name":"profile_list","description":"List device profiles of a tenant.","write_action":false,"price_micros":0,"input_schema":null},{"name":"profile_list_adr_algorithms","description":"List the ADR algorithms available on this server.","write_action":false,"price_micros":0,"input_schema":null},{"name":"profile_list_vendors","description":"List vendors from the imported device-profile catalogue.","write_action":false,"price_micros":0,"input_schema":null},{"name":"profile_set_codec","description":"Replace only the payload codec of a profile. For runtime JS, script is required and must define decodeUplink(input) and may define encodeDownlink(input); use runtime NONE to turn the codec off. Iterate here while watching uplinks with capture_read.","write_action":false,"price_micros":0,"input_schema":null},{"name":"profile_update","description":"Merge the given DeviceProfile fields into an existing profile; other fields are kept. Map and repeated fields you supply (e.g. tags, measurements) replace the whole field; omitted fields are kept.","write_action":true,"price_micros":0,"input_schema":null},{"name":"relay_add_device","description":"Attach an end-device to a relay.","write_action":false,"price_micros":0,"input_schema":null},{"name":"relay_gateway_get","description":"Get a relay gateway (4-byte relay id as hex).","write_action":false,"price_micros":0,"input_schema":null},{"name":"relay_gateway_list","description":"List relay gateways of a tenant.","write_action":false,"price_micros":0,"input_schema":null},{"name":"relay_list","description":"List devices acting as relays in an application.","write_action":false,"price_micros":0,"input_schema":null},{"name":"relay_list_devices","description":"List end-devices attached to a relay.","write_action":false,"price_micros":0,"input_schema":null},{"name":"relay_remove_device","description":"Detach an end-device from a relay.","write_action":true,"price_micros":0,"input_schema":null},{"name":"server_info","description":"Check the connection and the API key. Version and regions are only available to user sessions in ChirpStack, so they may be null/empty with an API key.","write_action":false,"price_micros":0,"input_schema":null},{"name":"tenant_create","description":"Create a tenant (0 for a count means unlimited).","write_action":true,"price_micros":0,"input_schema":null},{"name":"tenant_delete","description":"Delete a tenant and everything under it.","write_action":true,"price_micros":0,"input_schema":null},{"name":"tenant_get","description":"Get a tenant.","write_action":false,"price_micros":0,"input_schema":null},{"name":"tenant_list","description":"List tenants visible to the API key.","write_action":false,"price_micros":0,"input_schema":null},{"name":"tenant_update","description":"Update only the given fields of a tenant. Supplying `tags` replaces the whole tag map.","write_action":true,"price_micros":0,"input_schema":null},{"name":"tenant_user_add","description":"Give an existing user (by e-mail) a role in a tenant.","write_action":false,"price_micros":0,"input_schema":null},{"name":"tenant_user_list","description":"List users of a tenant with their roles.","write_action":false,"price_micros":0,"input_schema":null},{"name":"tenant_user_remove","description":"Remove a user from a tenant (the user account itself is kept).","write_action":true,"price_micros":0,"input_schema":null},{"name":"wait_for_event","description":"Block until the device emits a live event (optionally of the given types: up, join, ack, txack, log, status, location) or the timeout (max 60 s) passes. Only events newer than the moment of the call count (`live`); the events ChirpStack replays from its history never satisfy the wait, whatever their arrival timing. Use device_recent_events for those.","write_action":false,"price_micros":0,"input_schema":null}],"scan":{"score":83,"grade":"B","scanned_at":"2026-09-20T20:57:54.891Z","report":{"scannerVersion":"0.1.9","scannedAt":"2026-09-20T20:57:54.874Z","components":{"code":{"score":25,"max":25,"notes":["24 source files scanned"]},"reliability":{"score":-1,"max":20,"notes":["no gateway calls yet and no remote to probe"]},"poisoning":{"score":-1,"max":15,"notes":["tools not inspected (local package is not executed); not counted"]},"auth":{"score":6,"max":15,"notes":["static API keys via environment variables"]},"maintenance":{"score":15,"max":15,"notes":["last push 21 days ago"]},"identity":{"score":8,"max":10,"notes":["registry namespace matches repository owner","GitHub account older than a year"]}},"findings":[],"inputs":{"packages":[{"registryType":"pypi","identifier":"chirpstack-mcp-server","version":"0.1.1","found":true,"weeklyDownloads":30,"license":"MIT","dependencyCount":2,"publishedAt":"2026-08-29T21:39:45.412325Z","repositoryUrl":"https://github.com/oliveres/chirpstack-mcp-server"}],"repo":{"found":true,"owner":"oliveres","repo":"chirpstack-mcp-server","archived":false,"pushedAt":"2026-08-30T11:14:06Z","stars":0,"forks":0,"openIssues":0,"ownerType":"User","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/31700240?v=4","ownerCreatedAt":"2017-09-06T14:47:27Z","license":"MIT"},"icon":{"url":"https://avatars.githubusercontent.com/u/31700240?v=4&s=128","source":"github"},"presence":{"stars":0,"forks":0,"downloadsWeek":30,"license":"MIT","lastPushAt":"2026-08-30T11:14:06.000Z","score":22}}}},"grade_history":[],"reviews":[]}