meshcore-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| MESHCORE_HOST | No | Home node TCP host — the companion_radio_wifi path. Set this or MESHCORE_SERIAL_PATH, not both. | |
| MESHCORE_PORT | No | TCP port for MESHCORE_HOST (default '5000'). | 5000 |
| MESHCORE_SERIAL_PATH | No | USB serial device path (e.g. /dev/ttyACM0) — the serial alternative to MESHCORE_HOST. | |
| MESHCORE_LOGIN_PASSWORD | No | Default login/admin password for remote nodes (default '' — the guest password). | |
| MESHCORE_NODE_PASSWORDS | No | JSON object of per-node overrides: { "rocky-ridge": "secret" } (keyed by node id or name). | |
| MESHCORE_TRAFFIC_CAPACITY | No | Recent-traffic ring-buffer size (default the buffer's own default). | |
| MESHCORE_REQUEST_TIMEOUT_MS | No | Device request timeout, ms (default '10000'). | 10000 |
| MESHCORE_LOGIN_PASSWORD_FILE | No | Read the default password from a file instead (its trailing newline is stripped). Set this or MESHCORE_LOGIN_PASSWORD, not both. | |
| MESHCORE_NODE_PASSWORDS_FILE | No | Read that same JSON map from a file instead — keeps node secrets out of the environment and your MCP config (chmod 600 it). Set this or MESHCORE_NODE_PASSWORDS, not both. | |
| MESHCORE_ADMIN_REPLY_TIMEOUT_MS | No | How long the remote-admin path waits for a CLI reply, ms (default '15000'). | 15000 |
Capabilities
Features and capabilities supported by this server
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| prompts | {
"listChanged": true
} |
| resources | {
"subscribe": true,
"listChanged": true
} |
| completions | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| get_node_healthA | Consolidated health snapshot for a node: identity, radio, battery, uptime/queue, and packet/radio stats. Omit |
| survey_meshA | List the home node and every known contact, with each contact's advertised role and last-heard time — a roster for spotting quiet or missing nodes. |
| get_recent_trafficA | Recent live mesh traffic from the rolling buffer, oldest→newest, each tagged with structural provenance (kind + decrypt-verified). Optional |
| send_messageA | Transmit a text message. |
| set_channelA | Configure a channel slot on the connected node. Omit |
| delete_channelA | Remove a channel slot on the connected node, addressed by |
| trace_pathA | Trace a route through the mesh and report each repeater hop's SNR. Give an explicit |
| adminA | Run one enumerated admin command against a node. Benign: • advert [home+remote] — mode: flood (mesh-wide) or zerohop (neighbours only) • sync-time [home+remote] — no params • log-start [remote] — no params • log-stop [remote] — no params • set-time [remote] — epochSecs: absolute time as epoch seconds (firmware rejects backwards clocks) • discover-neighbors [remote] — no params Config: • set-tx-power [home+remote] — dbm: transmit power in dBm, 1–22 • set-radio [home+remote] — freqMhz: centre frequency in MHz (e.g. 910.525); kHz/Hz also accepted, bwKhz: bandwidth in kHz (sub-GHz: 62.5, 125, 250, 500; 2.4GHz/SX128x goes higher, up to 1000); Hz (62500) also accepted, sf: spreading factor, 5–12, cr: coding rate 5–8 (the 'n' in 4/n); '4/5' also accepted • set-name [home+remote] — name: advertised name, ≤32 bytes • set-location [home+remote] — lat: latitude in degrees, lon: longitude in degrees • set-repeat [remote] — enabled: true to enable packet repeating • set-dutycycle [remote] — percent: duty-cycle limit, 1–100 (percent) • set-path-hash-mode [remote] — mode: path-hash mode 0|1|2 (1-byte/2-byte/3-byte advertised prefixes; 64/32/21 flood cap respectively) • set-loop-detect [remote] — level: loop-detection aggressiveness • set-flood-max [remote] — hops: max flood hop count, 0–64 • set-radio-rxgain [remote] — enabled: true to enable boosted RX gain • tempradio [remote] — freqMhz: centre frequency in MHz (e.g. 910.525); kHz/Hz also accepted, bwKhz: bandwidth in kHz (sub-GHz: 62.5, 125, 250, 500; 2.4GHz/SX128x goes higher, up to 1000); Hz (62500) also accepted, sf: spreading factor, 5–12, cr: coding rate 5–8 (the 'n' in 4/n); '4/5' also accepted, timeoutMins: auto-revert timeout in minutes (≥1) • set-tx-delay [remote] — factor: TX delay factor 0–2 • set-direct-tx-delay [remote] — factor: direct TX delay factor 0–2 • set-rx-delay [remote] — secs: RX processing delay 0–20s • set-airtime-factor [remote] — factor: airtime factor 0–9 • set-interference-threshold [remote] — value: interference threshold (firmware-defined units) • set-agc-reset-interval [remote] — secs: AGC reset interval in seconds; firmware rounds to a multiple of 4 (0 disables) • set-multi-acks [remote] — enabled: true to enable multi-ack support • set-flood-advert-interval [remote] — hours: flood-advert interval in hours, 3–168 • set-advert-interval [remote] — minutes: zero-hop advert interval in minutes, 60–240; firmware stores it as /2 (use even values) • set-owner-info [remote] — text: owner info shown in adverts; '|' in the string becomes a newline • set-adc-multiplier [remote] — value: ADC multiplier 0.0–10.0 (0 = board default) • powersaving [remote] — enabled: true to enable sleep-between-TX power saving • region [remote] — sub: status | save | allowf (region: region name (prefix-matched)) | denyf (region: region name (prefix-matched)) | get (region: region name (prefix-matched)) | home-get | home-set (region: region name to set as home) | default-get | default-set (region: region name to set as default; use '' to clear) | put (name: new region name, parent: optional parent region; defaults to wildcard) | remove (region: region name (exact match)) | list-allowed | list-denied • gps [remote] — sub: status | on | off | sync | setloc | advert-get | advert-set (policy: none | share | prefs) • sensor [remote] — sub: get (key: sensor setting key to read) | set (key: sensor setting key to write, value: new value (string-typed; firmware parses per setting)) | list (startIndex: optional pagination start index (134-char chunks)) Sensitive (writes secrets / grants access): • set-admin-password [remote] — password: new admin password, ≤15 chars • set-permission [remote] — pubKey: hex public key, level: guest|read|readwrite|admin, or null to revoke (downgrade to guest — the firmware has no explicit removal, only a level-0 demotion) • set-allow-read-only [remote] — enabled: true to enable read-only mode • set-guest-password [remote] — password: new guest password, ≤15 chars Destructive (data/identity loss or reboot): • reboot [home+remote] — no params • log-erase [remote] — no params • clear-stats [remote] — no params • remove-neighbor [remote] — pubKeyPrefix: hex public-key prefix • set-private-key [remote] — hex: new private key as 64 hex chars (32 bytes) • start-ota [remote] — no params • clkreboot [remote] — no params |
| set_credentialA | Persist the password the server will use to log into |
| forget_credentialA | Remove the server's stored login password for |
| import_contactA | Add a contact to the local node's roster from its advert-packet bytes (hex). Typically obtained from another node's |
| export_contactA | Return the advert-packet bytes (hex) for a contact, suitable for another node's |
| share_contactA | Broadcast a contact's advert across the mesh. Other nodes that receive the advert can route to this contact without having heard its own transmissions. Costs airtime. |
| remove_contactA | Drop a contact from the local node's roster. Local-only — does not tell any other node. The contact may reappear if its advert is heard again under auto-add mode; combine with |
| reset_pathA | Clear the local cached forwarding path to a contact. The next direct send to that contact re-discovers the route. Useful when a known path has gone stale (a repeater rebooted, topology changed) and direct sends are failing or taking longer than expected. |
| set_contact_pathA | Set an explicit forwarding path (a sequence of repeater path-hash bytes, up to 64) to a contact. Advanced: only when you want to override automatic path discovery. Pass |
| set_auto_add_contactsA | Set whether new contacts heard via adverts are added to the local roster automatically ( |
| reboot_nodeA | Reboot a node — the home companion or a remote repeater. Omit |
| broadcast_advertA | Send an advert from a node — home or remote. |
| sync_clockA | Set a node's clock to the controller's current time. Omit |
| set_tx_powerA | Set the radio transmit power in dBm on a node. Omit |
| set_radioA | Set frequency (MHz), bandwidth (kHz), spreading factor, and coding rate on a node. Omit |
| set_node_nameA | Rename a node's advertised mesh name. Omit |
| set_node_locationA | Set a node's advertised lat/lon (decimal degrees). Omit |
| get_node_versionA | Read a remote repeater's firmware version + build date string. Equivalent to |
| get_node_boardA | Read a remote repeater's hardware board / model identifier. Equivalent to |
| get_node_clockA | Read a remote repeater's current device clock (HH:MM - D/M/Y UTC). Equivalent to |
| get_node_neighborsA | List a remote repeater's recent neighbours (up to 8), each as |
| discover_neighborsA | Broadcast a node-discovery request from a remote repeater. Replies populate its neighbour list — read it back with |
| get_node_configA | Read one of a remote repeater's configuration values by key (e.g. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| morning-mesh-check | A daily health sweep of the mesh: survey the roster, flag nodes not heard from recently, and spot-check anything that looks off. |
| diagnose-quiet-node | Work out why a specific node has gone quiet: check its health, recent traffic to and from it, when it was last heard, and its neighbours. |
| draft-outage-notice | Draft a concise outage notice for a node over a time window, and optionally send it once you approve. |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| nodes | The mesh as seen through the home node: the home device plus every known contact, each with its advertised role and last-heard time. |
| contacts | The home node's stored contact list — each contact's name, public key, role, and last-heard time. |
| channels | Configured channel slots on the connected node (index, name, key). |
| traffic-live | A rolling, subscribable feed of recent mesh traffic, each event tagged with structural provenance (kind + decrypt-verified). Subscribe to be notified as new events arrive, then re-read to fetch them. Verified channel messages and unverified channel datagrams are marked distinctly and never conflated. |
| help | How to use this server — orientation, the admin catalogue, and recipes. |
Latest Blog Posts
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/dpup/meshcore-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server