MCP server that provides ansible-lint integration for linting Ansible playbooks with structured reporting suitable for LLM analysis
Server has 4 tools with basic schemas and descriptions, but significant gaps limit production readiness. All tools have descriptions (10-80 chars, mostly adequate) and input schemas with types. However, parameter descriptions are sparse or missing context. Output schemas are not documented, LLMs cannot predict response structure. Error handling exists but lacks recovery guidance. No tool annotations (readOnlyHint, destructiveHint). Naming is clear and verb-driven (lint_*, get_*, validate_*), following conventions. Composition is reasonable, tools are single-purpose. Major weakness: output documentation and error messaging do not guide LLM recovery.
Get supported ansible-lint profiles and their descriptions
Run ansible-lint and return structured report suitable for LLM analysis
Run lint with progress updates (for long-running operations)
Validate Ansible playbook YAML syntax without full linting
Output schemas not documented. LLMs cannot predict response structure (fields, types, nesting). wrap_tool_output() returns JSON with 'tool', 'success', 'output', 'timestamp', but format_lint_output() structure is not declared in tool definitions.
Error messages lack recovery guidance. Errors return raw messages (e.g. 'Playbook exceeds maximum size') but do not suggest next steps. Pattern: 'Invalid status: got X, must be one of: Y, Z' is missing.
Parameter descriptions incomplete. 'profile' param in lint_ansible_playbook lists enum values but does not explain what each profile does (basic vs production vs safety). LLMs cannot reason about which to choose.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | B | 70 | <=2025-11-25 | v2 |
No tool annotations. Tools lack readOnlyHint, destructiveHint, or idempotentHint. All tools are read-only (safe to retry), but this is not declared in schema, LLMs must infer it.
get_lint_profiles has empty input schema (no parameters). Response structure not documented, LLM does not know if it returns array, object, or paginated result.