What is this?
Quill's Chronicles is a platform that helps tabletop RPG groups record, organize, and share their campaign stories. This MCP server gives Claude access to your campaign knowledge graph — characters, locations, organizations, story arcs, session transcripts, and more. Campaign owners and co-DMs can also ask Claude to fix and curate their wiki; every edit is previewed first. In Claude, entities, connection graphs, journeys, and transcripts render as interactive views.
Edits are limited to campaigns you own or co-DM. Each has a read-only preview, and Claude asks before applying it.
Users only see campaigns they own or have been invited to. Player/DM role visibility is enforced.
OAuth 2.1 via Clerk. Users authorize the connection and can revoke access at any time.
Setup
Connect from Claude (web, desktop, and mobile)
- In Claude, open Settings → Connectors.
- Find Quill's Chronicles in the connector directory, or choose Add custom connector and enter the server URL below.
- Click Connect and sign in with your Quill's Chronicles account.
https://quillschronicles.com/mcp Once connected on the web or desktop, the connector is also available in the Claude mobile apps.
Connect from Claude Code
Run this command in your terminal, then run /mcp in Claude Code to sign in:
claude mcp add --transport http quill https://quillschronicles.com/mcpAuthentication
On first connection, you'll be redirected to sign in with your Quill's Chronicles account. The server uses OAuth 2.1 with PKCE — your credentials are never shared with the AI client. You need a Quill's Chronicles account with at least one campaign you own or were invited to. Raw transcripts, secrets, and wiki edits are limited to the campaign's DM (owner or co-DM).
Usage Examples
Once connected, you can ask your AI assistant things like:
"Show me all the characters in my Forgotten Realms campaign"
The assistant will call get_worlds to find your worlds,
then get_campaign_entities with entityType: "Character" to list all characters with their descriptions and statuses.
"What is the relationship between Elara and the Shadow Syndicate?"
Calls get_relationship_between_entities to find all
connections between the two, with temporal context showing how the relationship evolved over sessions.
"Summarize what happened in our last 3 sessions and list any unresolved plot threads"
Combines get_session_summary for the "Story Thus Far" digest, get_arc_summary for active arcs, and get_recent_entities to highlight newly introduced elements.
"Find every time someone mentioned the 'Crimson Pact' in session 12"
Uses search_transcript to find exact matches in the
session recording transcript, returning surrounding context lines for each hit.
"The transcriber keeps writing 'Elarra' — change it to 'Elara' everywhere in the wiki"
Calls preview_find_replace to list every record that would change,
shows you the before and after, and only after you confirm runs find_replace.
If the wiki changed in between, the edit is refused rather than applied to different data. Transcripts are never edited.
Available Tools (49)
42 tools only read data. The 7 wiki-edit tools are available to campaign owners and co-DMs; Claude asks for your approval before running them, and those marked destructive change or archive existing records.
Basic Read Operations (9 tools) Core operations for navigating worlds, campaigns, and entities
Core operations for navigating worlds, campaigns, and entities
- List worlds
get_worldsGet a list of worlds the user has access to (owned or invited to campaigns within). This is typically the starting point for exploring data. Worlds the GM has finished carry completed=true.
- Get world
get_worldGet details about a specific world including all its campaigns with their session counts.
- Get campaign
get_campaignGet detailed information about a specific campaign including sessions, arcs, parties, and entity counts.
- List campaign sessions
get_campaign_sessionsGet a chronological list of sessions in a campaign with nested chapters, excerpts of each session's story digest and chapter summaries, and narrative_status. Use brief=true for minimal fields; get_session_summary returns a session's full text.
- List campaign entities
get_campaign_entitiesGet entities in a campaign filtered by type. Use brief=true for minimal fields.
- Get entity
get_entityGet comprehensive details about a wiki entity including type-specific fields.
- Find entity by name
get_entity_by_nameFind an entity by name within a campaign. Useful when you know the name but not the quill_id.
- Get relationship
get_relationshipGet details about a specific relationship between two entities.
- Search wiki
search_wikiSearch for wiki entities by name, description, or aliases. Returns brief results — use get_entity for full details.
Temporal Filtering (6 tools) Filter and explore data by timeline (sessions, chapters, temporal IDs)
Filter and explore data by timeline (sessions, chapters, temporal IDs)
- List entities by time range
get_entities_by_temporal_rangeGet entities created within a specific temporal range. Use format "s001.c005" for temporal IDs.
- List session entities
get_entities_in_sessionGet all entities introduced in a specific session.
- List recent entities
get_recent_entitiesGet entities introduced in the last N sessions.
- Get entity relationship timeline
get_entity_relationships_by_timeGet an entity's relationships sorted chronologically. Identify the entity by quillId, or by entityName plus campaignId.
- Get relationships between entities
get_relationship_between_entitiesGet all relationships between two specific entities. Identify each entity by its quillId, or by name plus campaignId.
- List session chapters
get_session_chaptersGet the chapters within a specific session. Identify the session by sessionQuillId, or by campaignId plus sequenceOrder.
Entity Journey & Relationships (9 tools) Explore entity narratives, connections, and story arcs
Explore entity narratives, connections, and story arcs
- Get entity journey
get_entity_journeyGet a narrative journey of an entity through the campaign. Shows appearances, relationships, and quotes. Identify the entity by quillId, or by entityName plus campaignId.
- Get entity connections
get_entity_connectionsGet all entities directly connected to a given entity through relationships. Each connection carries temporal provenance: neighbor first_seen and per-edge temporal_id (world-prefixed, e.g. "w(default).s005.c002" — the trailing sNNN.cNNN segment is the session/chapter key). Identify the entity by quillId, or by entityName plus campaignId.
- Get relationship essence
get_entity_essenceGet ESSENCE relationship summaries - AI-generated insights condensing all relationships between entities.
- List chapter entities
get_chapter_entitiesGet all entities that appeared in a specific chapter.
- List party members
get_party_membersGet all members of a party: linked Characters (with role, status, join/leave) plus any unlinked member names recorded on the party but not yet linked to a Character node. Membership is based on the party-member edge being active, not on role — members without an assigned role are still returned. Identify the party by partyQuillId, or by partyName plus campaignId.
- Get party relationship timeline
get_party_relationship_timelinePC-centric relationship evolution for a party: every member's relationship events aggregated per (partner, session), with temporal provenance (first_temporal_id per cell, world-prefixed — the trailing sNNN.cNNN segment is the session/chapter key). Partner lists are capped per member by event volume; PC-to-PC rows are always kept. Identify the party by partyQuillId, or by partyName plus campaignId.
- List location occupants
get_location_occupantsGet entities at a location, including nested locations. Identify the location by locationQuillId, or by locationName plus campaignId.
- List organization members
get_organization_membersGet members and affiliates of an organization with roles and influence levels. Identify the organization by orgQuillId, or by orgName plus campaignId.
- List secret holders
get_secret_holdersGet all entities that know a specific secret with context about how they learned it. Secrets are hidden content — only available to campaign owners and co-DMs. Identify the secret by secretQuillId, or by secretName plus campaignId.
Analytics & Statistics (8 tools) Campaign statistics, network analysis, and summaries
Campaign statistics, network analysis, and summaries
- Get campaign stats
get_campaign_statsGet comprehensive statistics about a campaign including entity counts, relationships, sessions.
- Summarize entity type
get_entity_type_summaryGet a summary of all entities of a specific type with aggregated statistics.
- Get relationship network stats
get_relationship_network_statsAnalyze the relationship network for an entity or entire campaign. Pass entityQuillId for one entity, or campaignId alone for the whole campaign.
- Get session summary
get_session_summaryGet the "Story Thus Far" summary for a session. Identify the session by sessionQuillId, or by campaignId plus sequenceOrder.
- List most connected entities
get_most_connected_entitiesFind the entities with the most relationships in a campaign.
- Get entity introduction timeline
get_entity_introduction_timelineGet a timeline of when entity types were introduced throughout the campaign.
- Get talk-time stats
get_talk_time_statsPer-speaker talk-time analytics: who talked, for how long, how many words, and the GM-vs-player split. Session form (sessionQuillId) returns one session's speakers; campaign form (campaignId) returns the per-session series for trend analysis (e.g. "who has been fading?"). DM-only, like the transcript. Multitrack sessions have millisecond-accurate timings; manual text imports return word counts only (timed:false). Each speaker carries mapped:false when its character is just a raw per-session diarization label (no speaker map) — such labels are NOT comparable across sessions, so never aggregate them by name in campaign-level analysis. Speakers carrying unknown:true are tracks the speaker map could not put a name to (the literal placeholder Unknown): pool them with mapped:false ones and never treat them as a character or a player. MEASURED vs INTERPRETED: the talk-time numbers are measured (the multitrack track IS the speaker). The session form also carries spotlight_modes when available — a MODEL'S INTERPRETATION of the session (what kind of scene each stretch was, how each character engaged, standout emotional beats), NOT a measurement; present it as a read, never as fact. It is absent when the session has no computed interpretation.
- Get story arcs
get_arc_summaryGet narrative arcs in a campaign. Lite mode (default) lists all arcs with basic info. Deep mode (provide arcQuillId) returns full arc details including involved entities and spanned chapters.
Transcript Access (3 tools) Read and search session transcripts (game dialogue)
Read and search session transcripts (game dialogue)
- Read transcript lines
get_transcript_linesGet specific lines from a session transcript.
- Get transcript info
get_transcript_infoGet metadata about a session transcript without downloading it.
- Search transcript
search_transcriptSearch for a phrase or keyword within a session transcript.
Utility Tools (2 tools) Dice rolling and oracle for gameplay assistance
Dice rolling and oracle for gameplay assistance
- Roll oracle
roll_oracleRoll the d6 oracle for yes/no questions with narrative complications. Returns results like "Yes, and...", "No, but...", etc. Optionally roll for multiple threads at once (batch mode).
- Roll dice
roll_diceRoll dice using standard notation. Supports modifiers (+/-), advantage (kh = keep highest), and disadvantage (kl = keep lowest). Examples: "1d20+5", "2d20kh1+3" (advantage), "2d20kl1-2" (disadvantage), "4d6kh3" (stat rolling).
Wiki Edits (7 tools) Create, update, archive, merge, and find & replace wiki records in campaigns the user owns or co-DMs
Create, update, archive, merge, and find & replace wiki records in campaigns the user owns or co-DMs
- Update entity
update_entitydestructiveUpdate fields on a wiki entity. Requires owner or co-DM access to the campaign, and campaignId must match the campaign the entity actually belongs to. Its read-only companion preview_update_entity returns the before→after change without writing. Optional expected_updated_at (from preview_update_entity or a prior read) makes the update fail safely if the entity changed in the meantime.
- Create entity
create_entitywriteCreate a new wiki entity in a campaign. Requires owner or co-DM access. Its read-only companion preview_create_entity returns what would be created, including a warning when a same-name entity already exists.
- Create relationship
create_relationshipwriteCreate a relationship (source → type → target) between two entities in the SAME campaign. Requires owner or co-DM access; both endpoints must belong to campaignId (cross-campaign relationships are rejected).
- Archive relationship
archive_relationshipdestructiveArchive (soft-delete) a relationship. Requires owner or co-DM access to the campaign both endpoints belong to; campaignId must match.
- Archive entity
archive_entitydestructiveArchive (soft-delete) a wiki entity. Requires owner or co-DM access; campaignId must match the campaign the entity actually belongs to. Relationships referencing the entity are left dangling; the read-only companion preview_archive_entity reports how many. Optional expected_updated_at (from preview_archive_entity or a prior read) makes the archive fail safely if the entity changed in the meantime.
- Merge entities
merge_entitiesdestructiveMerge one wiki entity into another: all of the secondary entity's relationships are rewired to the primary, its name and aliases are appended to the primary's aliases, and the secondary is archived. Not reversible. Requires owner or co-DM access; both entities must belong to campaignId. The read-only companion preview_merge_entities reports the impact and returns the expected_*_updated_at tokens, which make the merge fail safely if either entity changed in the meantime.
- Find and replace in wiki
find_replacedestructiveBulk find & replace text across a campaign's wiki records (entities, relationships, sessions, chapters, quotes, and the Story Thus Far digests via the story_thus_far field — never transcripts). Requires owner or co-DM access. expected_match_count is the totalMatches returned by preview_find_replace for the same arguments; if the match set has changed since, the call fails with a conflict and nothing is written. Matches whole words only unless wholeWord is set to false; case-insensitive unless caseSensitive is set to true.
Edit Previews (5 tools) Read-only previews that show exactly what a wiki edit would change, without changing anything
Read-only previews that show exactly what a wiki edit would change, without changing anything
- Preview entity update
preview_update_entityPreview a field update without making any change: the entity/campaign, each field's before → after value (and whether it actually differs), and the current updated_at to pass to update_entity as expected_updated_at. Requires owner or co-DM access. Accepts the same field arguments as update_entity.
- Preview entity creation
preview_create_entityPreview creating a new wiki entity without making any change: the campaign, the type/name/fields that would be created, and a warning if a non-archived entity with the same name already exists (a likely duplicate). Requires owner or co-DM access. Accepts the same arguments as create_entity.
- Preview entity archive
preview_archive_entityPreview the impact of archiving an entity WITHOUT making any change: entity name/type, how many non-archived relationships reference it (these become dangling on archive), and its current updated_at (pass it to archive_entity as expected_updated_at). Requires owner or co-DM access to the campaign the entity belongs to.
- Preview entity merge
preview_merge_entitiesPreview the impact of merging one entity into another WITHOUT making any change: both entities' names/types, how many relationships would rewire from the secondary to the primary, name/alias collisions, and both updated_at values (pass them to merge_entities as expected_primary_updated_at / expected_secondary_updated_at). Requires owner or co-DM access; both entities must belong to campaignId.
- Preview find and replace
preview_find_replacePreview a bulk find & replace across a campaign's wiki records without making any change: every record/field that would change, with before/after text and occurrence counts (first 100 matches shown), and totalMatches to pass to find_replace as expected_match_count. Searches entities, relationships, sessions, chapters, quotes, and the Story Thus Far digests (story_thus_far) — never transcripts. Requires owner or co-DM access. Matches whole words only unless wholeWord is set to false; case-insensitive unless caseSensitive is set to true.
Resources
The server also exposes MCP resources for contextual data:
quill://start-here READ THIS FIRST - Recommended workflow for exploring QuillChronicles dataquill://schema/entity-types Describes all entity types (Character, Location, Organization, etc.)quill://schema/relationship-types Describes relationship types that connect entitiesquill://schema/data-model High-level overview of QuillChronicles data structurequill://schema/temporal-ids Explains the temporal ID format (s001.c005)quill://tools/categories Lists all available tools organized by categorySafety & Privacy
- ✓ Confirmed edits: 42 of 49 tools are read-only. Wiki edits require owner or co-DM access, are previewed first, and are annotated so Claude asks for approval before running them. Transcripts and billing data are never modified.
- ✓ Access-scoped: Users only see their own worlds and campaigns. Player/DM role-based visibility is enforced server-side.
- ✓ No data training: Your campaign data is never used to train AI models. See our Privacy Policy.
- ✓ Revocable: You can disconnect at any time from Claude's connector settings or your Quill's Chronicles account settings.
Support
Having trouble connecting or using the MCP server? Reach out to us:
- Email: quill@quillschronicles.com
- Discord: discord.gg/WRDUhgBqzn