The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the Fantasy Tabletop Helper listing page.
Connect Claude Desktop, Cursor, Codex, or any MCP-capable client to your tabletop campaigns, and ask questions about your own world in plain language.
"Which NPCs in Westruun belong to a religion, and which of them have my party already met?"
This repository holds the connection docs and example client configs. The server itself is hosted — it runs inside fantasytabletophelper.com, so there is nothing to install, clone, or keep running.
https://www.fantasytabletophelper.com/api/mcp — keep the www., see belowftth_mcp_…). Reads plus controlled writes (proposals / notes / events you authored). Not OAuth — that is a separate issue.The server queries the database as you, not as an administrator. Row-level security decides the answer, so it can only ever show what the website would show you when logged in.
Writes exist, and they are bounded: notes and events you authored, recaps you submit, and proposals for the DM to review. Nothing an AI tool does through this connection becomes campaign canon until a DM reviews it in the app.
| Who sees it | |
|---|---|
| Party notes | Campaign members |
| DM-only notes | The DM of that campaign, or whoever wrote them |
| Private notes | Only their author |
| Codex entries | Members of that campaign; non-canon entries only for the DM |
If you are a player, pointing an AI client at your campaign cannot surface your DM's secrets. That is enforced in the database, not in application code.
| Tool | Returns |
|---|---|
list_campaigns | Your campaigns, and your role in each |
get_campaign | One campaign's details |
list_sessions | Sessions, most recently played first |
search_codex | NPCs, locations, items, lore, religions, cultures, groups |
get_subject | One codex entry in full, with its relationships |
get_session_notes | Notes from a single session |
get_session_recap | Session recap — plus DM prep hooks if you are the DM |
append_session_note | Add a note (visibility required) |
submit_session_recap | Save a recap you wrote |
propose_subject | Propose a codex entry for the DM to review |
propose_relationship | Propose a link between two existing entries |
list_session_events | Rolls and combat events you may read |
append_session_event | Append one typed event (roll / hit / heal…) |
get_session_transcript | Latest ready transcript — DM only, never the audio |
Factions and guilds are stored as kind: "group" — there is no separate
faction kind.
On the site, go to Account → AI Tool Access (/account/mcp), name the token
after the tool you are connecting, and press Create token.
The token appears once, beginning ftth_mcp_. Copy it then. Only a hash is
stored, so it cannot be shown again. If you lose one, revoke it and make another.
Ready-to-edit files are in examples/. Claude Desktop, for
instance:
Restart the client. ftthelper should appear in its tool list.
www.It is not cosmetic. The bare domain redirects to www, and HTTP clients drop the
Authorization header whenever a redirect changes origin — sensibly, since they
cannot know the new host deserves your credentials. Point a client at
https://fantasytabletophelper.com/api/mcp and the token is stripped in transit,
so the server sees an anonymous request and answers 401 Invalid or missing MCP token for a perfectly good token.
"List my campaigns, then find every religion in the Westruun one."
Press Revoke next to it on Account → AI Tool Access. It takes effect on that client's next request. Revoke any token you have pasted somewhere you no longer control.
| Symptom | Cause |
|---|---|
404 | Wrong path, or the server is switched off on this deployment. |
401 on a token you just made | Almost always the URL: the bare domain instead of www., which strips the token. Check that before suspecting the token. |
401 | Token is wrong, revoked, or expired. Make a new one. |
503 | We could not open a session for your account. Usually transient; retry. |
403 | Your plan is not Hero. |
429 | Soft rate limit (~60 requests/min per token). Wait for Retry-After. |
405 on a GET | Expected. The server is POST-only; your client should be using POST. |
| Connects, but every tool call returns an error | A server-side configuration problem. Contact support — the server logs these. |
| A tool returns an empty list | Usually genuine: you have no campaigns yet, or the search matched nothing. |
The last two rows are worth keeping apart. An empty list is an answer; an error is a fault.
Docs and example configs: MIT. The hosted service has its own terms.