agentless-mcp
agentless-mcp provides tree-sitter-based code navigation, repository
structure analysis, and patch validation for local repositories. It exposes
the same functionality through a command-line interface and a read-only
MCP server.
Install
uv tool install agentless-mcp
That installs two console scripts. agentless-mcp is the CLI, for a human or
for an agent driving it over a shell. agentless-mcp-server is the MCP
server, which an MCP client launches for you rather than something you run in
a terminal; it needs the mcp extra, so install that when you want the server:
uv tool install "agentless-mcp[mcp]"
Both entry points warm cold grammars in the background at startup (one
digest-verified bundle fetch at most; --no-auto-warm or
AGENTLESS_MCP_NO_AUTO_WARM opts out, AGENTLESS_MCP_NO_DOWNLOAD forbids
all fetching). To warm explicitly and fail loudly instead:
agentless-mcp warmup
agentless-mcp guide prints the full agent usage guide, which ships with the
package; agentless-mcp guide --section NAME prints one section, and an
unknown name lists them all.
CLI
Most commands analyze the repository containing the current directory. Use
--repo PATH to select another repository. Add --json where supported for
machine-readable output.
Navigate code
agentless-mcp map --focus src/app.py
agentless-mcp tree --depth 3
agentless-mcp skeleton src/app.py
agentless-mcp expand py:src/app.py::App.run
agentless-mcp slice src/app.py --lines 40:80
agentless-mcp find-symbol App
agentless-mcp refs App.run
agentless-mcp explain App.run
These commands provide repository maps, directory trees, symbol overviews,
full symbol bodies, source slices, symbol lookup, references, and symbol
context. Symbol IDs are printed by map and skeleton and can be passed to
expand, refs, explain, and related commands.
Analyze structure
agentless-mcp path App.run Database.connect
agentless-mcp cycles
agentless-mcp communities
agentless-mcp diagram > modules.mmd
agentless-mcp html > modules.html
These commands find relationships between symbols or files, report import cycles, group related files, and export Mermaid or interactive HTML graphs.
Validate patches
The CLI also supports deterministic patch workflows:
agentless-mcp patch parse --file change.patch
agentless-mcp patch check --file change.patch --repo /path/to/repo
agentless-mcp patch apply --file change.patch --repo /path/to/repo
agentless-mcp lint --candidates ./candidates --repo /path/to/repo
agentless-mcp lint --diff change.patch --repo /path/to/base-checkout
agentless-mcp validate --candidates ./candidates --repo /path/to/repo \
--test-cmd 'pytest -q'
agentless-mcp vote --verdicts verdicts.jsonl
Patch candidates can use SEARCH/REPLACE text or the package's edits.json
format. validate runs candidates against the repository tests, and vote
ranks the candidates that pass.
lint --diff runs the same checks over a branch's or a pull request's unified
diff, so a change that already exists does not have to be hand-converted first.
The checks compare the diff against --repo as it stands, which means --repo
must be a checkout of the diff's base, not a tree with the diff already
applied — otherwise every symbol the diff adds is already in the file and the
report would describe the change against itself. The usual shape is a second
worktree at the merge-base:
git diff main...HEAD > change.patch
git worktree add /tmp/base $(git merge-base main HEAD)
agentless-mcp lint --diff change.patch --repo /tmp/base
Pointing --repo at the branch instead is not silently wrong: each affected
file is reported as a not_checked coverage gap naming the remedy. Binary files
and mode-only changes are reported the same way, and a construct one edit cannot
express — a rename, a -U0 diff with no context — is refused with the reason.
Cache and capabilities
Parsing happens on demand. Build an optional repository cache to improve repeated queries:
agentless-mcp index --repo /path/to/repo
agentless-mcp capabilities --repo /path/to/repo
The MCP server builds and refreshes this cache itself, in the background,
the first time it serves a repository whose index is absent or stale
(--no-auto-index or AGENTLESS_MCP_NO_AUTO_INDEX opts out); the CLI
indexes only through the explicit command above. Use --no-cache on
repository-scoped commands to bypass the cache.
MCP server
The server exposes read-only repository tools. It talks over stdio by default, which is what a client that launches the server as a child expects. For a single-user machine, register it once and let the client's advertised workspace authorize repositories: whatever repository you open a session in is served on the first tool call, with nothing to enable per repo.
claude mcp add --scope user agentless -- agentless-mcp-server --allow-client-roots
For a locked-down server, omit --allow-client-roots and pass an explicit
allowlist instead; then only the listed repositories are servable, and a
client-advertised root can only select among them, never add one:
agentless-mcp-server --root /path/to/repo --root /path/to/other
Over HTTP the server also watches its own install: when the package is
upgraded or reinstalled, it finishes in-flight requests and replaces itself
with the new code (--no-auto-restart or AGENTLESS_MCP_NO_AUTO_RESTART
opts out). A long-running process otherwise serves the code it loaded at
startup forever -- reconnecting clients refreshes the connection, never the
process. On Windows the server exits cleanly instead and a supervisor's
Restart= completes the loop; docs/deploy/mcp-agentless.service is a
ready example unit.
--roots-from FILE reads that same list from a file, one path per line.
The file is re-read whenever it changes on disk, so appending a line enrolls
a repository on the next call without a restart, and the refusal an agent
sees for an unlisted repository names the file to append to. Blank lines and
whole-line # comments are skipped, and the flag is repeatable and combines
with --root:
cat > ~/.config/agentless-mcp/roots <<'EOF'
# one repository path per line
/path/to/repo
/path/to/other
EOF
claude mcp add --scope user agentless -- \
agentless-mcp-server --roots-from ~/.config/agentless-mcp/roots
Serving over HTTP
A client that cannot spawn a child process gets the same tools over FastMCP's
streamable-http transport, from one long-lived server that several clients
share. The endpoint is http://HOST:PORT/mcp:
agentless-mcp-server --transport http --port 8766 \
--roots-from ~/.config/agentless-mcp/roots
The bind address is loopback-only and is checked, not merely defaulted: this
server authenticates nobody, so the --root allowlist decides which
repositories are readable and says nothing about who may read them. On a
routable address that is unauthenticated read access to every enrolled
repository, so a non-loopback --host is refused before the socket opens.
Put an authenticating proxy in front if you need it off-host.
--host and --port apply to the HTTP transport only; passing either under
stdio is refused rather than ignored, because there is no socket to bind.
Every tool takes repo_root first. It may be omitted only when the server
holds one repository, or when the client advertises a root that selects
exactly one; otherwise the refusal lists the roots to choose from.
The MCP tools are five intent-shaped surfaces; three of them fold their
questions behind an operation parameter:
| Tool | Operations | Purpose |
|---|---|---|
orient |
map, communities, cycles, diagram, path |
Where does this live, how is the repository put together |
symbols |
find, overview, expand, explain, locate |
Look up, skeleton, expand, or explain symbols; resolve locations |
find_referencing_symbols |
Find references and callers (blast radius) | |
read |
slice, dir |
Read selected source lines; list the repository tree |
capabilities |
Report loaded grammars and cache state |
One worked call per surface:
orient(operation="map", focus=["src/app.py", "quote"])
symbols(operation="expand", stable_ids=["py:src/app.py::App.run"])
find_referencing_symbols(target="App.run")
read(operation="slice", path="src/app.py", lines=[[40, 80]])
capabilities()
A wrong operation is answered with the valid list, and a parameter foreign
to the selected operation is refused with a message naming what that
operation accepts and requires.
This v2 surface is the default. For the transition, --surface v1 publishes
the previous per-question tools (repo_map, expand_symbols, and the rest)
and --surface both publishes the union; v1 remains for one release. The
mapping between the surfaces is in
agentless-mcp guide --section the-two-surfaces.
The MCP server does not apply patches or execute repository commands.
Supported languages
The bundled grammars support Bash, C, C++, C#, Go, HCL, Java, JavaScript, JSON,
Kotlin, Lua, PHP, Python, Ruby, Rust, Scala, SQL, Swift, TOML, TSX, TypeScript,
and YAML. Run capabilities to see the grammars available in the current
installation.
License
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file agentless_mcp-0.5.0.tar.gz.
File metadata
- Download URL: agentless_mcp-0.5.0.tar.gz
- Upload date:
- Size: 313.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
uv/0.9.28 {"installer":{"name":"uv","version":"0.9.28","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Fedora Linux","version":"43","id":"","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
05b7f732f0e1fba793f7770708c41b44bd94f285f1330c85e1937dab03a098bc
|
|
| MD5 |
a39cd270271eb1af0af12dea41468c07
|
|
| BLAKE2b-256 |
8b59a383e451acde36bce90b630cb78beb710ac06d9d56045b108edc994a8f7c
|
File details
Details for the file agentless_mcp-0.5.0-py3-none-any.whl.
File metadata
- Download URL: agentless_mcp-0.5.0-py3-none-any.whl
- Upload date:
- Size: 346.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
uv/0.9.28 {"installer":{"name":"uv","version":"0.9.28","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Fedora Linux","version":"43","id":"","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8dbed12e95dc71525e9f100295ac947a01486412d3da7a744044f50cd2751fd8
|
|
| MD5 |
9cee2f6d06f1118b5a79ec36a6f5d5bc
|
|
| BLAKE2b-256 |
29271da6e8a60da9cef414ffa4915393ccf6eeab7ce3db615eb98f2e3ba93a65
|