Raxol
This server lets you drive and inspect headless Raxol app sessions and manage its adaptive UI feedback loop.
Start headless Raxol sessions from a module or script path, with optional screen dimensions and custom session IDs.
List active sessions, stop sessions, and inspect the current TEA model state as an Elixir term.
Send keystrokes (characters, special keys, and modifiers) to sessions and capture plain-text screenshots of the updated screen.
Retrieve the latest adaptive layout recommendation, including layout changes, confidence, and reasoning.
Accept or reject layout recommendations to feed positive or negative signal into the feedback loop.
View feedback-loop acceptance accuracy and behavior aggregates such as pane dwell times, command frequency, scroll metrics, alert response times, and takeover duration.
Allows Raxol to deliver UI snapshots and agent interactions to Telegram, using Telegram as one of the supported surfaces for the orchestration subsystem.
Raxol
Recursively, axol. Forever FOSS.
Write one app. Render it to a terminal, a browser, an SSH session, or an agent.
Your application is a single TEA module (init, update, view) running as an OTP GenServer. Raxol renders that module to four surfaces from one codebase:
+---> Terminal (termbox2 NIF)
|
TEA module (GenServer) -+---> Browser (Phoenix LiveView)
|
+---> SSH (Erlang :ssh)
|
+---> Agent (MCP tools)The interesting part is the runtime. Your app gets crash isolation per Component, hot code reload without restart, distributed clustering with CRDTs, and an agent surface where LLMs interact with structured Component trees instead of scraping pixels. Those are BEAM properties, from a VM built for systems that can't go down, can't lose state, and hot-swap code while running.
Bubble Tea, Ratatui, and Textual are excellent renderers. A2UI and AG-UI define agent-UI wire formats. Raxol is the runtime that renders all four surfaces from one source module. See Why OTP for the framework comparison, and Why Raxol for how the runtime compares to Python agent stacks like Hermes and Omnigent.
Agents
Raxol is a runtime for agents as much as for humans. Every interactive Component automatically exposes MCP tools (Button gives click, TextInput gives type_into/clear/get_value), and a focus lens filters to roughly 15 relevant tools per interaction. Where A2UI and AG-UI define how agents talk to UIs at the wire level, raxol generates the UI and the agent surface from one Component tree: same source, two projections.
import Raxol.MCP.Test
import Raxol.MCP.Test.Assertions
session = start_session(MyApp)
session
|> type_into("search", "elixir")
|> click("submit")
|> assert_component("results", fn c -> c[:content] != nil end)
|> stop_session()mix mcp.server starts the MCP server on stdio for Claude Code integration, and mix raxol.code is an interactive terminal coding agent (the axol face) with every mutating tool call gated by an ALLOW/ASK/DENY authorization engine. See the Coding Agent.
Code is the coding-agent product, in two hands-on surfaces: mix raxol.code is the interactive terminal TUI (the axol face ≡··≡), and mix raxol.p is its headless twin (prompt in on argv, answer to stdout, contract events to stderr) for pipes and CI. Every mutating tool call is gated by an ALLOW/ASK/DENY authorization engine. From a clone, one setup command and one launch:
(cd packages/raxol_agent && mix deps.get) # once
bin/raxol-code # the TUI, your cwd as the workspaceNo API key configured? The TUI opens on a provider wizard instead of failing. /inspect (or mix raxol.inspect from packages/raxol_agent) shows every config source the agent will use in the current directory.
Sessions are durable. Each session journals its events to disk, so --continue and --resume <id> restore the model context and the scrollback together, --replay <id> prints a transcript straight from the journal (--to-offset N stops at an offset), /rewind drops back to an earlier turn, and /share mints a signed 24-hour link to a read-only transcript that follows the session live (needs RAXOL_SHARE_SECRET and a host mounting Raxol.Agent.Code.ShareLive).
The same TUI serves over SSH: mix raxol.code --ssh --ssh-tenants /srv/tenants hosts many users from one daemon, each behind their own public key with their own cwd jail, session store, and spending identity (ssh <you>@your-host -p 2222 is the whole client). Single-tenant (--authorized-keys) and hosted deployment (RAXOL_SSH_CODE=true) are in Coding Agent.
Two unattended surfaces run the same agent. bin/raxol-acp (or mix raxol.acp) serves it over the Agent Client Protocol on stdio, for editors that spawn an agent themselves; Raxol.Agent.Harness.McpTools registers harness_start_session, harness_send_prompt, harness_read_transcript, and harness_list_sessions with the MCP registry, so a session started by an MCP client resumes later in the TUI. The ACP surface runs the full toolset with every sensitive call gated on a session/request_permission round trip, fail-closed on the decision: a client that refuses, times out, or does not implement permissions denies the write and keeps reading. The MCP surface stays read-only: write_file, edit_file, and bash are absent where nobody is there to answer an approval prompt.
Every one of those surfaces sits on the Harness, the agent-session engine: a durable event journal (Raxol.Agent.Journal), a typed event/command contract (Raxol.Agent.Contract), and surface state that is a pure fold over the event stream (Raxol.Harness.Projection), with staged interrupt, steer, and spend/blast-radius gates underneath. The same engine can supervise external agent CLIs (claude, cursor) as readily as Raxol's own loop. See Harness architecture.
The agent subsystems ship as standalone packages:
Pay (
raxol_payments): wallets, ledger-enforced spending limits, and transparent auto-pay when an agent hits an HTTP 402, across five protocols (x402, MPP, Xochi cross-chain, Permit2, Riddler).Earn (
raxol_earn): the sell side. Declare an offering, implement two callbacks, and a buyer agent discovers it, escrows funds, and settles on-chain through the Virtuals ACP job lifecycle (request, negotiation, transaction, evaluation, completed), one supervised process per job. Pre-alpha.Improve (
raxol_agent): a solved task becomes a reusableSKILL.md. A background reviewer runs on a cheap model after each turn, writing durable memory and new skills without spending the live turn's latency or context.Reach (
raxol_gateway): one adapter contract to many chat platforms, process-per-chat sessions, DM pairing for authorization, and/handoffto move a conversation across platforms with its history intact.Orchestrate (
raxol_symphony): an OTP port of OpenAI Symphony that polls a tracker, isolates each issue in its own workspace, and runs a coding agent, feeding six surfaces (terminal, LiveView, MCP, Telegram, Watch, JSON API) from one snapshot.Bridge (
raxol_agent_client_protocol): Elixir/OTP implementation of the Agent Client Protocol: the JSON-RPC 2.0 wire protocol between code editors and AI coding agents (the protocol Zed and a growing ecosystem speak). Bidirectional agent/client roles, pluggable transports (stdio, in-process), and durable resumable sessions (offset-based reattach/replay) as a vendor extension. Zero raxol-internal deps. Pre-alpha.
Related MCP server: terminal-use-mcp
Install
# mix.exs
def deps do
[{:raxol, "~> 2.6"}]
endOr generate a new project:
mix raxol.new my_appWith Nix, nix develop drops you into a shell with the full BEAM and NIF toolchain (no local Elixir install required):
nix develop github:DROOdotFOO/raxol # dev shell with elixir, erlang, NIF + speech depsTry it
git clone https://github.com/DROOdotFOO/raxol.git
cd raxol && mix deps.get
mix raxol.playground # 41 live demos, browse/search/filterThe flagship demo is a live BEAM dashboard with scheduler utilization, memory sparklines, and a process table:
mix run examples/demo.exsSee examples/README.md for the full learning path, including agent examples, swarm demos, and the sandboxed REPL.
Headless environment (CI, containers, agents)? The whole build-and-test path needs no tty:
mix local.hex --force # fresh machines and CI: install Hex without a prompt
mix deps.get
mix compile # termbox2 NIF needs make + a C compiler
SKIP_TERMBOX2_TESTS=true MIX_ENV=test mix test --exclude slow --exclude integration --exclude docker
MIX_ENV=test mix raxol.rate # RATE: render-determinism golden suitePrerequisites, the quality gate, and constrained-sandbox notes are in Development.
Performance
Full frame in 5.0ms on Apple M1 (Elixir 1.20 / OTP 29), 31% of the 60fps budget.
What | Time |
Full frame (create + fill + diff) | 5.0 ms |
Tree diff (100 nodes, 1 changed) | 32 us |
Cell write (single) | 1.4 us |
Buffer create (80x24) | 0.32 us |
Emulator ingest (parse + apply, plain) | 1.7 ms |
Memory per 80x24 buffer | 2 KB |
Measured 2026-08-07 at fce2465bb with mix run bench/suites/comparison/framework_comparison.exs (full mode). The ingest row is the whole emulator path (parse plus state application), not the standalone ANSI lexer, which handles plain text in under a microsecond (mix raxol.bench parser).
Unix/macOS backend uses a termbox2 NIF; Windows uses a pure Elixir driver (usable, not yet tuned). See the benchmark suite.
Documentation
Start with the documentation index, or jump to the Quickstart, feature catalog, package map, or API docs.
Development
Working from source needs Elixir/OTP (versions in mise.toml) and a C
toolchain: the termbox2 NIF compiles with make and cc (on Debian/Ubuntu,
apt-get install build-essential). nix develop provides all of it in one
shell. Every command below runs headless: no terminal is required for the
build, the test suite, or the golden checks.
git clone https://github.com/DROOdotFOO/raxol.git
cd raxol
mix local.hex --force # fresh machines and CI: install Hex without a prompt
mix deps.get
mix compile # builds the termbox2 NIF
SKIP_TERMBOX2_TESTS=true MIX_ENV=test mix test --exclude slow --exclude integration --exclude docker
MIX_ENV=test mix raxol.rate # RATE: render-determinism golden suite
mix raxol.check # full gate: format, compile, credo, dialyzer, security, docs, rate, test
mix raxol.check --quick # skip dialyzer
mix raxol.demo # built-in demos (needs a terminal)SKIP_TERMBOX2_TESTS=true excludes the tests that need a real local terminal
(pty lifecycle, timing-sensitive suites); CI sets the same variable. Plain
mix test without the exclude flags also runs integration suites that need
external services (the workflow checkpoint tests want PostgreSQL via
RAXOL_WORKFLOW_PG_URL), so stick to the command above unless you have
them. In sandboxes where HOME is read-only, point MIX_HOME and
HEX_HOME at a writable directory before running mix.
Origin
Raxol started as two converging ideas: a terminal for AGI, where AI agents interact with a real terminal emulator the same way humans do; and an interface for the cockpit of a Gundam Wing Suit, where fault isolation, real-time responsiveness, and sensor fusion are survival-critical. The Gundam thing sounds like a joke. Then you look at the constraint set and it's exactly what OTP was built for: systems that can't go down, can't lose state, and have to hot-swap components while running.
Built with Raxol
Xochi is a private cross-chain DEX (intent-based swaps across 6 chains, sub-3s settlement, stealth addresses by default, ZKSAR compliance proofs) whose entire trading surface is raxol. One Component tree projects four ways: an SSH trader terminal, a LiveView web UI, a solver-agent surface for Riddler's sub-2ms solver, and an ops cockpit running sensor fusion on solver health. The solver executes behind a dedicated fail-closed stack (buyer-pre-signed intents, ledger-enforced spend gates, deployment guards that refuse to run unconfigured), kept deliberately off the MCP surface, so no fund-moving action is reachable as a generic tool call.
foglet-bbs by Brendan Turner is an SSH-only retro bulletin board (bbs.foglet.io, ssh bbs.foglet.io) that stress-tested raxol's SSH path into shape.
License
MIT. See LICENSE.md.
Available Tools
11 toolsadaptive_accept_recommendationA
Accepts a pending layout recommendation by ID. This feeds positive signal into the feedback loop for model improvement.
| Name | Required | Description | Default |
|---|---|---|---|
| recommendation_id | Yes | The recommendation ID to accept |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden of behavioral disclosure. It adds context by noting that acceptance 'feeds positive signal into the feedback loop for model improvement,' but it does not disclose other potential side effects like reversibility, permissions, or response behavior. This is a moderate level of transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the core action, and every sentence adds value. No fluff or redundant repetition of schema fields.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter tool with no annotations or output schema, the description explains the purpose and a key behavioral consequence (feedback loop). It is adequate for the tool's complexity, though it could mention prerequisites or return values. Overall, sufficiently complete but not exhaustive.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already fully documents 'recommendation_id.' The description adds identifying context ('pending layout recommendation') but does not go beyond the schema's parameter meaning. Baseline 3 applies because the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Accepts') and resource ('pending layout recommendation by ID'). It clearly differentiates from sibling tools like adaptive_reject_recommendation by emphasizing the accept action and the feedback loop purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use this tool (for accepting a pending layout recommendation) but does not explicitly mention alternatives or when not to use it. The existence of adaptive_reject_recommendation as a sibling is not referenced, so usage guidance is only implied rather than explicitly contrasted.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
adaptive_get_accuracyA
Returns the feedback loop acceptance accuracy as a percentage. Tracks how often layout recommendations are accepted vs rejected.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden of behavioral disclosure. It explains the output (a percentage) and the underlying logic (acceptance vs rejection), but it does not detail how the percentage is computed, whether it is session-based, or any other behavioral nuances. It is transparent at a basic level but not exhaustive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two short sentences, front-loaded with the primary purpose and immediately followed by a clarifying statement. Every word earns its place, with no redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple no-parameter getter with no output schema, the description sufficiently explains what is returned and the metric's meaning. It does not specify when data is available or how to interpret extreme values, but those are minor gaps given the tool's simplicity. The presence of related sibling tools provides surrounding context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so there is nothing for the description to clarify beyond the schema. According to the rule, a baseline of 4 is appropriate when no parameters exist. The description adds meaning by explaining what the output represents, but parameter semantics are not applicable.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool 'Returns the feedback loop acceptance accuracy as a percentage.' This is a specific verb (returns) and resource (acceptance accuracy), and it distinctively differs from sibling tools like adaptive_accept_recommendation or adaptive_get_recommendation by focusing on the aggregate metric rather than individual actions or recommendations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is used to check how often recommendations are accepted vs rejected, but it does not explicitly state when to use it or contrast it with alternatives. No exclusions or specific contexts are provided, making usage guidance merely implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
adaptive_get_behavior_summaryA
Returns recent behavior aggregates from the BehaviorTracker. Shows pane dwell times, command frequency, scroll metrics, alert response times, and takeover duration.
| Name | Required | Description | Default |
|---|---|---|---|
| window_count | No | Number of recent aggregate windows to return (default: 3) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description bears the full burden for behavioral disclosure. It begins with 'Returns' which implies a read-only operation, and it lists the types of data provided, but it does not explicitly state that it is side-effect-free, lack of required permissions, or any limitations. The metric list adds context, but key behavioral traits are left implicit.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise: two sentences total. The first sentence states the core purpose, and the second lists specific metrics. No filler or redundant wording exists, and the structure front-loads the key information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only tool with one optional parameter and no output schema, the description is fairly complete. It lists the main categories of returned data, giving the user a clear idea of what to expect. It could mention the format of the aggregates or the time window, but these are not essential given the tool's low complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already provides a complete description for the only parameter (window_count, with default of 3), yielding 100% schema coverage. The description adds no additional explanation about the parameter's effect or usage, so it does not enhance the schema. A baseline of 3 is appropriate since the schema fully covers the parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: it 'Returns recent behavior aggregates from the BehaviorTracker' and enumerates specific metrics like pane dwell times, command frequency, scroll metrics, alert response times, and takeover duration. This specific verb+resource pairs with an explicit list of outputs, distinguishing it from sibling tools such as adaptive_get_accuracy.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit guidance on when to use this tool versus alternatives. While the content implies it is appropriate for retrieving behavior summaries, it does not mention exclusions or mention sibling tools like adaptive_get_accuracy or adaptive_get_recommendation. No when-to-use/when-not-to-use context is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
adaptive_get_recommendationA
Returns the most recent layout recommendation from the adaptive UI system. Includes layout changes (hide/show/expand/shrink), confidence score, and reasoning. Returns null if no recommendation has been generated yet.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It clearly states the return type, contents (layout changes, confidence, reasoning), and the null return when no recommendation exists. It does not disclose potential side effects, but the 'get' nature implies a read-only operation, and the description adds meaningful behavioral context beyond the tool name.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, each earning its place: the first states the primary purpose, the second lists the response contents, and the third covers the null case. It is front-loaded with the key action and avoids any redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a getter with no parameters and no output schema, the description fully explains the return value, including what is included (layout changes, confidence, reasoning) and the null condition. No additional context is needed for effective use, making it complete given the tool's simplicity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the schema requires no additional description. The description inherently provides all needed parameter context (i.e., none). Per the baseline for 0 parameters, a score of 4 is appropriate since no parameter explanations are necessary.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('returns') and identifies a clear resource ('most recent layout recommendation from the adaptive UI system'). It also distinguishes the tool from siblings by specifying its content (layout changes, confidence, reasoning), which sets it apart from tools like adaptive_get_accuracy or adaptive_reject_recommendation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is for retrieving the latest recommendation, but it doesn't explicitly state when to use it compared to alternatives like adaptive_accept_recommendation or adaptive_reject_recommendation. There is no mention of prerequisites, exclusions, or a 'use this when' context, so guidance is only implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
adaptive_reject_recommendationA
Rejects a pending layout recommendation by ID. This feeds negative signal into the feedback loop for model improvement.
| Name | Required | Description | Default |
|---|---|---|---|
| recommendation_id | Yes | The recommendation ID to reject |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It discloses a key side effect ('feeds negative signal into the feedback loop for model improvement'), which is helpful. However, it does not state whether the rejection is reversible, what happens to the recommendation afterward (e.g., removed, marked), or any permissions needed. It also implies the recommendation must be 'pending' but does not explicitly state the precondition.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences long, front-loaded with the main action in the first sentence, and the second sentence provides useful additional context. There is no redundant or irrelevant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple with one parameter and no output schema. The description covers what the tool does and the purpose (negative feedback loop). It is largely complete for an agent to use correctly, though it could mention what a successful rejection returns or any error conditions. However, given the simplicity, the description is sufficiently informative.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema description coverage is 100%, and the parameter description ('The recommendation ID to reject') fully explains the parameter. The tool description adds context that the ID refers to a 'pending layout recommendation,' which adds some meaning beyond just 'recommendation ID,' but it does not substantially enhance the parameter understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Rejects') and identifies the exact resource ('pending layout recommendation') and the identifier used ('by ID'). This clearly differentiates it from sibling tools, especially adaptive_accept_recommendation which is the opposite action.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the usage context by stating the action ('Rejects a pending layout recommendation') but does not explicitly mention alternative tools or when to prefer this over adaptive_accept_recommendation or adaptive_get_recommendation. The when-to-use is clear from the action, but there are no explicit exclusions or comparisons.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
raxol_get_modelA
Returns the current TEA model (application state) of a headless Raxol session as an inspected Elixir term.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Session identifier |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry the burden. It discloses the return format ('inspected Elixir term') and the context ('headless Raxol session') but does not explicitly state side effects, read-only nature, or error behavior. For a simple getter, this is minimally adequate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no redundant words. Every phrase adds value: the resource, the context, and the return format are all present.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter getter, the description covers the core: what is returned, the return format, and the session context. It does not mention potential error conditions or whether a session must already exist, but given the simplicity and full schema coverage, it is largely complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the parameter 'id' has a description ('Session identifier'). The tool description adds no additional parameter context, but the baseline of 3 applies when the schema fully documents parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb 'Returns' and a specific resource 'current TEA model (application state)', clearly distinguishing this tool from sibling tools like raxol_start and raxol_screenshot. The headless session qualifier adds precision.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives. The description does not mention exclusions, prerequisites, or complementary tools, leaving the agent without context for selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
raxol_listA
Lists all active headless Raxol sessions.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full responsibility for behavioral disclosure. It states the scope ('active headless') but omits any details about side effects, permissions, rate limits, or how 'active' is defined. The description essentially only repeats the function name's verb 'Lists' with minimal added context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no unnecessary words. It clearly and efficiently communicates the tool's purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple list tool with no parameters and no output schema, the description is largely complete. However, it does not mention what the return format will be or clarify the concept of 'active' sessions, which could be relevant context for an agent. This is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and the schema coverage is trivially 100%. The description adds no parameter information, but none is needed. The baseline for 0 parameters is 4, and the description does not detract from that.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb 'Lists' and identifies the resource as 'all active headless Raxol sessions'. This clearly distinguishes it from sibling tools like raxol_start and raxol_stop, which perform different actions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when you want to retrieve active headless sessions, but it does not explicitly state when to use this tool instead of alternatives, nor does it mention any exclusions or prerequisites. It provides no comparison with sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
raxol_screenshotA
Captures a text screenshot of a running headless Raxol session. Returns the current screen content as plain text (no ANSI codes).
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Session identifier |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It adds useful detail about the output format (plain text, no ANSI codes) and implies a read-only screenshot operation, but it does not explicitly state that the tool has no side effects or what happens if the session is invalid.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two concise sentences, front-loaded with the core action and followed by a key output detail. No filler or redundant phrasing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple single-parameter tool with no output schema, the description covers the essential purpose and return format. It could mention error behavior or session prerequisites, but overall it is sufficient for a tool of this complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already has 100% coverage for the single parameter 'id', with a clear description ('Session identifier'). The tool description adds no additional parameter detail beyond naming the session, so a baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Captures a text screenshot') and the resource ('a running headless Raxol session'), making the tool's purpose immediately clear. It distinguishes itself from sibling tools like raxol_stop or raxol_send_key by focusing on capturing screen content.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The context of use is clear: it applies to a running headless session and returns plain text. However, it does not explicitly mention when not to use it or name alternative tools, falling short of full usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
raxol_send_keyA
Sends a keystroke to a headless Raxol session and returns the updated screen content. Supports character keys ("q", "j", " "), special keys ("tab", "enter", "escape", "backspace", "up", "down", "left", "right"), and modifiers (ctrl, alt, shift).
Examples: {"id": "demo", "key": "tab"} {"id": "demo", "key": "q"} {"id": "demo", "key": "c", "ctrl": true}
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Session identifier | |
| alt | No | Hold Alt modifier (default: false) | |
| key | Yes | Key to send: a character ("q", "j") or special key name ("tab", "enter", "escape", "up", "down", "left", "right", "backspace") | |
| ctrl | No | Hold Ctrl modifier (default: false) | |
| shift | No | Hold Shift modifier (default: false) | |
| wait_ms | No | Milliseconds to wait for dispatch processing before screenshot (default: 50) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It transparently discloses the supported input types (characters, special keys, modifiers) and the output behavior (returns updated screen content). It does not mention error handling or edge cases, but for a keystroke tool this is acceptable and adds meaningful behavioral context beyond just the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and well-structured. It opens with the core action, lists supported key categories in a parenthetical, and provides three clear JSON examples. Every sentence contributes essential information without redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with six parameters and no output schema, the description is reasonably complete. It explains what the tool does, what inputs are accepted, and that it returns 'updated screen content'. The absence of a detailed return format is a minor gap, but the examples and schema cover the essential usage context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already provides 100% parameter coverage, so the baseline is 3. The description adds value by enumerating valid character and special key examples, showing modifier usage patterns, and clarifying that 'wait_ms' controls dispatch delay. The examples in the description reinforce and extend the schema definitions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's action: 'Sends a keystroke to a headless Raxol session' and explicitly notes it returns updated screen content. This is a specific verb+resource pairing that distinguishes it from sibling tools like raxol_screenshot (which only captures screen) and raxol_start/stop (which manage sessions).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when you need to send keyboard input to a Raxol session, supported by examples and key types. However, it does not explicitly state when to use this tool over alternatives (e.g., when to use raxol_screenshot instead) or any exclusions, leaving the guidance implicit rather than direct.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
raxol_startA
Starts a headless Raxol session. Accepts either a module name (atom) or a file path to an example script. Returns the session ID.
Examples: {"module": "RaxolDemo"} {"path": "examples/demo.exs", "id": "demo"} {"module": "RaxolDemo", "width": 120, "height": 40}
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Session identifier (default: derived from module name) | |
| path | No | File path to an example script (e.g. "examples/demo.exs"). Mutually exclusive with module. | |
| width | No | Screen width in columns (default: 120) | |
| height | No | Screen height in rows (default: 40) | |
| module | No | Module name as a string (e.g. "RaxolDemo"). Mutually exclusive with path. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden of behavioral disclosure. It explicitly mentions headless mode, return value (session ID), and the accepted input forms (module or path). It does not detail error handling or lifecycle behavior, but the core behaviors are transparent enough for a start operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, front-loaded with the main purpose, and includes well-chosen examples. Every sentence serves a purpose without redundancy. The structure—overview, acceptance criteria, return value, examples—makes it easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 5 parameters and no output schema, the description covers the key context: session ID return, input options, and example configurations. It omits error behavior and session lifecycle, but the given information is sufficient for basic usage. More details on mutual exclusion enforcement could improve completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so parameters are already well-documented. The description adds examples but introduces a minor inconsistency by calling the module an 'atom' while the schema specifies a string. It clarifies mutual exclusivity and defaults implicitly through examples, but does not add significant meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool 'Starts a headless Raxol session' with a specific verb and resource. It distinguishes from siblings like raxol_stop or raxol_list by focusing on the initiation action. The provided examples further clarify the function's scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use the tool (to start a session) and provides usage examples with module or path. It does not explicitly list exclusions or alternatives, but the naming and examples make the intended context clear. Slight gap in not stating when not to use (e.g., when a session already exists).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
raxol_stopA
Stops a running headless Raxol session and frees its resources.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Session identifier |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses the core side effect (stops session, frees resources) but does not mention idempotency, error behavior (e.g., if session already stopped), permissions, or whether the action is reversible. The mutation nature is clear, but additional context is missing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that is direct and front-loaded with the verb 'Stops'. It contains no redundant or filler wording.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with one parameter and no output schema, the description adequately explains the tool's purpose and core side effect. However, it omits behavioral details like idempotency and error handling, which would make it fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% since the only parameter 'id' has a description ('Session identifier'). The tool description adds no extra meaning beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb 'stops' and clearly identifies the resource ('running headless Raxol session') plus the side effect ('frees its resources'). This clearly distinguishes it from siblings like raxol_start and raxol_list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for terminating a session but provides no explicit guidance on when to use versus alternatives, when not to use, or prerequisites. The word 'running' suggests it only applies to active sessions but this is not made explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
Every tool has a unique action and target. The raxol_ and adaptive_ prefixes clearly separate the two functional areas, and within each prefix, each tool performs a distinct operation (e.g., start vs. stop vs. list vs. screenshot).
Both tool groups follow a consistent prefix + verb or verb_noun pattern (raxol_start, raxol_send_key, adaptive_get_recommendation). The only deviation is raxol_screenshot, which uses a noun instead of a verb form, but it is still clear and not confusing.
11 tools is well within the ideal 3-15 range. Each tool serves a distinct purpose in managing headless sessions and interacting with the adaptive recommendation feedback loop, with no redundancy.
The toolset covers the full lifecycle of headless sessions (start, stop, list) plus interaction (send_key, screenshot, get_model). The adaptive tools provide a complete feedback loop: accuracy, behavior summary, recommendation retrieval, and accept/reject actions. No obvious dead ends.
Maintenance
Related MCP Connectors
Stealth web browser for agents: search, fetch, click, download and type in persistent MCP sessions.
Your org's AI agents, tasks, runs, search, and brain files as MCP tools and resources.
Develop, manage, and debug Railway projects, services, and deployments from within agents.
Operate Linux, macOS and Windows from your LLM. Every action runs through an auditable allowlist.
Related MCP Servers
- AlicenseAqualityCmaintenanceWhat Chrome DevTools MCP is for the browser, tui-mcp is for the terminal. Launch any TUI app, take screenshots, send keystrokes, read text - works with any framework.133912MIT
- AlicenseBqualityBmaintenanceLocal + remote terminal interaction control MCP Server. Lets AI agents control interactive TUI programs the way a human would.2913MIT
- AlicenseNot gradedqualityCmaintenanceProvides AI agents with fully interactive terminal sessions, including TUI support, keyboard control, and screen capture across Windows, Linux, and Mac.MIT
- AlicenseNot gradedqualityCmaintenanceEnables MCP clients to launch and interact with terminal/TUI programs, providing tools to inspect and control live CLI/TUI sessions.111Apache 2.0
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/DROOdotFOO/raxol'
If you have feedback or need assistance with the MCP directory API, please join our Discord server