Skip to main content

key-agent-client

A Python client for the headless KeY theorem prover server — for proving that Java code satisfies its JML specification, and for finding out what to do when it does not.

This is a third-party tool. It is not an official KeY component.

It talks to a running keyext.server over JSON-RPC and does nothing else. It contains no Java, ships no jar and never starts a JVM: the server is a separate long-lived process, which is the whole reason it is worth talking to instead of re-running a prover from cold on every attempt.

Install

uv add key-agent-client        # or: pip install key-agent-client

No dependencies. Python 3.10 or newer. Add the [mcp] extra for the MCP server.

Start a server

This client does not start one, on purpose: a library that spawns JVMs is a library that owns processes it cannot supervise. keyext.server lives in this KeY fork — it is not part of upstream KeY — and every release there carries a prebuilt jar. Its name carries both KeY's version and the server's, so ask the release for it rather than writing it down:

gh release download --repo AzoteGwei/key --pattern 'keyext.server-*-exe.jar'
java -Xmx4g -jar keyext.server-*-exe.jar --port 0 --workspace /path/to/project

Give it -Xmx4g. KeY is memory-hungry and the default heap will not survive a real proof. The server publishes the port it got, so nothing needs to be passed to this client. The usage guide has the same download without gh, how to build the jar instead, and the rest of the server's options.

Prove something

from keyclient import KeyClient

with KeyClient.discover(workspace="/path/to/project") as key:
    load = key.wait_for_task(key.load("/path/to/project").task_id)
    env = load.result["envId"]

    contract = key.obligations(env)[0].contract_id
    proof = key.start_proof(env, contract)
    key.wait_for_task(key.run_auto(proof, timeout_ms=60_000).task_id)

    stats = key.statistics(proof)
    print("closed" if stats.closed else f"{stats.open_goals} goal(s) still open")

Or from a shell. This one runs as written, against the example in this repository:

java -Xmx4g -jar keyext.server-*-exe.jar --port 0 --workspace examples/first-proof &

key-agent load .
# env	env-e84opq9w                     your id will differ
key-agent prove env-e84opq9w 'Max[Max::max(int,int)].JML normal_behavior operation contract.0'
# closed	true

Start there. examples/first-proof holds three contracts — one that closes, one whose code is wrong, one missing a loop invariant — so the first answer you see is one you already know, and a closed false afterwards is about the code rather than about the setup.

The one thing to know

Statistics.closed is the server's report of KeY's own Proof.closed(). It is the only value in this library that means a contract was proved. Nothing here computes it, infers it or defaults it.

In particular a finished task is not a closed proof: slow work returns a handle whose status becomes SUCCEEDED, meaning the work ran to an end. A macro that ends leaving three goals open is a succeeded task with three open goals.

Where to go next

If you want to Read
Drive the prover yourself, from Python or the shell Usage guide
Look up a method, a field or an error code API reference
Check that your setup works at all examples/first-proof
Give an agent the prover over MCP MCP server
Install the Claude Code skill skills/key-prover
Work on this client, or cut a release Contributing

The guide's vocabulary section is worth five minutes before anything else: the distinctions in it — finished versus closed, out of ideas versus out of budget — are the ones that get misread.

Licence

MIT. The KeY server it talks to is GPL-2.0-only; this client is a separate program that communicates with it over a network protocol.

Metadata

Release files for key-agent-client 0.2.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 key-agent-client 0.2.1
File Size Uploaded Provenance Actions
key_agent_client-0.2.1.tar.gz 27.8 kB With provenance Details for key_agent_client-0.2.1.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for key-agent-client 0.2.1
File Interpreter ABI Platform Actions
key_agent_client-0.2.1-py3-none-any.whl Python 3 none any Details for key_agent_client-0.2.1-py3-none-any.whl

Total release size: 61.0 kB

Release files / key_agent_client-0.2.1.tar.gz

Download URL key_agent_client-0.2.1.tar.gz
Size 27.8 kB
Tags Source
SHA-256 checksum
How to use checksums
1d7ad7bc90d43e96d255dbda7c6f8263046a39a455bd908cc06dd88b0fc63cde
BLAKE2b-256 checksum
How to use checksums
32d09cdd66acb32e6f582f48aef92ef09e38e77d8c1518b19960a133b62395fd
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 2, 2026.

Transparency log

Release files / key_agent_client-0.2.1-py3-none-any.whl

Download URL key_agent_client-0.2.1-py3-none-any.whl
Size 33.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
3367182863aae1f0941f51a2b1918b8e15d10e657dfdd026d6cbaa51d180a223
BLAKE2b-256 checksum
How to use checksums
a88624f9091c6d6c3182b0176a2b6aba6d76e5e24756d50898c275a3f2c50c3c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 2, 2026.

Transparency log

Security for key-agent-client 0.2.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.

Full provenance

All 2 files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for key_agent_client-0.2.1.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 2, 2026.

Transparency log

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.

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