A defined tool surface
A tool profile limits what a local MCP client can discover. Operations describe their inputs before they are invoked.
Bounded tools, pre-execution decisions, and inspectable results make agent action easier to govern. The local runtime provides the first pieces of this model.
PyCharter 0.0.67 · public Python API · synthetic records · no account or MCP required. The website presents public synthetic fixtures. It has no production-data upload or live FMP/database action in this walkthrough.
The current libraries support scoped discovery, schema validation, configured policy, and optional audit. Production guarantees depend on how the runtime and adapters are deployed.
A tool profile limits what a local MCP client can discover. Operations describe their inputs before they are invoked.
When configured policy denies an operation, PyActuator returns a refusal before the adapter runs.
A result identifies its adapter. Check adapter.real to distinguish a mock result from a real side effect.
An audit writer can retain structured records of calls and decisions. The current local runtime does not require durable audit storage.
Rows below are checked against the current PyPI releases. A package does not inherit another package's runtime. Coming next means the release that was checked does not ship it.
| Capability | Status | What the checked release does |
|---|---|---|
| Pre-execution refusal | Built today | PyActuator 0.0.17 evaluates a policy after argument checks and before the adapter. A denied call returns POLICY_DENIED. Checked with a DEMO order of 100 at 250 against a notional limit of 10000. |
| Approval that waits for a person | Coming next | Coming next. RequireApproval in PyActuator 0.0.17 is an allow-list. Other callers are denied or dry-run. A page that waits for a person is coming next. |
| Durable audit | Built today | SQLite, Postgres, MongoDB, and SQLAlchemy writers exist. The default writer drops records. With SqliteAuditWriter configured, the refusal above was stored and read back with the tag policy_denied. The HTTP API exposes GET /api/v1/audit. |
| Mock versus real | Built today | A result names its adapter and adapter.real. The checked refusal named MockExecutionClient with adapter.real false. PYACTUATOR_STRICT_ACTUATION=1 refuses a mock when real execution is required. |
| Claude Code connection | Built today | The 0.0.17 guide connects Claude Code with: claude mcp add pyactuator -- pyactuator mcp serve --profile communications. That registers an MCP server. |
| Loopback approval page | Coming next | Coming next. A loopback page where a person approves a waiting call is coming next. pyactuator mcp serve can bind HTTP on 127.0.0.1 port 8765. That address is the tool endpoint. |
| Data contracts and quarantine | Built today | PyCharter 0.0.67 can attach a contract to a pipeline step and set on_error to quarantine with a file DLQ. A checked four-row synthetic file kept 3 rows, quarantined 1 row with amount -5, and failed 0. The quarantined count is the number of rows in the quarantine file. |
| State machines | Built today | PyStator 0.0.47 computes the next state from the current state and a trigger. A checked machine moved received to accepted on accept, and left the state unchanged for an unknown trigger. |
| Local model probe | Built today | PyGubernator 0.0.18 probe_local_models asks a local model server and returns nothing when none answers. Checked here, the probe returned nothing. PyGubernator does not run PyActuator or PyCharter. |
| Governance gate | Coming next | PyGubernator 0.0.18 exposes validate_governance. The no-op client returns conforms without inspecting a store. The local client calls PyCharter's vocabulary validator only when that import succeeds, and otherwise also returns conforms. That is not a fail-closed gate. |
| Policies as code | Coming next | A PyActuator deployment manifest can declare require_approval and limit_notional. A general policy vocabulary is coming next. |
| OpenTelemetry GenAI export | Coming next | Optional OpenTelemetry tracing exists for some API and validation paths in these releases. A GenAI semantic-convention export is not described in the docs that were searched. |
| Decision signing | Coming next | These releases do not ship a signed audit or decision record. PyActuator can verify an inbound provider callback signature. That check is separate from signing a decision. |
| License of the current PyPI releases | Built today | Apache-2.0 (from the next release; earlier releases MIT). PyActuator 0.0.17, PyCharter 0.0.67, PyStator 0.0.47, and PyGubernator 0.0.18 on PyPI still declare MIT. |
The hosted service is being designed to derive agent identity and tool scope from the authenticated key, enforce policy through one invocation path, and produce a durable record for every authenticated decision.