Skip to main content
Glama

CI PyPI License Language

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-mcp

Optional: 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 ls

Or set an environment variable once:

export ROOT_MCP_DATA_PATH=/path/to/your/data

3. 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/data

Use /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.


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 100

root-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 directory

Manual 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 statistics

  • mode: "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 results

  • run_rdataframe: Compute histograms using ROOT's RDataFrame (no boilerplate needed)

  • run_root_macro: Execute C++ ROOT macros via gROOT.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.html

For live-reload while writing docs:

cd docs && make livehtml

Highlights:

  • 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 tools
export_dataA
Destructive

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.

NameRequiredDescriptionDefault
pathYesFile path
formatYes
branchesYes
compressNoCompress output
selectionNoOptional cut expression
tree_nameYesTree name
output_pathYesOutput file path

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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_statsC
Read-onlyIdempotent

Get statistics for branches (supports derived variables via defines)

NameRequiredDescriptionDefault
pathYesFile path
definesNoDerived variable definitions (dict of name: expression)
branchesYes
selectionNoOptional cut expression
tree_nameYesTree name

TDQS

C2.9/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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_infoA
Read-onlyIdempotent

Discover ROOT analysis mode, capabilities, accessible named resources and request limits. Use before choosing analysis tools; native ROOT requires a separate installation.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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_fileA
Read-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.

NameRequiredDescriptionDefault
pathYesFile path

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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_branchesA
Read-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.

NameRequiredDescriptionDefault
pathYesFile path
patternNoOptional glob pattern
tree_nameYesTree name

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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_filesA
Read-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.

NameRequiredDescriptionDefault
limitNo
patternNoOptional glob pattern
resourceYesResource name

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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_branchesA
Read-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.

NameRequiredDescriptionDefault
pathYesFile path
limitNoMaximum rows to return (alternative to entry_stop)
offsetNoRows to skip (alternative to entry_start)
definesNoDerived branch names mapped to expressions
flattenNoFlatten jagged arrays; loses event boundaries
branchesYes
selectionNoOptional cut expression
tree_nameYesTree name
entry_stopNoExclusive stop entry
entry_startNoStart entry

TDQS

A3.7/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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_modeA
Idempotent

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.

NameRequiredDescriptionDefault
modeYes

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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_fileC
Read-onlyIdempotent

Validate ROOT file integrity

NameRequiredDescriptionDefault
pathYesFile path

TDQS

C2.9/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

  1. 9 tool updatesv0.3.1
    • Changedexport_data2 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / branches / minItems
        Added value: +1
    • Changedget_branch_stats2 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / branches / minItems
        Added value: +1
    • Changedget_server_info1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedinspect_file1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedlist_branches1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedlist_files2 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / limit
        Added value: +{
        +  "default": 100,
        +  "maximum": 1000,
        +  "minimum": 1,
        +  "type": "integer"
        +}
    • Changedread_branches9 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / branches / minItems
        Added value: +1
      • addedInput schema / properties / defines
        Added value: +{
        +  "additionalProperties": {
        +    "type": "string"
        +  },
        +  "description": "Derived branch names mapped to expressions",
        +  "type": "object"
        +}
      • addedInput schema / properties / entry_start / minimum
        Added value: +0
      • changedInput schema / properties / entry_stop / description
        Previous value: -"Stop entry"New value: +"Exclusive stop entry"
      • addedInput schema / properties / entry_stop / minimum
        Added value: +1
      • addedInput schema / properties / flatten
        Added value: +{
        +  "description": "Flatten jagged arrays; loses event boundaries",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / limit
        Added value: +{
        +  "description": "Maximum rows to return (alternative to entry_stop)",
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / offset
        Added value: +{
        +  "description": "Rows to skip (alternative to entry_start)",
        +  "minimum": 0,
        +  "type": "integer"
        +}
    • Changedswitch_mode1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedvalidate_file1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
  2. 9 tool updatesv0.1.7
    • First observedexport_data
    • First observedget_branch_stats
    • First observedget_server_info
    • First observedinspect_file
    • First observedlist_branches
    • First observedlist_files
    • First observedread_branches
    • First observedswitch_mode
    • First observedvalidate_file

TDQS

A3.7/5.0

Scored across 9 tools

Disambiguation5/5

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.

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness3/5

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

ActivityMaintained
ResponsivenessNo recent community issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    An MCP server that publishes CLI tools on your machine for discoverability by LLMs
    2 npm
    1
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    An 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.
    18
    1
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    An 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.
    15
    144 PyPI
    4
    AGPL 3.0
  • A
    license
    Not graded
    quality
    C
    maintenance
    An 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 PyPI
    6
    Apache 2.0