acplint
The linter for the Agent Client Protocol (ACP)
Validate your AI agent implementation against the ACP specification.
Catch missing hooks, broken streaming, schema violations, and more.
What is ACP?
The Agent Client Protocol (ACP) is a JSON-RPC 2.0 protocol for communication between AI coding agents and their clients (IDEs, CLIs, editors). It's used by Zed and other tools that integrate AI agents. If you're building an ACP-compatible agent, acplint makes sure you're doing it right.
What does acplint do?
Like eslint for JavaScript or pylint for Python, acplint checks your agent implementation against the ACP specification and reports what's missing, broken, or non-conformant.
It catches:
- Missing capabilities — agent doesn't advertise hooks, sub-agent support, skills
- Broken streaming — missing
agentMessageChunk/agentThoughtChunknotifications - Schema violations — wrong field names, missing required fields, invalid types (with exact field paths)
- Tool call issues — missing raw output, broken status transitions, missing content
- Protocol errors — wrong JSON-RPC responses, missing session updates, bad initialization
Install
pip install acplint
Quick Start
Test any ACP agent via stdio:
# Test Claude Code
acplint --agent claude-code --agent-args "--acp"
# Test a custom agent
acplint --agent "my-agent" --agent-args "--stdio --model=gpt-4"
14 Test Categories
| Category | What it validates |
|---|---|
initialization |
Protocol handshake, version negotiation, capabilities |
authentication |
Auth method discovery, authenticate, logout |
session_lifecycle |
new/load/resume/close/list/delete/fork sessions |
streaming |
All 11 session/update notification types |
tool_calls |
Full lifecycle: raw input/output, content, status, sub-agent/skills meta |
permissions |
request_permission flow, auto-approve detection |
file_operations |
fs/read_text_file, fs/write_text_file |
terminals |
terminal/create, output, release, kill, wait_for_exit |
plans |
plan notification detection and validation |
session_modes |
session/set_mode |
config_options |
session/set_config_option |
cancel |
session/cancel notification handling |
stress |
Rapid prompts, concurrent sessions, large content |
schema_validation |
Strict Pydantic validation on every method response |
Conformance Levels
| Level | Meaning |
|---|---|
| ✅ Full Conformance | All mandatory tests pass |
| ⚠️ Partial Conformance | Core tests pass, some optional capability tests fail |
| ❌ Non-Conformant | Core protocol tests fail |
Python API
from acplint import ConformanceRunner
runner = ConformanceRunner(agent_command=["my-agent", "--stdio"])
report = runner.run_all()
report.print_summary()
# Programmatic access
print(report.conformance_level)
print(report.passed_tests)
print(report.findings)
CI Integration
# JSON output for pipelines
acplint --agent "my-agent" --output json --output-file results.json
# Exit codes: 0=full, 1=partial, 2=non-conformant
acplint --agent "my-agent" && echo "Agent is ACP-conformant!"
Why "acplint"?
Because every protocol deserves a linter. acplint checks your agent against the ACP spec the same way eslint checks your JS against a style guide. If it passes acplint, your agent speaks ACP correctly.
License
Apache-2.0
Metadata
Release files for acplint 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| acplint-0.1.0.tar.gz | 23.3 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| acplint-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 49.1 kB
Release files / acplint-0.1.0.tar.gz
| Download URL | acplint-0.1.0.tar.gz |
|---|---|
| Size | 23.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
6553efb938218ccf8f7a53739e4cafaa77a8c196432745cdb5a3d7a9d6e99ac2
|
|
BLAKE2b-256 checksum How to use checksums |
cabe444c8848bdf8bedaf7a87e361a2d92983fbac3bcae4fcb9bbb31c7ca55dd
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
Hatch/1.16.5 cpython/3.12.3 HTTPX/0.28.1
|
Release files / acplint-0.1.0-py3-none-any.whl
| Download URL | acplint-0.1.0-py3-none-any.whl |
|---|---|
| Size | 25.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
ec1f77f46175e7353b7d310c0073fd8159566012573b0c22da9f8e7b6cd7422a
|
|
BLAKE2b-256 checksum How to use checksums |
b8f152fac758d175b468c8e0a66fb6b1231c054b6efd6f8df16433a1afeb9592
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
Hatch/1.16.5 cpython/3.12.3 HTTPX/0.28.1
|
Security for acplint 0.1.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.