Skip to main content
Charter installs one command, charter-mcp, and it serves shipped packs over the Model Context Protocol on stdio.
uvx runs it without installing anything into a Python of yours, so a client config does not depend on which python the client finds on its PATH. With pip, the same command:
python -m charter.mcp is the same entry point, with the same flags.

charter-mcp

str
required
Which packs to serve. One or more of gmail, gcalendar, gsheets, gdocs, gdrive, gforms, slack, github, stripe, linear, shopify, firecrawl, notion, granola, tavily, outlook, luma. Repeat the flag or comma-separate the names to serve several from one server — --pack gmail --pack slack and --pack gmail,slack are the same thing, order is the order you give, and a pack named twice is loaded once. Anything else is rejected by the argument parser, which exits 2.Prefer one server over several: the key you configure it under is what a host prefixes to every tool name, so one entry keeps the pack out of that prefix. See MCP server.
str
default:"charter"
The MCP server name reported to the client. Note that a host composes tool names from the key the server is configured under, not from this — so changing it does not change what the model sees.
flag
Offer a single ToolSearch instead of every schema, and add tools as the model asks for them, announcing each load with notifications/tools/list_changed. Only for a client that re-lists on that notification and hands the new tools to the model at once — Hermes Agent does; Codex, Claude Code and Google ADK do not, in the ways the MCP page records.--no-progressive, which was how to get every schema before 0.2.6 made it the default, is still accepted and does nothing.
flag
Print usage and exit.
The tools come from each pack’s TOOLS, and the credential from the environment — the packs read their documented variable on first use, so no configure() call is needed here. Every schema is in tools/list from the first request. With --progressive the server holds a ToolSession instead: the client is offered a single ToolSearch listing every tool by name, and loading one emits notifications/tools/list_changed. On start it writes one line to stderr, keeping stdout clear for the protocol:
With --progressive the line ends (schemas on demand via ToolSearch). Then it serves until the client disconnects. Missing the mcp extra raises ImportError from the adapter import, which happens after the pack loads.

Configuring a client

Using it as a function

main and load_pack are importable, but charter.mcp is not part of the public surface: it is the entry point, and the supported way to reach a pack’s tools from your own code is the pack itself.
  • MCP server — every client’s config, what each does with --progressive, and why a long-lived server needs a grant rather than a raw token
  • Adapters — the same tools as LangChain or OpenAI functions
  • Configuration — the environment variables