Skip to content

Lintlang

Static analysis for AI agent configs, tool descriptions, and system prompts — catches vague tool descriptions, missing stop conditions, and schema gaps before they reach…

Install

$uvx lintlang scan .
Claude Code
claude mcp add lintlang -- uvx lintlang scan .
Cursor / Claude Desktop (mcp.json)
{
  "mcpServers": {
    "lintlang": {
      "command": "uvx",
      "args": [
        "lintlang",
        "scan",
        "."
      ]
    }
  }
}

Install command taken from the project's README or registry entry. Always review code before running it.

LintLang

Catch agent failures before your agent runs.

Product page · Playground · PyPI · Docs · 简体中文

LintLang is a local, deterministic static linter for the instructions and tool interfaces an AI agent is given. It flags ambiguous tool choices, mixed output formats, schema gaps, missing bounds, and other setup defects before the agent runs.

Point it at a project directory. LintLang finds supported agent-facing content inside the files you already use: MCP and function-tool definitions nested in JSON/YAML, parameter schemas, system prompts, messages, output contracts, AGENTS.md, CLAUDE.md, GEMINI.md, SKILL.md, and supported Python prompt code.

uvx lintlang scan .

See LintLang in action. A stylized view of the real DeerFlow finding behind merged PR #5656.

Below, by contrast, is unedited terminal output on a bundled fixture: two of the ten findings from lintlang scan samples/bad_tool_descriptions.yaml, long lines wrapped.

  ❌ FAIL — 1 CRITICAL, 1 HIGH, 5 MEDIUM, 3 LOW
  Inspected: 5 tools (4 described, 5 with a schema), system prompt

    !! [CRITICAL] H1.1 samples/bad_tool_descriptions.yaml:34  tool:process_ticket
      Tool 'process_ticket' has no description.
      → Add a specific, disambiguating description that explains WHEN to use this tool, not just WHAT it does.

    ~ [MEDIUM] H1.6 samples/bad_tool_descriptions.yaml:10  tool:get_user_info vs tool:fetch_user_data
      Tools 'get_user_info' and 'fetch_user_data' carry no differentia — every meaning-bearing term in one is
      present, or has a synonym, in the other. Both descriptions may be accurate and still give a model nothing
      to choose between them.
      Evidence: "'Get user info' vs 'Get user data from the system'"
      → Name a condition that selects one over the other. State what each tool is for that the other is NOT
      for — e.g. 'use X for orders already placed, use Y for carts not yet submitted'.

How LintLang differs

  • From LLM-as-judge reviewers: no model calls and no network access during a scan. pyyaml is the only runtime dependency, and the test suite runs the CLI with outbound sockets disabled (tests/test_first_run_recipe.py). Findings and verdicts are deterministic: the same tree produces byte-identical JSON and SARIF (tests/test_sarif.py); only the terminal summary's elapsed time varies. That is what lets it gate CI.
  • From generic linters: agent-aware. It reads tool descriptions, system prompts, SKILL.md, MCP definitions, and parameter schemas as instructions a model will act on, not as prose.
  • Every finding names the file and proposes a specific fix, and cites the line wherever the parser can justify one. LintLang never invents line numbers.

What LintLang catches

Agent configuration can be valid YAML, JSON, Markdown, or Python and still give a model bad instructions, bad choices, or an interface it cannot reliably use.

LintLang catches problems like:

Similar plugs

Turn any codebase, with its docs, SQL schemas, configs, and PDFs, into a queryable knowledge graph. A /graphify skill for Claude Code, Cursor, Codex, and Gemini CLI: local…

Why use many token when few token do trick. Viral skill + proxy for coding agents that cuts 65% of tokens by talking like a caveman.

The 1st Collaborative AI Design Agent Workspace. Local-first and open source. Create prototypes, websites, apps, dashboards, presentations, images, and videos with your team…