BeamScope MCP
Provides tools for introspection and interaction with running Elixir/BEAM applications, including evaluating code, retrieving logs, inspecting processes, ETS tables, supervision trees, and more.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@BeamScope MCPshow me the latest error logs"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
BeamScope MCP
A robust MCP (Model Context Protocol) server for Elixir applications. BeamScope gives AI coding agents access to your running BEAM application through a resilient TCP architecture that survives app restarts.
Why BeamScope?
BeamScope was built to solve a fundamental problem with HTTP-based MCP servers like TideWave: when your Elixir app restarts, the connection dies and doesn't reconnect.
This is particularly painful during development when you're:
Running
mix compileafter making changesRestarting your app to pick up config changes
Experiencing crashes that trigger supervisor restarts
BeamScope uses a standalone TCP architecture where a TypeScript bridge maintains the connection to your AI agent and automatically reconnects when the Elixir app comes back up.
Traditional HTTP-based MCP (TideWave):
┌─────────────┐ HTTP ┌──────────────────────┐
│ AI Agent │ ──────────────► │ Phoenix Endpoint │ ← Dies when app restarts
└─────────────┘ │ (Plug-based MCP) │
└──────────────────────┘
BeamScope Architecture:
┌─────────────┐ stdio ┌───────────────────┐ TCP ┌─────────────────┐
│ AI Agent │ ─────────────► │ TypeScript │ ──────────► │ Elixir │
│ │ │ Bridge │ reconnects │ GenServer │
└─────────────┘ │ (stays running) │ on restart │ (BeamScope) │
└───────────────────┘ └─────────────────┘Related MCP server: harness-fe
Design Philosophy
Generic Elixir/BEAM, Not Framework-Specific
BeamScope works with any Elixir application, not just Phoenix. The tools are useful across the entire Elixir ecosystem:
project_eval— Evaluate code in your running applicationget_logs— Retrieve application logs with filteringget_docs— Access local documentation for modules and functions
We intentionally excluded framework-specific tools (Ecto, Ash, Phoenix) to keep BeamScope portable and focused on what every BEAM app has in common.
No Default Ports — Fail Loudly
BeamScope has no default port anywhere in the stack. If the port isn't configured, the app crashes at startup with a clear error message telling you exactly what to add to your config.
This prevents the maddening situation where your Elixir app is listening on one port and the MCP bridge is trying to connect on another. Every port must be explicitly configured in both places.
Installation
BeamScope MCP has two components: an Elixir library (TCP server + tools) and a TypeScript bridge (MCP protocol). Both run locally — clone the repo first, then reference it as a path dependency.
1. Clone the repo
cd ~/your/projects # or wherever you keep local deps
git clone https://github.com/JediLuke/BeamScope-MCP.git beam_scope_mcp2. Add to your Elixir project
Reference the cloned repo as a path dependency:
# mix.exs
def deps do
[
{:beam_scope_mcp, path: "../beam_scope_mcp", only: :dev}
]
endAdjust the path to wherever you cloned it relative to your project.
mix deps.get3. Configure the port (required)
# config/config.exs (or config/dev.exs)
config :beam_scope_mcp,
port: 9995,
app_name: "MyApp"Optionally allow env var override:
# config/runtime.exs
if port = System.get_env("BEAM_SCOPE_MCP_PORT") do
config :beam_scope_mcp, port: String.to_integer(port)
end4. Build the TypeScript bridge
cd /path/to/beam_scope_mcp
npm install
npm run build5. Configure your AI coding agent
Add BeamScope to your project's .mcp.json:
{
"mcpServers": {
"beam-scope-mcp": {
"type": "stdio",
"command": "node",
"args": ["/absolute/path/to/beam_scope_mcp/dist/index.js"],
"env": { "BEAM_SCOPE_MCP_PORT": "9995" }
}
}
}Important: The BEAM_SCOPE_MCP_PORT env var must match the port in your Elixir config. If it's missing, the TypeScript bridge will exit immediately with an error.
Available Tools (20)
Connection
Tool | Description |
| Establish TCP connection. Port pre-configured via env var. |
| Check current connection status. |
Core
Tool | Description |
| Application logs with tail/grep/level filtering. |
| Evaluate Elixir code in the running app with timeout. |
| Local documentation for modules/functions via |
Compilation
Tool | Description |
| Recompile the project from within the BEAM. Returns errors/warnings. |
| Hot-reload a single module from its source file. Fastest feedback loop. |
| Force recompile dependencies. Args required (e.g. |
System & Process Introspection
Tool | Description |
| Memory, schedulers, process counts, uptime, IO stats. |
| Filterable/sortable process listing (by name, memory, queue size). |
| Detailed info: function, memory, links, monitors, stacktrace. |
| Internal state of GenServers via |
| Process dictionary metadata (Logger metadata, flags, etc.). |
Application & OTP
Tool | Description |
| Runtime application config (what the BEAM has loaded, not files on disk). |
| Recursive OTP supervision tree walk. App name required. |
ETS
Tool | Description |
| All ETS tables with size, memory, type, protection, owner. |
| Read ETS table contents with row limits and truncation. |
Code Intelligence
Tool | Description |
| Find all callers of a module or function via |
Tracing
Tool | Description |
| Trace function calls on a module. Writes to file in |
| Emergency stop for any running trace. Safe to call even if no trace is running. |
Running Multiple Applications
Each application uses a different port:
# App 1: config/config.exs
config :beam_scope_mcp, port: 9995
# App 2: config/config.exs
config :beam_scope_mcp, port: 9994Each app's .mcp.json passes the matching port via BEAM_SCOPE_MCP_PORT.
Architecture
beam_scope_mcp/
├── lib/
│ ├── beam_scope_mcp.ex # Public API
│ └── beam_scope_mcp/
│ ├── application.ex # OTP Application (fail-loudly port config)
│ ├── server.ex # TCP GenServer + command dispatch
│ ├── log_capture.ex # Logger handler + circular buffer
│ └── tools/
│ ├── logs.ex # get_logs
│ ├── eval.ex # project_eval
│ ├── docs.ex # get_docs
│ ├── recompile.ex # recompile, reload_module, recompile_deps
│ ├── system_stats.ex # get_system_stats
│ ├── processes.ex # list_processes, get_process_info/state/dictionary
│ ├── app_config.ex # get_app_config
│ ├── supervision_tree.ex # get_supervision_tree
│ ├── ets.ex # list_ets_tables, inspect_ets_table
│ ├── xref.ex # xref_callers
│ └── trace.ex # trace_calls, stop_trace (writes to /tmp/beam_scope_traces/)
├── src/
│ ├── index.ts # MCP server entry point
│ ├── connection.ts # TCP connection (requires BEAM_SCOPE_MCP_PORT env var)
│ └── tools.ts # Tool definitions and handlers
└── dist/ # Compiled TypeScript (gitignored)Tool Selection Eval
Tool descriptions are optimized so LLMs select the correct tool for each task. See EVAL.md for 18 test scenarios and results (17/18 pass on Claude Opus 4.6).
Migrating from TideWave
See MIGRATION_FROM_TIDEWAVE.md for a step-by-step guide.
License
MIT
Available Tools
20 toolsconnect_beam_scope_mcpA
Connect to the BeamScope MCP server running in your Elixir application. The TCP port is pre-configured via BEAM_SCOPE_MCP_PORT env var. Do NOT guess the port. If connection fails, look up the correct port in the Elixir config: check config/runtime.exs, config/dev.exs, or config/config.exs in the current project for config :beam_scope_mcp, port: <number>. Then check .mcp.json to ensure the BEAM_SCOPE_MCP_PORT env var matches. This must be called before using other BeamScope tools (get_logs, project_eval, etc.).
| 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 explains the pre-configured port via env var, warns not to guess the port, and provides a concrete fallback procedure for debugging. This level of detail about connection prerequisites and failure handling is highly transparent.
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 appropriately sized for the tool's complexity, with each sentence providing valuable information: main purpose, port configuration, troubleshooting steps, and ordering requirement. It is front-loaded with the core purpose and avoids 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?
Given no output schema, the description covers the essential aspects: what it does, prerequisites, failure recovery, and ordering. The only gap is the lack of explicit statement about return behavior or idempotency, but for a connection tool, this is minor and the description is otherwise comprehensive.
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 baseline is 4. The description adds significant context about how the connection is configured (via BEAM_SCOPE_MCP_PORT and Elixir config), which is directly relevant to invocation even though there are no explicit parameters. This goes beyond the empty 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's purpose: 'Connect to the BeamScope MCP server running in your Elixir application.' It uses a specific verb+resource and explicitly differentiates from siblings by noting it 'must be called before using other BeamScope tools,' making it distinct from status, logs, and eval tools.
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 provides explicit when-to-use guidance: 'This must be called before using other BeamScope tools.' It also gives detailed troubleshooting steps for connection failures (check config files, .mcp.json). However, it does not mention alternatives or when not to use, which would push it to a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_app_configA
Get runtime application configuration — what the BEAM actually has loaded (not what's in the config files on disk). Includes runtime.exs overrides, env var substitutions, and dynamic Application.put_env changes.
WHEN TO USE: You need to check config values (ports, feature flags, module settings) as the running app sees them. NOT FOR: System health metrics (use get_system_stats). Process-level inspection (use get_process_info/state).
| Name | Required | Description | Default |
|---|---|---|---|
| app | Yes | Application name (e.g. "merlinex", "phoenix", "beam_scope_mcp") | |
| key | No | Specific config key (optional — omit for all config) |
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 key behavioral traits: runtime vs disk config, inclusion of runtime.exs overrides, env var substitutions, and dynamic Application.put_env changes. This goes beyond a simple 'get' and helps the agent understand what to expect. However, it does not mention return format or error behavior, which is a minor gap.
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 well-structured and front-loaded. The first sentence defines the tool, followed by a useful clarification, then crisp WHEN TO USE/NOT FOR directives. Every sentence adds value with no fluff.
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 read-only config retrieval tool with no output schema, the description is complete. It explains the tool's scope, distinguishes it from disk config, provides alternatives, and implies the typical use cases. The absence of output schema is compensated by describing the content of the runtime config.
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 baseline is 3. The description does not add parameter-specific details beyond what the schema already provides, but it does contextualize usage ('check config values for ports, feature flags, module settings'), which slightly reinforces the semantic meaning of app and key.
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 with a specific verb and resource: 'Get runtime application configuration'. It distinguishes itself from similar tools by clarifying 'what the BEAM actually has loaded (not what's in the config files on disk)', which sets it apart from other inspection tools like get_system_stats and get_process_info.
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?
Explicit WHEN TO USE and NOT FOR sections are provided, naming exact alternatives for excluded cases: 'System health metrics (use get_system_stats)' and 'Process-level inspection (use get_process_info/state)'. This gives the agent clear routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_beam_scope_mcp_statusA
Check if connected to an Elixir app and get server details. The port is configured via BEAM_SCOPE_MCP_PORT env var — if not set, check your .mcp.json env config.
| 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 transparency burden. It adds useful context about the BEAM_SCOPE_MCP_PORT env var dependency, but it does not describe what 'server details' includes, the expected return format, behavior when not connected, or whether the operation is purely read-only (though 'check' implies no side effects).
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 primary purpose in the first sentence. The second sentence adds a valuable configuration note without redundancy. No wasted words.
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 zero-parameter tool with no output schema, the description is decent but lacks specific return details—what exactly are 'server details'? It would benefit from listing fields like node name, port, or connection state. Without an output schema, the description should compensate, but it remains somewhat vague.
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?
There are zero parameters, giving a baseline of 4. The description correctly does not attempt to explain parameters since the input schema is empty, and no additional parameter semantics are needed.
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: 'Check if connected to an Elixir app and get server details.' This uses a specific verb ('check') and identifies the resource ('connection to Elixir app', 'server details'), distinguishing it from sibling tools like connect_beam_scope_mcp which establishes the connection.
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 usage context is implied: use when you need to verify connectivity. However, there is no explicit guidance on when to use this tool versus alternatives (e.g., connect_beam_scope_mcp), nor any mention of when not to use it. The additional env var configuration hint is helpful for setup but does not clarify tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_docsA
Get @moduledoc/@doc documentation for an Elixir module or function. Reads from compiled .beam files (local, no network).
WHEN TO USE: You need to understand what a function does, its parameters, or how to use a module. NOT FOR: Finding what calls a function (use xref_callers). Evaluating code (use project_eval).
Examples: "GenServer", "String.split", "String.split/2", "c:GenServer.handle_call/3" (prefix c: for callbacks).
| Name | Required | Description | Default |
|---|---|---|---|
| reference | Yes | Module name, Module.function, or Module.function/arity |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses that documentation is read from compiled .beam files and that no network access is involved, which are important behavioral traits. It could add more about error handling or return format, but the core behavior is well explained.
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 with sections for purpose, when to use, not for, and examples. Every sentence contributes useful information, and there is 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 1-parameter tool with no output schema, the description covers purpose, usage constraints, examples, and exclusions. It provides sufficient context for an agent to select and invoke the tool correctly without needing additional information.
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 has 100% coverage for the single reference parameter, and the description adds substantial value by providing example formats (Module, Module.function, Module.function/arity, callback prefix). This gives the agent concrete syntax guidance beyond the schema's generic type definition.
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 identifies the tool as retrieving @moduledoc/@doc documentation for Elixir modules/functions. It specifies the resource (Elixir documentation) and distinguishes itself from siblings by noting it reads from compiled .beam files locally and is not for finding callers or evaluating code.
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 provides explicit 'WHEN TO USE' and 'NOT FOR' sections, naming alternatives like xref_callers and project_eval. It also clarifies the local-only nature (no network) and gives concrete usage examples, making it clear when to select this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_logsA
Your primary debugging tool. Retrieve application logs from the running Elixir app — errors, warnings, crash reports, and application output. This is the ONLY source of log data; no other tool provides it.
WHEN TO USE: First step when diagnosing any problem. Check logs before drawing conclusions from other tools. NOT FOR: System resource usage (use get_system_stats). Process-level details (use get_process_info).
Use grep to filter (e.g. "error", "warning", "timeout") and level to filter by severity. Logs are in a circular buffer so old entries may be discarded.
| Name | Required | Description | Default |
|---|---|---|---|
| grep | No | Filter logs with regex pattern (case insensitive). E.g., "error" to find error messages | |
| tail | Yes | Number of log entries to return from the end | |
| level | No | Filter by log level |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full responsibility. It discloses that logs reside in a circular buffer and old entries may be discarded, which is a critical operational caveat. It also clarifies the tool is the sole log source and how grep/level filtering work. While it doesn't describe the exact return format, the disclosure is substantial.
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 well-structured with WHEN TO USE and NOT FOR sections, making it scannable. However, 'Your primary debugging tool' and 'Check logs before drawing conclusions from other tools' are somewhat redundant. Minor redundancy aside, every other sentence adds distinct value and there is no 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 3 parameters, no output schema, and no annotations, the description fully equips an agent: it covers the tool's purpose, when to use it, how to filter, and a key behavioral caveat (circular buffer). It also prevents misuse by pointing to alternative tools. This is contextual complete for effective selection and invocation.
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 baseline is 3. The description adds practical guidance: recommends grep patterns (error, warning, timeout), explains level filters by severity, and implies tail returns entries from the end. This goes beyond the schema's terse property descriptions and helps an agent use parameters effectively.
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 it retrieves application logs from the running Elixir app, enumerating content types (errors, warnings, crash reports, application output). It also asserts this is the ONLY source of log data, distinguishing it from sibling tools. The verb 'Retrieve' plus the resource 'logs' is specific and unambiguous.
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?
Provides an explicit WHEN TO USE section: 'First step when diagnosing any problem' and 'Check logs before drawing conclusions from other tools.' It gives explicit NOT FOR scenarios with named alternatives: system resource usage → get_system_stats, process-level details → get_process_info. This clear directive leaves no doubt about when to choose this tool over siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_process_dictionaryA
Read the process dictionary — hidden metadata stored outside the main state. Contains OTP internals like $ancestors, $initial_call, plus any custom entries (Logger metadata, step context, flags).
WHEN TO USE: You need metadata that isn't in the GenServer state — OTP ancestry, custom flags, or debugging context. NOT FOR: The process's main data (use get_process_state). Process vitals like memory/stacktrace (use get_process_info).
| Name | Required | Description | Default |
|---|---|---|---|
| pid | Yes | PID string (e.g. "<0.123.0>") or registered name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses the dictionary's location, contains examples of entries, and notes it's a read operation ('Read'). It does not mention error handling for invalid PIDs or return format, but the scope is well explained.
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?
Description is compact and front-loaded with the core purpose. The WHEN TO USE / NOT FOR structure is highly scannable, and every sentence adds value.
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 tool with one parameter, the description covers what, why, and when to use it, plus sibling differentiation. No output schema exists, but the description adequately sets expectations.
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% with a single well-described parameter ('PID string or registered name'). The description adds no extra parameter detail but doesn't need to since schema already fully documents it.
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 it 'Read the process dictionary' and explains it's hidden metadata outside main state. It explicitly distinguishes from siblings by listing what it contains (OTP internals like $ancestors) and what it's NOT for (main state, vitals).
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?
Provides explicit WHEN TO USE (metadata not in GenServer state, OTP ancestry, flags) and NOT FOR sections naming specific alternatives (get_process_state, get_process_info). This gives clear decision guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_process_infoA
Get metadata ABOUT a process: what function it's running, memory usage, message queue length, links, monitors, stacktrace.
WHEN TO USE: You want to know what a process IS and what it's DOING — its identity and vital signs. NOT FOR: The data the process is holding (use get_process_state). Metadata in the process dictionary (use get_process_dictionary). Use list_processes first to find PIDs/names if you don't know them.
| Name | Required | Description | Default |
|---|---|---|---|
| pid | Yes | PID string (e.g. "<0.123.0>") or registered name (e.g. "MyApp.Worker") |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and largely succeeds: it communicates a read-only metadata operation and lists exactly what aspects are queried. It does not mention possible failure modes or whether it could block, but for a simple getter these are minor gaps, and the described behavior is transparent enough for typical agent use.
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, using bolding and section labels to front-load the core purpose. Every sentence serves a decision-making purpose—what it does, when to use, what not to use, and how to bootstrap the parameter—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 single-parameter metadata tool with no output schema, the description covers purpose, content, and usage disambiguation thoroughly. It omits explicit return format or error behavior, but the listed metadata categories and clear guidance make it practically complete for correct tool selection and invocation.
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 gives 100% coverage for the single pid parameter, including format examples. The description adds a helpful tip to use list_processes for discovery, but this is contextual guidance rather than enriching the parameter's meaning. Baseline 3 applies for high schema coverage.
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 ('Get') and resource ('metadata about a process'), enumerating exact content types (function, memory usage, queue length, links, monitors, stacktrace). It explicitly contrasts with sibling tools get_process_state and get_process_dictionary, making the purpose unmistakable and distinct.
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 provides an explicit 'WHEN TO USE' section ('identity and vital signs') and a 'NOT FOR' section that names the precise alternative tools for excluded cases. It also advises using list_processes first when the PID/name is unknown, giving clear actionable guidance for selection and sequencing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_process_stateA
Get the DATA a GenServer is holding — its internal state (the value in the GenServer's loop).
WHEN TO USE: You want to see the actual data/state inside a process — what it's storing, its current values. NOT FOR: Process metadata like memory/links/stacktrace (use get_process_info). Process dictionary entries (use get_process_dictionary). Note: may timeout if the process is busy or doesn't support :sys messages.
| Name | Required | Description | Default |
|---|---|---|---|
| pid | Yes | PID string (e.g. "<0.123.0>") or registered name (e.g. "MyApp.Worker") | |
| timeout | No | Timeout in milliseconds (default: 5000) |
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 adds a critical caveat that the operation may timeout if the process is busy or doesn't support :sys messages, which is valuable for invocation planning. It doesn't cover all potential behaviors (e.g., side effects or process suspension), but for a read-only state retrieval that is sufficient.
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 well-structured with a concise lead sentence, then clearly labeled WHEN/NOT FOR sections, and a final note. Every sentence adds value and the text is front-loaded with the core 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?
Given the tool's low complexity (two params, one output concept), the description is complete. It explains what data is returned, when to use it, when not to, and a limitation. No output schema is needed since 'state' is self-explanatory.
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 fully describes both parameters (pid and timeout), providing a baseline of 3. The description adds behavioral context for the timeout parameter by noting it may timeout if the process is busy, connecting the parameter to real-world behavior. This elevates the score above baseline.
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 retrieves the internal state/data held by a GenServer process, using a specific verb ('Get') and resource (GenServer's loop state). It distinguishes itself from sibling tools like get_process_info and get_process_dictionary by explicitly narrowing scope to the internal data value.
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 provides explicit 'WHEN TO USE' and 'NOT FOR' sections with concrete alternatives, telling the agent when to use this tool versus get_process_info or get_process_dictionary. This directly addresses usage guidance and avoids ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_supervision_treeA
Get the OTP supervision tree for an application. Recursively walks supervisors showing the full hierarchy of processes with PIDs, types, and child counts.
You MUST specify the app name. Use get_app_config or project_eval with Application.started_applications() to find app names if unsure.
| Name | Required | Description | Default |
|---|---|---|---|
| app | Yes | Application name (required — e.g. "merlinex", "phoenix") | |
| depth | No | Max recursion depth (default: 10) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the burden of transparency. It discloses the recursive behavior ('Recursively walks supervisors'), the output content ('PIDs, types, and child counts'), and the prerequisite ('You MUST specify the app name'). While it does not explicitly state that the operation is read-only or describe error handling, the getter nature is implied and the behavioral description is informative enough for an agent to infer the tool's impact. This earns a 4.
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 well-structured sentences: the first states core purpose with output detail, the second gives a prerequisite and a fallback discovery method. It is front-loaded, every sentence serves a distinct function, and there is no redundant or filler content. Perfectly concise for the tool's complexity.
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?
Given the tool's simplicity, the description covers the essential context: what it returns (hierarchy with PIDs, types, child counts), the required input (app name), and a way to resolve the input if unknown. It does not mention behavior for unknown apps or when depth might be insufficient, but this is a minor omission for a getter tool. The output schema is absent, so the description's return-value hints are useful and adequate.
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%, with both parameters already described in the schema. The description adds value by emphasizing the app parameter's mandatory nature ('You MUST specify the app name') and providing guidance on how to find valid app names, which goes beyond the schema's field descriptions. It also reinforces the depth parameter indirectly through the demonstrated recursive behavior. This exceeds the baseline of 3.
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 purpose: 'Get the OTP supervision tree for an application.' It specifies the verb ('Get'), the resource ('OTP supervision tree'), and the scope ('for an application'), and goes further to describe what it does ('Recursively walks supervisors showing the full hierarchy of processes with PIDs, types, and child counts'). This distinguishes it from sibling tools like list_processes or get_process_info, which focus on individual processes rather than the hierarchical tree.
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 provides clear usage context: 'You MUST specify the app name' and gives a fallback approach for finding valid app names ('Use get_app_config or project_eval with Application.started_applications() to find app names if unsure'). This tells the agent when and how to use the tool, but it does not explicitly state when not to use it or name alternative tools for different scenarios. It's a minor gap, so a 4 is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_system_statsA
Get BEAM runtime health: memory usage, scheduler count, process/port/atom counts, uptime, IO throughput.
WHEN TO USE: You want a system-level health snapshot — is memory growing? How many processes are running? How long has the app been up? NOT FOR: Application configuration (use get_app_config). Individual process details (use get_process_info). Checking for errors (use get_logs — system stats don't show errors).
| 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 the full burden. It discloses the specific data it returns, and it explicitly notes a limitation ('system stats don't show errors'). It does not explicitly state it's read-only, but the nature of the tool (health snapshot) and lack of parameters makes this clear. It could have added more about potential performance cost or frequency limits, but for a simple read-only tool, this is sufficient.
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 and well-structured. It front-loads the core purpose in the first sentence, then provides usage guidance in clearly labeled sections. Every sentence serves a purpose with no redundancy or fluff.
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 zero-parameter tool with no output schema, the description is complete. It explains what the tool does, what data it returns, when to use it, when not to use it, and its limitations. The sibling context further clarifies its position in the API. No additional details are necessary for an agent to select and invoke it correctly.
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 input schema trivially has 100% coverage. The baseline for 0 params is 4, and the description correctly omits any parameter details since there are none. No additional semantics are needed.
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 purpose with a specific verb ('Get') and resource ('BEAM runtime health') and lists the exact metrics returned (memory, scheduler count, process/port/atom counts, uptime, IO throughput). It effectively distinguishes itself from sibling tools like get_app_config, get_process_info, and get_logs.
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 includes explicit WHEN TO USE and NOT FOR sections with named alternative tools (get_app_config, get_process_info, get_logs), providing clear guidance on when to choose this tool over others. This is exemplary usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
inspect_ets_tableA
Read the contents of an ETS table. Returns rows from the table, limited to avoid massive output.
Use list_ets_tables first to find table names, then inspect specific tables.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max rows to return (default: 20) | |
| table | Yes | ETS table name (e.g. "my_cache"). Use list_ets_tables to find names. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the burden of disclosing behavior. It mentions that output is limited to avoid massive output, which is useful context. However, it does not elaborate on error behavior, return format, or clearly state it is a read-only operation (though 'Read' implies this). It adds some behavioral insight but not rich detail.
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, efficiently conveying the core purpose, a warning about output limits, and a usage prerequisite. Every sentence earns its place with no wasted words.
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 tool with two parameters, no output schema, and no annotations, the description covers the key aspects: what it does, the limit behavior, and the recommended workflow. It does not explain edge cases like nonexistent tables or exact row formatting, but these are not critical for a straightforward inspection tool. Overall, it is sufficiently 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 description coverage is 100%, so the baseline is 3. The description does not add significant parameter-specific meaning beyond the schema; it only reiterates that output is limited, which is already captured by the 'limit' parameter description. Therefore, a 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 clearly states the tool reads and returns ETS table rows, using a specific verb and resource. It also distinguishes itself from the sibling tool 'list_ets_tables' by positioning itself as the follow-up step after listing table names, preventing confusion.
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 explicitly advises using 'list_ets_tables first to find table names, then inspect specific tables.' This provides clear context on when to use the tool relative to its sibling. However, it does not explicitly state exclusions or alternative tools for other scenarios, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_ets_tablesA
List all ETS tables with metadata: name, row count, memory, type, protection, owner. Sorted by memory descending.
WHEN TO USE: Discover what ETS tables exist, find tables using the most memory. NEXT STEP: Use inspect_ets_table with the table name to read its contents.
| 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 transparently lists the metadata fields returned and the sorting order, making the tool's behavior predictable. It doesn't mention performance or side effects, but as a straightforward read-only listing tool, this is sufficient.
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 succinct and well-structured, with the main action and output fields in the first sentence, followed by a 'WHEN TO USE' and 'NEXT STEP' section. Every sentence provides useful guidance, with no wasted words.
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 zero-parameter tool with no output schema, the description is complete. It specifies what will be returned (metadata fields and sorting) and gives practical context for when to invoke it, plus a follow-up action. There are no gaps in understanding.
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?
There are zero parameters, and the schema coverage is 100% since it has no properties. The description doesn't need to explain parameters, and the baseline for 0 params is 4. It adds value by describing the output, which is more than enough.
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 lists all ETS tables with specific metadata fields (name, row count, memory, type, protection, owner) and mentions sorting by memory descending. This distinguishes it from sibling tools like inspect_ets_table, which reads table contents.
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?
It provides a 'WHEN TO USE' section explicitly stating the tool is for discovering existing ETS tables and finding the most memory-intensive ones. It also suggests a concrete next step (use inspect_ets_table), though it doesn't explicitly say when not to use it. This is clear context, just missing explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_processesA
List running BEAM processes — find them by name, sort by memory or queue size. Returns summary info for each process.
WHEN TO USE: You need to discover what processes exist, find a specific process by name, or identify processes using the most memory/having the largest queues. NEXT STEP: Once you have a PID or name, use get_process_info, get_process_state, or get_process_dictionary for details.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max processes to return (default: 50) | |
| sort_by | No | Sort processes by this field (descending) | |
| name_filter | No | Filter by registered name (case-insensitive substring match) | |
| min_message_queue | No | Only show processes with at least this many messages in their queue |
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 clearly implies a read-only operation ('List running BEAM processes') and describes the return type ('summary info'). While it doesn't explicitly state 'does not modify state' or mention permissions, the nature of the tool as a list/query operation is evident and sufficient for a simple read-only tool.
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 and well-structured: a brief purpose statement, a one-sentence summary of returns, and clearly labeled 'WHEN TO USE' and 'NEXT STEP' sections. Every sentence adds value without redundancy, and the format is front-loaded.
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 list tool with four optional parameters, no output schema, and no annotations, the description adequately covers usage, return type at a high level, and next-step context. The only gap is that 'summary info' is vague about which fields are included, but given the tool's simplicity and sibling tools, this is acceptable.
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%, and the description adds little beyond the schema. It mentions sorting by memory or queue size, which aligns with the sort_by enum, but the schema already documents all four parameters with clear descriptions. Baseline 3 is appropriate since 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 clearly states the verb 'List' and the resource 'running BEAM processes', and specifies what can be done (find by name, sort by memory or queue size). It effectively distinguishes itself from siblings like get_process_info, get_process_state, and get_process_dictionary by describing a summary-level discovery operation.
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 includes a dedicated 'WHEN TO USE' section that explicitly lists use cases: discovering processes, finding by name, or identifying high-memory/large-queue processes. It also provides a 'NEXT STEP' section naming specific alternative tools (get_process_info, get_process_state, get_process_dictionary), which is excellent guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
project_evalA
Evaluate Elixir code in the context of the running application. This is the general-purpose escape hatch — use it when no specific tool exists for what you need.
PREFER specific tools over project_eval when they exist:
Need logs? Use get_logs, not project_eval with Logger
Need process info? Use get_process_info/get_process_state, not project_eval with Process.info
Need to recompile? Use recompile or reload_module
Need ETS data? Use list_ets_tables/inspect_ets_table
Need docs? Use get_docs
Need callers? Use xref_callers
Use project_eval for one-off operations that don't have a dedicated tool. The code runs with full access to your application's modules, dependencies, and runtime state.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | Elixir code to evaluate | |
| timeout | No | Max execution time in milliseconds (default: 30000) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses that code runs with full access to application modules, dependencies, and runtime state, which implies potential side effects. However, it stops short of explicitly warning about destructive operations or error handling, so a slight gap remains.
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 well-structured and front-loaded with the primary purpose, followed by a clear list of alternatives. Every sentence adds distinct value, and the bullet-point style improves scannability without verbosity.
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?
Given that this is a general-purpose evaluation tool with no output schema, the description covers all essential context: what it does, when to use it, when to avoid it, what alternatives exist, and the level of access granted. It is sufficiently complete for an agent to decide and invoke correctly.
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 provides 100% coverage for both parameters (code and timeout) with clear descriptions. The tool description adds context that the code executes within the running application, but doesn't elaborate on parameter syntax, defaults, or edge cases beyond what the schema already states.
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 evaluates Elixir code in the running application context, using the specific verb 'Evaluate' and naming the resource. It differentiates itself as a general-purpose escape hatch, contrasting with specific sibling tools like get_logs and recompile.
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 explicitly tells when to use project_eval (one-off operations with no dedicated tool) and when not to, providing a list of preferred alternatives for common tasks like logs, process info, recompilation, ETS data, docs, and callers.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
recompileA
Recompile the entire project from within the running BEAM. Returns errors/warnings.
WHEN TO USE: After changing multiple files, or when you're not sure what changed. This is equivalent to mix compile. NOT FOR: Single file changes (use reload_module instead — much faster). Dependencies (use recompile_deps instead).
| 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 must disclose behavior. It states the operation ('Recompile the entire project'), the context ('from within the running BEAM'), and the return value ('errors/warnings'). It adds that it is equivalent to 'mix compile'. It could go further by noting potential side effects like module reloading, but the core behavior is well disclosed.
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 and well-structured: a clear one-sentence summary, followed by succinct 'WHEN TO USE' and 'NOT FOR' sections. Every sentence earns its place, zero waste.
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 parameterless tool with no output schema, the description provides sufficient context: what it does, when to use it, when not to, and what it returns. It also draws clear boundaries with sibling tools. No gaps.
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 100% (empty schema). With no parameters, the description does not need to add parameter semantics, and the baseline for 0 params is 4. The description stays focused on behavior and usage.
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 purpose: 'Recompile the entire project from within the running BEAM.' It uses a specific verb and resource, and distinguishes itself from siblings by explicitly naming reload_module and recompile_deps as alternatives.
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?
Provides explicit WHEN TO USE and NOT FOR sections, naming specific alternatives (reload_module for single file changes, recompile_deps for dependencies). This gives clear guidance on when to select this tool over siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
recompile_depsA
Force recompile Elixir dependencies (not the project itself).
WHEN TO USE: When a local path dependency's source has changed, or to force-rebuild a specific dep. You MUST specify the args parameter. NOT FOR: Project code (use recompile or reload_module).
| Name | Required | Description | Default |
|---|---|---|---|
| args | Yes | Args passed to mix deps.compile (required). E.g. ["--force"] for all deps, or ["jason", "--force"] for a single dep. |
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 explains that the tool force-recompiles dependencies (not the project) and emphasizes the mandatory args parameter. It does not mention side effects like clearing build caches or potential duration, but for a command wrapper this is acceptable. The 'MUST specify args' constraint is a behavioral trait beyond the mere schema required flag, adding some 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 short sentences plus two labeled usage sections. It front-loads the core purpose, then gives actionable guidance. Every sentence earns its place with no fluff or redundancy.
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 single-parameter tool with no output schema, the description is sufficient. It covers the purpose, usage nuances, and explicitly names alternatives. It does not describe return values or failure behavior, but the tool acts as a wrapper around mix deps.compile, so the outcome is predictable. A 4 is warranted given no annotations or output schema to lean on.
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 describes the only parameter (args) thoroughly with examples and meaning ('Args passed to mix deps.compile'). Schema coverage is 100%. The description merely repeats that args must be specified, adding little over the schema. Baseline of 3 is appropriate since 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 clearly states the tool's function: 'Force recompile Elixir dependencies (not the project itself).' The verb 'force recompile' plus the resource 'dependencies' and the scope exclusion 'not the project itself' precisely define the tool's purpose. It also distinguishes from sibling tools by explicitly naming alternatives in the 'NOT FOR' section.
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 provides explicit WHEN TO USE guidance (local path dependency source changed, or to force-rebuild a specific dep) and NOT FOR guidance (project code, with alternatives recompile or reload_module). This clearly tells the agent when to select this tool versus its siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reload_moduleA
Hot-reload a single module from its source file. Fastest possible feedback loop — change one file, reload it, test immediately.
WHEN TO USE: After changing a single .ex file. No full recompile needed. NOT FOR: Multiple file changes (use recompile). Dependencies (use recompile_deps).
| Name | Required | Description | Default |
|---|---|---|---|
| file | Yes | Full path to the .ex or .exs file to reload (e.g. "/home/luke/workbench/flx/merlinex/lib/my_module.ex") |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full transparency burden. It discloses the hot-reload behavior and notes no full recompile is needed, which conveys the lightweight, runtime-mutating nature. However, it does not mention potential side effects (e.g., impact on running processes) or error behavior.
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 and well-structured: a clear one-sentence purpose, followed by tightly scoped WHEN/NOT FOR sections. Every sentence contributes value with no redundancy.
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 or annotations, the description covers purpose, usage context, and exclusions. It does not explain return values or error handling, but that is not critical for a hot-reload utility and the guidance is otherwise 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?
The input schema already provides 100% coverage for the single 'file' parameter, including a detailed description with an example path. The tool description adds no additional semantic detail beyond what the schema provides.
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 ('Hot-reload') and identifies the exact resource ('single module from its source file'). It distinguishes itself from sibling tools by naming alternatives like recompile and recompile_deps.
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?
Explicit 'WHEN TO USE' and 'NOT FOR' sections clearly state the ideal scenario and, importantly, identify alternative tools for other cases. This provides direct decision-making guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
stop_traceA
Abort a running trace early. You do not normally need to call this — traces auto-stop when they hit their max_calls or max_seconds limit and clean up after themselves. This is only useful if you want to cancel a trace before it finishes on its own. Safe to call even if no trace is running.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full transparency burden. It discloses that traces auto-stop with max_calls/max_seconds limits and clean up, and that this tool is for early cancellation. It also states it's safe to call with no trace running, implying no error or side effect. However, it doesn't explain what happens to trace data (e.g., partial results) or return value, but given the tool's simplicity, it provides sufficient behavioral 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 three sentences long and front-loaded with the action. The second sentence provides context on normal behavior (auto-stop), and the third covers the edge case of no running trace. Every sentence adds value with no fluff or repetition.
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: 0 params, no output schema, no annotations. The description covers the purpose, when to use it, the lifecycle context, and safety. It is reasonably complete for the tool's complexity. It might be improved by mentioning what the call returns or any side effects on trace data, but for a simple stop operation, the description provides enough context to use it correctly.
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 0 parameters, and the schema coverage is 100% (effectively nothing to cover). Per the rubric, 0 params results in a baseline score of 4. The description adds context about the trace lifecycle but no parameter details are needed. This 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 immediately states the tool's action: 'Abort a running trace early.' This is a specific verb+resource and clearly distinguishes stop_trace from its sibling trace_calls, which presumably starts traces. It also clarifies the trace lifecycle, making the purpose obvious.
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 explicitly explains when NOT to use the tool ('You do not normally need to call this') and when it IS useful ('if you want to cancel a trace before it finishes on its own'). It also notes that traces auto-stop and clean up, providing clear guidance for typical scenarios. Additionally, it mentions that it's safe to call even when no trace is running, which is helpful behavior guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
trace_callsA
Start tracing function calls on a module. This tool does NOT return the trace results directly — it writes them to a file and returns the file path.
WORKFLOW:
Call this tool → you get back a file path (e.g. /tmp/beam_scope_traces/MyModule_20260323_221503.log)
Wait a few seconds for the trace to collect events
Read the file using your normal file reading tools (Read tool) to see the trace results
The trace auto-stops when it hits max_calls or max_seconds — you do NOT need to call stop_trace
WHY A FILE: Traces collect events over time and can be large. Writing to a file lets you read just the parts you need (head, tail, grep for patterns).
The file contains timestamped entries like: [22:15:03.001] #1 #PID<0.599.0> MyModule.my_function("arg1", 42)
All parameters except function are REQUIRED. max_calls capped at 200, max_seconds capped at 30.
| Name | Required | Description | Default |
|---|---|---|---|
| module | Yes | Module to trace (e.g. "Merlinex.Core.Manager"). Required. | |
| function | No | Specific function name (optional — omit to trace all functions in the module) | |
| max_calls | Yes | Stop after this many calls (required, max 200) | |
| max_seconds | Yes | Stop after this many seconds (required, max 30) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full behavioral disclosure. It reveals that the tool is asynchronous (writes to a file and returns a path), auto-stops after limits, and includes a sample log entry format. This is far beyond the bare minimum and gives the agent a clear picture of what to expect.
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 well-structured with clear sections (WORKFLOW, WHY A FILE) and is appropriately sized for the tool's complexity. Every sentence serves a purpose, and the key 'returns a file path' point is front-loaded. No wasted words.
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?
Without an output schema, the description fully explains the return value (file path), the file format, and the multi-step workflow. It also clarifies auto-stop behavior and resource limits. This is complete enough for an agent to use the tool confidently.
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 the baseline is 3. The description does not add meaning beyond the schema; it reiterates required parameters and caps that are already in the property descriptions. The example log line is a nice extra but doesn't change parameter semantics.
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 verb and resource: 'Start tracing function calls on a module.' It also distinguishes itself by explaining the key behavioral nuance that it writes to a file rather than returning results directly, which separates it from siblings like stop_trace or get_logs.
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 provides a detailed workflow (call, wait, read file) and states that stop_trace is not needed. However, it does not explicitly compare this tool to specific alternatives like get_logs or xref_callers, so the 'when to use vs alternatives' is only implied rather than directly stated. The workflow and notes on required params offer clear context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
xref_callersA
Find all callers of a module or function across the project — "what depends on this?"
WHEN TO USE: Impact analysis before refactoring. "What breaks if I change this function?" "Who calls this module?" NOT FOR: Understanding what a function does (use get_docs). Seeing runtime call flow (use trace_calls).
| Name | Required | Description | Default |
|---|---|---|---|
| reference | Yes | Module or Module.function/arity (e.g. "Merlinex.Core.Manager" or "Enum.map/2") |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It conveys the tool is a static cross-reference lookup ('across the project' and 'what depends on this?') and distinguishes it from runtime call flow via trace_calls. However, it does not explicitly state whether the operation is read-only or describe the output format, leaving minor gaps for an unannotated tool.
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: main action in the first sentence, followed by WHEN TO USE and NOT FOR. Every sentence contributes value, with no redundant 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 has a single well-documented parameter, no output schema, and no annotations. The description covers purpose, usage context, and clear exclusions, making it sufficient for tool selection and invocation. The lack of output format details is a minor omission but not critical for this simple tool.
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 fully documents the only parameter, reference, with a clear description and examples. Since schema coverage is 100%, the description adds no additional parameter meaning beyond the schema, which aligns with the baseline of 3.
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 the tool's specific verb and resource: 'Find all callers of a module or function across the project' and immediately clarifies the intent with 'what depends on this?'. This distinguishes it clearly from siblings like get_docs and trace_calls, which are explicitly named in the NOT FOR section.
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?
Explicit WHEN TO USE ('Impact analysis before refactoring') and NOT FOR sections, with named alternatives ('use get_docs', 'use trace_calls'), provide direct guidance on when to use this tool versus siblings. This leaves no ambiguity about tool selection.
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 clearly distinct purpose with explicit 'WHEN TO USE' and 'NOT FOR' guidance. Overlapping concepts like process info/state/dictionary are precisely differentiated, and project_eval is positioned as a fallback with clear directives to prefer specific tools.
Tool names are mostly lowercase snake_case and follow a verb-first pattern like get_*, list_*, inspect_*, recompile, reload, trace_calls, stop_trace. Minor deviations include xref_callers and project_eval, which are less conventional in order but still readable and consistent in style.
20 tools is within the heavy range (16-25) and might feel overwhelming. However, the server covers a broad domain (logs, processes, ETS, supervision, tracing, compilation, docs, eval), so the count is defensible. Still, it is on the higher end and could benefit from consolidation.
The toolset provides comprehensive coverage for debugging a running BEAM application: connection, logs, system stats, process introspection, ETS inspection, supervision tree, app config, compilation, tracing, docs, xref, and a general eval fallback. No critical dead ends exist; gaps can be filled via project_eval.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
AI Agent with Architectural Memory. Impact analysis (free), tests and code from the graph (pro).
AI agent observability for production traces, natural-language insights, and improvement loops.
Live browser debugging for AI assistants — DOM, console, network via MCP.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceLiveTap connects live data streams (MQTT, WebSocket, file tailing) to AI coding agents, enabling real-time monitoring and alerting through natural language.139MIT
- AlicenseNot gradedqualityAmaintenanceA source-aware MCP server that connects AI agents to browser and server runtimes, enabling real-time debugging, monitoring, and automatic fixes via WebSocket or HTTP.2MIT

Tidewave Railsofficial
AlicenseNot gradedqualityAmaintenanceBetter agentic Rails development, runtime-level tools for your agent to talk to your running app.475Apache 2.0
Tidewave Phoenixofficial
AlicenseNot gradedqualityBmaintenanceBetter agentic Elixir Phoenix development, runtime-level tools for your agent to talk to your running app.847Apache 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/JediLuke/BeamScope-MCP'
If you have feedback or need assistance with the MCP directory API, please join our Discord server