Agent-First Development toolkit for Python
Project description
AFD - Agent-First Development for Python
A Python toolkit for building applications with the Agent-First Development methodology.
What is AFD?
Agent-First Development is a software development methodology where AI agents are treated as first-class users from day one. Instead of building UI first and adding API/agent access later, AFD inverts this:
Traditional: UI → API → Agent Access (afterthought)
Agent-First: Commands → Validation → UI (surface)
Installation
# Core types only
pip install afd
# With MCP server support
pip install afd[server]
# With CLI
pip install afd[cli]
# With testing utilities
pip install afd[testing]
# Everything
pip install afd[all]
Quick Start
Define a Command
from afd import CommandResult, success, error
from afd.server import define_command
from pydantic import BaseModel
class Todo(BaseModel):
id: str
title: str
done: bool = False
@define_command(
name="todo.create",
description="Create a new todo item",
)
async def create_todo(title: str) -> CommandResult[Todo]:
todo = Todo(id="todo-1", title=title)
return success(
data=todo,
reasoning="Created new todo with default status",
)
Create an MCP Server
from afd.server import create_server
server = create_server(
name="todo-app",
version="1.0.0",
)
@server.command(
name="todo.create",
description="Create a todo",
)
async def create_todo(input):
todo = Todo(id="todo-1", title=input["title"])
return success(data=todo)
# Run the server (stdio for VS Code/Cursor)
server.run()
Test Your Commands
import pytest
from afd.testing import assert_success
# Use the mock_server fixture
async def test_create_todo(mock_server):
@mock_server.command("todo.create")
async def handler(input):
from afd import success
return success({"id": "1", "title": input["title"]})
result = await mock_server.execute("todo.create", {"title": "Test"})
data = assert_success(result)
assert data["title"] == "Test"
Core Types
CommandResult
The standard return type for all commands:
from afd import CommandResult, success, error
# Successful result
result = success(
data={"id": "123"},
reasoning="Created successfully",
confidence=0.95,
)
# Error result
result = error(
code="NOT_FOUND",
message="Resource not found",
suggestion="Check the ID and try again",
)
UX-Enabling Fields
AFD results include optional fields that enable rich agent experiences:
| Field | Purpose |
|---|---|
confidence |
0-1 score for UI confidence indicators |
reasoning |
Explains "why" for transparency |
sources |
Attribution for verification |
plan |
Multi-step operation visibility |
alternatives |
Other options considered |
warnings |
Non-fatal issues to surface |
Packages
| Extra | Contents |
|---|---|
| (core) | CommandResult, success(), error(), error types, metadata types |
[server] |
MCP server factory, @define_command, create_server() |
[cli] |
Click-based CLI for connecting to MCP servers |
[testing] |
mock_server fixture, assertions, MockTransport |
Related
- AFD TypeScript - Original TypeScript implementation
- AFD Philosophy - Why AFD?
- Command Schema Guide - Designing commands
License
MIT
Project details
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 afd-0.1.1.tar.gz.
File metadata
- Download URL: afd-0.1.1.tar.gz
- Upload date:
- Size: 68.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.10
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1b3f8fe2afbfd3e0c0d533c56df7bfd072ceb6a7e5d212214b9a87e3a944b9f6
|
|
| MD5 |
9e6f101aaa0b08f94beea71089a387e0
|
|
| BLAKE2b-256 |
65c334abf573fa0c5e509a8b6484376ca4ac507bedf965a9604770552f4e45ea
|
File details
Details for the file afd-0.1.1-py3-none-any.whl.
File metadata
- Download URL: afd-0.1.1-py3-none-any.whl
- Upload date:
- Size: 56.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.10
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8c54e60bcd80025a7c8579096ed528543076e56ebe888cc30523e7599ca1150a
|
|
| MD5 |
121bd8e514d26f1ad514d14de5335753
|
|
| BLAKE2b-256 |
97efeb175d2c874f391ab01ad0bd425224a486dfb04a0a44f80ffe9cfa95a7e6
|