mishmar (Python)
Mishmar is a risk management layer for trading bots and AI agents: every order is checked against your limits before it reaches the exchange, large orders wait for your approval, and no key can trade alone.
This is the Python client: build a proposal, sign it with the agent's key, send it to the engine, read the decision.
The package also puts mishmar on the path, so uvx mishmar mcp runs the
MCP server and uvx mishmar signer run the signer without the CLI
installed: the command runs the binary found through MISHMAR_BIN, the
PATH or ~/.mishmar/bin, and when there is none fetches the pinned release
(v0.3.0) into ~/.mishmar/bin first, checked against the release's
checksums.
from datetime import timedelta
from mishmar import AgentKey, Client, Proposal
key = AgentKey.parse("msk_…") # shown once when the engine issued the key
client = Client("http://localhost:8080/v1", key, key_id="key_…")
decision = client.propose(Proposal(
trading_account_id="ta_…", symbol="BTC", side="buy", size="0.25",
order_type="market", valid_for=timedelta(minutes=5),
))
print(decision["verdict"]) # allow | require_approval | block
# Pull a resting order this agent placed through Mishmar: a cancel names the
# order by the clientOrderId its decision carries, and has no side or size.
client.propose(Proposal(
trading_account_id="ta_…", symbol="BTC", kind="cancel",
target_client_order_id=decision["proposal"]["clientOrderId"],
))
Sizes, prices and leverage are decimal strings and are signed exactly as
written: "0.5" and "0.50" are the same quantity but different signatures.
Never pass a float.
A call the engine did nothing with goes again by itself: 503 unavailable
while the engine restarts and 429 rate_limited (after its Retry-After),
for up to 45 s, then the last answer is raised as EngineError. Nothing else
is retried. Client(..., retries=None) turns that off; retries=Retries(budget=90)
tunes it.
Run the tests, which include the cross-language vectors in ../spec/vectors:
pip install -e ".[test]"
python -m pytest
The signer as a child process
With the mishmar binary installed (or fetched with download_binary),
Signer runs it as a child process and the bot holds no secret: the child
has the agent's key and shares, signs each proposal, and sends it one-shot
where it can. Reads go through the child too.
from mishmar import Signer
with Signer() as s: # ~/.mishmar/agent.json
d = s.order("ta_…", "BTC", "buy", "0.001", price="79500")
if d["verdict"] == "require_approval":
d = s.wait(d["id"])
s.cancel("ta_…", "BTC", d["proposal"]["clientOrderId"])
The child stops when this process ends, however it ends: it runs with
--exit-on-stdin-close and a pipe on its stdin. To share one signer among
several processes, or keep it connected across restarts, run it on its own
(mishmar signer run --local unix:/run/mishmar/signer.sock) and attach with
Signer.connect("unix:/run/mishmar/signer.sock"); stop() then leaves it
running. One signer runs per config, so a second Signer() on a config in
use fails and names the process that holds it.
Metadata
Release files for mishmar 0.3.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| mishmar-0.3.1.tar.gz | 35.0 kB | Without provenance | Details for mishmar-0.3.1.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| mishmar-0.3.1-py3-none-any.whl | Python 3 | none | any | Details for mishmar-0.3.1-py3-none-any.whl |
Total release size: 61.5 kB
Release files / mishmar-0.3.1.tar.gz
| Download URL | mishmar-0.3.1.tar.gz |
|---|---|
| Size | 35.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
33b9e92a15f7088189aab3f01fa97ee1f85ec271cfae76d933fa7601836be168
|
|
BLAKE2b-256 checksum How to use checksums |
29aee8445c606cd54f3bf118e227c240a409a2eae097396d6b91fd6bf5abedba
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.7.13
|
Release files / mishmar-0.3.1-py3-none-any.whl
| Download URL | mishmar-0.3.1-py3-none-any.whl |
|---|---|
| Size | 26.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
6ee9bdb239661120d69b8873be35a39fd167193f1572f569b6fab9d1231ffdf0
|
|
BLAKE2b-256 checksum How to use checksums |
f7d390c14aa130a3cb3f543d29d932d89343390cedaa86595b32257dc028d761
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.7.13
|
Security for mishmar 0.3.1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.