Skip to main content

ACP Agent Framework

Build custom AI agents using your existing subscriptions. No API keys. No vendor lock-in.

Python 3.10+ License: MIT CI PyPI ACP Protocol

The first open-source Python framework for building agents that speak the Agent Client Protocol (ACP).


How It Works

Architecture diagram

Why ACP?

Traditional Agent Frameworks ACP Agent Framework
Auth Manage API keys per provider Use your existing AI subscriptions
Protocol Proprietary APIs, custom integrations Open standard (ACP) — works with any ACP client
Lock-in Tied to one LLM provider Swap backends with one line: backend="gemini"

Features

Feature Description
Multi-Backend Claude, Gemini, Codex — swap with a single parameter
Agent Orchestration Sequential pipelines, keyword routing, agent-to-agent delegation
Tool Calling Wrap any Python function as an MCP tool the LLM can invoke
Streaming Real-time token-by-token output via async generators
Multi-Turn Conversation history maintained across prompts
Guardrails Input/output validation hooks — redact PII, block injections
Skills Load reusable agent capabilities per agentskills.io spec
Serving ACP stdio (editors), HTTP/SSE (web apps), CLI
State Persistence JsonSessionStore utility to save/restore session state as JSON
Session-Scoped Backends Backend processes spawn once per session and stay warm across turns

Install

pip install acp-agent-framework

For development:

git clone https://github.com/sanjay3290/agentic-framework-acp.git
cd agentic-framework-acp
pip install -e ".[dev]"

Quick Start

Simple Agent

from acp_agent_framework import Agent, serve

agent = Agent(
    name="assistant",
    backend="claude",  # or "gemini" or "codex"
    instruction="You are a helpful coding assistant.",
)

serve(agent)  # Serves over ACP stdio

Sequential Pipeline

Chain agents — each one's output feeds into the next:

Sequential pipeline

from acp_agent_framework import Agent, SequentialAgent, serve

researcher = Agent(
    name="researcher",
    backend="claude",
    instruction="Research the given topic thoroughly.",
    output_key="research",
)

summarizer = Agent(
    name="summarizer",
    backend="claude",
    instruction=lambda ctx: f"Summarize:\n\n{ctx.state.get('research', '')}",
)

pipeline = SequentialAgent(name="research-pipeline", agents=[researcher, summarizer])
serve(pipeline)

Router Agent

Route requests to specialists based on keywords:

Router agent pattern

from acp_agent_framework import Agent, Route, RouterAgent, serve

code_agent = Agent(name="coder", backend="claude", instruction="Help with code.")
writing_agent = Agent(name="writer", backend="gemini", instruction="Help with writing.")

router = RouterAgent(
    name="smart-router",
    routes=[
        Route(keywords=["code", "python", "bug"], agent=code_agent),
        Route(keywords=["write", "essay", "email"], agent=writing_agent),
    ],
    default_agent=code_agent,
)

serve(router)

Custom Tools

Wrap Python functions as tools the LLM can invoke via MCP:

from acp_agent_framework import Agent, FunctionTool, serve

def search_docs(query: str) -> str:
    """Search documentation for a query."""
    return f"Results for: {query}"

agent = Agent(
    name="tool-agent",
    backend="claude",
    instruction="Use tools to help the user.",
    tools=[FunctionTool(search_docs)],
)

serve(agent)

Tools are bridged to the backend via MCP — each FunctionTool is exposed as an MCP tool that the LLM can call during inference.

ToolAgent (No LLM Needed)

For deterministic workflows and data pipelines:

from acp_agent_framework import ToolAgent, FunctionTool, Context

async def build_report(ctx, tools):
    data = tools["fetch_data"].run({"source": "api"})
    return tools["format_report"].run({"data": data})

agent = ToolAgent(
    name="reporter",
    tools=[FunctionTool(fetch_data), FunctionTool(format_report)],
    execute=build_report,
    output_key="report",
)

Guardrails

Validate and transform inputs/outputs:

from acp_agent_framework import Agent, Guardrail, serve

agent = Agent(
    name="safe-agent",
    backend="claude",
    instruction="Be helpful.",
    input_guardrails=[
        Guardrail("pii-redact", lambda t: t.replace("SSN: 123-45-6789", "SSN: [REDACTED]")),
    ],
    output_guardrails=[
        Guardrail("length-limit", lambda t: t[:500] + "..." if len(t) > 500 else t),
    ],
)

Agent Skills

Load reusable capabilities per the agentskills.io spec:

agent = Agent(
    name="chat-agent",
    backend="claude",
    instruction="You are a helpful assistant.",
    skills=["google-chat"],  # loads from .agents/skills/google-chat/SKILL.md
)

Streaming

Real-time token-by-token output:

agent = Agent(name="storyteller", backend="gemini", instruction="Write stories.", stream=True)

async for event in agent.run(ctx):
    if event.type == "stream_chunk":
        print(event.content, end="", flush=True)

Agent-to-Agent Delegation

Wrap any agent as a tool for another agent:

Agent-to-agent delegation

from acp_agent_framework import Agent, AgentTool, serve

translator = Agent(name="translator", backend="gemini", instruction="Translate text.")
summarizer = Agent(name="summarizer", backend="claude", instruction="Summarize text.")

manager = Agent(
    name="content-manager",
    backend="claude",
    instruction="Use translator and summarizer tools to help the user.",
    tools=[AgentTool(translator, cwd="."), AgentTool(summarizer, cwd=".")],
)

serve(manager)

Serving Agents

Transport Use Case Command
ACP stdio ACP-compatible clients serve(agent)
HTTP/SSE Web apps, APIs serve(agent, transport="http", port=8000)
CLI Terminal acp-agent run module:agent

HTTP Endpoints

Method Endpoint Description
POST /api/sessions Create session
GET /api/sessions/{id} Get session info
DELETE /api/sessions/{id} Delete session
POST /api/sessions/{id}/prompt Prompt with SSE streaming

CLI

acp-agent init my-agent                            # Scaffold a new project
acp-agent run my_agent.agent:agent                 # Run over ACP stdio
acp-agent run my_agent.agent:agent -t http -p 8000 # Run as HTTP server

Supported Backends

Backend Command Install
Claude claude-agent-acp npm i -g @agentclientprotocol/claude-agent-acp
Gemini gemini --acp npm i -g @google/gemini-cli
Codex codex-acp npm i -g @agentclientprotocol/codex-acp
GitHub Copilot copilot --acp npm i -g @github/copilot
OpenCode opencode acp npm i -g opencode-ai
Goose goose acp block.github.io/goose
Qwen Code qwen --acp npm i -g @qwen-code/qwen-code
Cursor cursor-agent acp cursor.com/cli
Grok Build grok agent stdio npm i -g @xai-official/grok
Cline cline --acp npm i -g cline
Auggie auggie --acp npm i -g @augmentcode/auggie
Kilo kilo acp npm i -g @kilocode/cli
Devin devin acp devin.ai
Kimi CLI kimi acp kimi.com

Any other agent from the ACP Registry can be used by registering its launch command.

Register custom backends:

from acp_agent_framework import BackendConfig, BackendRegistry

registry = BackendRegistry()
registry.register("my-backend", BackendConfig(
    command="my-agent-binary",
    args=["--acp"],
))

Architecture

Framework internals

Testing

# Unit tests (174 tests)
pytest tests/ -v

# Integration tests (requires backends installed)
pytest tests/ -v -m integration

# Lint
ruff check src/ tests/

Examples

Check the examples/ directory for complete working agents:

Example Description
simple_agent Minimal agent with a single backend
function_tools Weather, calculator, and unit converter tools
tool_agent Hacker News digest without an LLM
guardrails PII redaction and injection blocking
streaming Real-time token streaming
multi_turn Conversational agent with history
router_agent Keyword-based routing
sequential_pipeline Multi-step agent chain
agent_to_agent Manager delegating to specialists

Contributing

See CONTRIBUTING.md for development setup and guidelines.

License

MIT

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

acp_agent_framework-0.2.0.tar.gz (996.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

acp_agent_framework-0.2.0-py3-none-any.whl (39.3 kB view details)

Uploaded Python 3

File details

Details for the file acp_agent_framework-0.2.0.tar.gz.

File metadata

  • Download URL: acp_agent_framework-0.2.0.tar.gz
  • Upload date:
  • Size: 996.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for acp_agent_framework-0.2.0.tar.gz
Algorithm Hash digest
SHA256 fb4beaba7ce9221de55f329959362f1534f22f90ef6b806c71619eb7872ad9b5
MD5 fbb310beeec7a85cfc308ffafe3844f9
BLAKE2b-256 9b50b6525b347c2af83f3ce168441e701856b443cc98274f8ab5adb6b35a1f28

See more details on using hashes here.

Provenance

The following attestation bundles were made for acp_agent_framework-0.2.0.tar.gz:

Publisher: publish.yml on sanjay3290/agentic-framework-acp

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file acp_agent_framework-0.2.0-py3-none-any.whl.

File metadata

File hashes

Hashes for acp_agent_framework-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 08b4ad82bc8d05d5d913af999517c7b20cb05845a6b913b9d92a9f25c6d57b7d
MD5 e8b481de931a91adb33c070f6f90cb8c
BLAKE2b-256 c70445b8f8c3591bf83036f4b73394aaf9bbdb50615e1bbf3a1fa03e48cf5af1

See more details on using hashes here.

Provenance

The following attestation bundles were made for acp_agent_framework-0.2.0-py3-none-any.whl:

Publisher: publish.yml on sanjay3290/agentic-framework-acp

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page