
Connects Claude to PMAT's codebase analysis engine through 19 MCP tools for technical debt assessment, mutation testing, and AI context generation. Exposes operations to grade code quality using six orthogonal metrics (A+ through F scale), run semantic search across 20+ languages with complexity annotations, and perform git history RAG with commit fusion. You'd reach for this when doing code reviews, refactoring sessions, or generating comprehensive codebase summaries for AI assistants. Integrates directly with Claude Desktop, Cline, and other MCP-compatible tools to surface repository health scores, compliance checks, and quality gate enforcement without leaving your AI workflow.
Zero-configuration AI context generation for any codebase
Installation | MCP Server | Usage | Features | Examples | Documentation
PMAT (Pragmatic Multi-language Agent Toolkit) provides everything needed to analyze code quality and generate AI-ready context:
.pmat-gates.toml configPart of the PAIML Stack, following Toyota Way quality principles (Jidoka, Genchi Genbutsu, Kaizen).
pmat query "cache invalidation" --churn --duplicates --entropy --faults
Every result includes TDG grade, Big-O complexity, git churn, code clones, pattern diversity, fault annotations, call graph, and syntax-highlighted source.
# Install from crates.io
cargo install pmat
Note for macOS Users: If you experience issues installing via
rustup, we recommend installing/updating Rust using Homebrew:brew install rustbefore runningcargo install pmat.
# Or from source (latest)
git clone https://github.com/paiml/paiml-mcp-agent-toolkit
cd paiml-mcp-agent-toolkit && cargo install --path .
PMAT is an MCP server first and a CLI second. One binary serves three surfaces, and they share one tool registry — you pick a surface, not a feature set.
| Surface | Start it with | Use it when |
|---|---|---|
| CLI | pmat analyze complexity --path . | A human or a shell script reads the output. |
| MCP over stdio | pmat --mode mcp | An MCP client launches pmat itself as a subprocess — Claude Code, Claude Desktop, Cline. One client, one process, no port, no token. |
| MCP over HTTP | pmat serve --transport http --port 8765 | One long-lived server that several clients — or another machine — talk to. Streamable HTTP, bearer auth. |
New in 3.32.0:
mcp-httpmoved into the default feature set.cargo install pmatnow gives you the HTTP transport; the old--features mcp-httpdance is gone. Compiling the transport in does not open a socket — onlypmat servebinds one.
Claude Code launches pmat as a subprocess. Nothing to keep running, nothing to authenticate.
cargo install pmat
claude mcp add --scope user pmat -- pmat --mode mcp
claude mcp list
# pmat: pmat --mode mcp - ✔ Connected
Claude Desktop takes the same command as JSON, in its own claude_desktop_config.json:
{
"mcpServers": {
"pmat": { "command": "pmat", "args": ["--mode", "mcp"] }
}
}
For clients that cannot pass flags, MCP_VERSION=1 pmat starts the identical server.
Smoke-test the stdio surface without any client at all:
printf '%s\n' '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}' \
| pmat --mode mcp 2>/dev/null | jq -r '.result.tools | length'
# 19
One server, many clients. Copy-paste the whole block:
cargo install pmat
export PMAT_MCP_HTTP_TOKEN='pmat-mcp-demo-token-0123456789' # >= 16 chars; use your own
pmat serve --transport http --port 8765 &
# pmat MCP (streamable HTTP) listening on http://127.0.0.1:8765/
# auth: Bearer, from PMAT_MCP_HTTP_TOKEN; unauthenticated requests get 401
# tools: 20
sleep 2
claude mcp add --scope user --transport http pmat http://127.0.0.1:8765/ \
--header "Authorization: Bearer $PMAT_MCP_HTTP_TOKEN"
claude mcp list
# pmat: http://127.0.0.1:8765/ (HTTP) - ✔ Connected
The server binds 127.0.0.1 unless you pass --host. To reach it from another machine, bind an
externally routable address and treat PMAT_MCP_HTTP_TOKEN as a real secret — the tool
surface can read and analyse any path the server process can read.
1. MCP is served at the root path /, not /mcp. There is no path prefix.
for p in / /mcp /health; do
printf '%-7s %s\n' "$p" "$(curl -s -o /dev/null -w '%{http_code}' -X POST "http://127.0.0.1:8765$p" \
-H "Authorization: Bearer $PMAT_MCP_HTTP_TOKEN" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}')"
done
# / 200
# /mcp 404
# /health 404
2. PMAT_MCP_HTTP_TOKEN is mandatory and must be at least 16 characters. Below that
the server refuses to start rather than falling back to serving unauthenticated — the
underlying pmcp transport answers every request when no auth provider is wired, so "no
token" has to mean "no server". Requests with no token, or a wrong one, get 401.
PMAT_MCP_HTTP_TOKEN=too-short-123 pmat serve --transport http --port 8765
# Error: PMAT_MCP_HTTP_TOKEN must be at least 16 characters; got 13
3. Hand-rolled clients must send Accept: application/json, text/event-stream. The
streamable transport rejects the request without it, and curl -f turns that into an
empty string with no message — so probe with plain curl -s while debugging.
curl -s -w '\n-> HTTP %{http_code}\n' -X POST http://127.0.0.1:8765/ \
-H "Authorization: Bearer $PMAT_MCP_HTTP_TOKEN" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}'
# {"jsonrpc":"2.0","error":{"code":-32700,"message":"Accept header must include application/json or text/event-stream"},"id":null}
# -> HTTP 406
4. There is no /health endpoint. GET /health is a 404, so a curl -f .../health readiness loop never turns green and never says why. Probe with a real
tools/list call instead:
curl -s -X POST http://127.0.0.1:8765/ \
-H "Authorization: Bearer $PMAT_MCP_HTTP_TOKEN" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}' \
| jq -r '.result.tools | length'
# 19
No MCP session id is involved: initialize returns no Mcp-Session-Id header, and
tools/call works directly — with or without a preceding initialize.
Both transports are built from the same registry, so HTTP serves all 20 tools, not a
subset. The tools/list payloads are byte-identical:
printf '%s\n%s\n' \
'{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"p","version":"1"}}}' \
'{"jsonrpc":"2.0","id":2,"method":"tools/list","params":{}}' \
| pmat --mode mcp 2>/dev/null \
| jq -Sc 'select(.id==2)|.result.tools|sort_by(.name)' > /tmp/pmat-stdio-tools.json
curl -s -X POST http://127.0.0.1:8765/ \
-H "Authorization: Bearer $PMAT_MCP_HTTP_TOKEN" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}' \
| jq -Sc '.result.tools|sort_by(.name)' > /tmp/pmat-http-tools.json
cmp /tmp/pmat-stdio-tools.json /tmp/pmat-http-tools.json && echo "identical"
# identical
The 19: analyze_complexity, analyze_satd, analyze_dead_code, analyze_dag,
analyze_deep_context, analyze_big_o, analyze_reachability,
analyze_hardcoded_paths, analyze_vacuous_tests, quality_gate, quality_proxy,
generate_context, scaffold_project, git_operation, pmat_query_code,
pmat_get_function, pmat_find_similar, pmat_index_stats,
pdmt_deterministic_todos. Names and descriptions are also committed as the machine-checked
manifest mcp.json at the repository root, regenerated from the server's own
registrations — so it cannot drift from what the two transports actually serve.
--transport also accepts web-socket, http-sse, both and all. None of them are
implemented; each exits 2 with a message saying so. http is the only value that
serves.
pmat serve --transport web-socket --port 8765
# error: pmat serve --transport websocket is not yet implemented
There is no stdio value for --transport — passing one is a clap error. Stdio is
pmat --mode mcp.
# Generate AI-ready context
pmat context --output context.md --format llm-optimized
# Analyze code complexity
pmat analyze complexity
# Grade technical debt (A+ through F)
pmat analyze tdg
# Score repository health
pmat repo-score .
# Pre-flight verify before committing (CI-faithful: fmt + complexity + satd + clippy + tests)
pmat verify --format json
# Run mutation testing
pmat mutate --target src/
# Start the MCP server over stdio, for Claude Code, Cline, etc. (see "MCP Server" above)
pmat --mode mcp
pmat verify)pmat verify runs the exact gate set CI enforces — format, complexity, satd, clippy, tests — fail-fast, with machine-readable output, so an agent gets "green here ⇒ green in CI" before committing. The canonical loop: edit → pmat verify --format json → fix on red → commit on green. See docs/agent-instructions/autonomous-verify-loop.md.
PMAT releases are dogfooded with ultracode — Claude Code's multi-agent dynamic-workflow orchestration — as both the test harness and the target workload:
tools/list payload is byte-identical to the stdio oneFindings from each sweep are adversarially re-verified by skeptic agents before they drive fixes — see the release case studies in the pmat book.
Generate comprehensive context for AI assistants:
pmat context # Basic analysis
pmat context --format llm-optimized # AI-optimized output
pmat context --include-large-files # Include files >500KB normally skipped
Six orthogonal metrics for accurate quality assessment:
pmat analyze tdg # Project-wide grade
pmat analyze tdg --include-components # Per-component breakdown
pmat tdg baseline create # Create quality baseline
pmat tdg check-regression # Detect quality degradation
Grading Scale:
Validate test suite effectiveness:
pmat mutate --target src/lib.rs # Single file
pmat mutate --target src/ --threshold 85 # Quality gate
pmat mutate --failures-only # CI optimization
Supported Languages: Rust, Python, TypeScript, JavaScript, Go, C/C++, C#, Lua, Lean, Java, Kotlin, Ruby, Swift, PHP, Bash, SQL, Scala, YAML, Markdown + MLOps model formats (GGUF, SafeTensors, APR)
Evidence-based quality metrics (0-289 scale, 11 categories):
pmat rust-project-score # Fast mode (~3 min)
pmat rust-project-score --full # Comprehensive (~10-15 min)
pmat repo-score . --deep # Full git history
Pre-configured AI prompts enforcing EXTREME TDD:
pmat prompt --list # Available prompts
pmat prompt code-coverage # 85%+ coverage enforcement
pmat prompt debug # Five Whys analysis
pmat prompt quality-enforcement # All quality gates
Search git history by intent using TF-IDF semantic embeddings:
# Fuse git history into code search
pmat query "fix memory leak" -G
# Search with churn, clones, entropy, faults
pmat query "error handling" --churn --duplicates --entropy --faults
# Run the example
cargo run --example git_history_demo
Automatic quality enforcement:
pmat hooks install # Install pre-commit hooks
pmat hooks install --tdg-enforcement # With TDG quality gates
pmat hooks status # Check hook status
pmat comply)162 automated checks across code quality, best practices, and governance:
pmat comply check # Run all compliance checks
pmat comply check --strict # Exit non-zero on failure
pmat comply check --format json # Machine-readable output
pmat comply migrate # Update to latest version
Key Checks:
A). Reads the index pmat query built; it never builds or rewrites one, and reports Skip / "Not measured" when .pmat/context.db is absentProvable-Contracts Enforcement (CB-1200..1210):
binding.yaml functions exist in src/, detects ghost bindings (L0-L3 enforcement levels)tests/contract_traits.rs for compiler-verified trait impls (13 kernel traits)Configure via .pmat.yaml:
comply:
thresholds:
min_tdg_grade: "A" # CB-200 floor; `.pmat-gates.toml` [tdg] min_grade overrides this
pv_lint_is_error: true # CB-1201: FAIL on pv lint failure
min_binding_existence: 95 # CB-1208: 95% binding verification
require_all_traits: true # CB-1209: 13/13 traits required
min_kani_coverage: 20 # CB-1206: minimum Kani proof %
pmat infra-score)CI/CD quality scoring (0-100 + 10 bonus for provable-contracts):
pmat infra-score # Text output
pmat infra-score --format json # Machine-readable
pmat infra-score -v --failures-only # Show only failing checks
Categories: Workflow Architecture (25pts), Build Reliability (25pts), Quality Pipeline (20pts), Deployment & Release (15pts), Supply Chain (15pts), Provable Contracts bonus (10pts).
pmat query --docs)Search documentation files (Markdown, text, YAML) alongside code:
pmat query "authentication" --docs # Code + docs results
pmat query "deployment" --docs-only # Only documentation
pmat query "API endpoints" --no-docs # Exclude docs (default)
pmat kaizen)Toyota Way continuous improvement — scan, auto-fix, commit:
pmat kaizen --dry-run # Scan only (no changes)
pmat kaizen # Apply safe auto-fixes
pmat kaizen --push # Fix, commit, and push (use --no-commit to skip)
pmat kaizen --format json -o report.json # CI/CD integration
# Cross-stack mode: scan all batuta stack crates in one invocation
pmat kaizen --cross-stack --dry-run # Scan all crates
pmat kaizen --cross-stack # Fix and commit per-crate
pmat kaizen --cross-stack -f json # Grouped JSON report
pmat extract)Extract function boundaries with metadata:
pmat extract --list src/lib.rs # Function/struct/enum/trait boundaries, as JSON
# For Claude Code
pmat context --output context.md --format llm-optimized
# With semantic search
pmat embed sync --path ./src
pmat semantic search "error handling patterns"
# Add to your CI pipeline
steps:
- uses: actions/checkout@v4
- run: cargo install pmat
- run: pmat analyze tdg --fail-on-violation --min-grade B
- run: pmat mutate --target src/ --threshold 80
# 1. Create baseline
pmat tdg baseline create --output .pmat/baseline.json
# 2. Check for regressions
pmat tdg check-regression \
--baseline .pmat/baseline.json \
--max-score-drop 5.0 \
--fail-on-regression
pmat/
├── src/
│ ├── cli/ Command handlers and dispatchers
│ ├── services/ Analysis engines (TDG, SATD, complexity, agent context)
│ ├── mcp_server/ MCP protocol server
│ ├── mcp_pmcp/ PMCP protocol integration
│ └── models/ Configuration and data models
├── examples/ 113 runnable examples
└── docs/
└── specifications/ Technical specs
| Metric | Value |
|---|---|
| Tests | 21,200+ passing |
| Coverage | 99.66% |
| Mutation Score | >80% |
| Languages | 20 supported + MLOps model formats |
| MCP Tools | 20 available |
Per Popper's demarcation criterion, all claims are measurable and testable:
| Commitment | Threshold | Verification Method |
|---|---|---|
| Context Generation | < 5 seconds for 10K LOC project | time pmat context on test corpus |
| Memory Usage | < 500 MB for 100K LOC analysis | Measured via heaptrack in CI |
| Test Coverage | ≥ 85% line coverage | cargo llvm-cov (CI enforced) |
| Mutation Score | ≥ 80% killed mutants | pmat mutate --threshold 80 |
| Build Time | < 3 minutes incremental | cargo build --timings |
| CI Pipeline | < 15 minutes total | GitHub Actions workflow timing |
| Binary Size | < 50 MB release binary | ls -lh target/release/pmat |
| Language Parsers | All 20 languages parse without panic | Fuzz testing in CI |
How to Verify:
# Run self-assessment with Popper Falsifiability Score
pmat popper-score --verbose
# Individual commitment verification
cargo llvm-cov --html # Coverage ≥85%
pmat mutate --threshold 80 # Mutation ≥80%
cargo build --timings # Build time <3min
Failure = Regression: Any commitment violation blocks CI merge.
All benchmarks use Criterion.rs with proper statistical methodology:
| Operation | Mean | 95% CI | Std Dev | Sample Size |
|---|---|---|---|---|
| Context (1K LOC) | 127ms | [124, 130] | ±12.3ms | n=1000 runs |
| Context (10K LOC) | 1.84s | [1.79, 1.90] | ±156ms | n=500 runs |
| TDG Scoring | 156ms | [148, 164] | ±18.2ms | n=500 runs |
| Complexity Analysis | 23ms | [22, 24] | ±3.1ms | n=1000 runs |
Comparison Baselines (vs. Alternatives):
| Metric | PMAT | ctags | tree-sitter | Effect Size |
|---|---|---|---|---|
| 10K LOC parsing | 1.84s | 0.3s | 0.8s | d=0.72 (medium) |
| Memory (10K LOC) | 287MB | 45MB | 120MB | - |
| Semantic depth | Full | Syntax only | AST only | - |
See docs/BENCHMARKS.md for complete statistical analysis.
PMAT uses ML for semantic search and embeddings. All ML operations are reproducible:
Random Seed Management:
Model Artifacts:
PMAT does not train models but uses these data sources for evaluation:
| Dataset | Source | Purpose | Size |
|---|---|---|---|
| CodeSearchNet | GitHub/Microsoft | Semantic search benchmarks | 2M functions |
| PMAT-bench | Internal | Regression testing | 500 queries |
Data provenance and licensing documented in docs/ml/REPRODUCIBILITY.md.
PMAT is built on the PAIML Sovereign Stack - pure-Rust, SIMD-accelerated libraries:
| Library | Purpose | Version |
|---|---|---|
| aprender | ML library (text similarity, clustering, topic modeling) | 0.64 |
| aprender-graph | CSR graph database (PageRank, Louvain) | 0.64 |
| aprender-db | Columnar analytics database (lib trueno_db, optional) | 0.64 |
| aprender-rag | RAG pipeline with VectorStore | 0.64 |
| aprender-viz | Terminal graph visualization | 0.64 |
| aprender-compute | SIMD/GPU compute for matrix operations (lib trueno) | 0.64 |
| aprender-zram-core | SIMD LZ4/ZSTD compression (optional) | 0.64 |
| aprender-contracts | Provable contracts (with aprender-contracts-macros) | 0.64 |
| pmcp | MCP protocol SDK (streamable HTTP transport) | 2.17 |
| pmat | Code analysis toolkit | 3.40.0 |
Key Benefits:
See CONTRIBUTING.md for development setup, testing, and pull request guidelines.
MIT License - see LICENSE for details.