Skip to main content
Glama

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault

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

CapabilityDetails
tools
{
  "listChanged": false
}
prompts
{
  "listChanged": false
}
resources
{
  "subscribe": false,
  "listChanged": false
}

Tools

Functions exposed to the LLM to take actions

NameDescription
scanA

scan for bluetooth le devices for timeout seconds, strongest signal first.

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 harald arm <address> in their own terminal. each write spends one from that budget, and firmware-update services stay blocked. by default it writes without response when the characteristic allows that, and with response otherwise. response=true waits for the device to acknowledge the write; false does not.

subscribeA

collect notifications from a characteristic for seconds.

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 showing a–b of n events footer comes last. a capture can hold several connections, each with its own handles. page with limit and offset. handle (an integer, e.g. 18 for h=0x0012) keeps only att events on that handle, channel (e.g. 9) only rfcomm events on that channel, conn (e.g. 64 for c=0x0040) only events on that connection, and offset then counts those filtered events. for a bluetooth classic gadget, capture its android app in a btsnoop log: an iphone app reaches classic gadgets only through apple iap2, which harald shows as rfcomm data but can't unwrap yet. relative paths resolve against the server's working directory.

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 harald arm <address> in their own terminal. each message spends one armed write, a query included, because classic has no read. all messages go over one connection, in order, with listen seconds (at most 30) of listening after each, so handshakes and acks can be sent as messages. service is an rfcomm service uuid or channel number from classic_services; standard profiles and channels missing from classic_services are refused, and firmware-update channels stay blocked. received holds each chunk with the message number it followed (0 = before the first), seconds since the channel opened and the value as hex. stopped explains a budget that ran out partway, or a link that failed after the first message; it is empty when every message was sent.

classic_listenA

open a classic device's rfcomm channel, send nothing, and collect seconds (at most 30) of what it says.

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

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription

No resources

TDQS

B3.4/5.0

Scored across 18 tools

Disambiguation4/5

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.

Naming Consistency4/5

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.

Tool Count4/5

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.

Completeness4/5

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.

Maintenance

ActivityMaintained
ResponsivenessNo issues