Plot Speaks
REMOTE · PLOTSPEAKS.COM · 2 COMPONENTS
Voice mysteries, history battles and trivia with your assistant as host. Sign in to keep progress.
Available components
Last scanned (7 hours ago)
Scores higher than 53% of remote servers
Reachable. Last reached 5 Nov 2026.
Category Entertainment and Games
How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score → Why this is hard to score →
Endpoint Security57
- The endpoint's TLS certificate is valid, in date, and uses a strong key. View diagnostics → Pass
- Authorisation check failed: no authorisation is required to call this server, and it exposes a tool marked destructive (submit_story). See how to fix → View diagnostics → Fail
- HTTPS is enforced; there's no plaintext access path. View diagnostics → Pass
- HSTS check failed: the Strict-Transport-Security header is absent. See how to fix → View diagnostics → Fail
- DNSSEC check failed: this domain isn't protected by DNSSEC. See how to fix → View diagnostics → Fail
Transport & Reachability100
- Verified streamable-http transport via a live MCP handshake. View diagnostics → Pass
Schema Quality & AI Usability75
- 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 7029 tokens (~260/item across 27 items; 25 tools + 2 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 Management27
- Stability observed for 8 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage100
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 100% of tool parameters carry a description.Pass
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- All 1 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
- An AI judge read all 27 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a current MCP spec version (2026-07-28).Pass
- Supports UI / widget rendering.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.
- 4 Nov 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 20 to 23. That category is still filling its 30-day observation window: 6 days of observed history at the previous scan, 7 at this one. The score rises as the window fills, whether or not the server changes.
- 3 Nov 26 0
- Tool “claim_plays” rewrote its description, which is the text the model reads security
- Tool “game_board” rewrote its description, which is the text the model reads security
- Tool “get_cue” rewrote its description, which is the text the model reads security
- Tool “list_stories” rewrote its description, which is the text the model reads security
- Tool “team_roster” rewrote its description, which is the text the model reads security
- Tool “world_update” rewrote its description, which is the text the model reads security
- Tool “write_story” rewrote its description, which is the text the model reads security
- Tool “pick_for_me” rewrote its description, which is the text the model reads security
- Tool “request_team” rewrote its description, which is the text the model reads security
- Tool “reveal_solution” rewrote its description, which is the text the model reads security
- Tool “start_story” rewrote its description, which is the text the model reads security
- Schema quality: 216 → 260 ▼ functional
- Schema quality: good → excellent functional
- “claim_plays” reworded the description of “play_ids” cosmetic
- “game_board” reworded the description of “play_id” cosmetic
- “game_board” reworded the description of “slug” cosmetic
- “get_cue” reworded the description of “cue” cosmetic
- “get_cue” reworded the description of “play_id” cosmetic
- “get_cue” reworded the description of “slug” cosmetic
- “list_stories” reworded the description of “collection” cosmetic
- “start_story” reworded the description of “versus_code” cosmetic
- “submit_story” reworded the description of “email_when_approved” cosmetic
- “team_roster” reworded the description of “team” cosmetic
- “world_update” reworded the description of “day” cosmetic
- “world_update” reworded the description of “initiative” cosmetic
- “world_update” reworded the description of “location” cosmetic
- “world_update” reworded the description of “npcs” cosmetic
- “world_update” reworded the description of “party” cosmetic
- “world_update” reworded the description of “play_id” cosmetic
- “world_update” reworded the description of “quests” cosmetic
- “world_update” reworded the description of “rest” cosmetic
- “world_update” reworded the description of “slug” cosmetic
- “write_story” reworded the description of “genre” cosmetic
- “write_story” reworded the description of “length” cosmetic
- “list_stories” reworded the description of “page” cosmetic
- “roll” reworded the description of “hidden” cosmetic
- “start_story” reworded the description of “chapter” cosmetic
- “start_story” reworded the description of “minutes” cosmetic
- “start_story” reworded the description of “new_campaign” cosmetic
- “start_story” reworded the description of “path_code” cosmetic
- “start_story” reworded the description of “play_id” cosmetic
- “start_story” reworded the description of “resume_code” cosmetic
- “start_story” reworded the description of “slug” cosmetic
- “start_story” reworded the description of “team” cosmetic
- 2 Nov 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 13 to 17. That category is still filling its 30-day observation window: 4 days of observed history at the previous scan, 5 at this one. The score rises as the window fills, whether or not the server changes.
- 31 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 7 to 10. That category is still filling its 30-day observation window: 2 days of observed history at the previous scan, 3 at this one. The score rises as the window fills, whether or not the server changes.
- 29 Oct 26 +1
- The server rewrote its instructions, which are the text every model session reads security
- Tool “list_stories” rewrote its description, which is the text the model reads security
- Tool “withdraw_submission” rewrote its description, which is the text the model reads security
- Stability: unverified → 0.03 ▲ functional
- New prompt “make_a_game_or_quiz” functional
- New prompt “write_a_story” functional
- New tool “submission_status” functional
- “submit_story” added an optional parameter “email_when_approved” cosmetic
- “list_stories” reworded the description of “collection” cosmetic
- “pick_for_me” reworded the description of “collection” cosmetic
- “withdraw_submission” reworded the description of “claim_code” cosmetic
- “withdraw_submission” made “claim_code” optional cosmetic
- 28 Oct 26 64
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 5 Nov 2026 · Probed https://plotspeaks.com/mcp
TLS valid
Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .
| Subject | Issuer | Valid from | Valid until | Key | Signature | Serial |
|---|---|---|---|---|---|---|
| CN=plotspeaks.com | CN=WE1,O=Google Trust Services,C=US | 17 Oct 2026 | 15 Jan 2027 | ECDSA 256 | ECDSA-SHA256 | 87af80a32900359b139ee38bae9f119b |
| SANs: plotspeaks.com, dev.plotspeaks.com, *.dev.plotspeaks.com | ||||||
| CN=WE1,O=Google Trust Services,C=US (CA) | CN=GTS Root R4,O=Google Trust Services LLC,C=US | 13 Dec 2023 | 20 Feb 2029 | ECDSA 256 | ECDSA-SHA384 | 7ff31977972c224a76155d13b6d685e3 |
| CN=GTS Root R4,O=Google Trust Services LLC,C=US (CA) | CN=GlobalSign Root CA,OU=Root CA,O=GlobalSign nv-sa,C=BE | 15 Nov 2023 | 28 Jan 2028 | ECDSA 384 | SHA256-RSA | 7fe530bf331343bedd821610493d8a1b |
Background: What to check on a remote MCP endpoint →
DNSSEC insecure
Validation of plotspeaks.com. — Not signed
| Zone | DS | Keys | Algorithms | Outcome |
|---|---|---|---|---|
| . | trust_anchor | 20326, 38696 | 8, 8 | Verified |
| com. | present | 19718 | 13 | Verified |
| plotspeaks.com. | absent | Unsigned (proven) parent-signed NSEC/NSEC3 proves an unsigned delegation |
Authentication No authorisation required
The endpoint answered without asking for a token. Anyone who knows the URL can reach it.
| Result | No authorisation required |
|---|---|
| HTTP status | 200 |
Background: How OAuth 2.1 works in the 2026 MCP spec →
Transports 2 probes
| Transport | URL | Outcome | Status | Location |
|---|---|---|---|---|
| streamable-http | https://plotspeaks.com/mcp | Verified | 200 | |
| http (plaintext) | http://plotspeaks.com/mcp | HTTPS enforced | 301 | https://plotspeaks.com/mcp |
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 →
check_accusation Check an accusation ~89
Checks a formal accusation in a Plot Speaks mystery. Returns the verdict line for the accused person, starting Correct. or Innocent., and the name it matched. Records the accusation and verdict anonymously.
| Name | Type | Req | Description |
|---|---|---|---|
| accused | string | yes | The name of the person the user accused |
| play_id | string | – | The play id from start_story |
| slug | string | yes | The story slug |
No output schema declared.
No examples provided.
choose Make a choice ~156
Moves a Plot Speaks choose-your-path story on by the player's choice and returns what happens next: the scene to narrate and the choices that follow, or the ending. With no choice it returns where the play is now and the path so far (for resuming). With go_back it returns to the last choice so the player can choose again.
| Name | Type | Req | Description |
|---|---|---|---|
| choice | string | – | The player's answer: the choice's number, or their words for it |
| go_back | boolean | – | True when the player wants to go back to their last choice and choose again (after an ending, or any time they ask) |
| play_id | string | yes | The play id from start_story |
| slug | string | yes | The story slug |
No output schema declared.
No examples provided.
claim_plays Add earlier plays to my account ~183
Attaches plays made earlier without an account to the signed-in player's Plot Speaks account, so they appear in their history (with how each ended) and in the "not played yet" filter, and marks the trivia clues already heard in those games. Returns a sentence naming the titles added and how many could not be added (id not found, or already on another account). Without a signed-in account it returns an error saying so. Changes the account's history; plays on another account are left alone.
| Name | Type | Req | Description |
|---|---|---|---|
| play_ids | array | yes | 1 to 50 play ids, as returned by start_story, e.g. ["3f2b8c1e-9d4a-4e7b-a1c2-5b6d7e8f9a0b"]; ids of plays made in this conversation without an account |
No output schema declared.
No examples provided.
game_answer Trivia answer ~274
Checks a player's answer to the open trivia clue, scores it and returns the ruling with the answer, or the next step of a stepped clue. In a survey game it checks an answer against the hidden board; in a letter game it takes a called letter or a solve attempt, in the player's own words; in a timeline game it takes where the open card goes (before X, between X and Y, at the end), in the player's own words; in Worms! it takes the face to keep ("the fours", "worms"), "roll again" or "stop", and "take" or "steal"; in Yacht it takes the dice to keep ("the threes", "keep 3 3 5", "keep all", "none", "reroll the one") or "score it", then the box ("full house", "fours", "chance") and a yes or no to "Take a zero?"; in Pigs! it takes "yes" (throw again) or "no" (bank).
| Name | Type | Req | Description |
|---|---|---|---|
| answer | string | yes | What the player said, in their words |
| play_id | string | yes | The play id from start_story |
| player | string | – | The answering player's name, for the scores |
| slug | string | yes | The game's slug |
No output schema declared.
No examples provided.
game_board Trivia board ~204
Returns the current state of a Plot Speaks game in play, as text, without changing it. For trivia: the scores and the categories and values still on the board. For a survey or letter game: the scores, the open question or puzzle and what is revealed so far. For a timeline game: the line so far, lives and the open card. For Worms!: the tiles, stacks and open roll. Reads only; nothing is recorded. A play id that does not belong to that game returns an error, and a story that is not a game returns an error saying so.
| Name | Type | Req | Description |
|---|---|---|---|
| play_id | string | yes | The play id start_story returned for this game, e.g. 3f2b8c1e-9d4a-4e7b-a1c2-5b6d7e8f9a0b |
| slug | string | yes | The game's slug or title, e.g. team-trivia |
No output schema declared.
No examples provided.
game_challenge Challenge a ruling ~89
Challenges the last trivia ruling: three different AI models judge the player's answer against the clue, and the ruling flips only if at least two agree it should count. Once per clue. In a timeline game it re-checks the last placement against the years and says what was heard.
| Name | Type | Req | Description |
|---|---|---|---|
| play_id | string | yes | The play id from start_story |
| slug | string | yes | The game's slug |
No output schema declared.
No examples provided.
game_question Trivia clue ~278
Opens one clue on a Plot Speaks trivia board and returns its text (not the answer). Category "final" opens the final once the board is clear. In a survey or letter game it deals the next question or puzzle: pass category "next" ("skip" gives the open one up; "no steal" closes a survey question after three strikes). In a timeline game it starts a round: pass the deck's name, then " for " and the players' names (the reply deals the first card); "next" repeats the open card. In Worms!, Yacht (and Pigs!) it sets up the game: pass "rules" for the how-to-play beats, or "players", the names and "and Wormbot" (Skipper in Yacht, Hambot in Pigs!) or "no CPU" ("play again" after a game).
| Name | Type | Req | Description |
|---|---|---|---|
| category | string | yes | The category the player picked, or "final" ("next" in a survey or letter game; the deck's name in a timeline game; "rules" or "players Ann, Bob and Wormbot" in Worms!) |
| play_id | string | yes | The play id from start_story |
| slug | string | yes | The game's slug |
| value | integer | – | The value the player picked, e.g. 300 |
No output schema declared.
No examples provided.
get_cue Get a scene cue ~268
Returns one scene cue from a Plot Speaks mystery or adventure script, as text: a READ ALOUD part (the scene as spoken narration) and, where the cue has them, NARRATOR NOTES that are not meant to be read aloud because they would spoil the scene; cue S1 also lists the follow-up cues to listen for. With a play id it records the scene reached as an anonymous play event, which the play's watch page shows as a timeline. An unknown slug returns an error naming the available stories; a cue id the story lacks returns an error saying so (or that the story has no cues).
| Name | Type | Req | Description |
|---|---|---|---|
| cue | string | yes | The cue id as written in the story's script: S, a number and an optional letter; the S and case may be omitted. E.g. S1, S3b or 3b |
| play_id | string | – | The play id start_story returned, e.g. 3f2b8c1e-9d4a-4e7b-a1c2-5b6d7e8f9a0b; when given, the cue is logged against that play |
| slug | string | yes | The story slug or title, e.g. example-dinner-party |
No output schema declared.
No examples provided.
list_stories List stories ~538
Lists the Plot Speaks stories and games that can be played by voice, three at a time with a one-line pitch each; the page argument gives the next three. Narrow it by a collection (Murder Mysteries, Greek Myths, Classic Detectives, Horror and Ghosts, Seasons, Holiday Specials, Bedtime, Dice Games, Road Trip, Read-Aloud Classics, Written by players), by length (max_minutes), by what's new (new: true), by kind (mysteries, adventures, choose-your-path stories, trivia, guessing games, game shows, dice games, word games, party and storytelling games, Table Talk, Story Time read-alouds, wind-downs, open worlds and campaigns) or, within mysteries, classic or dark. With group_by_category and no page it returns the whole catalogue under kind headings. An unknown kind or collection returns a message naming the valid ones.
| Name | Type | Req | Description |
|---|---|---|---|
| audience | string | – | Narrow by audience: general, or the all-ages pieces. Omit for everything |
| collection | string | – | A collection, by name or id, loosely matched: greek-myths, classic-detectives, ghost-gothic, seasons, holidays, bedtime, dice, road-trip, classics, players. Examples: "Greek Myths", "detective storie… |
| genre | string | – | Within mysteries and adventures: murder-mystery (all murder mysteries), classic (murder mysteries that aren't dark), dark (dark murder mysteries) or adventure |
| group_by_category | boolean | – | True, with no page, for the whole list grouped under kind headings |
| kind | string | – | Only list this kind: mystery, adventure, branching (choose your path), trivia, guessing (guessing games), gameshow (game shows), dice (dice games), word (word games), party (party and storytelling),… |
| max_minutes | integer | – | Only pieces this many minutes long or shorter |
| new | boolean | – | True for what's new: the newest pieces first, with their What's New line |
| not_played | boolean | – | True to leave out what this player has already played (signed-in players only) |
| page | integer | – | Which page of three to return, from 1; page 2 gives items 4 to 6 of the same filtered list. Each result states the page and total pages |
No output schema declared.
No examples provided.
my_history What I've played ~53
Returns what a signed-in Plot Speaks player has played, newest first, with how each ended. Without an account it says how to get one.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | How many to list (default 15) |
No output schema declared.
No examples provided.
open_plot_speaks Open Plot Speaks ~123
Returns the Plot Speaks welcome: a short spoken introduction, a question offering to list the stories, start one or write one, and a menu of story categories with example titles. With skip_intro the introduction is left out; with instructions it adds the how-to-play.
| Name | Type | Req | Description |
|---|---|---|---|
| instructions | boolean | – | True when the user asks how Plot Speaks works or wants the instructions again: adds the how-to-play |
| skip_intro | boolean | – | True when the user has heard the introduction before or asks to skip it: returns only the question and the menu |
No output schema declared.
No examples provided.
pick_for_me Pick something for me ~223
Picks ONE Plot Speaks story or game to play now, ranked from the player's mood, the time they have, how many are playing and an optional collection, skipping what a signed-in player has already played. Returns the pick's title, slug and one-line pitch, plus a runner-up. Records only anonymous counts of the mood matched and length asked for. If nothing fits every filter it says so instead of picking.
| Name | Type | Req | Description |
|---|---|---|---|
| all_ages | boolean | – | True to keep it suitable for every age (nothing rated above PG) |
| collection | string | – | Only from this collection, by name or id: Murder Mysteries, Greek Myths, Classic Detectives, Horror and Ghosts, Seasons, Holiday Specials, Bedtime, Dice Games, Road Trip, Read-Aloud Classics, Written… |
| minutes | integer | – | How long they have |
| mood | string | – | The mood or kind of thing, in their words, e.g. spooky, light, a mystery, something calm |
| players | integer | – | How many are playing |
No output schema declared.
No examples provided.
rate_story Rate a story ~287
Saves a rating and feedback for a Plot Speaks story the user has just played: 1 to 5 stars, whether anything was given away too early, an optional comment about the story, optional feedback about the experience for the people who make Plot Speaks, and, for a story still being tested, the player's verdict (passed, or needs work). Needs the play id from start_story; one rating per play; stars or a verdict (or both).
| Name | Type | Req | Description |
|---|---|---|---|
| comment | string | – | The player's comment about the story, if any, in their words |
| feedback | string | – | Feedback about the experience (the narration, the connector, what to improve), if any, in the player's words; read by the people who make Plot Speaks |
| play_id | string | yes | The play id from start_story |
| slug | string | yes | The story slug |
| spoiled | boolean | – | True if the player felt the narrator gave something away too early |
| stars | integer | – | 1 to 5 (optional when a verdict is given) |
| verdict | string | – | For a story being tested: "passed" if it passed the player's test, "needs_work" if something should be improved (put what, in their words, in feedback) |
| wish | string | – | What else the player would like to play, if they said, in their words |
No output schema declared.
No examples provided.
request_team Request a team ~91
Records a player's request for a sports team that Plot Speaks Team Trivia doesn't cover yet, for the people who maintain the database. Stores the team name and note as a request event, with no account or personal details attached, and returns a confirmation.
| Name | Type | Req | Description |
|---|---|---|---|
| note | string | – | Anything else they said about it |
| team | string | yes | The team they'd like added, with its league if they said it |
No output schema declared.
No examples provided.
reveal_solution Full reveal ~124
Returns the full solution of a Plot Speaks mystery (who did it, why, and the clues that pointed there) and what became of each character. Without gave_up: true it is refused unless an accusation is already recorded for that play; with gave_up: true it answers at once. Records that the play ended in a reveal.
| Name | Type | Req | Description |
|---|---|---|---|
| gave_up | boolean | – | True when the player has said they give up or want the answer without accusing anyone |
| play_id | string | yes | The play id from start_story |
| slug | string | yes | The story slug |
No output schema declared.
No examples provided.
review_story Review a story draft ~124
Runs the format checks on a draft story.md, and with secrets.md also the answer-key checks (including whether story.md gives the culprit away). Returns a status, the findings with line numbers, and a fair-play checklist. Nothing sent is stored.
| Name | Type | Req | Description |
|---|---|---|---|
| secrets_md | string | – | The full text of secrets.md (the private answer key), if written |
| slug | string | – | The story's folder name, e.g. the-last-toast; checks that name is plotspeaks-<slug> |
| story_md | string | yes | The full text of story.md |
No output schema declared.
No examples provided.
roll Roll dice ~155
Rolls dice for a Plot Speaks campaign or adventure on the server: "1d20+5", "2d6", "adv 1d20+3" (advantage), "dis 1d20" (disadvantage), "4d6 drop lowest". Returns each die and the total.
| Name | Type | Req | Description |
|---|---|---|---|
| dice | string | yes | The roll, e.g. 1d20+5 |
| hidden | boolean | – | True for a roll the story's rules keep secret from the players (a world clock, a hidden table); the result comes with a note that it is hidden and not for reading aloud |
| why | string | – | What the roll is for, e.g. Mira's stealth check |
No output schema declared.
No examples provided.
start_story Start a story ~586
Loads a Plot Speaks story or game, of any kind (mystery, choose-your-path, trivia, dice or word game, Team Trivia, campaign), by slug or title. Returns its script as text (setting, cast, scenes or board, and how it is narrated; one chapter at a time for multi-chapter stories) and a play id the play's other tools take. Records an anonymous play (story, connecting assistant, time; no conversation text), and on the account connector adds it to the player's history. An unknown slug or title returns an error naming close matches or the available stories; a chapter past the last returns an error; an unreleased chapter returns its release date.
| Name | Type | Req | Description |
|---|---|---|---|
| chapter | integer | – | Chapter number for a multi-chapter story, e.g. 2 for the second chapter (default 1); an error if the story has fewer chapters |
| minutes | integer | – | For a trivia game: minutes the player has, e.g. 25, so the game is sized to fit |
| new_campaign | boolean | – | For a campaign, when a signed-in player already has one: true starts a fresh campaign instead of carrying on their latest (default false) |
| path_code | string | – | For a choose-your-path story: the three-word path code a friend received at an ending, e.g. brave-river-stone, to follow that friend's choices; codes last 30 days, an unknown one returns an error |
| play_id | string | – | With chapter above 1: the play id returned for chapter 1, e.g. 3f2b8c1e-9d4a-4e7b-a1c2-5b6d7e8f9a0b, so both chapters count as one play; ignored if it belongs to another story |
| resume_code | string | – | For a campaign: the three-word code given at the end of an earlier session, e.g. amber-otter-lantern; carries on that campaign's world instead of starting one. An unknown code returns an error |
| slug | string | yes | The story's slug or title, matched loosely, 2 to 80 characters, e.g. example-dinner-party or The Last Toast |
| team | string | – | For the team-trivia story: the team as the player said it, e.g. Steelers, Pittsburgh or PIT; "Yankees vs Red Sox" gives a rivalry board. Several matches or an unsupported team return a message instea… |
| versus_code | string | – | For a trivia board: the three-word code a friend received at the end of their game, to play the same board and compare scores; pass slug "versus" with it, the code names the game. Codes last 30 days |
No output schema declared.
No examples provided.
submission_status Check a submission ~103
Read-only. Shows where a story submitted to Plot Speaks stands when its submission id and claim code match: received and waiting for a person, approved (with the story's link), or not accepted (with the reviewer's short note, if there is one). Changes nothing.
| Name | Type | Req | Description |
|---|---|---|---|
| claim_code | string | yes | The claim code from the receipt, e.g. ABCD-EFGH-JKMN |
| id | string | yes | The submission id from the receipt |
No output schema declared.
No examples provided.
submit_story Submit a story ~311
Submits a finished Plot Speaks story for human review, credited to the name the writer chooses. Runs the format checks, a safety screen and a daily limit, then stores it; nothing is public until a person approves it. Returns a submission id and a one-time claim code for withdrawing or updating it. With replaces_id and claim_code, it replaces an earlier submission.
| Name | Type | Req | Description |
|---|---|---|---|
| author_name | string | yes | The name credited publicly as "Written by" (2 to 60 characters; a pen name is fine). Checked by the reviewer with the story. |
| claim_code | string | – | Only to update an earlier submission: the claim code from its receipt |
| contact | string | – | Optional: how the reviewer can reach the writer (email or handle). Seen only by the reviewer. |
| email_when_approved | boolean | – | True records the writer's request for one email, to the verified Google address of the account they signed in with, when a person approves the story (default false: no email). It takes effect only on… |
| replaces_id | string | – | Only to update an earlier submission: its submission id |
| secrets_md | string | – | The full text of secrets.md (kept private on the server; mysteries need one) |
| story_md | string | yes | The full text of story.md |
No output schema declared.
No examples provided.
team_roster Team roster ~149
Returns a sports team's current roster for Plot Speaks Team Trivia, read live from ESPN (cached for hours): players grouped by position with jersey numbers, and the head coach, as plain text. Covers the leagues in the Team Trivia database. Reads only; nothing is recorded. A name that fits several teams returns an error listing the candidates with their leagues; a team not in the database returns an error listing the leagues covered; if ESPN does not answer, the text says so.
| Name | Type | Req | Description |
|---|---|---|---|
| team | string | yes | The team as the player said it: a city, name, nickname or abbreviation, e.g. Steelers, Pittsburgh or PIT; a full name such as Pittsburgh Steelers is the most exact |
No output schema declared.
No examples provided.
withdraw_submission Withdraw a submission ~105
Deletes a story submitted to Plot Speaks (pending or published) when its submission id and claim code match. On the account connector, a signed-in writer can withdraw their own story with just the id.
| Name | Type | Req | Description |
|---|---|---|---|
| claim_code | string | – | The claim code from the receipt, e.g. ABCD-EFGH-JKMN. Needed unless the writer is signed in on the account connector and the story is theirs. |
| id | string | yes | The submission id from the receipt |
No output schema declared.
No examples provided.
world_recall Recall the campaign ~101
Returns a Plot Speaks campaign's state (day, place, party with hit points, spell slots and gear, people met, quests, the story so far) by play id, or by the three-word resume code the players were given.
| Name | Type | Req | Description |
|---|---|---|---|
| play_id | string | – | The play id, when you have it |
| resume_code | string | – | The three-word resume code the players say |
| slug | string | yes | The campaign's slug |
No output schema declared.
No examples provided.
world_update Update the campaign ~583
Applies changes to a Plot Speaks campaign's saved world: new characters, damage and healing, spells cast, items, gold, rests, location, day, people met (the dead stay dead), quests, fight turn order (initiative) and a one-line story note. Send only what changed; fields left out are untouched. Returns a RECORDED list, a REFUSED list giving the reason for each change the campaign's rules do not allow, and the updated state. Saves to the campaign play (no personal data). An unknown slug, a non-campaign story or an unknown play id returns an error.
| Name | Type | Req | Description |
|---|---|---|---|
| day | integer | – | The campaign day number, e.g. 3, if it moved on |
| initiative | array | – | The turn order in a fight, first is up, naming only creatures the party can see (the screen shows it), e.g. ["Mira","Goblin","Tobin"]; sending the list again replaces it, and an empty list ends the f… |
| location | string | – | Where the party is now, e.g. the Sunken Chapel (kept to 120 characters) |
| note | string | – | One line for the story so far (kept to 240 characters) |
| npcs | array | – | People met or changed, each {name, status, note}; status e.g. friendly, hostile or dead (the dead stay dead); notes kept to 160 characters. E.g. [{"name":"Old Bram","status":"friendly"}] |
| party | array | – | Up to 6 party members to add or change, matched by name (an unknown name adds a character). Each: name, plus any of class, level (1 to 5), hp, max_hp, damage, heal, spend_slot (spell level 1 to 5), m… |
| play_id | string | yes | The campaign's play id from start_story or world_recall, e.g. 3f2b8c1e-9d4a-4e7b-a1c2-5b6d7e8f9a0b |
| quests | array | – | Quests taken or changed, each {name, status, note}; status is open, done or failed; notes kept to 160 characters. E.g. [{"name":"Find the lantern","status":"done"}] |
| rest | string | – | "short" or "long": applies that rest's recovery to the party under the campaign's rules |
| slug | string | yes | The campaign's slug or title, e.g. the campaign named in start_story's script |
No output schema declared.
No examples provided.
write_story Write a story ~211
Returns the writing kit for a new Plot Speaks story as one text: a short introduction to how a story is built (a public story.md plus a private answer key, secrets.md, reviewed by a person before anything is published), a suggested way for the writer and assistant to draft, review and submit it together, and the format template for the chosen genre and length. Reads only; nothing is stored or recorded beyond anonymous counts of genre and length. Genre and length are fixed choices, and omitting either gives the default.
| Name | Type | Req | Description |
|---|---|---|---|
| genre | string | – | Kind of story to write: murder-mystery (default), dark (a dark murder mystery), adventure, branching (a choose-your-path story), trivia (a trivia board) or game (a voice game); chooses which template… |
| length | string | – | Playing time of the story: "20" or "30" minutes in one chapter (default "30"), or "2-chapter" for a story in two sittings |
No output schema declared.
No examples provided.
How do I install the Plot Speaks MCP server?
Plot Speaks is a hosted endpoint at https://plotspeaks.com/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
remote · plotspeaks.com
claude mcp add --transport http com-plotspeaks-plot-speaks 'https://plotspeaks.com/mcp'
What is the Plot Speaks MCP server?
Plot Speaks is an MCP server listed in the public MCP registry as com.plotspeaks/plot-speaks. Voice mysteries, history battles and trivia with your assistant as host. Sign in to keep progress. This page covers its hosted endpoint (https://plotspeaks.com/mcp).
Is the Plot Speaks MCP server safe to use?
Plot Speaks scores 68 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 Plot Speaks MCP server expose?
Plot Speaks exposes 25 tools: open_plot_speaks, pick_for_me, list_stories, claim_plays, my_history, and 20 more. Their descriptions and schemas cost roughly 5,408 tokens of context every time the server is loaded.
Does the Plot Speaks MCP server require authentication?
No. We connected to Plot Speaks without credentials and it answered, so anything it exposes is reachable by anyone who knows the address.
Is the Plot Speaks MCP server still maintained?
Plot Speaks is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.