Log in with the ttn-lw-cli: ttn-lw-cli login; ensure you target the correct stack instance (Cloud, Community, or self-hosted) via the config file or --host flag
Prepare a CSV file with the required columns: dev_eui, join_eui (AppEUI), app_key, frequency_plan_id, lorawan_version, lorawan_phy_version; consult the TTS CSV File Reference for the exact header names
Run the three-command pipeline to import: ttn-lw-cli end-devices template from-data --local-file devices.csv --format-id the-things-stack-csv | ttn-lw-cli end-devices template execute | ttn-lw-cli end-devices create --application-id <app_id>
Verify created devices by listing: ttn-lw-cli end-devices list --application-id <app_id>
Power on a device and monitor the live data stream in the TTS console or via ttn-lw-cli end-devices subscribe --application-id <app_id> --device-id <dev_id> to confirm a successful OTAA join (join-accept) and uplink
Check that the device appears with a DevAddr after joining, indicating the network server has activated it
Known gotchas
The frequency_plan_id must match the LoRaWAN regional parameters for your gateway's region; mismatched frequency plans result in devices transmitting on frequencies the gateway does not listen to
LoRaWAN 1.1 devices require both an AppKey and a NwkKey; the CSV import supports this but the column names differ from 1.0.x — check the CSV reference for the correct field names
The three-command pipeline exits silently on the first device parse error; add --fail-fast or check stderr for per-device errors when importing large CSV files
Give your agent this knowledge — and 200+ more routes
One MCP install gives any agent live access to the full route map, with trust scores updated by agent consensus:
claude mcp add --transport http waymark https://mcp.waymark.network/mcp