Seizn API + MCP
Plug Seizn canon into your AI tool.
A REST API and an MCP server for fiction writers. Recall the canonical state of any character or world fact, run conflict checks against new passages, and explore timeline + graph from inside Claude Desktop, Claude Code, Cursor, Cline, and Continue. Bring your own LLM key, or use Studio Managed.
Base URL: https://seizn.com/api/v1 · Versioned via Seizn-Api-Version: 1.0
Already on Claude Pro / Max, Cursor Pro, or ChatGPT Plus? The recall, remember, graph, and search tools work on the Free tier (50 calls/day) with no extra LLM key — your host AI handles chat, Seizn handles canon. Only check and timeline need a separate LLM key (BYOK) or Studio Managed.
Why Seizn
Long-form fiction breaks LLM context windows. Authors keep canon in scattered Obsidian vaults, Scrivener notes, and Notion pages — and have to re-paste it every session. Seizn keeps the canon as graph + timeline you can query from any AI tool, with conflict checks before you publish.
- Canon, not vector soup. Approved facts are typed entities (character, location, object, event, rule, promise) with provenance — not anonymous embeddings.
- No lock-in. BYOK for any LLM (Anthropic, OpenAI, your own). Studio Managed is a convenience, not a requirement.
- Differentiation vs. Pensiv / Novelcrafter: machine-readable graph + REST + MCP, not just an editor. Plug into the tools you already use.
Quick start — Claude Desktop
The same JSON shape works on every OS. Only the config file location differs. Pick yours below, paste, restart Claude Desktop.
Config file location
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\\Claude\\claude_desktop_config.json - Linux:
~/.config/Claude/claude_desktop_config.json(community / unofficial builds — Anthropic ships official binaries for macOS + Windows only)
Config (paste-ready)
{
"mcpServers": {
"seizn": {
"command": "npx",
"args": ["-y", "@seizn/author-mcp-server"],
"env": {
"SEIZN_API_KEY": "sk_seizn_..."
}
}
}
}Restart Claude Desktop. The Seizn tools (recall, remember, graph, search, check, timeline) appear in the sidebar — Claude decides when to call them based on the conversation. You don't have to invoke them by name.
No npx on your PATH? Use the absolute Node path
Claude Desktop launches MCP servers from a minimal shell — sometimes npx isn't on the PATH it sees. Replace command with the absolute path:
- macOS (nvm):
~/.nvm/versions/node/v20.x.y/bin/npx— find viawhich npx - macOS (Homebrew):
/opt/homebrew/bin/npx(Apple Silicon) or/usr/local/bin/npx(Intel) - Windows:
C:\\Program Files\\nodejs\\npx.cmd
Quick start — Claude Code
Register the MCP server with the Claude Code CLI:
SEIZN_API_KEY=sk_seizn_... \
claude mcp add seizn \
--command "npx" \
--arg "-y" --arg "@seizn/author-mcp-server" \
--env SEIZN_API_KEY=$SEIZN_API_KEYThen ask Claude Code: “Recall everything we know about the protagonist before this chapter.”
Quick start — Cursor / Cline / Continue
Cursor, Cline, and Continue all read MCP servers from the same config shape. In Cursor settings → MCP, add:
{
"name": "seizn",
"command": "npx",
"args": ["-y", "@seizn/author-mcp-server"],
"env": { "SEIZN_API_KEY": "sk_seizn_..." }
}Cline + Continue accept the same JSON in their respective MCP settings panels. The MCP server speaks JSON-RPC over stdio, so any compliant client works without further configuration.
Quick start — WSL (Windows Subsystem for Linux)
WSL is just Linux as far as the MCP server cares — Node ≥20 + npx works the same. The only friction is when a Windows-side AI client (Claude Desktop, Cursor) needs to reach into WSL. Three patterns:
Pattern A — WSL Claude Code (most natural)
Install Claude Code inside WSL Ubuntu. Then everything stays on the Linux side:
# Inside WSL
SEIZN_API_KEY=sk_seizn_... claude mcp add seizn \
--command "npx" \
--arg "-y" --arg "@seizn/author-mcp-server" \
--env SEIZN_API_KEY=$SEIZN_API_KEYPattern B — VS Code with WSL Remote (Cline / Continue)
VS Code attached to WSL via the Remote-WSL extension runs every extension command inside WSL. Use the standard MCP JSON; the npx resolves to the WSL Node:
{
"name": "seizn",
"command": "npx",
"args": ["-y", "@seizn/author-mcp-server"],
"env": { "SEIZN_API_KEY": "sk_seizn_..." }
}Pattern C — Windows Claude Desktop spawning WSL
If you want to keep using Windows-native Claude Desktop but the Seizn server should run on the WSL side, wrap it with wsl.exe:
{
"mcpServers": {
"seizn": {
"command": "wsl.exe",
"args": [
"-e", "bash", "-lc",
"SEIZN_API_KEY=sk_seizn_... npx -y @seizn/author-mcp-server"
]
}
}
}Pattern C crosses the Windows ↔ WSL boundary on every stdio frame; if you see occasional tool call timed out errors, switch to Pattern A. Pattern B is the most common in practice for fiction writers using VS Code.
Troubleshooting
- My MCP client says "tool seizn_author_recall not found".
- The MCP server didn't finish handshaking. Check: (1)
SEIZN_API_KEYenv var is actually set inside the spawned process — Claude Desktop's shell does not source~/.zshrc, soexport-only keys won't reach it. Put the key in the JSONenvblock. (2)npxis on the PATH — see the absolute-path workaround above. - 401 invalid_api_key — even though I just created the key.
- Confirm the key actually starts with
sk_seizn_(Seizn keys, notsk-ant-Anthropic keys). The dashboard shows the secret once at create time; if you closed the modal without copying, click Rotate to issue a new one. The old prefix immediately stops working. - 429 rate_limited ·
Retry-Afterheader. - You hit the per-minute rate limit (Free: 30/min, Indie/Pro: 60/min, Studio+: 600/min). Wait the seconds shown in
Retry-Afterand retry. The MCP server propagates this as a tool error message to your host AI; Claude / GPT will usually wait and retry on its own. - 402 quota_exceeded — monthly quota hit.
- Free is 50 calls/day, Indie is 1,000 calls/mo, Pro is 10,000 calls/mo, Studio+ is 100,000 calls/mo. Upgrade in /dashboard/account/api-keys or wait for the period reset (UTC midnight for daily, UTC first-of-month for monthly).
- 402 precondition_required — "Add X-LLM-Provider and X-LLM-Key".
- You called
checkortimelinewithout BYOK headers. These two endpoints run real LLM inference on Seizn's side, so you either supply your own LLM key (X-LLM-Provider: anthropic+X-LLM-Key: sk-ant-…) or upgrade to Studio Managed. - 503 feature_disabled.
- The Track 2 surface is gated behind
TRACK_2_API_ENABLED. Production has it on; if you're seeing 503 you're probably hitting a custom deployment with the flag off. Contact [email protected]. - WSL:
npx: command not foundwhen Claude Desktop spawns me. - Pattern C from the WSL section uses
wsl.exe -e bash -lc "…"— the-l(login shell) flag is required sonvm/fnm/asdfsources the Node version. Without it, the spawned shell has no Node on its PATH. - Tool calls hang or time out (5+ seconds, no response).
- Most often a stdio buffering issue. If you're on Pattern C (Windows Claude Desktop ↔ WSL), switch to Pattern A or B. If you're on Cline / Continue with VS Code WSL Remote, restart the VS Code window once after first install. If on Claude Desktop directly: quit and relaunch — it does not hot-reload MCP server config.
Still stuck? File at github.com/litheonhq/seizn/issues with the X-Request-Id from the failing response and your client / OS combo.
REST API reference
Authenticate every request with Authorization: Bearer sk_seizn_…. Each response includes X-Request-Id and Seizn-Api-Version: 1.0. Errors are returned as application/problem+json per RFC 7807.
| Method | Path | Cost | Scope | Notes |
|---|---|---|---|---|
| GET | /api/v1/projects | 0 | projects:read | |
| POST | /api/v1/projects | 1 | projects:write | |
| GET | /api/v1/projects/{id}/recall?q=... | 1 | recall | |
| GET | /api/v1/projects/{id}/recall/{entityId}/mentions | 1 | recall | |
| POST | /api/v1/projects/{id}/conflicts/check | 5 | check | BYOK required |
| POST | /api/v1/projects/{id}/canon/{entityId}/approve | 1 | remember | |
| GET | /api/v1/projects/{id}/search?q=...&limit=... | 2 | search | |
| GET | /api/v1/projects/{id}/timeline?from=...&to=... | 5 | timeline | BYOK required |
| GET | /api/v1/projects/{id}/graph?root=... | 1 | graph | |
| GET | /api/v1/usage | 0 | (any) |
Recall — curl
curl https://seizn.com/api/v1/projects/saebyeok-main/recall?q=protagonist \
-H "Authorization: Bearer sk_seizn_..."
# 200 OK
# X-Request-Id: req_...
# Content-Type: application/json
# {
# "entities": [
# { "id": "saebyeok-entity-primary", "type": "character", ... }
# ]
# }Conflicts check — curl (BYOK)
curl -X POST https://seizn.com/api/v1/projects/saebyeok-main/conflicts/check \
-H "Authorization: Bearer sk_seizn_..." \
-H "Content-Type: application/json" \
-H "X-LLM-Provider: anthropic" \
-H "X-LLM-Key: sk-ant-..." \
-d '{"text":"In chapter 12, the protagonist returns home..."}'Error shape (RFC 7807)
HTTP/1.1 402 Payment Required
Content-Type: application/problem+json
{
"type": "https://seizn.com/errors/quota-exceeded",
"title": "Quota exceeded",
"status": 402,
"code": "quota_exceeded",
"detail": "API key sk_seizn_a1b2 reached 1000 calls this month. Upgrade or wait for reset.",
"instance": "/api/v1/projects/saebyeok-main/recall"
}SDK examples
TypeScript (fetch)
type RecallEntity = {
id: string;
type: 'character' | 'location' | 'object' | 'event' | 'rule' | 'promise';
canonicalName: string;
};
async function recall(projectId: string, query: string) {
const url = new URL(`https://seizn.com/api/v1/projects/${projectId}/recall`);
url.searchParams.set('q', query);
const res = await fetch(url, {
headers: { Authorization: `Bearer ${process.env.SEIZN_API_KEY!}` },
});
if (!res.ok) {
throw new Error(await res.text());
}
const body = (await res.json()) as { entities: RecallEntity[] };
return body.entities;
}Python (requests)
import os
import requests
def recall(project_id: str, query: str) -> list[dict]:
res = requests.get(
f"https://seizn.com/api/v1/projects/{project_id}/recall",
headers={"Authorization": f"Bearer {os.environ['SEIZN_API_KEY']}"},
params={"q": query},
timeout=30,
)
res.raise_for_status()
return res.json()["entities"]Security best practices
- Never commit API keys to git. Add
.env*to.gitignoreand turn on GitHub secret scanning for the repo. - Store keys in your platform's secret manager — Vercel, Netlify, Fly, AWS Secrets Manager. Inject as env vars at runtime.
- Rotate keys every 90 days, or whenever a teammate leaves. Use the Rotate button in /dashboard/account/api-keys; the old key is revoked at the moment the new one is issued.
- If a key is exposed publicly: revoke it immediately, then review the audit log to confirm no abuse occurred.
- For BYOK Anthropic keys, create a dedicated key with a cost cap on the Anthropic dashboard — don't reuse your main account key.
- Track 2 keys are rate-limited per minute and quota-limited per month. Treat HTTP 429 / 402 as expected; back off + retry on 429, surface 402 to the user.
Pricing (Track 2 - API + MCP only)
Track 2 covers the public REST + MCP channel and is billed in USD. Web app plans (Track 1) and Program plans (Track 3) stay separate, so checkout and legal consent for API + MCP plans happen on the API + MCP tab of the pricing page. BYOK is the default; Studio Managed is the tier that runs LLMs on Seizn infrastructure, with a metered overage on Opus calls.
| Tier | Charter price | Quota | Rate | Scopes |
|---|---|---|---|---|
| Free | $0 | 50 calls/day | 30/min | recall, remember, graph, search |
| Indie | $11/mo | 1,000 calls/mo | 60/min | recall, remember, graph, search, check, timeline, usage |
| Pro | $23/mo | 10,000 calls/mo | 60/min | recall, remember, graph, search, check, timeline, usage, projects:read, projects:write |
| Studio | $119/mo | 100,000 calls/mo | 600/min | recall, remember, graph, search, check, timeline, usage, projects:read, projects:write, audit:read |
| Studio Managed | $599/mo | 100,000 calls/mo | 600/min | recall, remember, graph, search, check, timeline, usage, projects:read, projects:write, audit:read, managed_llm |
| Enterprise | Contact us | Custom | Custom | All + custom scopes |