Skip to main content
Glama
PistachioPony

The Fortuneteller's Hand

The Fortuneteller's Hand — an RPG MCP Server

An MCP server that acts as a role playing game and GM using the rules of The Fortuneteller's Hand, an original tabletop RPG that I am currently working on. Claude reads the cards, casts the omens, and runs the table; the player and Claude will take turns narrating the story that develops.

What playing feels like

A short version, before you install anything: you sit with the Fortuneteller first — where you meet them is the one choice made before any card is drawn. Four suits become four facets of who you are; the Fortuneteller draws one card from each and speaks what it reveals, and you build a character from those four phrases. Once you have your character, you must interpret your Goal card before you set out.

From there, every scene works the same way: decide where you are, flip a card to see what's stirring, narrate forward. The moment the story reaches another heart, something hidden, or needs a turn of luck, you stop and ask fate directly by calling an Omen. Fate can turn against you, too; when it does, you can fight it.

This is, at heart, a creative journaling game. The real pleasure is in the narration you and the Fortuneteller build together, not in winning anything. Motivation, Ends, Seek, and Carry aren't rules to obey; they're seeds, four starting points for your character's psychology and the shape of the story ahead. Follow them where they lead, or let the story wander somewhere else. The more you describe, the more the story gives back.

That's the shape of it. Full mechanics in RULES.md; a gentler, fuller walkthrough in HOW_TO_PLAY.md; a full transcript of an actual session in 08-2026-Play-Example.md. If you ever lose track of your Goal or your four facets partway through a story, just ask the Fortuneteller to remind you.

Related MCP server: mcp-tarot-draw

Running it

Quick install

  1. Download fortunetellers-hand-0.1.1.mcpb somewhere findable.

  2. Double-click it (don't drag it into a chat window — just double-click the file itself). It'll open an install prompt in Claude Desktop.

  3. Confirm the install.

  4. Fully quit and reopen Claude Desktop.

  5. Start a new chat, and pull in the start_game prompt — it'll ask for a character name, then you're off.

Run from source

Requires Python and uv.

  1. uv sync inside this directory.

  2. In Claude Desktop: Settings → Developer → Edit Config, and add:

    {
      "mcpServers": {
        "fortuneteller": {
          "command": "uv",
          "args": ["run", "--directory", "/absolute/path/to/learnMCP", "main.py"]
        }
      }
    }
  3. Fully quit and restart Claude Desktop.

  4. Click the + icon near the message box → Connectors → enable "fortuneteller."

  5. Start a new chat and pull in the start_game prompt.

  6. When it asks for your character's name (player_name), fill that in.

  7. Once the prompt attaches as a chip above the message box, click send or hit enter — attaching it doesn't submit it on its own.

Influences

This project draws from a few places. The Omens' two-dice reading, comparing rather than summing, owes a real debt to Ironsworn by Shawn Tomkin, which I absolutely LOVE. The Defiance ritual, "Not Like This," borrows its five-dice, three-roll, keep-what-you-want shape from Yahtzee (which was stolen from the Puerto Rican game "Jenerala"). As a journaling game, this owes a lot to Thousand Year Old Vampire by Tim Hutchings, one of the games that proved solo, prompt-driven play could carry real weight. Incredible game! And finally, Max Moon has shaped the tone of this project throughout. I adore everything Max Moon creates.

Curious about the build?

This started as a way to learn the Model Context Protocol in a way that would interest me. The tool/resource/prompt choices, the state design, a few real bugs found and fixed along the way, these are all written up in DESIGN.md. If you have any questions or wish me to fix, or add anything, please contact me.

Privacy Policy

  • Data collection: This MCP collects nothing.

  • Usage and storage: Nothing is stored. All game state (your character, cards drawn, debt owed) exists only in memory for the length of your session and is discarded when it ends.

  • Third-party sharing: Nothing is shared with any third party, because nothing is collected in the first place.

  • Data retention: Nothing is retained.

  • Contact information: maria@mariasaha.com

Available Tools

11 tools
call_the_handCall the HandA

Trigger the Called Hand: an omen rolled doubles, so fate intrudes on the scene instead of answering the question.

Call immediately whenever cast_omen returns doubles=True — this isn't
the player's to invoke, Claude always calls it. Plays the oldest
outstanding debt card if any are owed (owed debt always comes due
first), otherwise deals a fresh card from the Fortuneteller's Hand
deck. Either way the landing must intrude on the scene — it costs
something, and the original question the omen asked stays unanswered.
If the player wants to fight the landed fortune, that's when they call
defiance (see defy_roll).

Takes no parameters. Not idempotent: mutates the shared debt row
(pops the oldest card) or the shared Hand deck (deals a fresh card).
Returns a dict with source ("debt_row" or "fresh_deal"), card (the
landed card's rank/suit/phrase/etc.), and a fixed note reminding you
the landing must intrude and the question stays unanswered.
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

It discloses non-idempotency, mutation of shared state (debt row or Hand deck), priority ordering for owed debt, and the exact return shape. Annotations only hint at read-only/destructive status, but the description goes well beyond them, adding meaningful behavioral context without contradicting anything.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is longer than minimal but every sentence earns its place, covering the invocation rule, procedural details, narrative requirement, alternative, side effects, and return contract. It is front-loaded with the trigger condition and structured into logical paragraphs.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a side-effectful tool with an empty schema and no output schema, the description is remarkably complete. It explains the trigger, source selection rule, debt precedence, intrusion requirement, consequences, non-idempotent behavior, and return fields—nothing important is left unspecified.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There are zero parameters, so the schema cannot carry meaning. The description explicitly notes 'Takes no parameters,' which resolves any ambiguity and matches the empty input schema. A baseline of 4 is appropriate for a no-param tool.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool triggers the Called Hand when an omen lands doubles, with a specific triggering condition and relationship to cast_omen. It distinguishes this from defiance and other sibling tools by explaining its exact role in the flow.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when to call it ('immediately whenever cast_omen returns doubles=True'), that it is not for the player to invoke, and points to defy_roll as the alternative for fighting the landed fortune. This provides strong usage guidance with clear exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

cast_omenCast OmenA

Cast an omen: roll two ten-sided dice (light vs dark, compared not summed) to answer a real yes/no question with real stakes.

Call whenever a scene reaches something no one can know in advance —
other hearts, hidden things, or the turn of luck — or when a player
claims an uncertain, high-stakes action simply succeeded. At least one
omen must be asked before a scene can close. Not for material that just
needs new story content rather than a yes/no answer — use
draw_unclaimed_card for that instead.

hope: a plain sentence naming the real stakes being asked about — what
the asker hopes is true (e.g. "I hope the guard doesn't notice me").

Not idempotent: each call rolls fresh dice and increments an internal
counter that alternates who narrates the result. Doesn't mutate any
other game state. Returns a dict describing the roll: on doubles,
{hope, light, dark, doubles: True, reading} — no answer, the Hand is
called instead (see call_the_hand). Otherwise {hope, light, dark,
doubles: False, direction, gap, texture, complication_rank,
complication_meaning, grounds_by} — direction and gap give the answer's
shape, grounds_by says whether the player or Claude narrates the
complication.
ParametersJSON Schema
NameRequiredDescriptionDefault
hopeYes

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses idempotency and state mutation beyond annotations: 'Not idempotent: each call rolls fresh dice and increments an internal counter that alternates who narrates the result. Doesn't mutate any other game state.' Also describes the doubles case where no answer is given and the Hand is called. Annotations only provide readOnlyHint:false and destructiveHint:false, so this adds significant value.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Every sentence earns its place, covering purpose, usage, parameter, and behavior. The description is structured logically, front-loading the core mechanic, then usage rules, then parameter semantics, then return values. It is detailed but not redundant.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description fully details return values: 'Returns a dict describing the roll: on doubles, {hope, light, dark, doubles: True, reading} — no answer, the Hand is called instead (see call_the_hand). Otherwise {hope, light, dark, doubles: False, direction, gap, texture, complication_rank, complication_meaning, grounds_by}.' It also clarifies the meaning of key fields and side effects, making it complete for an agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must fully explain parameters. It does: 'hope: a plain sentence naming the real stakes being asked about — what the asker hopes is true (e.g. "I hope the guard doesn't notice me").' This adds concrete meaning and an example, going beyond the schema's bare title.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states the tool's purpose with a specific verb and resource: 'Cast an omen: roll two ten-sided dice (light vs dark, compared not summed) to answer a real yes/no question with real stakes.' It clearly distinguishes from siblings by noting 'use draw_unclaimed_card for that instead' for non-yes/no content.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit when-to-use and when-not-to-use guidance: 'Call whenever a scene reaches something no one can know in advance — other hearts, hidden things, or the turn of luck — or when a player claims an uncertain, high-stakes action simply succeeded.' It also includes an exclusion and alternative: 'Not for material that just needs new story content rather than a yes/no answer — use draw_unclaimed_card for that instead.'

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

complete_goalComplete GoalA

Mark the current Sitting's Goal as completed, once the story has actually resolved it.

Call at most once per Sitting, only after an Omen's grounding has landed
and, checked against the Goal's saved interpretation (get_sheet's 'goal'
field), genuinely resolves what the Goal meant — never call this
preemptively, ahead of the grounding that earns it. Distinct from
draw_goal_card, which deals the Goal at the start of the Sitting;
complete_goal only marks it finished later in play.

Takes no parameters. Idempotent in effect (repeated calls leave the flag
True) but should only be invoked the one time the resolution actually
happens. Sets and returns goal_completed as True.
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only say readOnlyHint=false, destructiveHint=false, which doesn't convey the side effect or idempotency. The description adds crucial context: it is idempotent, sets a flag, and returns goal_completed as True. It also clarifies the exact timing condition, going well beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Each sentence earns its place: purpose, timing condition, prohibition, sibling distinction, idempotency note, and return value. The structure is front-loaded with the purpose and flows logically. No fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no parameters and no output schema, the description covers all essential information: what the tool does, when to call it, when not to, how it differs from a sibling, and its behavioral properties. This is fully complete for an agent to invoke correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0 parameters, the baseline is 4. The description explicitly states 'Takes no parameters' and mentions the return value, which is sufficient since there's nothing to explain about arguments. It adds no unnecessary parameter details.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description starts with a specific verb+resource: 'Mark the current Sitting's Goal as completed', and immediately clarifies the condition ('once the story has actually resolved it'). It also distinguishes from sibling tool draw_goal_card by location in play (start vs later), satisfying the need for differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit when-to-use and when-not-to-use: 'Call at most once per Sitting, only after an Omen's grounding has landed... never call this preemptively'. It also names an alternative (draw_goal_card) and explains the boundary (deals vs marks finished). This is textbook usage guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

defy_resolveResolve DefianceA

Lock in the current defiance dice as final, deal debt, and reset the ritual.

Call once, after defy_roll has been called at least once and the
player is done rolling (whether by choice or because three rolls were
taken). Ends the current defiance ritual — a subsequent defy_roll call
starts a fresh one from scratch.

Takes no parameters. Raises ValueError if called before any defy_roll
in this ritual. Not idempotent: mutates the shared debt row, adding
one debt card per roll taken during the ritual (more rolls, more debt,
win or lose), and clears the ritual's dice/roll-count state. Returns a
dict with final_dice, rolls_taken, pattern and bend (None if no
scoring pattern was hit — otherwise three of a kind/"turn the blade",
small straight/"stay the hand", full house/"take the cup", or five of
a kind/"seize the pen"), and debt_dealt (the cards just added to the
debt row).
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Despite annotations (readOnlyHint=false, destructiveHint=false), the description greatly extends transparency: it warns about a ValueError if called prematurely, declares it non-idempotent, details that it adds one debt card per roll taken (win or lose), and resets dice/roll-count state. It also fully explains return fields, including pattern meanings.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured: a single-sentence summary first, then clear usage prerequisites, then a detailed behavior/return spec. Every sentence adds value, and the length is justified by the tool's complexity (state mutation, error handling, and a rich return value).

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description fully explains the return dict (final_dice, rolls_taken, pattern, bend, debt_dealt) and the pattern value mappings. It covers the error condition, state mutation, and the ritual lifecycle, making it complete for the tool's complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, and the schema is an empty object. The description explicitly states 'Takes no parameters,' and no further parameter guidance is needed. Per the rubric, a baseline of 4 applies for zero-parameter tools, and the description does not add parameter-specific meaning beyond that.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a precise action: 'Lock in the current defiance dice as final, deal debt, and reset the ritual.' It clearly distinguishes from siblings like defy_roll (the preceding step) and call_the_hand, making the purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly specifies when to call: after defy_roll has been used at least once and rolling is done (whether by choice or after three rolls). It also notes that a subsequent defy_roll starts a fresh ritual, providing clear sequencing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

defy_rollRoll Defiance DiceA

Roll (or re-roll) the five defiance dice, Yahtzee-style, when a player wants to fight a landed fortune from call_the_hand.

Call once to make the first roll (keep=None or []), then optionally
call again up to two more times to re-roll, keeping whichever dice the
player wants to hold between rolls. Up to three rolls total; call
defy_resolve once the player is satisfied with the dice (or after the
third roll) to lock in the result and deal debt.

keep: the die face values (1-6) to hold onto from the current dice
before rolling the rest fresh — e.g. keep=[6, 6] to hold two sixes.
Must be a subset of what's actually currently showing (raises
ValueError otherwise), and must be empty/None on the very first roll of
a ritual (there are no dice to keep yet).

Not idempotent: mutates shared dice/roll-count state across calls
within one defiance ritual; each extra roll taken also means more debt
dealt later at defy_resolve. Returns a dict with dice (sorted current
values), rolls_taken, rolls_remaining, and current_pattern/current_bend
if the dice already match a scoring pattern (three of a kind, small
straight, full house, or five of a kind — see defy_resolve).
ParametersJSON Schema
NameRequiredDescriptionDefault
keepNo

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only say readOnly=false and destructiveHint=false, so the description must carry the burden. It goes well beyond that by disclosing non-idempotency, mutation of shared dice/roll-count state, extra debt consequences, and constraints such as requiring keep to be a subset of current dice.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is detailed but efficient, front-loading the core purpose before explaining the two-phase invocation flow, parameter rules, and side effects. No sentence is filler; the repetition of 'up to three rolls' is minor and reinforces the boundary.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's moderate complexity and lack of output schema, the description covers all needed information: exact call flow, parameter constraints, state mutation effects, consequences for debt, and return value structure including dice and pattern fields. The reference to defy_resolve for scoring/enforcement also completes the ritual workflow.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must fully explain keep. It does: keep holds die face values to preserve before re-rolling, must be a subset of the current showing dice, raises ValueError otherwise, and must be empty/None on the first roll. This is complete and actionable.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Roll (or re-roll) the five defiance dice, Yahtzee-style.' It clearly identifies when the tool applies ('when a player wants to fight a landed fortune from call_the_hand') and distinguishes it from the related sibling defy_resolve, which locks in the result.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit calling instructions: use on the first roll with keep=None, re-roll up to two more times, hold dice via keep, and call defy_resolve when satisfied. It clearly frames the tool within the larger defiance ritual and names the sibling that handles the next step.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

draw_cross_cardDraw Cross CardA

Draw one card, blind, into a position on the Sitting's cross — the four-drive character-creation spread built once at the start of every campaign.

Call once per drive during the Sitting, after the player has chosen a
suit for that drive: Motivation, then Seek, then Carry, then Ends, in
that order. Each of the four positions and each of the four suits can
only be used once each — calling this with a position or suit already
used raises ValueError. "Blind" means the card is drawn face-down from
the matching suit's own 13-card pile without looking; don't reveal its
phrase to the player until all four drives have a card.

suit: which of the four card suits (♥ Hearts, ♦ Diamonds, ♣ Clubs,
♠ Spades) the player chose for this drive — each suit represents a
different domain of meaning (love/loyalty, wealth/ambition,
labor/growth, death/conflict).
position: which of the four drives this card fills — Motivation, Seek,
Carry, or Ends.

Not idempotent: mutates the shared cross and removes a card from the
suit's pile. Returns the drawn card as a dict with rank, suit,
suit_name, domain, rank_meaning, and phrase.
ParametersJSON Schema
NameRequiredDescriptionDefault
suitYes
positionYes

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations, the description discloses that the operation is not idempotent, mutates the shared cross, removes a card from the suit's pile, returns a specific dict shape, and that the card's phrase should not be revealed until all four drives are filled. This is strong behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but every sentence adds necessary context: purpose, invocation order, uniqueness constraints, blindness behavior, parameter meanings, mutation effects, and return shape. There is no filler or repetition of structured data.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has no output schema and only enum-based parameters, the description supplies all needed context: what the tool does, exactly when to call it, what parameters mean, what state changes occur, what errors arise, and what the returned dict contains. It is complete for safe invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description fully compensates: it explains suit meanings and suits' names, defines position values as the four drives, and clarifies the semantic roles each suit represents. The parameters are entirely enriched beyond the bare enum values.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb and resource: 'Draw one card, blind, into a position on the Sitting's cross' and distinguishes this from sibling drawing tools by anchoring it to the four-drive character-creation spread. It clearly names what the tool does and the exact context.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit when-to-use guidance: call once per drive after the player chooses a suit, and in the order Motivation, Seek, Carry, Ends. It also states when not to call it—each position and suit can only be used once, and a reused value raises ValueError.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

draw_goal_cardDraw Goal CardA

Deal the Goal: draw one card face-up from whatever's left across all four suit piles, once all four drives have been drawn.

Call once, during the Sitting, right after all four calls to
draw_cross_card are done (one per drive: Motivation, Seek, Carry, Ends)
and the player has described their character. Unlike draw_cross_card,
this draws from the combined remainder of all four suit piles at once,
not one specific suit — and it's revealed to the player immediately,
not held back. After dealing it and asking what it means, pass the
player's answer to record_goal_interpretation.

Takes no parameters. Raises ValueError if called before all four cross
positions are filled, or if a Goal has already been dealt this Sitting.
Not idempotent: mutates the shared Goal and the relevant suit pile.
Returns the drawn card as a dict with rank, suit, suit_name, domain,
rank_meaning, and phrase.
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations, the description discloses error conditions ('Raises ValueError if called before all four cross positions are filled, or if a Goal has already been dealt'), non-idempotency, mutation of shared state, and the return shape. This goes well beyond what readOnlyHint and destructiveHint already reveal, and it does not contradict the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Each sentence adds necessary information: sequencing, comparison to draw_cross_card, error preconditions, state mutation, and return fields. The description is detailed but not padded, and it is organized in short scannable paragraphs.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Since there is no output schema and stateful game rules matter, the description fills an important gap by specifying the returned dict fields, exact call timing, before-conditions, and post-call handoff. No essential operational detail appears missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters and no required fields, so the schema is already complete. The description explicitly confirms 'Takes no parameters' and instead places invocation correctness on preconditions and state, which is the appropriate level of guidance for a 0-parameter tool.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific action: 'draw one card face-up from whatever is left across all four suit piles' and clearly identifies the goal-card purpose. It also distinguishes itself from draw_cross_card by noting the combined-pile behavior and immediate reveal, which prevents sibling confusion.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives precise sequencing: call once during the Sitting, after all four draw_cross_card calls, and after the player has described their character. It also explicitly contrasts with draw_cross_card and directs the next step to record_goal_interpretation, giving clear when-to-use and next-action guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

draw_unclaimed_cardDraw Unclaimed CardA

Draw one card from the Fortuneteller's Hand deck to open or refuel a scene with new story material.

Call at the start of every new scene, and again mid-scene any time the
story genuinely needs new material rather than a yes/no answer — for a
yes/no question, use cast_omen instead. Read the returned phrase cold,
before narrating anything else; only afterward do you narrate the scene
forward and let its meaning land in the fiction.

Takes no parameters. Not idempotent: each call removes and returns a
different card from the shared, shuffled deck (auto-reshuffles when the
deck runs out). Returns a dict with rank, suit, suit_name, domain,
rank_meaning, and phrase.
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations, the description discloses that the tool is not idempotent, removes a distinct card from a shared shuffled deck, auto-reshuffles when exhausted, and returns a dict with six specified fields. These are important behavioral details not available from readOnlyHint/destructiveHint alone.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose and every sentence adds needed guidance: when to use, when not to use, how to handle the phrase, non-idempotence, and return structure. It is longer than a one-liner, but the content is all operational and necessary.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Because there is no output schema, the description fully covers the return value by listing the dict fields. It also explains deck behavior, reshuffling, and the intended narrative workflow, making the tool self-sufficient for an agent to invoke correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes no parameters, and the schema already reflects this with an empty properties object. The description explicitly confirms 'Takes no parameters,' so there is no parameter semantics gap to compensate for. Baseline 4 is appropriate for a zero-parameter tool.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's action: 'Draw one card from the Fortuneteller's Hand deck to open or refuel a scene with new story material.' It names the specific resource (Fortuneteller's Hand deck) and distinguishes its purpose from cast_omen, which is explicitly reserved for yes/no questions.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit invocation guidance: call at the start of every new scene, and mid-scene when the story needs new material. It also names the alternative for yes/no questions ('use cast_omen instead') and instructs the agent to read the returned phrase before narrating anything else.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_sheetGet Character SheetA
Read-only

Read the current character sheet: the Sitting's cross, Goal, debt row, and whether the Goal is completed.

Call any time you need to check saved state rather than re-deriving
it — for example, checking the Goal's saved interpretation before
calling complete_goal, or checking goal_completed before deciding
whether to close the campaign at a scene's end. Read-only: never
mutates game state.

player_name: must exactly match the name already set via
name_character for the character currently in play; raises ValueError
if no character has been named yet, or if the name doesn't match the
current character.

Returns a dict with cross (the four drive-to-card mapping), goal (the
dealt Goal card plus its recorded interpretation, or None if not yet
dealt), debt_row (list of outstanding debt cards), and goal_completed
(bool).
ParametersJSON Schema
NameRequiredDescriptionDefault
player_nameYes

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and destructiveHint=false. The description adds specific error behavior (raises ValueError if no character named or name mismatch) and return format. It doesn't contradict annotations, and adds useful behavioral context beyond the safety flags.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Description is longer than typical but every paragraph adds essential info: purpose, usage context, error semantics, return structure. Well-structured with clear paragraphs. Slightly verbose but justified.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given simple tool, it fully explains what it returns, when to call, error casesable. No output schema, so description covers return dict. Sibling tools are distinct (mutating actions vs this read-only query). Complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema has 0% description coverage, but the description comprehensively explains player_name: exact match requirement, error conditions, and relationship to name_character. This is far beyond schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states it reads the current character sheet with specific contents (cross, goal, debt row, goal_completed), and distinguishes itself from siblings as read-only state access. The verb 'Read' is specific and the resource is well-defined.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says 'Call any time you need to check saved state rather than re-deriving it' and gives concrete examples like checking interpretation before complete_goal or checking goal_completed to decide campaign closure. Also states read-only nature and error conditions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

name_characterName CharacterA

Set the name of the character being created for a new Sitting.

Already called automatically, once, when the start_game prompt runs —
you typically won't need to call this tool yourself. It exists as a
standalone tool mainly so get_sheet and other tools have a name to
validate against. Call it directly only if you need to (re)name a
character outside the normal start_game flow.

player_name: the player-chosen name for their character. No format
constraints.

Not idempotent: overwrites the shared character name each time it's
called, with no confirmation or uniqueness check. Returns
{"player_name": player_name}.
ParametersJSON Schema
NameRequiredDescriptionDefault
player_nameYes

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses non-idempotency, overwriting behavior, lack of confirmation/uniqueness check, and the exact return format. Annotations indicate readOnlyHint=false and destructiveHint=false, and the description adds specifics beyond these (overwrite semantics, no uniqueness check) without contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise yet complete: front-loaded purpose, automatic-call note, usage guidance, idempotency warning, and return format—all in a few well-structured sentences.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple 1-parameter tool, it covers purpose, automatic invocation, when to call directly, behavior (overwrite, no checks), and return schema, leaving no ambiguity for the agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Despite zero schema description coverage, the description explains player_name is the player-chosen name with no format constraints, adding meaning not in the schema. It also clarifies the return value with that parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Set the name of the character being created for a new Sitting' with a specific verb and resource. It also distinguishes itself from siblings by noting it's automatically called and exists for other tools to validate against.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly explains when it's called automatically, that users typically don't need to call it, and provides clear guidance for when to invoke it directly (renaming outside the normal flow). This distinguishes it from alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

record_goal_interpretationRecord Goal InterpretationA

Save the player-and-Claude-agreed meaning of the Goal card onto the Goal, for later reference.

Call once, during the Sitting, right after the player has answered what
the Goal means and Claude has reflected that answer back in a sentence
or two — pass that reflected sentence in. This becomes the saved
reference that complete_goal later checks against (via get_sheet's
'goal' field) to judge whether a moment in play genuinely resolves the
Goal.

interpretation: a plain-language sentence or two capturing what the
Goal means for this character — Claude's own reflected summary, not a
verbatim quote of the player's answer.

Raises ValueError if called before draw_goal_card has dealt a Goal.
Not idempotent: overwrites any existing interpretation on the shared
Goal. Returns the full updated Goal card dict, including the new
'interpretation' field.
ParametersJSON Schema
NameRequiredDescriptionDefault
interpretationYes

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses that the tool overwrites existing interpretations (not idempotent), raises an error if called at the wrong time, and returns the full updated Goal card dict. These details go beyond the annotations (readOnlyHint false, destructiveHint false) and provide important behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured and concise, with each sentence serving a purpose. It avoids fluff and presents information logically: purpose, timing, parameter details, error conditions, and return value. The repetition of key points is minimal and does not detract from clarity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the sparse schema (only a string parameter with no description) and no output schema, this description provides complete context: what the tool does, when to call it, what the parameter means, what errors can occur, and what it returns. It also relates to other tools (draw_goal_card, complete_goal, get_sheet), making it self-contained.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description thoroughly explains the 'interpretation' parameter: it should be a plain-language sentence or two capturing what the Goal means, and explicitly states it should not be a verbatim quote. This adds significant meaning beyond the schema's simple string type.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: to save the player-and-Claude-agreed meaning of the Goal card. It distinguishes itself from siblings by explaining its role in the flow (e.g., it feeds into complete_goal) and provides specific context about when it is used.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when to call: once, during the Sitting, right after the player has answered and Claude has reflected. It also notes a precondition (must be after draw_goal_card) and an error condition (raises ValueError if called too early), giving clear usage boundaries.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 11 tool updatesv0.1.0
    • First observedcall_the_hand
    • First observedcast_omen
    • First observedcomplete_goal
    • First observeddefy_resolve
    • First observeddefy_roll
    • First observeddraw_cross_card
    • First observeddraw_goal_card
    • First observeddraw_unclaimed_card
    • First observedget_sheet
    • First observedname_character
    • First observedrecord_goal_interpretation

TDQS

A4.9/5.0
Disambiguation5/5

Each tool occupies a distinct step in the game flow—character creation, omen resolution, defiance, or state reading—and the descriptions explicitly state when to call each. Even though several tools draw cards or roll dice, their triggers and parameters are clearly separated, so an agent would not confuse them.

Naming Consistency5/5

All tools follow a consistent verb_noun pattern with lowercase and underscores, using clear action words like draw, cast, call, defy, get, complete. The only slight variation is 'call_the_hand' which includes an article, but it's still a verb-phrase pattern, so the naming is highly predictable.

Tool Count5/5

Eleven tools is appropriate for this game system, covering character building, scene resolution, and state management without being excessive. Each tool serves a concrete purpose, and the count falls squarely in the recommended 3-15 range.

Completeness5/5

The tool set covers the full lifecycle of a Sitting: naming, cross and goal drawing, interpretation recording, scene omen and hand mechanics, defiance rituals, unclaimed cards, state inspection, and goal completion. There are no obvious missing operations that would force an agent to work around gaps.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    An MCP server that draws tarot cards from the 78-card deck and interprets them for your situation, using StupidAPIs with an X-API-Key required.
    14
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    MCP server providing true randomness capabilities to Claude, enabling cryptographically secure random number generation for games, decision-making, sampling, simulations, and any operation requiring genuine randomness.
    13
    2
    MIT
  • F
    license
    B
    quality
    B
    maintenance
    An MCP server that provides 18 tools for dice rolling, luck tests, character management, world state, combat, and save/load, enabling an AI game master to run a solo-play gamebook entirely through deterministic game logic.
    18
    1
    -

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/PistachioPony/learnMCP'

If you have feedback or need assistance with the MCP directory API, please join our Discord server