Your browser would not let the page write to the clipboard. Copy this instead:
Whose account each call is for
An agent acting in a customer’s account has to stay in that account, and only your app knows which one it is. A field markedFromContext() is filled in by your app on every call and is absent from what the model sees, so a rule like “only this customer’s charges” reads a value the model can’t change. The egress map lists it beside everything else each tool can reach: commit it, and a change to what your agent can reach is a diff in review. The quickstart does it.
What the model sees and what gets sent can’t disagree
The same declaration answers both questions, so they cannot disagree. A field the model must not see is absent from the type it is handed, not filtered out of a prompt afterwards. Across 534 runs against live APIs, that surface produced none of the malformed GraphQL documents, undeclared endpoints or rejected base64 the raw arm did. Task success itself was a wash. The full record, including the template that goes the other way. Read Why Charter for the full story.Your rules, checked before the request
The declaration mirrors the API field by field, so your coding agent can check it against the docs for drift. Your own rules go on top, in the same Pydantic model: a cap, an allowlist, any check you can write in Python. A value can also be pinned out of the model’s reach. Every rule runs before any request. A call that breaks one never reaches the API: the model gets back an error naming the field and what it sent, so it can fix the call or stop. Charter never improvises, and since nothing touches the network, every rule can be tested offline with plain unit tests. The quickstart breaks one on purpose.Plugs into what you run
The framework you already use decides when to call a tool, and Charter makes the call.What you get
Open and direct
Apache 2.0. Your process calls the API. No proxy, no per-call price, no rate limit but the API’s own.
Egress control
A field the model must not see is absent from its schema, and the map is printable.
Deterministic wire
MIME, base64url, protobuf and casing are declared once and built by the runtime, never by the model.
Runs where you run it
No telemetry, no phone-home, no training on your traffic. The only network calls are the API calls you define.
Next
Quickstart
Declare a tool for any API, put your rules on it, watch one get refused, act for one customer.
Packs
Seventeen integrations, 687 tools, ready to configure and call.
Coding agents
The skill that teaches your agent to declare tools for any API, and these docs as a source.
MCP server
Compile a pack into a lean server that speaks the protocol.