CERN ROOT MCP Server
This server lets you discover, inspect, validate, read, analyze, and export data from CERN ROOT files, while also querying capabilities and switching analysis modes.
List ROOT files in configured named resources, with optional glob patterns and limits.
Inspect ROOT file structures, including directories, TTrees, RNTuples, and histograms.
List branch names and types in a TTree or RNTuple.
Validate ROOT file integrity.
Read selected branches with optional cuts, derived variables, entry ranges, limits, offsets, and jagged-array flattening.
Compute branch statistics, including derived variables and selections.
Export selected branches to JSON, CSV, or Parquet files, with optional compression and selections.
Switch the server-wide analysis mode between core and extended.
Query server mode, capabilities, accessible resources, and request limits via server info.
Click on "Deploy 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., "@CERN ROOT MCP ServerPlot the muon pT distribution from sample.root"
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.
Repository Mirror: This repository is mirrored to CERN GitLab for CERN users. PyPI releases are published via GitHub Actions using attestation-based trusted publishing.
ROOT-MCP empowers Large Language Models (LLMs) to natively understand and analyze CERN ROOT files.
By exposing a set of specialized tools via the Model Context Protocol (MCP) or a token-efficient CLI interface, it turns Claude (and other MCP-compliant agents) into capable physics research assistants that can:
Inspect ROOT file structures (Trees, RNTuples, Branches, Histograms)
Analyze data distributions (Compute Histograms, Statistics)
Compute kinematic quantities (Invariant Mass)
Visualize results (Plot 1D/2D histograms directly)
Filter data using physics cuts ("selections")
Why this matters: Instead of asking an LLM to "write a script" that you have to debug and run, you can ask the LLM to "Check the muon pT distribution in this file" and it will just do it.
Two Interfaces: MCP Server and CLI
ROOT-MCP provides two ways to interact with ROOT files:
1. MCP Server (for Codex, Claude Code and other MCP clients)
Full JSON-RPC protocol support
Structured input/output for programmatic use
Best for: MCP-compliant LLM clients, automated workflows
2. ROOT CLI (root-cli)
Human-readable output by default
Simpler architecture (no server process)
Best for: Direct LLM interaction, debugging, scripting
Both interfaces share the same analysis backend. MCP also provides resource discovery and server capability information.
Related MCP server: XRootD MCP Server
Quick Start
1. Install
pip install root-mcpOptional: For remote file access via XRootD protocol:
pip install "root-mcp[xrootd]"2. Configure
Fastest path — no config file needed:
# MCP Server
root-mcp --data-path /path/to/your/data
# CLI (token-efficient)
root-cli -d /path/to/your/data lsOr set an environment variable once:
export ROOT_MCP_DATA_PATH=/path/to/your/data3. Connect a coding agent
# Codex
codex mcp add root-mcp -- uvx root-mcp --data-path /absolute/path/to/data
# Claude Code (project scope)
claude mcp add --transport stdio --scope project root-mcp -- uvx root-mcp --data-path /absolute/path/to/dataUse /mcp in your client to check the connection. See the
LLM integration guide for development checkouts,
Antigravity CLI, Qwen Code, Pi/OMP, VS Code, Cursor, Zed, community harnesses,
authenticated HTTP and bounded analysis workflows.
The server uses MCP Python SDK 2.3+ and the 2026-07-28 protocol, with SDK compatibility for older clients. It provides discovery instructions, explicit tool safety hints, validated inputs, structured results and readable resource catalogs. Remote deployments retain authentication, resource ACLs and quotas. See the v0.3.1 release notes for the full change list.
ROOT CLI (Recommended for LLM Interaction)
The CLI provides a token-efficient, human-readable interface that provides significant token savings compared to the MCP JSON protocol.
Basic Usage
# List files
root-cli ls
# Inspect a file
root-cli inspect /data/sample.root
# Create histogram with fit
root-cli histogram /data/sample.root events muon_pt --bins 100 --fit gaussian
# Read data with selection
root-cli read /data/sample.root events met muon_pt --selection "met > 50"
# Plot results
root-cli plot1d /tmp/root_mcp/muon_pt_hist.json -o plot.png --title "Muon pT"Example LLM Workflow
Ask your LLM: "Plot the muon pT distribution"
The LLM generates:
root-cli histogram /data/sample.root events muon_pt --bins 50 && \
root-cli plot1d /tmp/root_mcp/muon_pt_hist.json -o muon_pt.png --title "Muon pT Distribution"Documentation
See docs/skills/root-cli.md for complete command reference with examples.
MCP Server
Zero-config one-liners:
# Core mode (lightweight, no scipy/matplotlib needed)
root-mcp --data-path /data --mode core
# Explicit stdio transport (same runtime as the compatibility default)
root-mcp serve-stdio --data-path /data
# Extended mode with native ROOT, restricted to one directory
root-mcp --data-path /data --enable-root --allowed-root /data
# Remote XRootD resource, no YAML needed
root-mcp --resource cms=root://xrootd.cern.ch//store --allow-remote --mode extended
# Docker / container — fully env-var driven
ROOT_MCP_DATA_PATH=/data ROOT_MCP_MODE=extended ROOT_MCP_EXPORT_PATH=/exports root-mcp
# Quiet server (only warnings+) with a cache increase
root-mcp --data-path /data --log-level WARNING --cache-size 100root-mcp serve-http serves the MCP Streamable HTTP endpoint for central
deployments. It requires explicit auth, Origin validation, restrictive central
policy, and safe bind-address settings before it starts.
For shared deployments, start with the operator docs:
docs/operator/central_deployment.md
and docs/operator/security_checklist.md.
Restrictive starter configs and Kubernetes manifests live in
examples/central/.
Operators can preview and apply export retention with
root-mcp cleanup-exports --config /etc/root-mcp/config.yaml --dry-run.
The external HTTP smoke script at
scripts/smoke_external_http_client.py
starts a temporary central server and checks it with the MCP Streamable HTTP
client.
Generate a starter config (optional):
root-mcp init --permissive # creates config.yaml pre-filled with current directoryManual config file — for persistent settings, remote resources, or native ROOT:
server:
mode: "extended" # "core" or "extended"
resources:
- name: "my_analysis"
uri: "file:///path/to/data"
allowed_patterns: ["*.root"]
security:
allowed_roots: [] # empty = any local path is accessible (permissive)Local-use warning: The permissive
allowed_roots: []default is intended for trusted local stdio sessions. Do not expose that configuration as a shared HTTP service; restrict roots and require an authenticated deployment profile before central or multi-user use.
Mode Selection:
mode: "core"— Lightweight: file operations and basic statisticsmode: "extended"— Full analysis: histograms, fitting, kinematics, correlations
Switch modes at runtime with the switch_mode tool — no restart required.
Run with Claude Desktop
Add to your claude_desktop_config.json:
{
"mcpServers": {
"root-mcp": {
"command": "root-mcp",
"args": ["--data-path", "/path/to/your/data"]
}
}
}Or with a persistent config file:
{
"mcpServers": {
"root-mcp": {
"command": "root-mcp",
"env": {
"ROOT_MCP_CONFIG": "/path/to/config.yaml"
}
}
}
}Architecture
ROOT-MCP organizes analysis capabilities into analysis tiers:
Core Mode: File I/O, data reading, and basic statistics
Extended Mode: Full analysis capabilities including fitting, kinematics, and correlations
The mode is controlled via configuration, and the server automatically loads only the components you need. Runtime mode switching is also available.
Optional Native ROOT Support
ROOT-MCP can optionally integrate with a native ROOT/PyROOT installation to unlock capabilities beyond what uproot provides:
run_root_code: Execute arbitrary PyROOT/Python code and get structured resultsrun_rdataframe: Compute histograms using ROOT's RDataFrame (no boilerplate needed)run_root_macro: Execute C++ ROOT macros viagROOT.ProcessLine
This feature is entirely optional — ROOT-MCP works fully without ROOT installed. When ROOT is available and enabled, these additional tools appear automatically.
Requirements: A working ROOT installation (via conda-forge, system package, or binary tarball). ROOT is not pip-installable at this time.
Enable it by setting enable_root: true in your config.yaml:
features:
enable_root: true
# Optional: tune execution settings
root_native:
execution_timeout: 60
working_directory: "/tmp/root_mcp_native"Use get_server_info to check ROOT availability at runtime:
{
"root_native_available": true,
"root_native_enabled": true,
"root_version": "6.32/02",
"root_features": {"rdataframe": true, "roofit": true, "tmva": false}
}Documentation
The full documentation site is built with Sphinx and covers installation, configuration, all 20 MCP tools, LLM integration patterns, and the developer guide with auto-generated API reference.
Read online: The docs are hosted at root-mcp docs
pip install "root-mcp[docs]"
./scripts/build_docs.sh
# open docs/_build/html/index.htmlFor live-reload while writing docs:
cd docs && make livehtmlHighlights:
User Guide — installation, quickstart, modes, configuration, LLM integration
Tool Reference — complete catalogue of all tools and their JSON payloads
CLI Reference — complete command reference for root-cli with examples
Developer Guide — architecture, module overview, dev setup, contributing
API Reference — auto-generated from source docstrings
Citation
If you use ROOT-MCP in your research, please cite:
@software{root_mcp,
title = {ROOT-MCP: Production-Grade MCP Server for CERN ROOT Files},
author = {Mohamed Elashri},
year = {2025},
url = {https://github.com/MohamedElashri/root-mcp}
}License
MIT License - see LICENSE for details.
Available Tools
9 toolsexport_dataADestructive
Export selected ROOT branches to a JSON, CSV or Parquet file. Writes output_path and may overwrite it. Central deployments require an artifact-relative output path and export permission.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | File path | |
| format | Yes | ||
| branches | Yes | ||
| compress | No | Compress output | |
| selection | No | Optional cut expression | |
| tree_name | Yes | Tree name | |
| output_path | Yes | Output file path |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, readOnlyHint=false and openWorldHint=true, so the safety profile is covered. The description adds genuinely new behavior: it writes output_path, may overwrite existing content, and in central deployments requires an artifact-relative path plus export permission. It stops short of stating what happens on a failed or partial write.
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?
Three sentences, front-loaded with purpose, then the mutation risk, then the deployment prerequisite. Every clause carries distinct information with no 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?
For a destructive write tool with no output schema and 71% parameter coverage, the description covers the critical unknowns: overwrite risk, path constraints, and permissions. It could still say what the tool returns or how large exports behave, but nothing essential for a correct call is missing.
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 71%, so most parameters are already documented. The description reinforces format choices (JSON/CSV/Parquet) and the output_path branch selection, but adds nothing about selection cut syntax, compress semantics, or the relationship between path and tree_name, so it does not compensate for the remaining gap.
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?
Specific verb plus resource: "Export selected ROOT branches to a JSON, CSV or Parquet file" tells the agent exactly what is produced and in what formats, which separates it from read-only siblings like read_branches and inspect_file. It does not explicitly name the sibling it replaces, so it stays short of a 5.
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?
Usage is implied by the write-to-file framing and the note that central deployments require artifact-relative paths and export permission, which is real context. However, there is no explicit "use this instead of read_branches when..." guidance or statement of when not to export, leaving the agent to infer the boundary with read_branches/get_branch_stats.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_branch_statsCRead-onlyIdempotent
Get statistics for branches (supports derived variables via defines)
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | File path | |
| defines | No | Derived variable definitions (dict of name: expression) | |
| branches | Yes | ||
| selection | No | Optional cut expression | |
| tree_name | Yes | Tree name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false, and openWorldHint, so the safety profile is covered. The description adds only that derived variables are supported via defines, but says nothing about what statistics are computed, the return shape, or any error conditions.
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 single sentence is front-loaded and free of filler. It is efficient, though the parenthetical is the only extra detail provided.
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?
With five parameters, a nested defines object, and no output schema, the description is too thin to explain what statistics are returned or how defines, selection, and tree_name interact. It leaves significant gaps 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?
Schema description coverage is 80%, so the schema already documents most parameters. The description's mention of derived variables via defines largely restates the schema and adds no new meaning about selection, tree_name, or path.
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 verb and resource: 'Get statistics for branches.' It is clear what the tool returns at a high level, but it does not distinguish itself from sibling tools such as list_branches or read_branches.
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 guidance on when to use this tool instead of list_branches or read_branches, and no prerequisites or exclusions are mentioned. The only implied usage is that it computes statistics rather than listing branches.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_server_infoARead-onlyIdempotent
Discover ROOT analysis mode, capabilities, accessible named resources and request limits. Use before choosing analysis tools; native ROOT requires a separate installation.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), so the description's job is to add context — and it does: it discloses that request limits exist and that native ROOT availability depends on a separate installation. It does not describe the shape of the returned capability data, which is the main remaining gap given there is no output 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?
Two tight sentences with the payload enumeration front-loaded and the sequencing advice second. Every clause carries information; nothing is padded or restated from the title.
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?
With no output schema, the description must convey what comes back, and it does at a high level by naming mode, capabilities, resources, and limits. A short note on the response format or whether limits are static or per-session would close the remaining 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 takes zero parameters, so there is no parameter semantics to explain and the baseline is 4. The description correctly implies the call needs no arguments to enumerate server state.
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?
States a specific verb (Discover) plus the concrete payload: ROOT analysis mode, capabilities, accessible named resources, and request limits. This clearly separates it from siblings like list_files or export_data, which operate on data rather than server configuration, though it never names a sibling it is not.
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?
'Use before choosing analysis tools' gives explicit ordering guidance that an agent can act on when planning a session. The prerequisite note about native ROOT requiring a separate installation is genuinely useful gating information, but there are no when-not-to-use conditions or named alternative discovery tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
inspect_fileARead-onlyIdempotent
Inspect a ROOT file's directories, TTrees, RNTuples and histograms before reading data. Accepts a returned path or @resource/relative.root reference. Does not modify files.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | File path |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already supply readOnlyHint, destructiveHint=false, idempotentHint and openWorldHint, so the safety profile is covered. 'Does not modify files' merely restates destructiveHint=false, and the only genuinely additive behavioral detail is the accepted path-reference format. Nothing is said about what the inspection output contains or how large it may be for complex files.
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?
Three short sentences, front-loaded with purpose, then accepted input form, then the safety note. The final sentence duplicates the destructiveHint=false annotation and would be better spent on output/behavior detail, but nothing is padded or buried.
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 one-parameter read-only tool with full annotation coverage and no output schema, the description covers purpose, usage timing and accepted path forms. The remaining gap is that an agent is not told what the inspection response looks like, which matters given the enumerated variety of ROOT objects it reports.
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?
With a single parameter at 100% schema coverage, the schema already documents 'path' as a string file path, so the baseline is 3. The description does add value by clarifying that the path may be a returned path or an @resource/relative.root reference, which is meaning the schema's bare 'File path' does not convey.
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 names a specific verb (inspect) and resource (a ROOT file) and enumerates what is surfaced: directories, TTrees, RNTuples, histograms. That is far more informative than the tool name alone, though it never explicitly contrasts itself with close siblings such as list_branches or validate_file.
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 states a clear usage window: 'before reading data', which tells the agent this is a discovery/orientation step preceding data reads. It gives no exclusions or explicit pointer to the alternative siblings (list_branches, get_branch_stats) for narrower lookups, so it stops short of a full when/when-not statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_branchesARead-onlyIdempotent
List branch names and types in a ROOT TTree or RNTuple. Use before selecting branches for reads, statistics or histograms. Does not modify files.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | File path | |
| pattern | No | Optional glob pattern | |
| tree_name | Yes | Tree name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true and openWorldHint=true. The description adds that it does not modify files, which reinforces safety but largely repeats the annotations; it does not add details about output size, permissions 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 short and front-loaded, moving from purpose to usage to safety. The sentence 'Does not modify files' is slightly redundant with annotations, but it is not wasteful enough to hurt readability.
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 listing tool with full schema coverage and rich annotations, the description covers purpose, workflow timing and safety adequately. Minor gaps remain around the optional pattern parameter and output characteristics, but the core information needed to invoke it correctly is present.
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 path, tree_name and pattern are already documented in the schema. The description adds no parameter-specific meaning beyond the general subject of branch listing.
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 verb and resource: list branch names and types in a ROOT TTree or RNTuple. This makes the operation clear, but it does not explicitly distinguish this tool from siblings like read_branches or get_branch_stats beyond the preparatory usage note.
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 gives clear contextual guidance: use before selecting branches for reads, statistics or histograms. It does not name alternative tools or state when not to use it, but the intended workflow position is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_filesARead-onlyIdempotent
List CERN ROOT files in a configured named resource. Use pattern and limit to bound discovery; inspect a returned path next. Does not modify files.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| pattern | No | Optional glob pattern | |
| resource | Yes | Resource name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=false, so 'Does not modify files' largely restates structured data. The one piece of added context is that the resource must be pre-configured and named, implying a setup prerequisite. It says nothing about result volume, truncation, or what happens when limit is hit, which the schema's maximum of 1000 hints at but does not explain.
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?
Three short clauses, front-loaded with the core action, and no filler. The final sentence 'Does not modify files' is mostly redundant with the read-only annotations and is the one element that does not earn its place.
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 small three-parameter read tool with no output schema, the description covers what it returns implicitly (paths to inspect), the knobs that bound results, and the safety profile. It could state the return shape (a list of paths) explicitly, but an agent has enough to call 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?
Schema description coverage is 67%, and the schema itself only documents pattern as 'Optional glob pattern' and resource as 'Resource name'. The description adds purpose for both pattern and limit ('to bound discovery'), which is meaningful guidance the schema lacks. It does not explain the limit default or the 1000 cap, so it adds value but not fully.
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 gives a specific verb and resource ('List CERN ROOT files') scoped to 'a configured named resource', which clearly separates it from siblings like inspect_file, list_branches, or validate_file. It stops short of explicitly naming a sibling to disambiguate against, so it is clear but not maximally differentiated.
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 tells the agent how to bound the call ('Use pattern and limit') and routes the next step explicitly ('inspect a returned path next'), which is genuine workflow guidance pointing at inspect_file. It does not state when not to use this tool (e.g. for non-ROOT files or unconfigured resources), so it falls short of a full when/when-not treatment.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_branchesARead-onlyIdempotent
Read selected branches from a ROOT TTree or RNTuple, optionally with a cut expression. Set entry_start/entry_stop to bound rows; prefer get_branch_stats or histograms for large datasets. Does not modify files.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | File path | |
| limit | No | Maximum rows to return (alternative to entry_stop) | |
| offset | No | Rows to skip (alternative to entry_start) | |
| defines | No | Derived branch names mapped to expressions | |
| flatten | No | Flatten jagged arrays; loses event boundaries | |
| branches | Yes | ||
| selection | No | Optional cut expression | |
| tree_name | Yes | Tree name | |
| entry_stop | No | Exclusive stop entry | |
| entry_start | No | Start entry |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, so 'Does not modify files' mainly restates them. The description usefully flags a performance consideration for large datasets and the optional cut expression, but says nothing about return shape or memory behavior for wide branch selections.
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?
Three short sentences with no waste: purpose first, then row-bounding, then the large-dataset alternative, then the safety note. Every sentence carries distinct 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?
With 10 parameters, nested objects (defines), and no output schema, the description covers invocation adequately but leaves the returned data structure unexplained. An agent cannot predict the shape of results, only how to bound them.
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 90%, so parameters are already well documented. The description reinforces entry_start/entry_stop and the cut expression but adds no clarification on the limit/offset vs. entry_start/entry_stop relationship or on defines/flatten, so it stays at the 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?
States a specific verb and resource ('Read selected branches from a ROOT TTree or RNTuple') and names an alternative (get_branch_stats) for one case. It is not fully differentiated from siblings like export_data or list_branches, but the core operation is 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?
Gives concrete when-to-use guidance: bound rows with entry_start/entry_stop, and prefer get_branch_stats or histograms for large datasets. It omits when to choose this over export_data or list_branches, so alternatives are only partially covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
switch_modeAIdempotent
Change the local server-wide analysis tier between core and extended. Affects all calls to this process; list tools again afterward. Disabled in central deployments.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare it non-read-only, idempotent and non-destructive, so the description's job is to add scope and side effects, which it does: the change is server-wide and affects all calls to the process, and the tool surface must be re-listed afterward. It does not say whether the setting persists across restarts or whether it requires elevated permission, which are the remaining unknowns for a process-wide mutation.
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?
Three short sentences, front-loaded with the action and scope, followed by side effect and restriction. No filler 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 one-parameter mutation with annotations covering the safety profile and no output schema, the description covers scope, blast radius, follow-up and deployment restriction. The only substantive omission is the semantic difference between the two tiers and persistence behavior.
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 0%, but the single parameter is a self-documenting two-value enum, and the description echoes both values. However, it never explains what 'core' versus 'extended' actually enables, so the agent cannot reason about the consequence of its choice beyond the label.
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 names a specific verb ('Change') and resource ('local server-wide analysis tier') and enumerates the two valid states (core, extended), so the agent knows exactly what the tool does. It does not need sibling differentiation because none of the listed siblings (list_files, inspect_file, export_data, etc.) overlap with mode switching.
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 states the applicable context ('local server-wide') and an explicit exclusion ('Disabled in central deployments'), plus a follow-up instruction to re-list tools. What is missing is any guidance on when an agent should prefer extended over core, which is the real decision the caller faces.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
validate_fileCRead-onlyIdempotent
Validate ROOT file integrity
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | File path |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false, and openWorldHint, so the safety profile is covered. Beyond that, the description says nothing about what "integrity" means (checksums, structural parse, branch/entry sanity), how failures are surfaced, or whether the check is a costly full scan of a potentially large file — meaningful gaps for a validation 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?
Five words, front-loaded, with zero filler or repetition. It is terse to the point of under-specification, but nothing in the sentence is wasted.
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?
With no output schema, the description must explain what a successful versus failed validation returns (boolean, error list, exception), and it does not. Combined with the missing sibling differentiation and undefined notion of "integrity," an agent cannot predict the result shape or cost before calling.
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 required "path" parameter, so the schema already documents the input and a baseline 3 applies. The description adds only the implied constraint that the path should reference a ROOT file, with no detail on accepted path forms (local vs remote) beyond 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?
"Validate ROOT file integrity" gives a specific verb (validate) and resource (ROOT file), so the agent knows this checks a file rather than listing or reading it. It does not explicitly distinguish itself from the closest sibling, inspect_file, leaving the boundary between inspecting and validating to inference.
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 guidance on when to choose this over inspect_file, list_files, or read_branches, and no stated prerequisites (e.g., file must be closed, accessible, or local versus remote). The agent must guess the trigger condition for validation from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
9 tool updates
v0.3.1- Changed
export_data2 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / branches / minItemsAdded value: +1
- Changed
get_branch_stats2 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / branches / minItemsAdded value: +1
- Changed
get_server_info1 field changed- added
Input schema / additionalPropertiesAdded value: +false
- Changed
inspect_file1 field changed- added
Input schema / additionalPropertiesAdded value: +false
- Changed
list_branches1 field changed- added
Input schema / additionalPropertiesAdded value: +false
- Changed
list_files2 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / limitAdded value: +{ + "default": 100, + "maximum": 1000, + "minimum": 1, + "type": "integer" +}
- Changed
read_branches9 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / branches / minItemsAdded value: +1 - added
Input schema / properties / definesAdded value: +{ + "additionalProperties": { + "type": "string" + }, + "description": "Derived branch names mapped to expressions", + "type": "object" +} - added
Input schema / properties / entry_start / minimumAdded value: +0 - changed
Input schema / properties / entry_stop / descriptionPrevious value: -"Stop entry"New value: +"Exclusive stop entry" - added
Input schema / properties / entry_stop / minimumAdded value: +1 - added
Input schema / properties / flattenAdded value: +{ + "description": "Flatten jagged arrays; loses event boundaries", + "type": "boolean" +} - added
Input schema / properties / limitAdded value: +{ + "description": "Maximum rows to return (alternative to entry_stop)", + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / offsetAdded value: +{ + "description": "Rows to skip (alternative to entry_start)", + "minimum": 0, + "type": "integer" +}
- Changed
switch_mode1 field changed- added
Input schema / additionalPropertiesAdded value: +false
- Changed
validate_file1 field changed- added
Input schema / additionalPropertiesAdded value: +false
9 tool updates
v0.1.7- First observed
export_data - First observed
get_branch_stats - First observed
get_server_info - First observed
inspect_file - First observed
list_branches - First observed
list_files - First observed
read_branches - First observed
switch_mode - First observed
validate_file
TDQS
Scored across 9 tools
Each tool targets a distinct stage of ROOT file analysis: discovery (list_files), structure inspection (inspect_file), branch listing, validation, reading, statistics, export, and server metadata/mode control. Overlap between inspect_file and list_branches is clarified by descriptions focusing on file structure versus TTree/RNTuple branches.
All names use snake_case with verb_noun structure (list_files, inspect_file, read_branches, get_branch_stats, export_data, get_server_info). switch_mode fits the verb_noun convention despite being administrative rather than analytical.
Nine tools is well-scoped for a read-only ROOT analysis server, covering discovery through export without redundant operations. Each tool has a clear, non-overlapping role in the workflow.
The surface covers discovery, inspection, validation, reading, statistics, and export, but references histograms as an alternative in tool descriptions without providing any histogram or plotting tool. This creates a notable dead end for a core ROOT analysis operation, though agents can partially work around it via stats and export.
Maintenance
Related MCP Connectors
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with yo…
An MCP server for search and retrieval over a local LanceDB database
MCP server for AI dialogue using various LLM models via AceDataCloud
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceAn MCP server that publishes CLI tools on your machine for discoverability by LLMs2 npm1MIT
- AlicenseAqualityBmaintenanceAn MCP server providing access to XRootD file systems, allowing LLMs to browse directories, read file metadata, and access contents via the root:// protocol. It supports advanced features like campaign discovery, file searching, and ROOT file analysis for scientific data management.181MIT
- AlicenseAqualityBmaintenanceAn MCP server that connects LLMs to CERN GitLab to discover and analyze High Energy Physics code, documentation, and analysis examples. It provides 14 tools for repository browsing, dependency parsing, and CI/CD configuration analysis.15144 PyPI4AGPL 3.0
- AlicenseNot gradedqualityCmaintenanceAn MCP server that exposes Rucio distributed data management operations as tools for LLMs. Designed for ATLAS physicists working with grid data on analysis facilities, but usable with any Rucio instance.31 PyPI6Apache 2.0