HOCON — 18 Operations for AI Agents
HOCON configures the reactive JVM stack: Akka clusters, Play apps, Kafka tooling. act101 resolves its nested, include-heavy structure into navigable form, so agents follow a setting to its source through layers of overrides.
This page is the canonical reference an AI coding agent uses to refactor, query, and analyze HOCON code through the act MCP server. 18 operations available: 0 refactor, 18 query, 0 analysis. Each operation is callable from Claude Code, Cursor, Codex, OpenCode, or any MCP-compatible agent host. Click any operation for a stable anchor link suitable for citation.
Worked HOCON examples
act101 reads a HOCON file's top-level key-value pairs, called paths, as variable declarations in the skeleton, one per top-level key regardless of whether its value is a scalar or a nested object. symbols descends into every nested object, reporting each pair at every depth, also as variable. The unit of structure in this grammar is the pair: a HOCON object like channels is, at the query level, just a pair whose value happens to hold more pairs. Each example below is the verbatim output of the command shown, run against the file shown. Query outputs are pretty-printed with the timing block omitted.
Read the top-level pairs as a skeleton
calibration.hocon records a lab instrument's calibration run with three top-level keys: instrument, calibration, and due-date.
$ act query skeleton calibration.hocon
Before
instrument {
model = "Fluke-8846A"
serial = "FL-2291X"
}
calibration {
reference-standard = "NIST-traceable resistor bank"
last-run = "2026-04-12"
technician = "M. Alvarez"
channels {
ch1 {
range-ohms = 100
offset = 0.003
}
ch2 {
range-ohms = 1000
offset = -0.012
}
}
}
due-date = "2026-10-12"
Output
{
"type": "Skeleton",
"declarations": [
{
"kind": "variable",
"name": "instrument",
"range": {
"start": {
"file": "calibration.hocon",
"line": 1,
"column": 1,
"byte_offset": 0
},
"end": {
"file": "calibration.hocon",
"line": 4,
"column": 2,
"byte_offset": 60
}
},
"name_range": {
"start": {
"file": "calibration.hocon",
"line": 1,
"column": 1,
"byte_offset": 0
},
"end": {
"file": "calibration.hocon",
"line": 1,
"column": 12,
"byte_offset": 11
}
}
},
{
"kind": "variable",
"name": "calibration",
"range": {
"start": {
"file": "calibration.hocon",
"line": 6,
"column": 1,
"byte_offset": 62
},
"end": {
"file": "calibration.hocon",
"line": 21,
"column": 2,
"byte_offset": 325
}
},
"name_range": {
"start": {
"file": "calibration.hocon",
"line": 6,
"column": 1,
"byte_offset": 62
},
"end": {
"file": "calibration.hocon",
"line": 6,
"column": 13,
"byte_offset": 74
}
}
},
{
"kind": "variable",
"name": "due-date",
"range": {
"start": {
"file": "calibration.hocon",
"line": 23,
"column": 1,
"byte_offset": 327
},
"end": {
"file": "calibration.hocon",
"line": 23,
"column": 24,
"byte_offset": 350
}
},
"name_range": {
"start": {
"file": "calibration.hocon",
"line": 23,
"column": 1,
"byte_offset": 327
},
"end": {
"file": "calibration.hocon",
"line": 23,
"column": 10,
"byte_offset": 336
}
}
}
]
}
The skeleton reports instrument, calibration, and due-date as variable declarations; the pairs nested inside instrument and calibration, such as serial and technician, don't get their own top-level entry.
List every nested pair as symbols
calibration nests a channels object two levels deep, with ch1 and ch2 each setting their own range-ohms and offset.
$ act query symbols calibration.hocon
Before
instrument {
model = "Fluke-8846A"
serial = "FL-2291X"
}
calibration {
reference-standard = "NIST-traceable resistor bank"
last-run = "2026-04-12"
technician = "M. Alvarez"
channels {
ch1 {
range-ohms = 100
offset = 0.003
}
ch2 {
range-ohms = 1000
offset = -0.012
}
}
}
due-date = "2026-10-12"
Output
{
"type": "Symbols",
"symbols": [
{
"name": "instrument ",
"kind": "variable",
"range": {
"start": {
"file": "calibration.hocon",
"line": 1,
"column": 1,
"byte_offset": 0
},
"end": {
"file": "calibration.hocon",
"line": 1,
"column": 12,
"byte_offset": 11
}
},
"visibility": "unknown"
},
{
"name": "model ",
"kind": "variable",
"range": {
"start": {
"file": "calibration.hocon",
"line": 2,
"column": 3,
"byte_offset": 15
},
"end": {
"file": "calibration.hocon",
"line": 2,
"column": 9,
"byte_offset": 21
}
},
"visibility": "unknown"
},
{
"name": "serial ",
"kind": "variable",
"range": {
"start": {
"file": "calibration.hocon",
"line": 3,
"column": 3,
"byte_offset": 39
},
"end": {
"file": "calibration.hocon",
"line": 3,
"column": 10,
"byte_offset": 46
}
},
"visibility": "unknown"
},
{
"name": "calibration ",
"kind": "variable",
"range": {
"start": {
"file": "calibration.hocon",
"line": 6,
"column": 1,
"byte_offset": 62
},
"end": {
"file": "calibration.hocon",
"line": 6,
"column": 13,
"byte_offset": 74
}
},
"visibility": "unknown"
},
{
"name": "reference-standard ",
"kind": "variable",
"range": {
"start": {
"file": "calibration.hocon",
"line": 7,
"column": 3,
"byte_offset": 78
},
"end": {
"file": "calibration.hocon",
"line": 7,
"column": 22,
"byte_offset": 97
}
},
"visibility": "unknown"
},
{
"name": "last-run ",
"kind": "variable",
"range": {
"start": {
"file": "calibration.hocon",
"line": 8,
"column": 3,
"byte_offset": 132
},
"end": {
"file": "calibration.hocon",
"line": 8,
"column": 12,
"byte_offset": 141
}
},
"visibility": "unknown"
},
{
"name": "technician ",
"kind": "variable",
"range": {
"start": {
"file": "calibration.hocon",
"line": 9,
"column": 3,
"byte_offset": 158
},
"end": {
"file": "calibration.hocon",
"line": 9,
"column": 14,
"byte_offset": 169
}
},
"visibility": "unknown"
},
{
"name": "channels ",
"kind": "variable",
"range": {
"start": {
"file": "calibration.hocon",
"line": 11,
"column": 3,
"byte_offset": 187
},
"end": {
"file": "calibration.hocon",
"line": 11,
"column": 12,
"byte_offset": 196
}
},
"visibility": "unknown"
},
{
"name": "ch1 ",
"kind": "variable",
"range": {
"start": {
"file": "calibration.hocon",
"line": 12,
"column": 5,
"byte_offset": 202
},
"end": {
"file": "calibration.hocon",
"line": 12,
"column": 9,
"byte_offset": 206
}
},
"visibility": "unknown"
},
{
"name": "range-ohms ",
"kind": "variable",
"range": {
"start": {
"file": "calibration.hocon",
"line": 13,
"column": 7,
"byte_offset": 214
},
"end": {
"file": "calibration.hocon",
"line": 13,
"column": 18,
"byte_offset": 225
}
},
"visibility": "unknown"
},
{
"name": "offset ",
"kind": "variable",
"range": {
"start": {
"file": "calibration.hocon",
"line": 14,
"column": 7,
"byte_offset": 237
},
"end": {
"file": "calibration.hocon",
"line": 14,
"column": 14,
"byte_offset": 244
}
},
"visibility": "unknown"
},
{
"name": "ch2 ",
"kind": "variable",
"range": {
"start": {
"file": "calibration.hocon",
"line": 16,
"column": 5,
"byte_offset": 262
},
"end": {
"file": "calibration.hocon",
"line": 16,
"column": 9,
"byte_offset": 266
}
},
"visibility": "unknown"
},
{
"name": "range-ohms ",
"kind": "variable",
"range": {
"start": {
"file": "calibration.hocon",
"line": 17,
"column": 7,
"byte_offset": 274
},
"end": {
"file": "calibration.hocon",
"line": 17,
"column": 18,
"byte_offset": 285
}
},
"visibility": "unknown"
},
{
"name": "offset ",
"kind": "variable",
"range": {
"start": {
"file": "calibration.hocon",
"line": 18,
"column": 7,
"byte_offset": 298
},
"end": {
"file": "calibration.hocon",
"line": 18,
"column": 14,
"byte_offset": 305
}
},
"visibility": "unknown"
},
{
"name": "due-date ",
"kind": "variable",
"range": {
"start": {
"file": "calibration.hocon",
"line": 23,
"column": 1,
"byte_offset": 327
},
"end": {
"file": "calibration.hocon",
"line": 23,
"column": 10,
"byte_offset": 336
}
},
"visibility": "unknown"
}
]
}
symbols lists all 15 pairs, including the repeated range-ohms and offset from both channels; each reported name carries a trailing space, since act101 reports the pair's key text exactly as HOCON's grammar spans it, up to the =.
Query
18 query tools, the same on every supported language. Descriptions live in the shared reference: /docs/query-tools.
callers control_flow data_flow definition diagnostics effect_closure effect_summary fix_auto get_type graph import_organize interface mutations references repo_outline skeleton symbols symbols_batch