The Fortuneteller's Hand
MCPB · FORTUNETELLERS-HAND-0.1.1.MCPB
Solo journaling RPG — Claude runs The Fortuneteller's Hand, reading cards and casting Omens.
Available components
Last scanned (12 hours ago)
Scores higher than 87% of MCPB servers
Category Entertainment and Games
How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →
Supply Chain Security12
- No malware scan is available for this kind of package: the supply-chain vendors we use do not cover it. This is a permanent gap in our coverage, not a finding about the package.Unverified
- Known CVEs were checked across the 28 of 28 dependencies we could resolve, so this covers what we could see, not the whole tree.Partial
- Install-script risk not yet assessed.Unverified
- 1 of 28 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency45
- Source repository is publicly reachable at the declared URL. View diagnostics → Pass
- Provenance check failed: no build-provenance attestation is published. See how to fix → View diagnostics → Fail
- Clear OSI-approved license (MIT).Pass
- Actively maintained (last published 57 days ago).Pass
- Disclosure check failed: no security disclosure policy was found in the source repository. See how to fix → Fail
Schema Quality & AI Usability81
- 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 2391 tokens (~217/item across 11 items; 11 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management63
- Stability observed for 19 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage67
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 0% of tool parameters carry a description.Fail
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- We read all 11 captured tool definition(s), and no name or description among them implies an irreversible operation.Pass
- An AI judge read all 11 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 15 Oct 26 +38
- Injection markers: unverified → pass ▲ security
- Tool coverage: unverified → 100 ▲ functional
- Stability: unverified → 0.57 ▲ functional
- MCP protocol: unverified → pass ▲ functional
- Schema quality: unverified → 100 ▲ functional
- 7 Oct 26 −30
- Tool safety: pass → unverified ▼ security
- Stability: Stability not yet verified: this package installed, but its server did not start, so we have no schema to compare. security
- Tool coverage: 100 → unverified ▼ functional
- Capabilities: pass → unverified ▼ functional
- Schema quality: 100 → unverified ▼ functional
- 28 Sept 26 +34
- Injection markers: unverified → pass ▲ security
- Known CVEs: unverified → partial ▲ security
- First check of Judged manipulation: pass security
- Stability: Stability not yet verified: not enough scan history yet (needs a 30-day window). security
- Tool coverage: unverified → 100 ▲ functional
- Dependency health: unverified → 0.99 ▲ functional
- MCP protocol: unverified → pass ▲ functional
- Schema quality: unverified → 100 ▲ functional
- First check of Destructive annotations: pass functional
- First check of Schema quality: fail functional
- First check of Tool coverage: 0 functional
- First check of Schema quality: fail functional
- First check of Schema quality: excellent functional
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
- 25 Sept 26 −4
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
- 26 Aug 26 0
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
- 20 Aug 26 0
First indexed and scored.
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 17 Oct 2026 · Analysed mcpb/https://github.com/PistachioPony/learnMCP/releases/download/v0.1.1/fortunetellers-hand-0.1.1.mcpb@0.1.1
Provenance No attestation
The registry publishes no build provenance for this version, so there is nothing to verify.
| Result | No attestation |
|---|---|
| Ecosystem | mcpb |
| Reason | No attestation published |
Background: How many MCP packages publish verified provenance →
Dependencies 28 packages
| Packages resolved | 28 |
|---|---|
| Stale | 1 |
| Tree resolution | Complete |
Background: SBOMs and build attestations, explained →
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
call_the_hand Call the Hand ~225
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.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
cast_omen Cast Omen ~288
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.
| Name | Type | Req | Description |
|---|---|---|---|
| hope | string | yes | – |
No output schema declared.
No examples provided.
complete_goal Complete Goal ~156
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.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
defy_resolve Resolve Defiance ~224
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).
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
defy_roll Roll Defiance Dice ~299
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).
| Name | Type | Req | Description |
|---|---|---|---|
| keep | – | – | – |
No output schema declared.
No examples provided.
draw_cross_card Draw Cross Card ~292
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.
| Name | Type | Req | Description |
|---|---|---|---|
| position | string | yes | – |
| suit | string | yes | – |
No output schema declared.
No examples provided.
draw_goal_card Draw Goal Card ~204
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.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
draw_unclaimed_card Draw Unclaimed Card ~165
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.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
get_sheet Get Character Sheet ~194
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).
| Name | Type | Req | Description |
|---|---|---|---|
| player_name | string | yes | – |
No output schema declared.
No examples provided.
name_character Name Character ~148
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}.
| Name | Type | Req | Description |
|---|---|---|---|
| player_name | string | yes | – |
No output schema declared.
No examples provided.
record_goal_interpretation Record Goal Interpretation ~196
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.
| Name | Type | Req | Description |
|---|---|---|---|
| interpretation | string | yes | – |
No output schema declared.
No examples provided.
How do I install the The Fortuneteller's Hand MCP server?
The Fortuneteller's Hand ships as an MCPB bundle, a single file you download and open in an MCP host that supports MCPB bundles, such as Claude Desktop. The host reads the launch command from the bundle's own manifest, so there is no command to copy. The MCP registry declares no SHA-256 for this bundle, so there is no published digest to check the download against.
mcpb · fortunetellers-hand-0.1.1.mcpb
Download bundleThe MCP registry declares no SHA-256 for this bundle, so there is no published digest to check it against. Open it with an MCPB-capable host such as Claude Desktop.
What is the The Fortuneteller's Hand MCP server?
The Fortuneteller's Hand is an MCP server listed in the public MCP registry as io.github.PistachioPony/fortunetellers-hand. Solo journaling RPG, Claude runs The Fortuneteller's Hand, reading cards and casting Omens. This page covers its MCPB bundle (https://github.com/PistachioPony/learnMCP/releases/download/v0.1.1/fortunetellers-hand-0.1.1.mcpb).
Is the The Fortuneteller's Hand MCP server safe to use?
The Fortuneteller's Hand scores 51 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the The Fortuneteller's Hand MCP server expose?
The Fortuneteller's Hand exposes 11 tools: draw_cross_card, draw_goal_card, name_character, record_goal_interpretation, cast_omen, and 6 more. Their descriptions and schemas cost roughly 2,391 tokens of context every time the server is loaded.
What licence is the The Fortuneteller's Hand MCP server under?
The Fortuneteller's Hand declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.