Voice mysteries, history battles and trivia with your assistant as host. Sign in to keep progress.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
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.
The story slug
The name of the person the user accused
The play id from start_story
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
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.
| Argument | Type | Description |
|---|---|---|
| slug* | string | The story slug |
| accused* | string | The name of the person the user accused |
| play_id | string | The play id from start_story |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"slug",
"accused"
],
"properties": {
"slug": {
"type": "string",
"maxLength": 80,
"minLength": 2,
"description": "The story slug"
},
"accused": {
"type": "string",
"maxLength": 120,
"minLength": 1,
"description": "The name of the person the user accused"
},
"play_id": {
"type": "string",
"maxLength": 40,
"minLength": 1,
"description": "The play id from start_story"
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| slug* | string | The story slug |
| 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 | The play id from start_story |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"slug",
"play_id"
],
"properties": {
"slug": {
"type": "string",
"maxLength": 80,
"minLength": 2,
"description": "The story slug"
},
"choice": {
"type": "string",
"maxLength": 200,
"description": "The player's answer: the choice's number, or their words for it"
},
"go_back": {
"type": "boolean",
"description": "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": {
"type": "string",
"maxLength": 40,
"minLength": 1,
"description": "The play id from start_story"
}
}
}For a player who has just signed in: adds plays they made earlier without an account (the play ids from this conversation) to their Plot Speaks history, with how each ended, and marks trivia questions they heard. Plays already on another account are left alone.
| Argument | Type | Description |
|---|---|---|
| play_ids* | array | Play ids from earlier in this conversation (start_story returned them) |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"play_ids"
],
"properties": {
"play_ids": {
"type": "array",
"items": {
"type": "string",
"maxLength": 40,
"minLength": 1
},
"maxItems": 50,
"minItems": 1,
"description": "Play ids from earlier in this conversation (start_story returned them)"
}
}
}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).
| Argument | Type | Description |
|---|---|---|
| slug* | string | The game's slug |
| answer* | string | What the player said, in their words |
| player | string | The answering player's name, for the scores |
| play_id* | string | The play id from start_story |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"slug",
"play_id",
"answer"
],
"properties": {
"slug": {
"type": "string",
"maxLength": 80,
"minLength": 2,
"description": "The game's slug"
},
"answer": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "What the player said, in their words"
},
"player": {
"type": "string",
"maxLength": 40,
"description": "The answering player's name, for the scores"
},
"play_id": {
"type": "string",
"maxLength": 40,
"minLength": 1,
"description": "The play id from start_story"
}
}
}Returns a Plot Speaks trivia game's scores and the categories and values still on the board (in a survey or letter game: the scores, the open question or puzzle, and what is revealed so far; in a timeline game: the line so far, the lives and the open card; in Worms!: the tiles, the stacks and the open roll).
| Argument | Type | Description |
|---|---|---|
| slug* | string | The game's slug |
| play_id* | string | The play id from start_story |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"slug",
"play_id"
],
"properties": {
"slug": {
"type": "string",
"maxLength": 80,
"minLength": 2,
"description": "The game's slug"
},
"play_id": {
"type": "string",
"maxLength": 40,
"minLength": 1,
"description": "The play id from start_story"
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| slug* | string | The game's slug |
| play_id* | string | The play id from start_story |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"slug",
"play_id"
],
"properties": {
"slug": {
"type": "string",
"maxLength": 80,
"minLength": 2,
"description": "The game's slug"
},
"play_id": {
"type": "string",
"maxLength": 40,
"minLength": 1,
"description": "The play id from start_story"
}
}
}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).
| Argument | Type | Description |
|---|---|---|
| slug* | string | The game's slug |
| value | integer | The value the player picked, e.g. 300 |
| play_id* | string | The play id from start_story |
| category* | string | 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!) |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"slug",
"play_id",
"category"
],
"properties": {
"slug": {
"type": "string",
"maxLength": 80,
"minLength": 2,
"description": "The game's slug"
},
"value": {
"type": "integer",
"maximum": 10000,
"minimum": 1,
"description": "The value the player picked, e.g. 300"
},
"play_id": {
"type": "string",
"maxLength": 40,
"minLength": 1,
"description": "The play id from start_story"
},
"category": {
"type": "string",
"maxLength": 80,
"minLength": 1,
"description": "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!)"
}
}
}Returns a cue from a Plot Speaks adventure: the scene text to narrate, and the scene's notes for the narrator. Pass the play id so a passenger following along sees the scene reached.
| Argument | Type | Description |
|---|---|---|
| cue* | string | The cue id, e.g. S1 or S3b |
| slug* | string | The story slug |
| play_id | string | The play id from start_story |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"slug",
"cue"
],
"properties": {
"cue": {
"type": "string",
"pattern": "^S?\\d+[a-z]?$",
"maxLength": 8,
"description": "The cue id, e.g. S1 or S3b"
},
"slug": {
"type": "string",
"maxLength": 80,
"minLength": 2,
"description": "The story slug"
},
"play_id": {
"type": "string",
"maxLength": 40,
"minLength": 1,
"description": "The play id from start_story"
}
}
}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), 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. Use group_by_category without a page for the whole catalogue under kind headings.
| Argument | Type | Description |
|---|---|---|
| new | boolean | True for what's new: the newest pieces first, with their What's New line |
| 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), talk (Table Talk), story time (read-aloud classics), winddown (wind-downs), campaign (open worlds and D&D-style campaigns), or game (every one of the game kinds above except trivia and guessing) |
| page | integer | Which three to read, from 1. After reading a page, if the listener says more, call again with the same filters and page + 1 |
| genre | string | Within mysteries and adventures: murder-mystery (all murder mysteries), classic (murder mysteries that aren't dark), dark (dark murder mysteries) or adventure |
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.
| Argument | Type | Description |
|---|---|---|
| limit | integer | How many to list (default 15) |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"limit": {
"type": "integer",
"maximum": 50,
"minimum": 1,
"description": "How many to list (default 15)"
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| skip_intro | boolean | True when the user has heard the introduction before or asks to skip it: returns only the question and the menu |
| instructions | boolean | True when the user asks how Plot Speaks works or wants the instructions again: adds the how-to-play |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"skip_intro": {
"type": "boolean",
"description": "True when the user has heard the introduction before or asks to skip it: returns only the question and the menu"
},
"instructions": {
"type": "boolean",
"description": "True when the user asks how Plot Speaks works or wants the instructions again: adds the how-to-play"
}
}
}Suggests ONE Plot Speaks story or game to play now, from the player's mood, the time they have and who is playing. Use it when they aren't sure what to play.
| Argument | Type | Description |
|---|---|---|
| mood | string | The mood or kind of thing, in their words, e.g. spooky, light, a mystery, something calm |
| minutes | integer | How long they have |
| players | integer | How many are playing |
| 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 |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"mood": {
"type": "string",
"maxLength": 200,
"description": "The mood or kind of thing, in their words, e.g. spooky, light, a mystery, something calm"
},
"minutes": {
"type": "integer",
"maximum": 600,
"minimum": 1,
"description": "How long they have"
},
"players": {
"type": "integer",
"maximum": 12,
"minimum": 1,
"description": "How many are playing"
},
"all_ages": {
"type": "boolean",
"description": "True to keep it suitable for every age (nothing rated above PG)"
},
"collection": {
"type": "string",
"maxLength": 60,
"description": "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"
}
}
}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).
| Argument | Type | Description |
|---|---|---|
| slug* | string | The story slug |
| wish | string | What else the player would like to play, if they said, in their words |
| stars | integer | 1 to 5 (optional when a verdict is given) |
| comment | string | The player's comment about the story, if any, in their words |
| play_id* | string | The play id from start_story |
| spoiled | boolean | True if the player felt the narrator gave something away too early |
| 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) |
| 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 |
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. Only after the player says they'd like it added.
| Argument | Type | Description |
|---|---|---|
| note | string | Anything else they said about it |
| team* | string | The team they'd like added, with its league if they said it |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"team"
],
"properties": {
"note": {
"type": "string",
"maxLength": 200,
"description": "Anything else they said about it"
},
"team": {
"type": "string",
"maxLength": 80,
"minLength": 1,
"description": "The team they'd like added, with its league if they said it"
}
}
}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. Only after the player has accused someone, or when they say they give up or ask for the full reveal (gave_up: true). Records that the play ended in a reveal.
| Argument | Type | Description |
|---|---|---|
| slug* | string | The story slug |
| gave_up | boolean | True when the player has said they give up or want the answer without accusing anyone |
| play_id* | string | The play id from start_story |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"slug",
"play_id"
],
"properties": {
"slug": {
"type": "string",
"maxLength": 80,
"minLength": 2,
"description": "The story slug"
},
"gave_up": {
"type": "boolean",
"description": "True when the player has said they give up or want the answer without accusing anyone"
},
"play_id": {
"type": "string",
"maxLength": 40,
"minLength": 1,
"description": "The play id from start_story"
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| slug | string | The story's folder name, e.g. the-last-toast; checks that name is plotspeaks-<slug> |
| story_md* | string | The full text of story.md |
| secrets_md | string | The full text of secrets.md (the private answer key), if written |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"story_md"
],
"properties": {
"slug": {
"type": "string",
"maxLength": 80,
"description": "The story's folder name, e.g. the-last-toast; checks that name is plotspeaks-<slug>"
},
"story_md": {
"type": "string",
"maxLength": 60000,
"minLength": 1,
"description": "The full text of story.md"
},
"secrets_md": {
"type": "string",
"maxLength": 60000,
"description": "The full text of secrets.md (the private answer key), if written"
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| why | string | What the roll is for, e.g. Mira's stealth check |
| dice* | string | 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 is for you only |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"dice"
],
"properties": {
"why": {
"type": "string",
"maxLength": 80,
"description": "What the roll is for, e.g. Mira's stealth check"
},
"dice": {
"type": "string",
"maxLength": 40,
"minLength": 2,
"description": "The roll, e.g. 1d20+5"
},
"hidden": {
"type": "boolean",
"description": "True for a roll the story's rules keep secret from the players (a world clock, a hidden table); the result is for you only"
}
}
}Loads a Plot Speaks story by slug or title. Returns its script (setting, cast, scenes, and how the game is narrated; one chapter at a time for two-chapter stories) and a play id. Records an anonymous play.
| Argument | Type | Description |
|---|---|---|
| slug* | string | The story's slug or title, e.g. example-dinner-party or The Last Toast |
| team | string | For Team Trivia: the team the player named, in their words (a city, a name, a nickname or an abbreviation) |
| chapter | integer | For a two-chapter story: 2 to get chapter 2 (default 1) |
| minutes | integer | For a trivia game: how long the player has (their drive), to size the game to it |
| play_id | string | With chapter 2: the play id from chapter 1, to keep the same play |
| path_code | string | For a choose-your-path story: the three-word path code a friend got at its ending, to follow their choices |
| resume_code | string | For a campaign: the three-word code from an earlier session, to carry on where it left off |
| versus_code | string | For a trivia board: the three-word code a friend got at the end of their game, to play the same board and compare scores (pass slug "versus"; the code names the game) |
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.
| Argument | Type | Description |
|---|---|---|
| contact | string | Optional: how the reviewer can reach the writer (email or handle). Seen only by the reviewer. |
| story_md* | string | The full text of story.md |
| claim_code | string | Only to update an earlier submission: the claim code from its receipt |
| secrets_md | string | The full text of secrets.md (kept private on the server; mysteries need one) |
| author_name* | string | The name credited publicly as "Written by" (2 to 60 characters; a pen name is fine). Checked by the reviewer with the story. |
| replaces_id | string | Only to update an earlier submission: its submission id |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"story_md",
"author_name"
],
"properties": {
"contact": {
"type": "string",
"maxLength": 200,
"description": "Optional: how the reviewer can reach the writer (email or handle). Seen only by the reviewer."
},
"story_md": {
"type": "string",
"maxLength": 60000,
"minLength": 1,
"description": "The full text of story.md"
},
"claim_code": {
"type": "string",
"maxLength": 40,
"description": "Only to update an earlier submission: the claim code from its receipt"
},
"secrets_md": {
"type": "string",
"maxLength": 30000,
"description": "The full text of secrets.md (kept private on the server; mysteries need one)"
},
"author_name": {
"type": "string",
"maxLength": 60,
"minLength": 2,
"description": "The name credited publicly as \"Written by\" (2 to 60 characters; a pen name is fine). Checked by the reviewer with the story."
},
"replaces_id": {
"type": "string",
"maxLength": 40,
"description": "Only to update an earlier submission: its submission id"
}
}
}Reads a sports team's current roster from ESPN for Plot Speaks Team Trivia: players by position with numbers, and the head coach. Takes the team's name as the player says it.
| Argument | Type | Description |
|---|---|---|
| team* | string | The team, as the player named it |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"team"
],
"properties": {
"team": {
"type": "string",
"maxLength": 80,
"minLength": 1,
"description": "The team, as the player named it"
}
}
}Deletes a story submitted to Plot Speaks (pending or published) when its submission id and claim code match.
| Argument | Type | Description |
|---|---|---|
| id* | string | The submission id from the receipt |
| claim_code* | string | The claim code from the receipt, e.g. ABCD-EFGH-JKMN |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"id",
"claim_code"
],
"properties": {
"id": {
"type": "string",
"maxLength": 40,
"minLength": 1,
"description": "The submission id from the receipt"
},
"claim_code": {
"type": "string",
"maxLength": 40,
"minLength": 1,
"description": "The claim code from the receipt, e.g. ABCD-EFGH-JKMN"
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| slug* | string | The campaign's slug |
| play_id | string | The play id, when you have it |
| resume_code | string | The three-word resume code the players say |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"slug"
],
"properties": {
"slug": {
"type": "string",
"maxLength": 80,
"minLength": 2,
"description": "The campaign's slug"
},
"play_id": {
"type": "string",
"maxLength": 40,
"minLength": 1,
"description": "The play id, when you have it"
},
"resume_code": {
"type": "string",
"maxLength": 80,
"description": "The three-word resume code the players say"
}
}
}Records what happened in a Plot Speaks campaign: new characters, damage and healing, spells cast, items gained or lost, gold, rests, where the party is, the day, people met (the dead stay dead), quests, the turn order in a fight (initiative), and a one-line note for the story so far. Refuses changes the rules don't allow and says why.
| Argument | Type | Description |
|---|---|---|
| day | integer | The campaign day, if it moved on |
| note | string | One line for the story so far (kept to 240 characters) |
| npcs | array | People met or changed (status e.g. friendly, hostile, dead; notes kept to 160 characters) |
| rest | string | A short or long rest |
| slug* | string | The campaign's slug |
| party | array | Changes to party members, by name (a new name adds a character) |
| quests | array | Quests taken or changed (notes kept to 160 characters) |
| play_id* | string | The campaign play id |
| location | string | Where the party is now (kept to 120 characters) |
Returns material for writing a Plot Speaks story: a short introduction to how a story is built (a public story.md and a private answer key, secrets.md, reviewed by a person before anything is published), a suggested way to draft and review it together, and the format template.
| Argument | Type | Description |
|---|---|---|
| genre | string | murder-mystery (default), dark (a dark murder mystery), adventure, branching (a choose-your-path story), trivia (a trivia board) or game (a voice game) |
| length | string | 20 or 30 (minutes, one chapter; default 30), or 2-chapter |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"genre": {
"enum": [
"murder-mystery",
"dark",
"kids",
"adventure",
"branching",
"trivia",
"game"
],
"type": "string",
"description": "murder-mystery (default), dark (a dark murder mystery), adventure, branching (a choose-your-path story), trivia (a trivia board) or game (a voice game)"
},
"length": {
"enum": [
"20",
"30",
"2-chapter"
],
"type": "string",
"description": "20 or 30 (minutes, one chapter; default 30), or 2-chapter"
}
}
}| 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. Say "Greek Myths" or "detective stories" as the listener did. |
| not_played | boolean | True to leave out what this player has already played (signed-in players only) |
| max_minutes | integer | Only pieces this many minutes long or shorter |
| group_by_category | boolean | True, with no page, for the whole list grouped under kind headings |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"new": {
"type": "boolean",
"description": "True for what's new: the newest pieces first, with their What's New line"
},
"kind": {
"type": "string",
"maxLength": 40,
"description": "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), talk (Table Talk), story time (read-aloud classics), winddown (wind-downs), campaign (open worlds and D&D-style campaigns), or game (every one of the game kinds above except trivia and guessing)"
},
"page": {
"type": "integer",
"maximum": 200,
"minimum": 1,
"description": "Which three to read, from 1. After reading a page, if the listener says more, call again with the same filters and page + 1"
},
"genre": {
"enum": [
"murder-mystery",
"classic",
"dark",
"kids",
"adventure"
],
"type": "string",
"description": "Within mysteries and adventures: murder-mystery (all murder mysteries), classic (murder mysteries that aren't dark), dark (dark murder mysteries) or adventure"
},
"audience": {
"enum": [
"general",
"family"
],
"type": "string",
"description": "Narrow by audience: general, or the all-ages pieces. Omit for everything"
},
"collection": {
"type": "string",
"maxLength": 60,
"description": "A collection, by name or id, loosely matched: greek-myths, classic-detectives, ghost-gothic, seasons, holidays, bedtime, dice, road-trip, classics. Say \"Greek Myths\" or \"detective stories\" as the listener did."
},
"not_played": {
"type": "boolean",
"description": "True to leave out what this player has already played (signed-in players only)"
},
"max_minutes": {
"type": "integer",
"maximum": 600,
"minimum": 1,
"description": "Only pieces this many minutes long or shorter"
},
"group_by_category": {
"type": "boolean",
"description": "True, with no page, for the whole list grouped under kind headings"
}
}
}{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"slug",
"play_id"
],
"properties": {
"slug": {
"type": "string",
"maxLength": 80,
"minLength": 2,
"description": "The story slug"
},
"wish": {
"type": "string",
"maxLength": 300,
"description": "What else the player would like to play, if they said, in their words"
},
"stars": {
"type": "integer",
"maximum": 5,
"minimum": 1,
"description": "1 to 5 (optional when a verdict is given)"
},
"comment": {
"type": "string",
"maxLength": 500,
"description": "The player's comment about the story, if any, in their words"
},
"play_id": {
"type": "string",
"maxLength": 40,
"minLength": 1,
"description": "The play id from start_story"
},
"spoiled": {
"type": "boolean",
"description": "True if the player felt the narrator gave something away too early"
},
"verdict": {
"enum": [
"passed",
"needs_work"
],
"type": "string",
"description": "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)"
},
"feedback": {
"type": "string",
"maxLength": 1000,
"description": "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"
}
}
}| new_campaign | boolean | For a campaign, when the player is signed in and has one already: true to start a fresh one instead of carrying on |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"slug"
],
"properties": {
"slug": {
"type": "string",
"maxLength": 80,
"minLength": 2,
"description": "The story's slug or title, e.g. example-dinner-party or The Last Toast"
},
"team": {
"type": "string",
"maxLength": 80,
"description": "For Team Trivia: the team the player named, in their words (a city, a name, a nickname or an abbreviation)"
},
"chapter": {
"type": "integer",
"maximum": 9,
"minimum": 1,
"description": "For a two-chapter story: 2 to get chapter 2 (default 1)"
},
"minutes": {
"type": "integer",
"maximum": 600,
"minimum": 1,
"description": "For a trivia game: how long the player has (their drive), to size the game to it"
},
"play_id": {
"type": "string",
"maxLength": 40,
"minLength": 1,
"description": "With chapter 2: the play id from chapter 1, to keep the same play"
},
"path_code": {
"type": "string",
"maxLength": 80,
"description": "For a choose-your-path story: the three-word path code a friend got at its ending, to follow their choices"
},
"resume_code": {
"type": "string",
"maxLength": 80,
"description": "For a campaign: the three-word code from an earlier session, to carry on where it left off"
},
"versus_code": {
"type": "string",
"maxLength": 80,
"description": "For a trivia board: the three-word code a friend got at the end of their game, to play the same board and compare scores (pass slug \"versus\"; the code names the game)"
},
"new_campaign": {
"type": "boolean",
"description": "For a campaign, when the player is signed in and has one already: true to start a fresh one instead of carrying on"
}
}
}| initiative | array | The turn order in a fight, first is up, naming only creatures the party can see (the screen shows it); send it again as the turn moves on, and an empty list when the fight ends |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"slug",
"play_id"
],
"properties": {
"day": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "The campaign day, if it moved on"
},
"note": {
"type": "string",
"maxLength": 4000,
"description": "One line for the story so far (kept to 240 characters)"
},
"npcs": {
"type": "array",
"items": {
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"maxLength": 200,
"minLength": 1
},
"note": {
"type": "string",
"maxLength": 4000
},
"status": {
"type": "string",
"maxLength": 100
}
}
},
"maxItems": 60,
"description": "People met or changed (status e.g. friendly, hostile, dead; notes kept to 160 characters)"
},
"rest": {
"enum": [
"short",
"long"
],
"type": "string",
"description": "A short or long rest"
},
"slug": {
"type": "string",
"maxLength": 80,
"minLength": 2,
"description": "The campaign's slug"
},
"party": {
"type": "array",
"items": {
"type": "object",
"required": [
"name"
],
"properties": {
"hp": {
"type": "integer",
"maximum": 500,
"minimum": 0
},
"gold": {
"type": "integer",
"maximum": 1000000,
"minimum": -1000000
},
"heal": {
"type": "integer",
"maximum": 500,
"minimum": 0
},
"name": {
"type": "string",
"maxLength": 80,
"minLength": 1
},
"class": {
"type": "string",
"maxLength": 100
},
"level": {
"type": "integer",
"maximum": 5,
"minimum": 1
},
"damage": {
"type": "integer",
"maximum": 500,
"minimum": 0
},
"max_hp": {
"type": "integer",
"maximum": 200,
"minimum": 1
},
"remove": {
"type": "boolean"
},
"add_items": {
"type": "array",
"items": {
"type": "string",
"maxLength": 1000
},
"maxItems": 100
},
"max_slots": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "integer",
"maximum": 4,
"minimum": 0
}
},
"conditions": {
"type": "array",
"items": {
"type": "string",
"maxLength": 400
},
"maxItems": 40
},
"spend_slot": {
"type": "string",
"pattern": "^[1-5]$"
},
"remove_items": {
"type": "array",
"items": {
"type": "string",
"maxLength": 1000
},
"maxItems": 100
}
}
},
"maxItems": 6,
"description": "Changes to party members, by name (a new name adds a character)"
},
"quests": {
"type": "array",
"items": {
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"maxLength": 200,
"minLength": 1
},
"note": {
"type": "string",
"maxLength": 4000
},
"status": {
"enum": [
"open",
"done",
"failed"
],
"type": "string"
}
}
},
"maxItems": 60,
"description": "Quests taken or changed (notes kept to 160 characters)"
},
"play_id": {
"type": "string",
"maxLength": 40,
"minLength": 1,
"description": "The campaign play id"
},
"location": {
"type": "string",
"maxLength": 1000,
"description": "Where the party is now (kept to 120 characters)"
},
"initiative": {
"type": "array",
"items": {
"type": "string",
"maxLength": 80
},
"maxItems": 30,
"description": "The turn order in a fight, first is up, naming only creatures the party can see (the screen shows it); send it again as the turn moves on, and an empty list when the fight ends"
}
}
}