Skip to main content
Glama

Data stories: hand a table to Hunchful as a story that plays

create_data_story

"Gör en databerättelse": a table that plays (race, rank, lines) or a tree (nodes), private to them, in their Hunchful AI chat. Always a source, never numbers from memory: try fetch_dataset first. To put it on a place: create_post with story_id. To change one: story_id and the whole recipe.

Input Schema

NameRequiredDescriptionDefault
geoNomap only: which map.
formNorace: who overtakes (5+ series); rank: places step by step (5–10); lines: 1–5 over time; map: countries or län (needs geo, ids ISO3 or län codes); tree: give nodes, no table.
keysNoInstead of table: the years (rising).
showNorace: how many bars; rank: how many places.
unitNo'%', 'personer', 'kr' …
colorNoseries (default with 2+ series): each series its own colour; accent: one colour.
nodesNotree only: at most 40 nodes, at most 8 lanes (leave lane out — the server lays them out).
tableNoCSV or TSV: a header with the series' names, one row per year (or one row per series).
titleYesShort, what the story shows: 'Kodspråk sedan 1970'.
labelsNomap only: numbers on the regions.
seriesNoInstead of table: each series' values, one per key (at most 60; a map every region, up to 250).
sourceYesWhere the numbers (a tree's years) come from (required).
emblemsNoauto (default): a flag for an ISO3 id, else initials.
chaptersNoCaptions at a year that tell the turn; hold (ms) pauses; focus: the ≤3 series it's about.
decimalsNo
emphasisNoSeries to stand out (ids or names) — a tree's node ids.
questionNoOnly when the person asks for one: ONE question at the end with 2–4 short answers. Leave it out otherwise.
story_idNoTo change a story you made before.
subtitleNo
durationMsNoHow long it plays. Leave it out: 1,5 s per step for a race or a map.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed12 schema fields changed
    • removedInput schema / $schema
      Removed value: -"http://json-schema.org/draft-07/schema#"
    • removedInput schema / additionalProperties
      Removed value: -false
    • changedInput schema / properties / chapters / description
      Previous value: -"Captions at a year that tell the turn (an overtake, a peak) — not a list of numbers; hold (ms) pauses there; focus = the ≤3 series (or tree nodes) it's about (they light up)."New value: +"Captions at a year that tell the turn; hold (ms) pauses; focus: the ≤3 series it's about."
    • removedInput schema / properties / chapters / items / additionalProperties
      Removed value: -false
    • changedInput schema / properties / emblems / description
      Previous value: -"A round emblem on each head: auto (default) = the flag for a country (ISO3 ids like SWE), else the initials; none = no emblems."New value: +"auto (default): a flag for an ISO3 id, else initials."
    • changedInput schema / properties / form / description
      Previous value: -"race: many series changing rank (5+ — the bars overtake each other; the default with 6+ series); rank: the places step by step, a line per series through 1, 2, 3 … (5–10 series); lines: 1–5 series over time; map: countries or Swedish län shaded by value with their numbers on them (needs geo, ids = ISO3 or län codes 01–25); tree: branches growing down in time (give nodes, no table)."New value: +"race: who overtakes (5+ series); rank: places step by step (5–10); lines: 1–5 over time; map: countries or län (needs geo, ids ISO3 or län codes); tree: give nodes, no table."
    • removedInput schema / properties / nodes / items / additionalProperties
      Removed value: -false
    • removedInput schema / properties / question / additionalProperties
      Removed value: -false
    • removedInput schema / properties / series / items / additionalProperties
      Removed value: -false
    • removedInput schema / properties / source / additionalProperties
      Removed value: -false
    • changedInput schema / properties / table / description
      Previous value: -"The numbers as CSV/TSV text: a header row with the series' names, then one row per year (or period) — or one row per series with the years across. Empty cells are fine."New value: +"CSV or TSV: a header with the series' names, one row per year (or one row per series)."
    • changedOutput schema / (root)
      Previous value: -{
      -  "$schema": "http://json-schema.org/draft-07/schema#",
      -  "additionalProperties": false,
      -  "properties": {
      -    "error": {
      -      "type": "string"
      -    },
      -    "form": {
      -      "type": "string"
      -    },
      -    "private": {
      -      "type": "boolean"
      -    },
      -    "sourced": {
      -      "type": "boolean"
      -    },
      -    "story_id": {
      -      "type": "string"
      -    },
      -    "tell": {
      -      "type": "string"
      -    },
      -    "title": {
      -      "type": "string"
      -    }
      -  },
      -  "type": "object"
      -}New value: +null
  2. Changed2 schema fields changed
    • changedInput schema / properties / series / description
      Previous value: -"Instead of table: each series' values, one per key."New value: +"Instead of table: each series' values, one per key (at most 60; a map every region, up to 250)."
    • changedInput schema / properties / series / maxItems
      Previous value: -60New value: +250
  3. Changed9 schema fields changed
    • changedInput schema / properties / chapters / description
      Previous value: -"Captions at a year that tell the turn (an overtake, a peak) — not a list of numbers; hold (ms) pauses there; focus = the ≤3 series it's about (they light up)."New value: +"Captions at a year that tell the turn (an overtake, a peak) — not a list of numbers; hold (ms) pauses there; focus = the ≤3 series (or tree nodes) it's about (they light up)."
    • addedInput schema / properties / emblems
      Added value: +{
      +  "description": "A round emblem on each head: auto (default) = the flag for a country (ISO3 ids like SWE), else the initials; none = no emblems.",
      +  "enum": [
      +    "auto",
      +    "none"
      +  ],
      +  "type": "string"
      +}
    • changedInput schema / properties / emphasis / description
      Previous value: -"Series to stand out (ids or names)."New value: +"Series to stand out (ids or names) — a tree's node ids."
    • changedInput schema / properties / form / description
      Previous value: -"race: many series changing rank (5+ — the bars overtake each other; the default with 6+ series); lines: 1–5 series over time; map: countries or Swedish län shaded by value with their numbers on them (needs geo, ids = ISO3 or län codes 01–25)."New value: +"race: many series changing rank (5+ — the bars overtake each other; the default with 6+ series); rank: the places step by step, a line per series through 1, 2, 3 … (5–10 series); lines: 1–5 series over time; map: countries or Swedish län shaded by value with their numbers on them (needs geo, ids = ISO3 or län codes 01–25); tree: branches growing down in time (give nodes, no table)."
    • changedInput schema / properties / form / enum
      Previous value: -[
      -  "lines",
      -  "race",
      -  "map"
      -]New value: +[
      +  "lines",
      +  "race",
      +  "rank",
      +  "map",
      +  "tree"
      +]
    • addedInput schema / properties / nodes
      Added value: +{
      +  "description": "tree only: at most 40 nodes, at most 8 lanes (leave lane out — the server lays them out).",
      +  "items": {
      +    "additionalProperties": false,
      +    "properties": {
      +      "at": {
      +        "description": "The year it began.",
      +        "type": "number"
      +      },
      +      "from": {
      +        "description": "Its parents' ids — the same year or earlier; two or more = a merge.",
      +        "items": {
      +          "maxLength": 24,
      +          "type": "string"
      +        },
      +        "maxItems": 4,
      +        "type": "array"
      +      },
      +      "id": {
      +        "maxLength": 24,
      +        "type": "string"
      +      },
      +      "label": {
      +        "maxLength": 40,
      +        "type": "string"
      +      },
      +      "lane": {
      +        "maximum": 7,
      +        "minimum": 0,
      +        "type": "number"
      +      }
      +    },
      +    "required": [
      +      "id",
      +      "label",
      +      "at"
      +    ],
      +    "type": "object"
      +  },
      +  "maxItems": 40,
      +  "type": "array"
      +}
    • changedInput schema / properties / question / description
      Previous value: -"ONE question at the end with 2–4 short answers."New value: +"Only when the person asks for one: ONE question at the end with 2–4 short answers. Leave it out otherwise."
    • changedInput schema / properties / show / description
      Previous value: -"race: how many bars."New value: +"race: how many bars; rank: how many places."
    • changedInput schema / properties / source / description
      Previous value: -"Where the numbers come from (required)."New value: +"Where the numbers (a tree's years) come from (required)."
  4. Changed8 schema fields changed
    • changedInput schema / properties / chapters / description
      Previous value: -"Captions at a year; hold (ms) pauses there."New value: +"Captions at a year that tell the turn (an overtake, a peak) — not a list of numbers; hold (ms) pauses there; focus = the ≤3 series it's about (they light up)."
    • addedInput schema / properties / chapters / items / properties / focus
      Added value: +{
      +  "items": {
      +    "maxLength": 40,
      +    "type": "string"
      +  },
      +  "maxItems": 3,
      +  "type": "array"
      +}
    • addedInput schema / properties / color
      Added value: +{
      +  "description": "series (default with 2+ series): each series its own colour; accent: one colour.",
      +  "enum": [
      +    "series",
      +    "accent"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / durationMs
      Added value: +{
      +  "description": "How long it plays. Leave it out: 1,5 s per step for a race or a map.",
      +  "maximum": 90000,
      +  "minimum": 4000,
      +  "type": "number"
      +}
    • changedInput schema / properties / form / description
      Previous value: -"lines (a few series over time, default) or race (many series changing rank)."New value: +"race: many series changing rank (5+ — the bars overtake each other; the default with 6+ series); lines: 1–5 series over time; map: countries or Swedish län shaded by value with their numbers on them (needs geo, ids = ISO3 or län codes 01–25)."
    • changedInput schema / properties / form / enum
      Previous value: -[
      -  "lines",
      -  "race"
      -]New value: +[
      +  "lines",
      +  "race",
      +  "map"
      +]
    • addedInput schema / properties / geo
      Added value: +{
      +  "description": "map only: which map.",
      +  "enum": [
      +    "world",
      +    "europe",
      +    "nordics",
      +    "sweden-lan"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / labels
      Added value: +{
      +  "description": "map only: numbers on the regions.",
      +  "enum": [
      +    "auto",
      +    "all",
      +    "none"
      +  ],
      +  "type": "string"
      +}
  5. Added

TDQS

A3.6/5.0
Behavior3/5

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

Annotations declare a non-read-only, non-destructive, non-idempotent, closed-world write, and the description adds genuinely useful context: the story is private to the person, a source is mandatory, and an update replaces the entire recipe rather than patching fields. That last point is a valuable non-obvious behavior. However it says nothing about what a successful call returns (a story_id is clearly needed for the follow-up `create_post` step) or about any limits.

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?

Three dense sentences, front-loaded with what the tool produces, followed by the data-sourcing rule and the publish/update follow-ups. No filler. The Swedish lead-in phrase "Gör en databerättelse" is evocative but slightly opaque as an opening for an agent.

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

Completeness3/5

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

For a 20-parameter tool with nested objects and no output schema, the description is thin in places: it never states the return value or that the created story's id feeds `create_post`, and it leaves the large optional surface (chapters, emphasis, question, durationMs) entirely to the schema. The critical workflow pointers it does give are accurate, so it is adequate but not complete.

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

Parameters3/5

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

Schema description coverage is 90% and per-field docs already explain form, geo, labels, show, chapters, question, and durationMs in detail, so the baseline is 3. The description reinforces only the table-vs-tree split and the required `source`, adding little beyond the schema. It does not touch the many optional parameters an agent must decide about.

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

Purpose4/5

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

States a specific verb+resource (create a data story) and describes the two shapes it can take: a playing table with race/rank/lines forms, or a tree given via `nodes`. It also notes the story is private and rendered in the Hunchful AI chat. It never names or contrasts with the sibling `create_visual_story`, so an agent cannot distinguish the two from the description alone.

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

Usage Guidelines4/5

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

Gives real routing: try `fetch_dataset` first so numbers never come from memory, use `create_post` with the returned story_id to publish to a place, and pass `story_id` plus the whole recipe to change an existing one. That covers the main before/after workflows. It lacks any guidance on when to prefer this over `create_visual_story`, the closest alternative.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.