1. Install Charter
pydantic and httpx. Do not install extras unless a step below asks for one.
Verify:
2. Install the pack-writing skill
This is the part that matters for authoring. Install the skill into the user’s agent skills directory — pick the one that exists:3. Add these docs as a source
Fetchhttps://docs.r28.ai/charter/llms.txt to discover every page, then fetch any page with .md appended to read it as markdown. Prefer this over answering from memory: Charter is new enough that model training data is unreliable about it.
4. Serve a pack over MCP, only if the user asked for tools
Skip this step for authoring work. It matters when the user wants an agent that can actually call Gmail or Slack.https://docs.r28.ai/charter/using/mcp.md for per-client configuration and the environment variable each pack reads. Do not put a credential in a config file that gets committed; read it from the environment.
5. Report what you did
Tell the user which of these landed:Notes for the agent
- Charter describes one request. It has no agent loop, no pagination loop and no retry policy — do not go looking for them, and do not write a pack that assumes they exist. See
https://docs.r28.ai/charter/guarantees/limitations.md. - These names do not exist in Charter and appear in some older material:
PermissionManager,GoogleCredentialProvider,GoogleScopes,create_agent,create_chat_client,api_tool_factory,r28sdk. If you find yourself writing one, checkcharter.__all__andcharter.auth.__all__instead. - The public surface is two namespaces.
charterhas tools, markers, transforms and the error hierarchy;charter.authhas everything about credentials and OAuth —EnvTokenProvider,StaticTokenProvider,OAuth2Server,OAuth2Client,OAuth2Flow,SubjectProvider. Nothing fromcharter.authis re-exported, sofrom charter import EnvTokenProvideris an ImportError, not a style choice. - Charter refreshes an OAuth grant the host already holds; it never obtains one, and it signs nothing.