Python client for an acture MCP server — a dict-like facade over the Model Context Protocol. The acture library itself lives on npm (https://www.npmjs.com/package/acture).
Project description
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
acturePython dependency. Installing it is a deliberate, opt-in choice to reuse a tested facade rather than own it. Seedocs/positioning.mdanddocs/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-generatorover each tool'sinputSchemathemselves; 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 ismcp-only; themcpSDK 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
docs/hand-written-python-client.md— the ~50-line agent-written equivalent.acture-mcp-server— the npm package this client talks to.- Model Context Protocol — the wire protocol.
actureon GitHub — the full ecosystem (TypeScript core, adapters, skills).
License
Apache-2.0.
Project details
Release history Release notifications | RSS feed
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 acture-1.2.1.tar.gz.
File metadata
- Download URL: acture-1.2.1.tar.gz
- Upload date:
- Size: 10.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2131ea2ac3c8a32912415caca7b6db435c699ed7a6ff3dc903ffd674569dc326
|
|
| MD5 |
ca0ca13c7baecc0f290ff04f10b69cfe
|
|
| BLAKE2b-256 |
892acb1fc00b9e7acb713c63812e8f7b285f94d817d9913e4d4e0903114c0f43
|
File details
Details for the file acture-1.2.1-py3-none-any.whl.
File metadata
- Download URL: acture-1.2.1-py3-none-any.whl
- Upload date:
- Size: 12.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ee6822ea11dfcb79a031c123acb5c42309473839c9c852b907e7e1d39acd288d
|
|
| MD5 |
19ab7332cc635815de0a0b94b1bab5b3
|
|
| BLAKE2b-256 |
4b7c337d7fbf1bde06e0e1c8f990df05c494f40cc42fca8f1cb9fd3f5ef9349f
|