Two faces

Web and MCP are siblings, not layers

The web does not call the MCP server. Both read directly from packages/core/queries and the modules SDK. That's the rule, not a quirk — it's how the canon stays consistent across surfaces while each can ship at its own cadence.

humans

storytelling.anlakstudio.com

The site you are reading. Decks, slides, insights, learn. Built with Astro + Astro Actions; Drizzle queries run inside the action handlers.

Use Browsing the canon
agents

storytelling://

Same canon, exposed as MCP tools, resources, and prompts. Claude / Cursor / Codex install once and ground every answer in this material.

Use Reading the canon programmatically
The canon, by the numbers

What ships behind the URI

Live counts read off Postgres + the markdown corpus at request time. The page introspects itself; nothing here is a static brochure number.

resources 110
areas 6
categories 13
documents 10.3k
slide images 320k
components 1.7M
canon abstractions 483
observed matches 335k

Areas

Six lenses on the same skill tree. Areas are role, not folder.

  • Skill Orchestrator 3 resources

    How the Storytelling skill asks for canon, resources, deck evidence and output contracts.

  • Method 59 resources

    Storymakers operating guidance: process, agents, checklists, storytelling moves and playbook examples.

  • Canon 12 resources

    Reusable abstractions: arcs, loops and application patterns that should converge with Postgres canon.

  • Craft 10 resources

    Slide, prose, rhythm and composition techniques for making the canon visible on the page.

  • Applications 25 resources

    Consulting, activist, valuation, campaign and research-note use cases built from the shared canon.

  • Examples 1 resources

    Reference specimens and playbooks worth studying when matching, reviewing or generating decks.

Resource scheme

The storytelling:// namespace

MCP resources are addressed by URI, not file path. The agent never sees the folder shape — it sees the role tree. The same paths drive the web routes you visit at /skill/<domain>/<category>/<slug>.

canonical surface storytelling://
  • storytelling://the canon root
  • method/operating guidance · agents · checklists
  • 10-step-process.md
  • agents.md
  • canon/arcs · loops · patterns
  • story-arcs.md
  • loop-examples.md
  • craft/prose · rhythm · composition
  • textures/composition-patterns.md
  • applications/consulting · activist · campaign
  • forms/activist-deck.md
121 resources advertised live · indexed by role, not by physical folder
Agent endpoint

25 tools · 121 resources · 4 prompts

The MCP surface is what your agent actually receives. Tools are the entry points (search the canon, fetch a resource, count documents by kind). Resources are the addressable corpus. Prompts are server-suggested workflows. Each tool reads from one of three sources, marked below.

live data 5 tools

Postgres-backed. Always reflects the current state of the canon — slides, decks, components, observed matches.

  • list_storymakers_canon_filters
  • documents_count_by_kind
  • get_deck_playbook
  • search_slides
  • get_slide
markdown 7 tools

Curated long-form text — method, agents, checklists, arcs. Loaded from disk at boot, served via storytelling:// URIs.

  • search_storytelling_corpus
  • get_storytelling_resource
  • list_storytelling_corpus
  • get_storymakers_method_pack
  • search_patterns
  • get_pattern
  • list_categories
db + markdown 1 tools

Converged. Postgres canon (arcs, loops, tools) joined with their markdown companions for a single answer.

  • get_storymakers_canon

Server-suggested prompts

Workflows the MCP server proposes when an agent asks "what would you have me do here?"

  • draft-arc prompt

    Given a thesis and audience, suggest a Storymakers arc, primary beat sequence and one supporting loop, grounded in concepts.arcs and concepts.loops.

  • review-deck prompt

    Walk a deck draft through Storymakers checklists: action titles, narrative arc adherence, pattern coverage, slide function balance.

  • storymakers-method prompt

    Bootstraps a session with the 10-step process, Creative Trio agents and quality checklists pre-loaded — for sustained authoring work.

  • contrarian-thesis prompt

    Build a short or activist thesis using the corpus patterns: peer-gap, sum-of-parts, CEO-quote contradiction, governance, named villain.

The architecture

MCP is the entry point · everything else fans out from three slots

When your AI installs the storytelling skill via MCP, it gets one connection and three capability slots — tools (functions), resources (addressable content), prompts (workflow templates). No nesting, no hidden orchestration on the server side. The diagram names every slot, every tool family, every URI prefix, and every prompt.

flowchart TB
  classDef ext   fill:#FFF7D9,stroke:#b08800,color:#1A1713
  classDef entry fill:#1F4E79,stroke:#0d2c4d,color:#fff
  classDef slot  fill:#DAEFEE,stroke:#1D6967,color:#1A1713
  classDef item  fill:#fafafa,stroke:#8C8577,color:#1A1713

  CC["Claude Code"]:::ext
  CUR_AI["Cursor"]:::ext
  CDX["Codex · GPT"]:::ext
  CONT["Continue · etc"]:::ext

  CC --> MCP
  CUR_AI --> MCP
  CDX --> MCP
  CONT --> MCP

  MCP{{"storytelling MCP server<br/>:8787/mcp · one bearer token per agent"}}:::entry

  MCP --> TOOLS["20 TOOLS · functions the agent calls"]:::slot
  MCP --> RES["121 RESOURCES · canon by URI"]:::slot
  MCP --> PR["4 PROMPTS · workflow templates"]:::slot

  TOOLS --> TI["search_storytelling_corpus<br/>get_storytelling_resource<br/>search_slides · get_slide<br/>get_storymakers_canon<br/>get_pattern · search_patterns<br/>+ 12 more — counts · filters · method-pack · ping"]:::item

  RES --> RI["storytelling://method/ — 10-step-process · agents · checklists<br/>storytelling://canon/ — story-arcs · loops · patterns<br/>storytelling://craft/ — textures · composition-patterns<br/>storytelling://applications/ — activist · valuation · campaign"]:::item

  PR --> PI["draft-arc — walks through drafting a story arc<br/>review-deck — walks through reviewing a deck<br/>contrarian-thesis — walks through building a thesis<br/>storymakers-method — walks through the 10-step method"]:::item
MCP is a stateless entry point. Every connected agent gets the same three slots — 20 tools, 121 resources, 4 prompts. No per-agent gating, no nested skills, no subagents inside the server. The agent picks what to call.
  1. 1
    Corpus

    Postgres + S3

    10.3k documents · 320k slide images · 1.7M components · 483 canon abstractions. Decks live as pages with extracted components; canonical arcs/loops/tools sit alongside.

    corpus.* schema · packages/core/db
  2. 2
    Abstraction

    Domain modules

    Reusable queries that present the corpus as canonical operations: search the canon, fetch a resource, get a method pack, list filter facets, count by kind. The same SDK both the web and MCP server consume.

    packages/core/queries · packages/modules/*
  3. 3
    MCP

    Manifest registry

    One package declares every tool, resource, and prompt the agent surface advertises. Both apps/server (real /mcp HTTP transport) and apps/web (in-process introspector) call the same createStorytellingMcpServer with the same deps shape — capabilities cannot drift.

    packages/mcp-manifest
Agent-side · the report pipeline

report-orchestrator · all 10 phases · grounded in the MCP

The bundle that authors Anlak Strategic Intelligence reports lives at packages/skills/ in this same repo — sibling to apps/server. One orchestrator, ten phases. Phases that need canon grounding consume the storytelling MCP at https://storytelling.anlakstudio.com/mcp (dev: http://localhost:8787/mcp). The diagram below names every phase, every delegate, and which MCP tools it calls.

flowchart TB
  classDef orch fill:#1F4E79,stroke:#0d2c4d,color:#fff
  classDef sub  fill:#DAEFEE,stroke:#1D6967,color:#1A1713
  classDef meth fill:#FFF7D9,stroke:#b08800,color:#1A1713
  classDef self fill:#fff,stroke:#8C8577,color:#5C5448
  classDef mcp  fill:#1F4E79,stroke:#0d2c4d,color:#fff
  classDef todo fill:#fff,stroke:#b08800,stroke-width:2px,color:#5C5448

  RO["report-orchestrator<br/>scaffold → build · 10 phases"]:::orch

  RO --> P1["1 · SCAFFOLD<br/>create-new-report skill"]:::sub
  P1 --> P2["2 · RESEARCH<br/>research-discoverer → research-curator"]:::sub
  P2 --> P3["3 · ANALYSIS<br/>research-quant"]:::sub
  P3 --> P4["4 · NARRATIVE<br/>storymakers method"]:::meth
  P4 --> P5["5 · CHAPTER WRITING<br/>chapter-writer"]:::sub
  P5 --> P6["6 · IMAGE STRATEGY<br/>orchestrator-owned"]:::self
  P6 --> P7["7 · VALIDATION<br/>typst-validator method"]:::meth
  P7 --> P8["8 · IMAGE GENERATION<br/>image-runner"]:::sub
  P8 --> P9["9 · COHERENCE & QA<br/>orchestrator-owned"]:::self
  P9 --> P10["10 · BUILD<br/>./build.sh"]:::self

  P2 -.search canon · cite resources.-> MCP[("storytelling MCP<br/>:8787/mcp · same repo")]:::mcp
  P3 -.canon counts · filters.-> MCP
  P4 -.method-pack · canon arcs.-> MCP
  P5 -.cite slides · canon patterns.-> MCP

  P8 -->|"chart slots"| VC["visx-chart<br/>OLD · being upgraded<br/>after the charts-2000 analysis"]:::todo
  P8 -->|"sketchnote slots"| HF["higgsfield MCP<br/>slide gen in Anlak brand style<br/>(to wire)"]:::mcp
  P8 -->|"product UI slots"| SCR["screenshot-capture method"]:::meth
One orchestrator. Ten linear phases. Four phases consult the storytelling MCP for canon grounding (dotted arrows). Phase 8 routes images per slot type. visx-chart is on the upgrade path after the ongoing charts-2000 analysis. higgsfield MCP is wired for slide generation in Anlak brand style (currently disabled — to wire).

Phase × delegate × MCP tools called

For every phase: who runs it, which directory it owns, and which storytelling MCP tools it calls. Read top-to-bottom and you have the full pipeline.

Phase Delegate Writes MCP tools called
The mechanic

Inside a real call

A concrete walk-through. The agent receives a request from its user, fetches a prompt for guidance, then sequences tool calls itself. Below: the full sequence, then three flow examples grouped by where the data lives — live data, markdown, or both.

sequenceDiagram
  participant AG as Your AI<br/>(Claude · Cursor · Codex)
  participant SK as storytelling MCP
  participant CN as the canon

  Note over AG: User asks: "Help me draft a chapter on<br/>why CEOs need Loop Logic."<br/>Agent picks the storymakers-method prompt for guidance.

  AG->>SK: GetPrompt: storymakers-method
  SK-->>AG: 10-step process template · which tools to call when

  Note over AG: Agent reads the template,<br/>plans the calls.

  AG->>SK: get_storymakers_canon<br/>kind: "loop" · slug: "logic-chain"
  SK->>CN: concepts.loops + canon/loop-examples.md
  CN-->>SK: 4-step Logic Chain + 3 annotated examples
  SK-->>AG: structured object · ready to cite

  AG->>SK: search_slides<br/>q: "competitive matrix" · limit: 5
  SK->>CN: rank corpus.document_pages
  CN-->>SK: 5 slide IDs by tsvector score
  SK-->>AG: 5 slide briefs

  Note over AG: Drafts the chapter. Cites the loop,<br/>quotes 2 slides. 6 footnotes. Lessonbox at end.
One real call. The agent picks a prompt for guidance, then calls tools in the order the prompt suggests. The MCP server does not sequence — it returns what each call asks for. The agent owns the plan.
live data

search_slides

  1. Agent calls search_slides({q: "wave chart", limit: 5})
  2. apps/server · Hono receives POST /mcp · MCP SDK dispatches
  3. tools/slides.ts in mcp-manifest · invokes searchSlides(db, args)
  4. core/queries · Drizzle SELECT with tsvector ranking on corpus.document_pages
  5. Postgres returns top-N rows · handler shapes them into MCP content[] · agent receives
markdown

get_storytelling_resource

  1. Agent calls get_storytelling_resource({uri: "storytelling://method/agents.md"})
  2. apps/server dispatches to tools/corpus.ts
  3. Handler resolves URI → disk path · corpus/storymakers/method/agents.md
  4. Reads file from the in-memory corpus loaded at boot · parses frontmatter
  5. Returns markdown body + metadata as MCP tool result · no DB hit
db + markdown

get_storymakers_canon

  1. Agent calls get_storymakers_canon({kind: "loop", slug: "logic-chain"})
  2. tools/canon.ts · invokes converger in canon-converge.ts
  3. core/queries · pulls the canonical row from concepts.loops
  4. module-contrarian · loads markdown companion canon/loop-examples.md
  5. Converger merges row + markdown · returns single object · agent receives the converged canon

The same shape repeats for every request: agent picks the call, MCP server resolves it against Postgres or markdown (or both), result comes back. Sequencing happens in the agent. If you want a fixed workflow with named stop-gates and per-step validation, that's not what MCP gives you — that's what an agent-side bundle (like packages/skills/) gives you.