Python SDK for A2AMCP - Agent-to-Agent communication via Model Context Protocol
Project description
A2AMCP Python SDK
Official Python SDK for A2AMCP (Agent-to-Agent Model Context Protocol) - enabling seamless communication between AI agents working on parallel development tasks.
Features
- Simple Integration: Get started with just a few lines of code
- Automatic Lifecycle Management: Registration, heartbeats, and cleanup handled automatically
- Conflict Resolution: Built-in strategies for handling file conflicts
- Type Safety: Full type hints for better IDE support
- Async/Await: Modern async Python for efficient operation
- Prompt Generation: Intelligent prompt builder for optimal agent instructions
Installation
pip install a2amcp
Quick Start
Basic Agent
import asyncio
from a2amcp import A2AMCPClient, Project, Agent
async def main():
# Initialize client and project
client = A2AMCPClient("localhost:5000")
project = Project(client, "my-project")
# Create and run an agent
async with Agent(
project=project,
task_id="001",
branch="feature/auth",
description="Build authentication"
) as agent:
# Add todos
todo_id = await agent.todos.add("Implement login", priority=1)
# Work with files
async with agent.files.coordinate("src/auth.py") as file:
# File is locked
print(f"Working on {file}")
# File automatically released
# Mark todo complete
await agent.todos.complete(todo_id)
asyncio.run(main())
Orchestrator Spawning Agents
from a2amcp import A2AMCPClient, Project, TaskConfig, AgentSpawner
async def spawn_agents():
client = A2AMCPClient("localhost:5000")
project = Project(client, "my-app")
tasks = [
TaskConfig(
task_id="001",
branch="feature/auth",
description="Build authentication",
shared_interfaces=["User"]
),
TaskConfig(
task_id="002",
branch="feature/profile",
description="Build user profiles",
depends_on=["001"]
)
]
spawner = AgentSpawner(project)
sessions = await spawner.spawn_multiple(tasks, "/path/to/worktrees")
print(f"Spawned {len(sessions)} agents")
Agent with Message Handling
from a2amcp import Agent
agent = Agent(project, "003", "feature/api", "Build API")
@agent.handles("interface")
async def handle_interface_query(message):
if "User" in message['content']:
return "User has: id, email, password, role"
@agent.on("todo_completed")
async def on_todo_completed(event):
print(f"Completed: {event['todo']['text']}")
async with agent:
while True:
await agent.process_messages()
await asyncio.sleep(5)
Core Concepts
Project Context
All operations happen within a project context:
project = Project(client, "project-id")
# Access managers
agents = await project.agents.list()
interfaces = await project.interfaces.list()
todos = await project.todos.get_all()
Agent Lifecycle
Agents automatically handle:
- Registration on startup
- Heartbeats every 30-45 seconds
- Message checking
- Unregistration on shutdown
# Automatic lifecycle management
async with Agent(project, "001", "feature", "description") as agent:
# Agent is registered and heartbeat is running
pass
# Agent is automatically unregistered
File Coordination
Prevent conflicts with built-in file locking:
# Simple coordination
async with agent.files.coordinate("src/models.py") as file:
# File is locked
pass
# File is released
# Advanced with conflict strategies
await agent.files.lock(
"src/models.py",
strategy=ConflictStrategy.WAIT,
timeout=60
)
Inter-Agent Communication
# Query another agent
response = await agent.communication.query(
"task-002",
"interface",
"What fields does User have?"
)
# Broadcast to all
await agent.communication.broadcast(
"info",
"User model updated with new fields"
)
# Check messages
messages = await agent.communication.check_messages()
Shared Interfaces
# Register an interface
await project.interfaces.register(
agent.session_name,
"User",
"interface User { id: string; email: string; }",
"src/types/user.ts"
)
# Require an interface (waits if needed)
user = await project.interfaces.require("User", timeout=60)
Todo Management
# Add todos
todo1 = await agent.todos.add("Design schema", priority=1)
todo2 = await agent.todos.add("Write tests", priority=2)
# Update status
await agent.todos.start(todo1)
await agent.todos.complete(todo1)
# Check all todos in project
all_todos = await project.todos.get_all()
Prompt Generation
Generate optimal prompts for agents:
from a2amcp import PromptBuilder
prompt = PromptBuilder("project-id")\
.with_task({
"task_id": "001",
"branch": "feature/auth",
"description": "Build authentication",
"depends_on": ["database"],
"shared_interfaces": ["User", "Session"]
})\
.with_coordination_rules()\
.with_error_recovery()\
.add_instruction("Use bcrypt for passwords")\
.build()
Advanced Features
Conflict Resolution Strategies
WAIT: Wait for the lock to be released (default)ABORT: Raise exception immediately on conflictQUEUE: Wait in line for the resourceNEGOTIATE: Query the lock owner and negotiate
Event Handling
@agent.on('file_conflict')
async def handle_conflict(event):
print(f"Conflict on {event['file']}")
@agent.on('interface_registered')
async def handle_new_interface(event):
print(f"New interface: {event['name']}")
Project Monitoring
async with project.monitor() as monitor:
async for event in monitor.events():
print(f"Event: {event.type} - {event.data}")
Error Handling
from a2amcp import ConflictError, TimeoutError
try:
await agent.files.lock("src/models.py", strategy=ConflictStrategy.ABORT)
except ConflictError as e:
print(f"File locked by {e.conflict.agent}")
except TimeoutError:
print("Could not acquire lock in time")
Complete Examples
See the examples/ directory for complete examples:
- Basic agent registration and communication
- Agent with message handlers
- Orchestrator spawning multiple agents
- Conflict resolution strategies
- Working with shared interfaces
- Advanced prompt generation
- Todo-driven development
- Project monitoring dashboard
Requirements
- Python 3.8+
- A2AMCP server running (typically at localhost:5000)
- Docker (if using containerized A2AMCP server)
Contributing
Contributions are welcome! Please see CONTRIBUTING.md for guidelines.
License
MIT License - see LICENSE for details.
Links
Support
- GitHub Issues: github.com/webdevtodayjason/A2AMCP/issues
- Discord: Join our community
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file a2amcp_sdk-0.1.4.tar.gz.
File metadata
- Download URL: a2amcp_sdk-0.1.4.tar.gz
- Upload date:
- Size: 18.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
66a43e61a7ccafba38ec03aa4f3ee894ad9a58aefc8d5aed95919be55774d165
|
|
| MD5 |
beb4299cec0d6c744b3e2d250890a0fc
|
|
| BLAKE2b-256 |
2a242902e3efaa6d6007ff50a732e753f2540798f2d6e5ad0a743c3ac684e5be
|
Provenance
The following attestation bundles were made for a2amcp_sdk-0.1.4.tar.gz:
Publisher:
publish.yml on webdevtodayjason/A2AMCP
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
a2amcp_sdk-0.1.4.tar.gz -
Subject digest:
66a43e61a7ccafba38ec03aa4f3ee894ad9a58aefc8d5aed95919be55774d165 - Sigstore transparency entry: 232249956
- Sigstore integration time:
-
Permalink:
webdevtodayjason/A2AMCP@e13e8595c6890337b15e4c9d8b73f9a85116989d -
Branch / Tag:
refs/heads/main - Owner: https://github.com/webdevtodayjason
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@e13e8595c6890337b15e4c9d8b73f9a85116989d -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file a2amcp_sdk-0.1.4-py3-none-any.whl.
File metadata
- Download URL: a2amcp_sdk-0.1.4-py3-none-any.whl
- Upload date:
- Size: 16.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2eeea44c20699f124a48eeadc275329666eeddb29a17352bed26d4a50027e82a
|
|
| MD5 |
5415e5d8aa6fed41aed1a29563f251fd
|
|
| BLAKE2b-256 |
ec760e5b4fd4821cc88b1670c9215d55e2089a4b58a293bfd3b251e329569d16
|
Provenance
The following attestation bundles were made for a2amcp_sdk-0.1.4-py3-none-any.whl:
Publisher:
publish.yml on webdevtodayjason/A2AMCP
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
a2amcp_sdk-0.1.4-py3-none-any.whl -
Subject digest:
2eeea44c20699f124a48eeadc275329666eeddb29a17352bed26d4a50027e82a - Sigstore transparency entry: 232249962
- Sigstore integration time:
-
Permalink:
webdevtodayjason/A2AMCP@e13e8595c6890337b15e4c9d8b73f9a85116989d -
Branch / Tag:
refs/heads/main - Owner: https://github.com/webdevtodayjason
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@e13e8595c6890337b15e4c9d8b73f9a85116989d -
Trigger Event:
workflow_dispatch
-
Statement type: