Index
axm
AXM CLI — Unified command-line interface for the AXM ecosystem.
AXMTool
Bases: Protocol
Structural protocol for AXM deterministic tools.
Implementors must provide:
- name (property): unique tool identifier
- execute(...) : deterministic execution with explicit params
Optionally provide:
- agent_hint (class attribute): optional, free-form one-liner
optimized for LLM consumption: what the tool does, key params, and
what it replaces. Like the other discovery attributes below, it is
not a protocol member and carries no guaranteed fallback — some
discovery tooling reads it best-effort via getattr /
:func:tool_metadata; absent, nothing is substituted.
- expose_directly (class attribute, default False): when
True, the MCP server registers this tool directly in
tools/list (the hot path). When False (default), the
tool is reachable only through the MCP facade
(axm_search -> axm_describe -> axm_call), keeping the
tools/list payload small.
- domain (class attribute, default None): coarse capability
group used by the facade for axm_capabilities and to scope
axm_search (e.g. "ast", "git", "ticket").
- tags (class attribute, default frozenset()): free-form
keywords feeding facade discovery (axm_search).
Uses structural typing (PEP 544) — no inheritance required.
@runtime_checkable enables isinstance() checks. The discovery
attributes (expose_directly / domain / tags) are not
protocol members on purpose: adding data attributes to a
runtime_checkable protocol would make them required for
isinstance() and break the check for the many tools that satisfy
AXMTool structurally without subclassing it. Read them through
:func:tool_metadata (or getattr(tool, name, default)) instead,
which works for subclasses and structural tools alike.
Example::
class MyTool(AXMTool):
agent_hint = "Frobnicate widgets — use width param."
expose_directly = True # hot path (read via tool_metadata)
domain = "widget"
tags = frozenset({"frobnicate"})
@property
def name(self) -> str:
return "my-tool"
def execute(self, *, value: int = 0) -> ToolResult:
return ToolResult(success=True, data={"result": value})
Source code in packages/axm/src/axm/tools/base.py
name
property
Unique tool identifier (e.g., 'esbmc', 'dafny', 'pytest').
execute(**kwargs)
Execute the tool with given arguments.
Subclasses should override with explicit, typed parameters::
def execute(self, *, title: str = "", body: str = "") -> ToolResult:
...
The **kwargs signature here is the structural minimum —
any callable accepting keyword arguments satisfies it.
Returns:
| Type | Description |
|---|---|
ToolResult
|
ToolResult with success status and structured data. |
Source code in packages/axm/src/axm/tools/base.py
DeclarativeTool
Common AXMTool adapter, unavailable without an explicit host binding.
Source code in packages/axm/src/axm/tools/declarative.py
name
property
Canonical name shared by CLI, nodes and MCP.
execute(**kwargs)
Validate and invoke the host binding, never an ambient view.
Source code in packages/axm/src/axm/tools/declarative.py
DeclarativeToolDefinition
dataclass
Immutable tool metadata; schemas are detached on every access.
Source code in packages/axm/src/axm/tools/declarative.py
input_schema
property
Detached JSON Schema for functional arguments, without routing fields.
output_schema
property
Detached JSON Schema for successful ToolResult.data.
validate_input(arguments)
Reject malformed/non-JSON arguments before contacting any view.
Source code in packages/axm/src/axm/tools/declarative.py
validate_result(result)
Validate successful data; failures retain their structural signal.
Source code in packages/axm/src/axm/tools/declarative.py
DeclarativeToolManifest
dataclass
One addon bundle's closed tool declarations.
Source code in packages/axm/src/axm/tools/declarative.py
| Python | |
|---|---|
DependencyEnvironment
dataclass
Trusted runner inputs, transported with the phase contract.
Source code in packages/axm/src/axm/tools/dependency_reads.py
from_mapping(raw)
classmethod
Validate absolute runner locations; never infer a service interpreter.
Source code in packages/axm/src/axm/tools/dependency_reads.py
to_mapping()
Serialize the runner inputs without granting any write prefix.
Source code in packages/axm/src/axm/tools/dependency_reads.py
ToolAccessDenied
ToolMetadata
dataclass
Facade/CLI discovery metadata for a tool, with safe defaults.
Built by :func:tool_metadata from the optional expose_directly /
domain / tags attributes a tool may declare. Centralising the
defaults here keeps the MCP facade and the CLI reading the same contract.
Attributes:
| Name | Type | Description |
|---|---|---|
expose_directly |
bool
|
Whether the tool is on the MCP hot path
(registered directly in |
domain |
str | None
|
Coarse capability group, or |
tags |
frozenset[str]
|
Discovery keywords (possibly empty). |
Source code in packages/axm/src/axm/tools/base.py
ToolNodeError
ToolResult
dataclass
Immutable result of a tool execution.
Attributes:
| Name | Type | Description |
|---|---|---|
success |
bool
|
Whether the tool execution succeeded. |
data |
dict[str, Any]
|
Structured output data (backend-specific). |
error |
str | None
|
Human-readable error message, if any. |
hint |
str | None
|
Optional next-step suggestion for the agent. |
text |
str | None
|
Optional pre-rendered text representation (e.g. Markdown). |
Source code in packages/axm/src/axm/tools/base.py
ValidationFeedback
dataclass
Structured feedback for validation failures.
Attributes:
| Name | Type | Description |
|---|---|---|
what |
str
|
What failed (brief description) |
why |
str
|
Why it failed (expected vs actual) |
how |
str
|
How to fix it (actionable guidance) |
Source code in packages/axm/src/axm/witnesses.py
WitnessResult
dataclass
Result of a witness validation.
Attributes:
| Name | Type | Description |
|---|---|---|
passed |
bool
|
Whether validation passed |
feedback |
ValidationFeedback | None
|
Feedback if validation failed |
verdict |
str | None
|
Optional routing decision for Gates |
metadata |
dict[str, Any]
|
Optional execution metadata |
Source code in packages/axm/src/axm/witnesses.py
failure(feedback, verdict=None, metadata=None)
classmethod
Create a failing result with feedback.
Source code in packages/axm/src/axm/witnesses.py
| Python | |
|---|---|
success(verdict=None, metadata=None)
classmethod
Create a passing result.
WitnessRule
Bases: Protocol
Protocol for witness validation rules.
Source code in packages/axm/src/axm/witnesses.py
validate(content, **kwargs)
Validate content.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
content
|
str
|
The content to validate |
required |
**kwargs
|
Any
|
Additional validation parameters |
{}
|
Returns:
| Type | Description |
|---|---|
WitnessResult
|
WitnessResult indicating pass/fail with feedback |
Source code in packages/axm/src/axm/witnesses.py
load_declarative_manifest(raw)
Validate a JSON manifest from a trusted installed package.
Extra fields, remote schema references, versions and collisions are refused. This validates metadata only: the host verifies the mounted bundle.
Source code in packages/axm/src/axm/tools/declarative.py
require_read_path(path)
Require read authority before opening a service's persisted target.
Both explicit caller targets and implicit configured targets must pass here after canonical service resolution. Relative paths use the active contract's execution root, and symlinks use its canonical readable decision. Transport None explicitly denies reads and suppresses the ambient environment. Only legacy local callers with neither transport binding nor contract stay unrestricted; this helper never grants write authority.
Source code in packages/axm/src/axm/tools/read_authority.py
require_write_path(path)
Require active write authority for a persisted target, or raise PermissionError.
Use this before the canonical business mutation, with the host-configured path, not a path chosen by the model. Only allowed write prefixes count: readable roots/dependency aliases never grant writes. Resolution is relative to the contract execution root and follows symlinks through its canonical resolver. Missing authority is refused, including headless calls without an explicit contract. Local CLI callers may use their explicit AXM_WRITE_CONTRACT.
Source code in packages/axm/src/axm/tools/write_authority.py
session_dependency_environment(project_path)
Resolve a declared runtime, refusing implicit execution via read authority.
Return None only without a transport/local contract. Under a contract a matching declared environment is mandatory, including for readable roots. Keep the interpreter's lexical venv path; resolving its symlink loses venv activation semantics.
Source code in packages/axm/src/axm/tools/dependency_reads.py
tool_access_scope(names)
Apply an immutable allowlist; nested scopes can only narrow it.
Source code in packages/axm/src/axm/tools/access.py
tool_execution_guard(guard)
Install a neutral execution guard; inner scopes cannot remove outer guards.
Guards validate the current lease and may normalize detached keyword args. They run immediately before execution, including cached and injected tools. A transport owns its callback: the SDK does not import the transport.
Source code in packages/axm/src/axm/tools/access.py
tool_metadata(tool)
Read a tool's optional discovery attributes into a :class:ToolMetadata.
Works for tools that subclass :class:AXMTool, tools that satisfy it
structurally, and plain callables — anything missing an attribute falls
back to the default. tags is coerced to a frozenset so callers
can rely on set semantics regardless of how the tool declared it.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
tool
|
object
|
The tool instance (or plain callable) to introspect. |
required |
Returns:
| Name | Type | Description |
|---|---|---|
A |
ToolMetadata
|
class: |
Source code in packages/axm/src/axm/tools/base.py
tool_node(name, *, args=None, returns=None, allow_failure_data=False)
Build a DAG python-node fn(payload) -> dict around an axm.tools tool.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
name
|
str
|
The tool's |
required |
args
|
Mapping[str, str] | None
|
Optional |
None
|
returns
|
Mapping[str, str] | None
|
Precedence / collision: the literal |
None
|
allow_failure_data
|
bool
|
Opt-in for observation tools whose |
False
|
Returns:
| Type | Description |
|---|---|
Callable[[Mapping[str, object]], dict[str, object]]
|
A callable mapping the node's |
Raises:
| Type | Description |
|---|---|
ToolNodeError
|
At call time, if the tool is unknown, returns
|
Source code in packages/axm/src/axm/tools/node.py
| Python | |
|---|---|
130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 | |
tool_scope_sha256(names)
Fingerprint a positive tool list; no provider-specific spelling.
Source code in packages/axm/src/axm/tools/declarative.py
validate_declarative_schema(schema)
Return a detached object schema validated offline for tools or snapshots.
Only the supported 2020-12 dialect and local references are accepted. Remote IDs/vocabularies and legacy recursive dialect keywords cannot weaken it.