Skip to main content
Glama

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
BORER_BUDGETNoCap in bytes for every answer. Default 72000. 0 lifts it.72000
BORER_MAX_FILENoLargest file read into memory, in bytes or with K, M or G. Default 1G. 0 lifts it.1G
BORER_DEADLINE_SECSNoSeconds one request may run before it stops. Default 300. 0 means no deadline.300
BORER_NO_UPDATE_CHECKNoSet to 1 to turn off the daily update check.

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
{}
prompts
{}
resources
{}
completions
{}

Tools

Functions exposed to the LLM to take actions

NameDescription
annotationsA

List the names, findings and open questions (comments opening with ?) added this session, paged. Use it to resume work; not for binary symbols (use symbols) or user types (use types).

binary_infoA

Summarize the loaded program: format, arch, entry, sections with entropy, imports, exports. load_binary already returns it; for protection and where to start, query borer://triage. Fails if nothing is loaded.

callgraphA

Draw a function's call graph as mermaid: callees, or callers with callers=true; imports are leaves and a %% line counts nodes cut by max_nodes. Not for one path (use reaches) or a caller list (use xrefs).

cfgA

Draw a function's control-flow graph as mermaid: blocks and successor edges, 300 blocks a page, a %% line when cut. Not for reading logic (use decompile) or a block table (use function).

class_layoutA

Infer a C++ class's fields, methods and vftable from how its methods use the object: offset, width, reads, writes. Use it on an unknown class; for a known layout use set_type. apply=Name saves it as a struct (dry run until dry_run=false).

decompileA

Decompile one function to pseudo-C. Locals are local_N/arg_N (N hex bytes below the entry sp: higher N, lower address); /* asm */ marks unmodeled code. Line 2 says what was checked, // warn: what is wrong. Not for a first look (use function_summary).

decompile_batchA

Decompile many functions matching a name filter, in parallel, 6000 chars each and 40000 in all; out=<file.c> writes all uncapped to a file under the output root, kept unless overwrite=true. For one use decompile.

disassembleA

Disassemble count instructions from any address as va text rows. Use it for a few instructions or code outside functions; for a whole function use disassemble_function. Fails if unmapped.

disassemble_functionA

Disassemble a whole function by blocks, with L_<addr>: labels and named call targets. Use it when exact instructions matter; for C use decompile, for a few instructions disassemble.

entropyA

Find packed, compressed or encrypted data: chunks at or above threshold bits/byte, as off va len entropy rows, at most 200, paged. To name the packer query borer://protection instead.

fetch_pdbA

Download the loaded PE's missing PDB over https into the cache, kept only if its GUID and age match. Use it when load_binary reports no PDB; dry run until dry_run=false, then load_binary again.

find_crypto_constantsA

Find crypto constants and tables (AES, SHA, MD5, CRC-32, ChaCha, Blowfish, FNV, Base64) and hashed API names as va section algorithm rows, paged. Use it to locate crypto code, then xrefs a hit; not for strings (use strings).

find_function_by_stringA

Find the functions whose strings contain a text, case-insensitively: a numbered string legend, then entry name: 1 2 rows, paged. Not for one function's strings (use function_strings).

functionA

Show one function's raw facts: range, counts, callers, callees and block table (start size term successors), 300 blocks a page. Not for a readable triage (use function_summary).

function_stringsA

List the string literals one function references as site string_va text rows, at most 100. Not for finding a text's functions (use find_function_by_string).

function_summaryA

Triage one function in one call: shape, loops, jump tables, callers, callees, strings and data, then # next: lines. Use it before decompile; for the raw block table use function.

functionsA

List discovered functions as entry size blocks instrs callers callees src name rows, paged; filter on name or entry hex, sort=size for the largest. Not for imports (use symbols).

hexdumpA

Hexdump raw bytes at an address as address hex |ascii| rows; a range past mapped bytes shows what is there. Not for typed values (use read), text (use strings) or a live process (live_read).

load_binaryA

Load a PE, ELF or Mach-O file (or raw bytes with arch) as the program all tools read, returning its summary. Clears the session's names: save_project first. A refused load changes nothing.

load_projectA

Replace the session's names, comments and types with a saved .json project. Another binary's project (by SHA-256) is refused unless force=true; for a rebuild use borer://carry.

queryA

Read a borer:// resource (triage, taint, emulate, solve, grep...) for hosts without MCP resources; same answer as resources/read. Use it for analyses no tool has; borer://help lists them, !offset=N!limit=N pages.

reachesA

Find the shortest call chain from one function to another or to an import, or say none exists within depth. Not for the whole neighbourhood (use callgraph) or direct callers (use xrefs).

readA

Read typed values (kind) as va value rows, or a user type (type) one row per field, pointers named; stops at the first unmapped byte. Not for raw bytes (use hexdump) or a live process (live_read).

reloadA

Restart the borer server on its rebuilt binary, keeping the session, the loaded file and its annotations. Use it after rebuilding borer instead of restarting the client; live attaches end.

save_projectA

Save the session's names, comments and types to a .json project under the output root, keyed by SHA-256. Restore with load_project; an existing file is kept unless overwrite=true.

scriptA

Run a sandboxed Rhai script on a snapshot of the program: query(uri) and rows(uri) read any resource. Use it when no single tool answers. Proposed names apply only with dry_run=false; a failed script applies nothing.

searchA

Search every byte of the file for a hex pattern with ?? wildcards, or text with kind=text, as function: va ... rows, paged. Not for listing strings (use strings).

set_commentA

Comment an address in the session overlay, never the binary; a comment opening with ? is an open question. To name it use set_name. Dry run until dry_run=false; save_project keeps it.

set_nameA

Name a function or data global in the session overlay, never the binary; names=[addr=name,...] renames many, checked first. A taken name needs force=true. Dry run until dry_run=false.

set_typeA

Define a struct, enum or typedef, or apply a type at an address so decompile names its fields; at a function, type sets the prototype. To infer a class use class_layout. Checked first; dry run until dry_run=false.

stringsA

List printable ASCII and UTF-16LE strings as va len enc text rows, paged, skipping bytes of code. Not for the code using one (use find_function_by_string).

symbolsA

List imports, exports, forwards, locals and data as demangled kind addr name rows by module, paged. Not for discovered code (use functions) or call sites (use xrefs).

typesA

List user-defined types and where each is applied, paged. Not for defining one (use set_type) or names and comments (use annotations).

xrefsA

List references to an address or name, one row per function, paged; an import lists calls through its slot, Class+0x24 who touches that field. Not for call paths (use reaches).

Prompts

Interactive templates invoked by user choice

NameDescription
explain_functionExplain one function from its summary, decompilation and callers, then propose names to apply.
find_checkLocate and explain the code that validates something (serial, license, password): from strings and constants to the comparison, ending with a rename plan.
protocolMap how a networked client talks and dispatches: wire ids, every command's record, the message classes with their fields and handlers, and the registration tables, in a token-frugal order.
triageTriage the loaded binary end to end (what it is, what it imports, what it hides, where to read first) in a token-frugal tool order.

Resources

Contextual data attached and managed by the client

NameDescription
helpEvery resource with what it answers, one line each; a template read without its argument (borer://emulate), or borer://help/<name>, gives its grammar and an example
infoSummary of the loaded program (binary_info)
sessionWhere this session stands: what is loaded, the overlay's counts and whether it is saved, the names, comments, types and loads it applied, and the requests it answered, each marked held (since=<tag> answers what changed), capped or paged
annotationsAnnotation overlay: names and comments
qtQt classes from moc metadata: signals, slots, methods and properties, each mapped to its function
objcObjective-C classes and categories from a Mach-O's runtime metadata, a row per method with its implementation (named -[Class sel]), 200 a page; borer://objc/<filter> narrows by class or selector
capabilitiesWhat the program can do, grouped from its imports: networking, injection, crypto, persistence, anti-analysis and more
clrA .NET assembly's metadata: its types, its methods with each body's address (IL is not decompiled; a mixed-mode image's native methods analyze as usual), P/Invokes as dll!export, the external members it uses, referenced assemblies and its user strings, 200 rows a page; borer://clr/<filter> narrows by kind (type, method, pinvoke, memberref, asmref, moduleref, string) or text
hiddenStrings the program generates at run time by mixing a keystream, recovered by running the generators
decodedStrings a decoder function produces, recovered by running it at each of its call sites with that site's arguments (ciphertext pointer, length): a row per recovered string with its decoder and call site; a function that only copies yields nothing; borer://decoded/<filter> narrows by text
stackstringsStrings a function builds on its stack a piece at a time, which malware does to keep text out of the data sections
vmDispatch loops: an interpreter's table jump with the handlers that return to it, which is what a virtualized function looks like
dynimportsThe APIs and DLLs the program resolves at runtime via GetProcAddress/LoadLibrary, the imports a thin table hides
checksFunctions that decide whether a key, serial or license is valid, with the constants they test against
antianalysisThe anti-debug and anti-VM techniques the binary carries, at the instruction level and in its imports
flatFunctions whose control flow was flattened into one loop around a switch: every block a case, the block order destroyed, a state variable saying which runs next
mapThe program's namespaces, each with its classes counted by role (from a pack's [roles] lines, else the role words in class names: managers, components, widgets, messages, commands), singletons and methods: a table of contents; borer://map/<namespace> lists one namespace's classes with role, parent, methods and instance
attrsEvery typed attribute the program registers (entity state: hit points, positions, timers), from the registrar a pack names ([attributes] registrar), with its four-character code, type, access mode, default and the functions using it, 200 rows a page; borer://attrs/<filter> narrows by name or code, and one exact match lists every user with the definition global
packsThe packs this session knows (named in BORER_PACKS, and every pack in the pack directories) and whether each loads for the loaded program: a pack loads by itself when all its [match] lines hold
portsEvery message every port (entity property, manager, UI handler) accepts and the function its dispatch calls for it, or inline, from the accept helpers a pack names ([messages] accept); borer://ports/<filter> narrows by component or message
messagesEvery class that registered a four-character wire id, with its named fields and the functions that test for the id (the handlers), 200 rows a page, a function named in several cells numbered once in a # functions: legend; borer://messages/<filter> narrows by class name
indexBuilds the decompilation index of the loaded program (every function's pseudo-C, cached on disk for borer://grep) and reports its size
triageWhat the first ten calls of a triage would tell you, in one: format, protection, anti-analysis, crypto, generated strings, capabilities, and the functions to read first with the evidence for each; for a file with no code (data, an archive, another instruction set), its magic, entropy, high-entropy and encoded regions, and strings
protectionWhether the image is packed or protected, which protector the section names give away, and the evidence
iocsIndicators to block or hunt: URLs, domains, IP and e-mail addresses, registry keys, file paths, pipe, mutex and kernel object names, user agents, each with where it came from (a stored string's address, a stack string, a generated string, decoded base64, an emulated API or syscall argument, an API call's argument), the function using it and a confidence, benign-common marking what every program carries; 200 rows a page, borer://iocs/<filter> narrows by type or text
fingerprintThe identity of this build's fingerprints: a digest, the counts, and how to write the sidecar a later borer://diff reads. The manifest itself is a file, written by the CLI, because one line per function is megabytes
hashesThe content hashes a file is correlated by: imphash (Mandiant's dll.function MD5 as pefile and VirusTotal compute it: table order, dll lowercased with .dll/.ocx/.sys stripped, ordinals named as pefile names them), authentihash (SHA-256 with the checksum, security directory and certificate table excluded, so signing does not move it), tlsh (Trend Micro's TLSH, the T1 string public feeds carry; none under 50 bytes or for too little variety) and borer-lsh (borer's own locality-sensitive hash, matching only another borer-lsh)
encodedStrings stored encoded: base64 and hex text whose decoded bytes are text or a known file (a URL, a config, an embedded archive), each with its address and the decoded value; borer://encoded/<filter> narrows by decoded text
childrenPrograms and containers embedded in the file, each found by its signature and kept only when its headers validate (PE, ELF, Mach-O, zip, gzip, xz, 7z, cab, squashfs, cpio, uImage, cramfs, Android boot image), with offset, size and a one-line identity, plus the high-entropy runs no header explains: packed, compressed or encrypted bytes. load_binary path=<file>@<off> opens a program row as a program of its own; containers are listed, not extracted
assertsThe fields the binary's assertions name, with the classes that assert them
sourcesThe source files the binary's assertions name, by directory: the subsystems it was built from
classesEvery class that registered a four-character code, the code that identifies it on the wire, with its method count and first method
singletonsThe program's singletons: the classes whose one instance lives at a fixed thread-local or global slot, with the slot and the ::Instance accessor - the engine's global object model
enumsEvery name table the binary encodes (string-to-constant parsers and constant-to-string tables), one line per function
benchWall-clock speed of borer's hot queries on the loaded binary (AOB scan, string walks, indexed grep when the index is cached): one row per op with its answer size, fastest elapsed and throughput; timings differ run to run, the counts never do

TDQS

A4/5.0

Scored across 34 tools

Disambiguation4/5

Descriptions are unusually disciplined, including explicit "not for X (use Y)" redirects that resolve nearly every overlap (function vs function_summary, strings vs function_strings vs find_function_by_string, callgraph vs reaches vs xrefs). Still, the cluster of function/cfg/decompile/disassemble/function_summary tools is dense and an agent must read descriptions carefully to choose correctly, especially names differing only by plural (function/functions).

Naming Consistency4/5

A discernible two-tier convention holds: read-only inspectors use bare nouns (symbols, types, xrefs, strings, cfg, hexdump) while mutating or action tools use verb_noun (load_binary, save_project, set_name, find_crypto_constants, disassemble_function). Minor hazards exist—`function`/`functions` and `disassemble`/`disassemble_function` differ only by inflection, and `query`/`script` are vague one-worders—but nothing is camelCase-mixed or chaotic.

Tool Count4/5

34 tools is at the upper bound, but this is a full binary-analysis platform (load, inspect, decompile, annotate, save) where nearly every tool maps to a distinct analysis operation. A few could plausibly merge (disassemble/disassemble_function, function/function_summary), but none look like filler.

Completeness3/5

Core lifecycle is thorough—load, symbols/types, functions, decompile/disassemble, xrefs/callgraph/CFG, strings/search/entropy, annotation overlay, and project save/restore. However, several descriptions point to tools that are absent from the surface (live_read, live attach via reload), and there is no live-process read path or any means to compare/patch state beyond the overlay, leaving referenced dead ends.

Maintenance

ActivityMaintained
ResponsivenessNo issues