Skip to main content

Minimal agent runtime with MCP integration, declarative tools, and streaming

Project description

agentory

A lightweight Python library for building tool-calling agents.

Installation

pip install agentory

Install only the providers you actually need

pip install "agentory[openai]" # + azure
pip install "agentory[anthropic]"
pip install "agentory[all]"

Requires Python 3.12+.

Quickstart

import asyncio
from llmify import ChatOpenAI
from agentory import Agent, Tools, ToolCallEvent

tools = Tools()

@tools.action("Return the current UTC time as an ISO-8601 string.")
def get_time() -> str:
    from datetime import datetime, timezone
    return datetime.now(timezone.utc).isoformat()

async def main():
    llm = ChatOpenAI(model="gpt-5.4-mini")
    agent = Agent(
        instructions="You are a helpful assistant.",
        llm=llm,
        tools=tools,
    )
    async for event in agent.run("What time is it?"):
        if isinstance(event, ToolCallEvent):
            print(f"[tool] {event.tool_name}: {event.status}")
        else:
            print(event)

asyncio.run(main())

Core API

Agent

Agent(
    instructions: str,
    llm: ChatOpenAI | ChatAzureOpenAI | ChatAnthropic,
    tools: Tools | None = None,
    mcp_servers: list[MCPServer] | None = None,
    skills: list[Skill] | None = None,
    max_iterations: int = 10,
    context: T | None = None,
)

The main agent class. Call agent.run(task) to get an AsyncIterator[StreamEvent] that yields either plain str chunks or ToolCallEvent objects.

context is an arbitrary value injected into every tool function that declares a context parameter.

Tools

A registry that turns plain functions into LLM-callable tools.

tools = Tools()

@tools.action("Fetch the content of a URL.", status=lambda a: a["url"])
async def fetch(url: str) -> str:
    ...
  • description – shown to the LLM in the tool schema.
  • name – overrides the function name.
  • status – a string or callable producing a human-readable status shown during streaming.

Type hints on parameters are automatically converted to JSON Schema. Use Annotated[str, "description"] to attach per-parameter descriptions.

Tool

Low-level dataclass representing a single tool. Usually created via Tools.action; useful when constructing tools manually or from MCP servers.

Skill

A piece of reusable instructions injected into the system prompt inside a <skill> block.

from pathlib import Path
from agentory import Skill

skill = Skill.from_path(Path("my_skill.md"))
# or load SKILL.md from a directory:
skill = Skill.from_directory(Path("skills/my_skill/"))

agent = Agent(instructions="...", llm=llm, skills=[skill])

Skill files use optional YAML frontmatter for name and description:

---
name: web-search
description: Search the web for information
---

Use the search tool whenever the user asks about recent events...

MCPServerStdio

Connects to any Model Context Protocol server over stdio and exposes its tools to the agent.

from agentory import Agent, MCPServerStdio

server = MCPServerStdio(
    command="npx",
    args=["-y", "@modelcontextprotocol/server-filesystem", "/tmp"],
)

async with server:
    agent = Agent(instructions="...", llm=llm, mcp_servers=[server])
    async for event in agent.run("List files in /tmp"):
        print(event)

Options:

Parameter Default Description
command Executable to spawn
args [] Arguments for the command
env None Extra environment variables (inherits current env when None)
cache_tools_list True Cache tool discovery after first call
allowed_tools None Whitelist of tool names to expose

StreamEvent

type StreamEvent = str | ToolCallEvent

Events yielded by agent.run(). A plain str is a text chunk from the LLM; a ToolCallEvent signals that a tool is being called.

@dataclass
class ToolCallEvent:
    tool_name: str
    status: str | None

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

agentory-0.1.0.tar.gz (17.1 kB view details)

Uploaded Source

Built Distribution

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

agentory-0.1.0-py3-none-any.whl (13.3 kB view details)

Uploaded Python 3

File details

Details for the file agentory-0.1.0.tar.gz.

File metadata

  • Download URL: agentory-0.1.0.tar.gz
  • Upload date:
  • Size: 17.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.2

File hashes

Hashes for agentory-0.1.0.tar.gz
Algorithm Hash digest
SHA256 f5fe2afde12b094d84e81eb0e36d6f17825ea1deae96d1c4801c5c9ee161c0eb
MD5 7d9ffbef0f200598f5ff8ae4342aefda
BLAKE2b-256 903e868b43abfb8265fe9ff8b89cf4d083dad664320124250616b83b6c415d46

See more details on using hashes here.

File details

Details for the file agentory-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: agentory-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 13.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.2

File hashes

Hashes for agentory-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 76065e4196daea096f8fbe1f071c29cc49b2a73cef22381966478cf81c6dab0e
MD5 a23018f6e4c7d85895886ccc39085310
BLAKE2b-256 d0d471410ef67f92ff501823c7dc9170ea99f2463f1b4f799f36379293f97cff

See more details on using hashes here.

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