Catalog PyPI
Back to packageRELEASE DETAILS

0.1.0

PyPI

acplint

The linter for the Agent Client Protocol (ACP) — validate your AI agent against the ACP spec

Published22 May 2026
Direct dependencies5
Transitive dependenciesNot calculated

README

Version 0.1.0 documentation

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.

PyPI Python Versions License


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 / agentThoughtChunk notifications
  • 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

CategoryWhat it validates
initializationProtocol handshake, version negotiation, capabilities
authenticationAuth method discovery, authenticate, logout
session_lifecyclenew/load/resume/close/list/delete/fork sessions
streamingAll 11 session/update notification types
tool_callsFull lifecycle: raw input/output, content, status, sub-agent/skills meta
permissionsrequest_permission flow, auto-approve detection
file_operationsfs/read_text_file, fs/write_text_file
terminalsterminal/create, output, release, kill, wait_for_exit
plansplan notification detection and validation
session_modessession/set_mode
config_optionssession/set_config_option
cancelsession/cancel notification handling
stressRapid prompts, concurrent sessions, large content
schema_validationStrict Pydantic validation on every method response

Conformance Levels

LevelMeaning
✅ Full ConformanceAll mandatory tests pass
⚠️ Partial ConformanceCore tests pass, some optional capability tests fail
❌ Non-ConformantCore 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

Downloads & popularity

Awaiting observations

No metric observations yet

Download counts and popularity will appear here as the collector receives them.

Declared dependencies 5

Native requirements
5 direct targetsNot calculated transitive count
Package / targetRequirementRelationship
pydantic
Environment
{
  "extras": "",
  "marker": null,
  "requires_python": ">=3.11",
  "evaluation": "NOT_EVALUATED"
}
pydantic>=2.0runtime
rich
Environment
{
  "extras": "",
  "marker": null,
  "requires_python": ">=3.11",
  "evaluation": "NOT_EVALUATED"
}
rich>=13.0runtime
pytest-asyncio
Environment
{
  "extras": "",
  "marker": "extra == \"dev\"",
  "requires_python": ">=3.11",
  "evaluation": "NOT_EVALUATED"
}
pytest-asyncio>=0.23; extra == "dev"runtime
pytest
Environment
{
  "extras": "",
  "marker": "extra == \"dev\"",
  "requires_python": ">=3.11",
  "evaluation": "NOT_EVALUATED"
}
pytest>=8.0; extra == "dev"runtime
ruff
Environment
{
  "extras": "",
  "marker": "extra == \"dev\"",
  "requires_python": ">=3.11",
  "evaluation": "NOT_EVALUATED"
}
ruff>=0.4; extra == "dev"runtime

Distribution files

2 collected
acplint-0.1.0-py3-none-any.whl

bdist_wheel · 25.17 KB · Python py3

Source file
acplint-0.1.0.tar.gz

sdist · 22.77 KB · Python source

Source file

Metadata history

Meaningful changes
Current collected state Current

Observed since 20 Oct, 18:23 UTC

No superseded metadata states collected. Unchanged observations do not create new revisions.

Record identity

package_version:c7da497bcdf02a2a55816dd031d0d0157e8527a44d4fb5feb3a64a3c698e1dcb

Other collected versions

View all collected versions →