Skip to main content
MCP is a compile target, not an adapter. You declare tools once as schemas, and Charter emits a server that speaks the protocol — with serialization, casing, egress policy and envelope checking still owned by the runtime rather than by the transport.
--pack takes any pack name; --name overrides the server name, which defaults to the pack’s. Every flag is listed under python -m charter.mcp. Schemas are sent on demand. MCP is the surface where that costs nothing: the server holds a ToolSession, tools/list reports what is currently loaded, and a load emits notifications/tools/list_changed so your client re-lists on its own. Gmail’s 23 tools arrive as a single ToolSearch whose description lists them by name; each one appears as it is used. Pass --no-progressive for a client that ignores the notification.

Add it to your client

The server speaks stdio, so a client runs it as a command rather than connecting to a URL. Put the credential in the environment, not in a config file you commit.
One entry per pack — the server serves a single pack, so an agent that needs Gmail and Slack gets two. Restart the client after adding one.

Credentials

The entry point reads them from the environment — the same environment fallbacks every pack honours. Shopify needs both variables, since the host is a property of the store.
A raw access token expires in about an hour. For a server that stays up, configure the pack with an OAuth client in your own process rather than using the environment entry point.

What the client sees

The tools a pack exports, with the schema the model is allowed to see — not the full API surface. A field marked Mode("response_only") is absent from the tool definition the MCP client receives, because the LLM view is computed before anything is serialised. The boundary is the same one every other caller crosses.