ansible-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| OAM_BIN | No | Path to the oam binary to use. Otherwise the launcher checks `OAM_INSTALL_DIR`, the installed locations (`~/.oam/bin`, and `%LOCALAPPDATA%\oam\bin` on Windows) and `PATH`, and takes the newest. | |
| ANSIBLE_MCP_DIR | No | Project used when a tool call passes no `dir`. | the server's working directory |
| OAM_INSTALL_DIR | No | Directory the launcher checks for the oam binary when `OAM_BIN` is not set. | |
| ANSIBLE_MCP_CACHE | No | Server-side cache (and the Ansible-side one in native mode): the dummy vault file, local temp, upgrade targets. Safe to delete. | ~/.cache/ansible-mcp |
| ANSIBLE_MCP_BIN_DIR | No | Ansible-side directory holding `ansible-*` (a venv's `bin`). Also put first on the child's `PATH` (ansible-lint needs `ansible-playbook` next to it). Unset uses `PATH`. | |
| ANSIBLE_MCP_RUNTIME | No | `auto`: the newest oam at 0.19.0 or newer, else Node. `oam`: oam or exit with an error. `node`: always Node -- the escape hatch when a problem only shows up under oam. | auto |
| ANSIBLE_MCP_PASS_ENV | No | Comma-separated names of server env vars to forward to the Ansible side in prefix mode. | |
| ANSIBLE_MCP_PATH_STYLE | No | `wsl` or `native`. `auto` is `wsl` when the prefix starts with `wsl`/`wsl.exe`. Other prefixes (`ssh`, `docker exec`) get `env -C <dir> ...` and are best effort. | auto |
| ANSIBLE_MCP_TIMEOUT_MS | No | Kill any Ansible command after this long (the upgrade download gets 3x). | 120000 |
| ANSIBLE_MCP_REMOTE_CACHE | No | The Ansible-side cache in prefix mode. | $HOME/.cache/ansible-mcp on the Ansible side |
| ANSIBLE_MCP_COMMAND_PREFIX | No | JSON array prepended to every Ansible command, e.g. ["wsl.exe","-d","Ubuntu","--exec"]. A value not starting with `[` is split on whitespace. Required on Windows (Ansible inside WSL). Unset means native execution. | |
| ANSIBLE_MCP_ALLOW_PLAY_LOOKUPS | No | `1` lets playbooks with lookups in play-level `name` / `hosts` / `vars_files` be parsed (Ansible runs those lookups on this machine). Unset refuses them. | |
| ANSIBLE_MCP_ALLOW_DYNAMIC_INVENTORY | No | `1` re-enables script, constructed and plugin inventory sources (they run code and may call cloud APIs). Unset disables them. |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| ansible_project_infoA | What this Ansible checkout contains and how Ansible sees it: ansible-core version, effective config file, collections and roles paths, installed ansible-* binaries, detected playbooks, inventories, roles and requirements files. Call it first. Read-only; never connects to a managed host (AAP MCP covers controller state, ADT MCP takes actions). |
| ansible_module_docA | Exact options (type, required, default, choices, aliases, suboptions) of a module or plugin as INSTALLED here (ansible-doc), with the collection version that provides it and redirects resolved. Use before writing a task; options drift between collection versions, so training-data guesses are often wrong. |
| ansible_module_searchA | Find installed modules or plugins by name or description (ansible-doc -l), ranked exact name, prefix, token, then description match. Pass query, collection, or both. |
| ansible_check_task_argsA | Check tasks (inline YAML, or a tasks file / playbook) against the INSTALLED module docs: unknown options, missing required ones, bad choices and types (YAML 1.1 aware: unquoted off/yes/0755), suboptions, deprecated options. ansible-doc cannot express cross-option rules (mutually_exclusive, required_if), so the answer says what it could not check; it catches action-plugin modules (copy, template) that ansible-lint's args rule skips. |
| ansible_role_interfaceA | A role's interface: argument_specs entry points and options (no_log honoured), defaults with redacted values, which defaults are undocumented, dependencies, vars names and galaxy_info. Works for local roles (roles_path, dir/roles, or a path) and collection roles (ns.collection.role). |
| ansible_inventoryA | Groups, hosts and inventory-level vars (ansible-inventory --graph/--list/--host), always redacted: vault values, secret-like names and secret-shaped values are hidden, templates are shown unrendered. Script and plugin inventory sources run code, so they are skipped unless ANSIBLE_MCP_ALLOW_DYNAMIC_INVENTORY=1 (which can also call cloud APIs); vault secrets are never supplied, so whole-file vaults degrade to a per-file view. |
| ansible_playbook_structureA | Plays, matched hosts, tasks (with module and file:line where unambiguous) and tags of a playbook (ansible-playbook --syntax-check, then --list-hosts --list-tasks --list-tags), plus deprecation warnings Ansible printed while parsing; never runs a play. Parses playbooks with Ansible: treat dir as code you would run --syntax-check on (play-level Jinja and playbook-adjacent vars plugins are evaluated); lookups in play-level fields are refused unless ANSIBLE_MCP_ALLOW_PLAY_LOOKUPS=1. |
| ansible_configA | The effective configuration for this dir (ansible-config dump) with each setting's origin (ansible.cfg, env, default); galaxy server tokens and passwords are always redacted. Settings this server overrides for safety in its other tools (vault password files, inventory and vars plugins) are flagged. |
| ansible_collectionsA | requirements.yml (collections and roles) against what is installed: ok, VIOLATES (with file:line) or MISSING, using galaxy constraint rules, plus collections shadowed across collections paths (the first in COLLECTIONS_PATHS wins). Never installs anything. |
| ansible_lint_summaryA | ansible-lint (offline) grouped by rule with counts, severities and file:line locations; never fixes anything (ADT MCP's ansible_lint fixes). Parses playbooks with Ansible: treat dir as code you would run --syntax-check on (play-level Jinja and playbook-adjacent vars plugins are evaluated); lookups in play-level fields are refused unless ANSIBLE_MCP_ALLOW_PLAY_LOOKUPS=1. |
| ansible_upgrade_impactA | What breaks in THIS project's tasks if one collection moves to an exact version: removed or moved modules (meta/runtime.yml redirects and tombstones), removed options and aliases, newly required options, dropped choices, type and default changes, each tied to the task's file:line, plus requirements.yml constraints and a verdict. Downloads the target collection from Galaxy (or the configured servers) into this server's cache on first use; never touches dir, requirements files or your collections paths. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 11 tools
Each tool targets a clearly distinct facet of Ansible project analysis: inventory, config, project info, playbook structure, role interface, module docs/search, task-arg validation, collections requirements, lint summary, and upgrade impact. The descriptions explicitly differentiate overlapping-sounding tools (e.g., ansible_check_task_args vs ansible_lint_summary, ansible_module_doc vs ansible_module_search), leaving no real ambiguity.
All tools use a consistent ansible_ prefix and snake_case, which is highly predictable. The only minor deviation is mixed verb/noun construction (ansible_check_task_args and ansible_module_search are verb-led, while most others are noun phrases), but this remains readable and consistent enough.
11 tools is well within the ideal 3-15 range for a read-only Ansible project analysis server. Each tool earns its place by covering a distinct inspection or validation concern, with no obvious redundancy.
The surface is broad and complete for read-only analysis: project info, config, inventory, playbook structure, roles, modules, task args, collections, lint, and upgrade impact are all covered. Minor gaps exist, such as no explicit variable-precedence or host-fact inspection tool, but these are largely workaroundable or intentionally out of scope.