Skip to main content

acture (Python)

acture is a development tool first. This Python package is an optional accelerator — an agent can hand-write the same client into your project instead, with no acture Python dependency. Installing it is a deliberate, opt-in choice to reuse a tested facade rather than own it. See docs/positioning.md and docs/hand-written-python-client.md.

The acture library itself is a TypeScript / JavaScript package on npm (https://www.npmjs.com/package/acture); the server side ships as acture-mcp-server. This Python package is a thin client that consumes any acture-mcp-server instance the same way an LLM agent would — via the Model Context Protocol.

Install

pip install acture

Requires Python ≥ 3.10. Brings one runtime dependency: the official mcp SDK (≥ 1.10).

Use

import asyncio
from acture import ActureClient

async def main():
    async with ActureClient.from_stdio(['node', 'dist/cli.js']) as client:
        # Dict-like over the command registry
        print(list(client))                       # ['app.foo', 'app.bar', ...]
        print(len(client))                        # 2
        print(client['app.foo'].description)

        # Call a command
        result = await client['app.foo'](text='hi')
        print(result)                             # the dispatch's structuredContent

asyncio.run(main())

ActureClient is a Mapping[str, Command]. The dict-like surface mirrors dol and py2mcp conventions.

Errors as data

A failed dispatch on the TypeScript side ({ ok: false, error: { code, message } }) arrives in Python as a typed exception:

from acture import ActureError

try:
    await client['app.may_fail'](x=1)
except ActureError as e:
    print(e.code, e.message, e.details)   # e.command_id == 'app.may_fail'

If you want the raw CallToolResult instead — without an exception — use call_raw:

result = await client['app.may_fail'].call_raw(x=1)
if result.isError:
    print('failed:', result.content)
else:
    print('ok:', result.structuredContent)

Transports

Two transports bundled out of the box:

# stdio — launch the server as a subprocess
async with ActureClient.from_stdio(['node', 'dist/cli.js']) as client:
    ...

# streamable HTTP — connect to a long-running server
async with ActureClient.from_http('http://localhost:9000/mcp') as client:
    ...

For an in-memory channel (tests), a WebSocket bridge, or any other transport, pass an async context manager yielding (read, write) streams to ActureClient.connect(transport=...). The bundled helpers (acture.stdio_transport, acture.http_transport) are the reference shapes.

What's intentionally not in v1

Per acture_research_6 §"v1 scope":

  • No Pydantic-codegen SDK. Pydantic adds no value for agents — they read JSON Schema + descriptions. Human users who want typed models can run datamodel-code-generator over each tool's inputSchema themselves; that is post-v1 work and out of scope for the thin facade.
  • No OpenAPI emitter. OpenAPI imposes REST semantics on a function-call protocol; MCP already speaks JSON Schema. Adding a second wire would double the surface area without serving agents.
  • No hard dependency on pydantic, httpx, or any framework. The package is mcp-only; the mcp SDK brings what it needs.

Both are post-v1 candidates; pull-forward decisions are the user's.

Tier filtering

Tier filtering happens on the server side. The Python client sees whatever acture-mcp-server published — typically tier: 'stable' only. To see experimental commands, configure the server-side tiers option, not the client.

See also

License

Apache-2.0.

Metadata

Release files for acture 1.3.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for acture 1.3.1
File Size Uploaded
acture-1.3.1.tar.gz 10.3 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for acture 1.3.1
File Interpreter ABI Platform
acture-1.3.1-py3-none-any.whl Python 3 none any Details

Total release size: 22.7 kB

Release files / acture-1.3.1.tar.gz

Download URL acture-1.3.1.tar.gz
Size 10.3 kB
Tags Source
SHA-256 checksum
How to use checksums
cbd8369d46f59748986a6efc0ea1aa936c3f2c472d600ebb27b00624f7008ec9
BLAKE2b-256 checksum
How to use checksums
fe11f956cc66b50d2d54e4c38fba96764551d85bbf418c5311b77196af3f12aa
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.13

Release files / acture-1.3.1-py3-none-any.whl

Download URL acture-1.3.1-py3-none-any.whl
Size 12.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
09bd720eb8d2ab1cff89f297bb4046c611a217580bbe9cd8c534f1ad60a4ebf2
BLAKE2b-256 checksum
How to use checksums
5906a596f0360a4ce55151c7071af0d485fcd9b4a8f396114a5d5a25006df21c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.13

Release history Release notifications | RSS feed

This release

1.3.1 This release

2 release files

1.3.0

2 release files

1.2.1

2 release files

1.2.0

2 release files

0.0.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page