Skip to main content
Glama

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
PATHNoOnly needed if the client can't find `solc`. Set to your PATH including solc-select's bin directory.

Instructions

Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.

Static call-flow navigation for Solidity repositories (Slither-based). Typical audit loop: list_entry_points -> get_flow on an interesting entry point (include_source=true to read code inline) -> get_function_source / get_type_definition for details -> find_paths_to to see which entry points reach a sensitive internal function -> list_unresolved + set_interface_bindings to follow calls through interfaces. The first call for a repo compiles it (can take a while); later calls are cached. After editing Solidity sources, call analyze_repo(force=true). SolFlow emits no vulnerability findings; it only shows code structure. Unresolved nodes are places where static analysis cannot see the callee - treat them as gaps.

Capabilities

Features and capabilities supported by this server

Protocol revision2025-11-25

CapabilityDetails
tools
{
  "listChanged": false
}
prompts
{
  "listChanged": false
}
resources
{
  "subscribe": false,
  "listChanged": false
}

Tools

Functions exposed to the LLM to take actions

NameDescription
analyze_repoA

Compile a Solidity repo (Foundry/Hardhat/etc. via crytic-compile + Slither) and build one call-flow per external entry point. Returns a summary.

Other tools call this implicitly with defaults, so only call it to (a) change
scope, or (b) recompile after source edits (force=true).

Each call sets the WHOLE scope from defaults + solflow.toml + these arguments;
options and unsaved set_interface_bindings from earlier calls are dropped.

Args:
    repo_path: Absolute path to the project root (where foundry.toml etc. lives).
    force: Recompile even if cached (needed after editing .sol files).
    exclude_paths: Gitignore-style globs; contracts in matching files get no flows.
    exclude_contracts: Globs on contract names to exclude (e.g. "*Harness*").
    inline_libraries: Names of lib/<NAME>/ dependencies to recurse into instead
        of stopping at them (e.g. "openzeppelin-contracts").
    stub_paths: Globs for in-tree call targets NOT to recurse into (e.g. dense
        math libs: "src/libraries/FullMath.sol").
    bindings: Interface -> concrete contract, e.g. {"IOracle": "ChainlinkOracle"},
        so calls through the interface are followed into that implementation.
    use_default_excludes: Default excludes are tests (*.t.sol, test/, tests/),
        mocks/, *Mock* contracts and dependency contracts (lib/, node_modules/,
        including such folders outside the repo root). Excluded contracts get no
        entry points of their own; project contracts that inherit dependency
        code still get those entry points. Set false to include them.
    config_path: Optional solflow.toml path (default: <repo>/solflow.toml if present).
list_entry_pointsA

List every externally callable entry point, grouped by contract and split into mutating vs read-only, with modifiers, call-tree depth, node count and number of unresolved calls. Use the printed names with get_flow.

Args:
    repo_path: Project root.
    contract: Only this contract (exact name).
    query: Case-insensitive substring filter on "Contract.fn(types)".
    mutating_only: Hide view/pure entry points.
    max_chars: Output size cap.
get_flowA

Show the full execution call tree for one entry point as an indented text tree: modifiers, internal/library/external calls (with the parent line that makes each call), inherited/virtual dispatch resolved through C3, builtins used (require, keccak256, ...), dependency calls not followed, and UNRESOLVED calls with the reason.

Args:
    repo_path: Project root.
    entry_point: "Contract.fn(type1,type2)", "Contract.fn", or bare "fn" if unique.
    max_depth: Limit tree depth (root = 0). Omit for the full tree.
    include_source: Inline each function's source (line-numbered) the first
        time it appears. Great for reading a flow end-to-end in one call.
    collapse_repeats: Print a function's subtree only once; later occurrences
        say "(subtree already shown above)". Keeps output small.
    max_chars: Output size cap.
get_function_sourceA

Get the source (line-numbered) and metadata of any function or modifier, including internal/private ones and those in libraries, plus its outgoing calls.

Args:
    repo_path: Project root.
    function: "Contract.fn(type1,type2)", "Contract.fn", or bare "fn" if unique.
find_paths_toA

Reverse reachability: which entry points can reach a given function (or dependency call), and through which call chain. E.g. "who can reach _mint?", "which external functions end up in Pool.swap?".

Args:
    repo_path: Project root.
    target: Function as "Contract.fn(types)", "Contract.fn" or bare "fn".
        Bare names match every contract's function with that name.
    include_read_only: Also search view/pure entry points.
    max_chars: Output size cap.
list_unresolvedA

List every call site static analysis cannot follow (unbound interface calls, low-level .call/.delegatecall, Yul dynamic dispatch, abstract with no impl), which entry points hit each one, and interfaces that could be bound to a concrete implementation via set_interface_bindings (with candidates).

Args:
    repo_path: Project root.
    contract: Only flows whose entry point is on this contract.
    max_chars: Output size cap.
set_interface_bindingsA

Bind interfaces to concrete contracts so flows follow calls like IOracle(addr).price() into the chosen implementation's body. Rebuilds flows instantly (no recompile). Bound edges are marked as asserted, not proven.

Args:
    repo_path: Project root.
    bindings: {"IInterface": "ConcreteContract", ...}. Map an interface to ""
        to remove its binding.
    replace: Replace all current bindings instead of merging.
    save: Persist the resulting bindings to the [bindings] table of
        solflow.toml (only that table is rewritten).
get_type_definitionA

Get the definition of a struct, enum, or user-defined value type, plus the definitions of user types its members reference (one level per call).

Args:
    repo_path: Project root.
    name: Type name, bare ("PoolKey") or qualified ("Morpho.Position").

Prompts

Interactive templates invoked by user choice

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription

No resources

TDQS

A4.2/5.0

Scored across 8 tools

Disambiguation5/5

Each tool has a clearly distinct role in the Solidity call-flow analysis workflow: setup, entry-point listing, single-flow inspection, function source retrieval, reverse reachability, unresolved-call diagnostics, and interface binding. Overlap between get_flow and get_function_source is minimal because one targets entry-point call trees while the other retrieves arbitrary function source and metadata.

Naming Consistency5/5

All tool names use consistent snake_case and begin with an action verb. The convention is predictable across setup, retrieval, listing, search, and configuration tools.

Tool Count5/5

Eight tools is a well-scoped set for a Solidity static-analysis server. Each tool covers a distinct stage of the analysis workflow, and none appears to be filler.

Completeness4/5

The surface covers compilation, entry-point discovery, flow inspection, source retrieval, reverse paths, unresolved calls, and interface binding, which supports the core analysis workflow well. Minor gaps remain, such as no direct enumeration of internal functions or contracts beyond external entry points, which agents may need to infer through flows or known names.

Maintenance

ActivityMaintained
ResponsivenessNo recent community issues