harald
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| scanA | scan for bluetooth le devices for manufacturer_data maps each company id (as 0x-hex) to its payload hex. |
| connectC | connect to a device and list its gatt services and their characteristics. use the characteristic uuids listed here with read_char, write_char and subscribe. |
| read_charB | read a characteristic once; returns its value as hex. |
| write_charA | write hex bytes to a characteristic; returns the writes left. refused unless the human armed this device by running |
| subscribeA | collect notifications from a characteristic for returns one entry per notification: seconds since the start and the value as hex. |
| open_captureA | show the att and rfcomm timeline of a phone capture (.pklg or btsnoop log). one line per event with time, acl connection, direction, op and value hex. att
events show their handle and uuid; rfcomm events (rfcomm data, rfcomm_open and
rfcomm_close) show their server channel, e.g. ch=9. any warnings come first and
a |
| diffB | compare hex payloads byte by byte. returns how many payloads have each length, the byte at every position that is the same in all of them (over the shortest), the positions that vary, and whether the set looks like block-cipher output. |
| guess_checksB | name the checksums and length fields one hex payload is consistent with. checks sum8 and xor8 in the last byte, and the byte before a trailing end marker, over the bytes after a leading start marker; crc16-ccitt in the last two; and a length byte at position 0 or 1. |
| try_keysA | decrypt hex payloads with each candidate aes key, in ecb and in cbc with a zero iv, best-scoring first. samples holds the first plaintexts as hex. the score only tells keys apart across several distinct payloads: with one payload, or identical copies, every key scores 1.0. keys that are not 16, 24 or 32 bytes and payloads that are not a multiple of 16 bytes are skipped. |
| analyze_apkA | statically analyze a vendor android app (.apk, .xapk or .apks) already on disk. detects the framework. for a native app it runs jadx and lists the uuids (gatt and rfcomm) in gatt_uuids and file:line candidates (uuids, aes keys, base64 blobs, command builders, rfcomm socket calls) to open under jadx_dir, the app's own package first and third-party libraries skipped. each list keeps at most 50 per kind; totals has the full counts, and when anything was cut a warning names the file under jadx_dir that lists them all. flutter and react-native apps keep their ble code compiled, so the warnings point to capture analysis instead. harald never downloads apps. |
| list_devicesB | list the gadgets in harald's device library, with status and summary. |
| load_deviceC | the device library entry for one slug, including any app-wide key and cipher. |
| read_notesC | the working notes for a device, or an empty string when there are none. notes live in harald-work//notes.md, relative to the server's working directory. |
| save_noteA | append a timestamped note to harald-work//notes.md. the path is relative to the server's working directory. slugs use lowercase letters, digits and hyphens, e.g. demo-lamp. |
| classic_devicesA | list the bluetooth classic devices paired with this mac. connected says whether each is linked to the mac now. use an address from here with classic_services, classic_send and classic_listen. |
| classic_servicesA | list a paired classic device's service records from the mac's sdp cache. each record has a name, service-class uuids and an rfcomm channel (null when rfcomm cannot reach it). protected channels are standard profiles such as hands-free and headset, which harald never opens; firmware_update channels stay blocked for writes. refresh=true asks the device again instead of trusting the cache. |
| classic_sendA | send hex messages to a classic device's rfcomm channel and collect its answers. refused unless the human armed this device by running |
| classic_listenA | open a classic device's rfcomm channel, send nothing, and collect needs no arm, but standard profiles are still refused. service is an rfcomm service uuid or channel number from classic_services. returns one entry per chunk: seconds since the channel opened and the value as hex. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 18 tools
Most tools are cleanly separated by transport (BLE vs classic) and action (scan, connect, read_char, write_char, subscribe, classic_send, classic_listen). There is mild overlap among the three listing/discovery tools (scan, list_devices, classic_devices) and between open_capture and analyze_apk, but descriptions make the boundaries clear.
All names use snake_case consistently, with a sensible classic_* namespace for the classic transport tools. However, the convention is a mix of verb_noun (read_char, save_note), noun_action (classic_send, classic_devices), and bare verbs (scan, connect, subscribe, diff), so it is not a single predictable pattern.
18 tools is on the heavier side but each maps to a distinct capability (transport ops, capture analysis, crypto analysis, APK analysis, notes/library). The breadth is justified by the varied reverse-engineering workflow rather than being padding.
Covers the full BLE and classic lifecycle (scan, connect, read/write/subscribe/send/listen) plus strong analysis tooling (captures, diff, checksums, key trial, APK static analysis) and a notes/device library. Minor gaps like no explicit BLE disconnect/unsubscribe or device-library registration keep it from a 5.