Getting started with Legate
Legate is a content board. You draft posts on it, organise them by account and campaign, and hand the finished ones off to wherever you publish. Nothing is ever posted automatically - Legate is a drafting and review surface, not a publisher.
This guide covers what Legate is, how to set it up, and how to wire it into an AI agent (Claude Code, Hermes, or any MCP client) so you can draft straight from your terminal onto the board.
1. What Legate is
A few concepts to hold onto:
- Workspace - your team's space. Everything (accounts, campaigns, drafts, keys) belongs to one workspace. You can belong to several and switch between them.
- Account - a voice. Each account is a column on the board and has its own handle and voice label (for example
@kamino_swap, "execution-focused product voice"). An account is not a login; it is a brand/persona you write as. - Campaign - a board. A campaign pulls a chosen set of accounts in as columns, so one board can target several voices at once. Cards are grouped by beat (a free label like Teaser, Launch, Follow-up) which you can filter by.
- Card / draft - a single post (or a thread). Cards carry a status (Idea, Drafted, Approved, and so on), an optional template tag and score, notes, and media. There are also note and todo cards for working alongside drafts.
- Scratch inbox - a per-workspace staging area in the right-hand sidebar (the amber "+ draft" button toggles it). Drafts can sit here unattached to any account or campaign, and you promote them onto a board column by dragging when you are ready. This is where agent-sent drafts land by default.
The guiding principle: drafts flow in from anywhere (the UI, scripts, AI agents), you review and curate them on the board, and you export the finished ones by hand. A human always stays in the loop before anything is published.
2. Set up the app
- Sign in at legate.social with Google.
- Create or join a workspace. A new account with no workspace is taken to onboarding, where you create one (or accept an invite link a teammate sent you). Invites and members are managed under Team.
- Add your accounts (voices). For each brand or persona you write as, add an account with its handle and a short voice label. These become the board's columns.
- Create a campaign (board) and add the accounts you want as columns. Drafts you create on that board are grouped by beat and filterable.
- That is enough to start drafting by hand. To draft from an AI agent, set up an API key next.
3. Connect an AI agent
This is the part that lets you say "draft this and put it on my Legate board" from inside Claude Code, Hermes, Codex, or any other MCP-capable tool. Under the hood there is one mechanism (the Model Context Protocol, MCP); the only thing that differs per client is where you paste the config.
3.1 Create an API key (do this first, once)
- In Legate, open Team -> API keys.
- Click Create key, give it a name (for example "Claude Code - laptop"), optionally set an expiry, and Create.
- Copy the key now - it is shown once and never again. It looks like
legate_sk_....
Notes on keys:
- A key is scoped to one workspace. Anything created with it lands in that workspace, and nothing in a request can reach another workspace.
- Keys are revocable at any time (Team -> API keys -> the
x), and can be given an expiry. - They are prefixed
legate_sk_so secret scanners can spot one if it leaks. Treat it like a password.
3.2 How drafts land
Every client exposes the same three tools. The important one is create_draft:
- Omit account and campaign and the draft lands in your scratch inbox for you to place yourself. This is the safe default, and the right choice when the agent does not know your board layout.
- Provide both (
accountas a key or@handle,campaignas a name or id) and the draft drops straight into that board column. - Use
bodyfor a single post, orthread(a list of posts) for a thread.
The other two tools, list_accounts and list_campaigns, let the agent discover valid targets before it commits to a column.
3.3 Claude Code
You have two ways in. The plugin is the smoothest; the manual command is there if you would rather not install a plugin.
Option A - the Legate plugin (recommended)
/plugin marketplace add Bartega/legate-plugin
/plugin install legate@legate
You will be prompted for your API key during install. This bundles the connection plus a /legate-draft command and a drafting skill, so you can run:
/legate-draft a teaser about the new lend vault, for @kamino on the launch campaign
or just talk to Claude ("draft this and drop it in my Legate inbox") and it will use the tools.
Option B - connect the hosted server directly (no plugin)
claude mcp add --transport http legate https://legate.social/api/mcp \
--header "Authorization: Bearer legate_sk_..."
Replace legate_sk_... with your key. That is the whole setup; the create_draft, list_accounts, and list_campaigns tools are now available.
3.4 Hermes
Hermes (NousResearch's hermes-agent) reads MCP servers from ~/.hermes/config.yaml under mcp_servers. Add Legate there. The hosted (HTTP) form needs nothing installed:
mcp_servers:
legate:
url: "https://legate.social/api/mcp"
headers:
Authorization: "Bearer legate_sk_..."
If you prefer a local server (or your Hermes build does not support remote HTTP servers), use the published stdio package instead:
mcp_servers:
legate:
command: "npx"
args: ["-y", "legate-mcp"]
env:
LEGATE_API_KEY: "legate_sk_..."
Then reload and check it connected:
/reload-mcp # inside a Hermes session, after editing the config
hermes mcp catalog # lists configured servers
3.5 Codex and any other MCP client
The same two forms work everywhere; only the file/location differs (see your client's MCP docs for where its server config lives).
Hosted (HTTP): point the client at https://legate.social/api/mcp with header Authorization: Bearer legate_sk_....
Local (stdio): the standard MCP JSON shape:
{
"mcpServers": {
"legate": {
"command": "npx",
"args": ["-y", "legate-mcp"],
"env": { "LEGATE_API_KEY": "legate_sk_..." }
}
}
}
4. The tools
| Tool | What it does |
|---|---|
create_draft | Create a draft on the board. Args: body (or thread for 2+ posts), and optional account (key or @handle), campaign (name or id), beat, template, notes. Omit account + campaign for the scratch inbox; provide both for a board column. |
list_accounts | The accounts (voices/columns) in your workspace, with their keys, handles, and voice labels. |
list_campaigns | The campaigns (boards) in your workspace, with their names and ids. |
Example prompts
- "List my Legate campaigns, then draft a launch-day post for @kamino_swap on the Kamino Learn Launch board."
- "Draft three teaser variants and put them in my Legate inbox so I can pick one."
- "Turn this thread into a Legate draft for @xBartega."
The agent will not invent live numbers or links; it leaves placeholders like <TBD> for you to fill before posting, which the board renders as fill-before-posting chips.
5. Drafting from a script (REST)
If you want to push drafts from a plain script rather than an agent, the same API is a normal REST endpoint. Full reference at legate.social/developers. The essentials:
# Lands in the scratch inbox
curl -X POST https://legate.social/api/v1/drafts \
-H "Authorization: Bearer legate_sk_..." \
-H "Content-Type: application/json" \
-d '{"body":"my draft"}'
# Straight into a board column
curl -X POST https://legate.social/api/v1/drafts \
-H "Authorization: Bearer legate_sk_..." \
-H "Content-Type: application/json" \
-d '{"body":"my draft","account":"xBartega","campaign":"Kamino Learn Launch"}'
# Discover valid targets
curl https://legate.social/api/v1/accounts -H "Authorization: Bearer legate_sk_..."
curl https://legate.social/api/v1/campaigns -H "Authorization: Bearer legate_sk_..."
6. Good to know
- Nothing is ever posted publicly. Every route only creates draft cards on your board. Publishing stays a manual step you take after review.
- Keys are workspace-scoped, revocable, and can expire. Manage them under Team -> API keys. Revoking a key stops anything using it immediately.
- The agent defaults to your inbox. When in doubt it drops drafts in the scratch inbox rather than guessing a board column, so a stray draft is never more than a delete away.
- One key works everywhere. The same
legate_sk_...key authenticates the plugin, the hosted MCP server, the stdio package, and the REST API.
Quick reference
| You want to... | Do this |
|---|---|
| Get a key | legate.social -> Team -> API keys -> Create key |
| Claude Code (plugin) | /plugin marketplace add Bartega/legate-plugin then /plugin install legate@legate |
| Claude Code (direct) | claude mcp add --transport http legate https://legate.social/api/mcp --header "Authorization: Bearer legate_sk_..." |
| Hermes | add a legate server to ~/.hermes/config.yaml (url + headers, or npx legate-mcp + env), then /reload-mcp |
| Other MCP client | hosted URL + Bearer header, or npx -y legate-mcp with LEGATE_API_KEY |
| Script it | POST https://legate.social/api/v1/drafts (see legate.social/developers) |
| Send to the inbox | omit account and campaign |
| Send to a column | pass both account and campaign |