Model Context Protocol

MCP servers I’ve built.

13 custom servers, 240 tools. Each one wires a real product’s data and logic directly into Claude — so users can ask questions, take actions, and get back natural answers without ever leaving the conversation.

How it works

From a question to your database, in one round trip.

MCP is the protocol that lets AI assistants like Claude talk directly to the tools and data your users already trust. Ask in plain language, and the work happens right there in the conversation.

  1. Step 1

    User asks Claude

    Plain language. "What's on my plate today?" — no API knowledge required.

  2. Step 2

    Claude picks a tool

    Claude reads the available tools, picks the right one, and fills in the parameters.

  3. Step 3

    MCP server validates

    Auth, parameter checks, business logic. The server speaks to your app's database.

  4. Step 4

    Data flows back

    The response lands back in Claude, which writes a natural reply for the user.

The servers, up close.

Click any card to expand the tool list and see example flows.

Tool lists come straight from each server’s own tools/list, last updated October 5, 2026.

The MCP layer behind ControlledChaos — an ADHD-first task manager with crisis mode, goal tracking, and a daily mirror. These tools let Claude create and triage tasks, log goals, drop brain dumps, and read back stats so users can plan a day without opening the app.

Live app

Tools (41)

cc_add_task_session

Plan another sitting for an existing task, leaving its other sittings alone ("also work on this Thursday morning").

cc_brain_dump

Store a raw brain dump entry in the user's dump history.

cc_complete_microtask

Mark a microtask done for today.

cc_complete_task

Mark a task as completed.

cc_create_event

Create a new calendar event in ControlledChaos, optionally recurring.

cc_create_goal

Create a new goal in ControlledChaos.

cc_create_journal

Save a new junk journal entry — longer-form, reflective writing kept separate from task brain dumps.

cc_create_microtask

Create a small repeatable microtask (a prompt, not a real task).

cc_create_reference_card

Pin a new reference card to the user's dashboard: a markdown playbook, checklist, or set of defaults they look up often.

cc_create_task

Create a new task in ControlledChaos.

cc_deactivate_microtask

Soft-pause a microtask (sets active=false).

cc_delete_event

Permanently delete a calendar event.

cc_delete_goal

Delete a goal.

cc_delete_moment

Soft-delete a moment.

cc_delete_task

Delete a task.

cc_delete_task_session

Remove ONE planned sitting from a task.

cc_get_active_crisis

Return the user's active crisis plan if one is in progress, or report none.

cc_get_daily_stats

Get a snapshot of today's productivity stats: tasks completed today, total pending, overdue count, and upcoming events.

cc_get_mirror_day

Read the chronological timeline for a single day — completed tasks, calendar events, brain dumps, journal entries, and moments, merged and sorted in reverse-chronological order.

cc_get_settings

Read the user's timezone and the hour bounds of their day.

cc_list_brain_dumps

List past brain dump entries from ControlledChaos.

cc_list_calendar

List calendar events from ControlledChaos within a date range.

cc_list_goals

List goals from ControlledChaos, in the order the user arranged them (most important first).

cc_list_journals

List junk journal entries (category='junk_journal').

cc_list_microtasks

List the user's active microtasks with today's completion status and a rolling 7-day count.

cc_list_moments

List recent moments, optionally filtered by date range or type.

cc_list_reference_cards

List the user's reference cards: pinned markdown playbooks shown on the dashboard (evening routines, launch-pad checklists, decision defaults).

cc_list_tasks

List tasks from ControlledChaos, optionally filtered by status, priority, category, or energy level.

cc_log_moment

Log a behavioral state moment.

cc_recommend_next_task

Return up to 5 candidate next tasks plus current context (energy, active Rescue plans, goals, today's planned sittings, calendar, today's progress) so the calling AI can recommend "what to do right now."

cc_search_tasks

Search tasks by text across titles and descriptions.

cc_uncomplete_microtask

Undo today's completion of a microtask.

cc_uncomplete_task

Reopen a completed task — put it back to pending and clear its completion timestamp.

cc_update_event

Update an existing calendar event.

cc_update_goal

Update an existing goal.

cc_update_journal

Edit the text of an existing junk journal entry — fixing a typo, finishing a sentence the user trailed off on.

cc_update_microtask

Update fields on an existing microtask.

cc_update_moment

Update a moment's intensity, note, or timestamp.

cc_update_reference_card

Update a reference card.

cc_update_task

Update an existing task.

cc_update_task_session

Move or resize ONE planned sitting of a task.

Example flows

Illustrative — sample data, not real usage.

User asks Claude

Add 'review PR feedback for the auth refactor' to my tasks — it's important, due tomorrow at 5.

Claude calls MCP toolcc_create_task
{
  "title": "review PR feedback for the auth refactor",
  "priority": "important",
  "deadline": "2026-10-06T21:00:00Z"
}
MCP server responds
{
  "id": "a8f3c1d2-…",
  "title": "review PR feedback for the auth refactor",
  "priority": "important",
  "deadline": "2026-10-06T21:00:00Z",
  "status": "pending"
}
Claude replies

Added — marked important, due tomorrow at 5. You've got 4 other tasks open for tomorrow already. Want me to pull those up so you can stack-rank?

User asks Claude

What's on my plate today?

Claude calls MCP toolcc_list_tasks
{
  "status": "pending"
}
MCP server responds
[
  {
    "title": "ship MCP docs page",
    "priority": "urgent",
    "energy_level": "high"
  },
  {
    "title": "reply to client onboarding email",
    "priority": "normal",
    "energy_level": "low"
  },
  {
    "title": "write up patch notes for v0.4.1",
    "priority": "someday",
    "energy_level": "low"
  }
]
Claude replies

Three on the list: shipping the MCP docs page (urgent), replying to the onboarding email, and patch notes whenever. The docs page is the heaviest — start there while your focus is fresh?

The MCP server behind ChaosPatch — a project-scoped patch tracker for fixes, features, and refactors. From inside Claude Code, you can spin up a patch, mark one in progress, search the backlog, or close one out without ever leaving the editor. Built for solo devs and small teams who don't need the weight of Jira.

Live app

Tools (27)

cp_add_note

Append a note to an existing patch.

cp_add_patch

Add a new patch to a project, optionally with initial notes, a long-form spec, tags, and a due date.

cp_add_project

Create a new ChaosPatch project for the authenticated user.

cp_add_tags

Append tags to a patch atomically.

cp_archive_completed

Archive all completed (status='done') patches owned by the authenticated user, optionally scoped to a single project.

cp_archive_project

Archive a project: hide it (and its patches) from project lists, cross-project patch lists, search, and summaries without deleting anything.

cp_batch_update

Bulk-apply one action to many patches.

cp_complete_patch

Set a patch status to done and log completed_at.

cp_confirm_image_upload

Step 2 of 2: after PUTting the file to the upload_url from cp_request_image_upload, call this with its upload_id to attach the image to the patch.

cp_delete_patch

Permanently delete a patch.

cp_delete_project

Permanently delete a project and all its patches.

cp_get_patch

Fetch a single patch by ID.

cp_get_patch_images

Fetch a patch's image attachments as viewable images for visual context (e.g. screenshots the user attached to a bug).

cp_get_project_summary

Get open/in_progress/done/archived/total counts for each project.

cp_get_velocity

Get patches completed since a given date/time across all projects (most recent first).

cp_list_all_patches

Get patches across ALL projects for the authenticated user (patches in archived projects are excluded unless include_archived is true), optionally filtered by status, priority, and/or tags (any-overlap match).

cp_list_patches

Get patches for a project, optionally filtered by status (open | in_progress | done), priority (low | medium | high), and/or tags (returns patches with at least one matching tag).

cp_list_projects

Get all ChaosPatch projects for the authenticated user.

cp_remove_tags

Remove specific tags from a patch atomically.

cp_reopen_patch

Reopen a done or in_progress patch.

cp_request_image_upload

Step 1 of 2 for attaching an image (e.g. a screenshot) to an existing patch.

cp_search_patches

Search patches by title, notes, or tags (case-insensitive).

cp_start_patch

Set a patch status to in_progress and log started_at.

cp_unarchive_patch

Unarchive a single patch (sets archived = false).

cp_unarchive_project

Unarchive a project so it shows up in default lists again.

cp_update_patch

Update a patch's title, priority, tags, due_date, notes, and/or spec.

cp_update_project

Update a project's name, color, and/or slug.

Example flows

Illustrative — sample data, not real usage.

User asks Claude

Log a patch for the timezone bug I just found in the calendar view.

Claude calls MCP toolcp_add_patch
{
  "project_slug": "controlledchaos",
  "title": "fix timezone offset on calendar day boundary",
  "priority": "high",
  "notes": "Events created at 11:30pm local appear on the next day in the week view. Suspected double-conversion of UTC → local in the day-grouping logic."
}
MCP server responds
{
  "id": "patch_9c4e22",
  "status": "open",
  "priority": "high",
  "created_at": "2026-10-05T18:55:03.000Z"
}
Claude replies

Logged as a high-priority patch on ControlledChaos. Want me to start it now and dig into the day-grouping code?

User asks Claude

What's open on Kindling? I've only got energy for small stuff.

Claude calls MCP toolcp_list_patches
{
  "project_slug": "kindling",
  "status": "open",
  "tags": [
    "energy:low"
  ]
}
MCP server responds
[
  {
    "title": "Snooze picker: add a 'next week' shortcut",
    "priority": "medium",
    "tags": [
      "ui",
      "energy:low"
    ]
  },
  {
    "title": "Fix tag chip wrapping on mobile",
    "priority": "low",
    "tags": [
      "bug",
      "energy:low"
    ]
  }
]
Claude replies

Two low-energy patches on Kindling: a 'next week' snooze shortcut and a tag-chip wrapping fix on mobile. The chip fix is the quickest — want to start there?

The MCP server behind Kindling — where ideas worth keeping go to be developed. Claude can kindle a spark when you ask it to, recall the sparks most in need of attention (ranked by age and neglect), dig up cold ones for triage, and record when an idea finally became something real.

Live app

Tools (21)

kindle

Keep a curated idea — one worth planning and coming back to.

kindling_archive

Archive a spark that is no longer relevant, so it stops competing for attention in recall.

kindling_batch_archive

Archive many sparks in one call.

kindling_delete

Permanently delete a spark.

kindling_dig

Surface cold sparks — the ones untouched for so long they fell out of active rotation — for triage.

kindling_export

Export the whole corpus as markdown or JSON — every spark, with tags, timestamps and promotion provenance.

kindling_find_duplicates

Find sparks that are probably the same recurring thought captured more than once.

kindling_get

Inspect one spark in full — its whole content, every timestamp, and its promotion provenance if it has any.

kindling_list

List sparks, filtered by status, tag, kind and/or home.

kindling_promote

Record that a spark became something real — it turned into a project, a task, a draft, a decision, a section of a document.

kindling_recall

Surface the sparks most in need of attention, ranked by the Kindling algorithm — how old they are, how long they have been neglected, and how rarely they have been shown.

kindling_remove_tag

Strip a tag from every spark carrying it, leaving the sparks themselves untouched.

kindling_rename_tag

Rename a tag across every spark that carries it — and merge two tags by renaming one into the other.

kindling_revive

Move a cold spark back to active, resetting its decay clock so it can surface in recall again.

kindling_search

Find a spark the user half-remembers, by text (title, content, home, next step) and/or by tags, kind or home.

kindling_set_standing

Mark a spark as a standing intention, exempt from the decay clock forever — or put it back on the clock.

kindling_settings

Read or change how long a spark sits untouched before it goes cold (default 180 days).

kindling_snooze

Hold a spark out of recall for a while — "not now, ask me in a month".

kindling_stats

Counts by status, promotion rate, capture cadence, and the oldest and most neglected active sparks.

kindling_tags

Every tag in use, with how many sparks carry each.

kindling_update

Edit a spark's title, content, tags, kind, home or next step.

Example flows

Illustrative — sample data, not real usage.

User asks Claude

I'm about to work on the essay — anything I captured that's relevant?

Claude calls MCP toolkindling_recall
{
  "context": "essay on attention and design",
  "limit": 3
}
MCP server responds
[
  {
    "title": "Attention as a design material",
    "kind": "essay",
    "age_days": 64
  },
  {
    "title": "Interfaces that forgive forgetting",
    "kind": "essay",
    "age_days": 112
  }
]
Claude replies

Two sparks rhyme with this: "Attention as a design material" (two months old) and "Interfaces that forgive forgetting" (almost four). The second one might be your opening.

The MCP server behind Tangle — an epistemic notebook for AI assistants. Claude captures a hunch with an honest confidence level, recalls what it suspected last session before starting work, and resolves each note as it plays out, so dead-ends don't get re-investigated and guesses get calibrated over time.

Live app

Tools (11)

note_batch_resolve

Resolve many notes in one call — for maintenance sweeps such as clearing a duplicate cluster.

note_capture

Stash an epistemic note — a hunch, suspicion, dead-end, or partial reasoning.

note_find_duplicates

Find clusters of duplicate notes — groups that share identical content, tags, confidence, identity, and parent.

note_get

Deep-read a single note by id — returns the full content body plus tags, confidence, status, standing, outcome, and parent chain.

note_list

Admin-style paginated listing of notes for review passes.

note_recall

Pull live notes for the current context as a tiered, scannable index.

note_resolve

Close out a live note with an outcome.

note_search

Substring search across all notes' content + tags.

note_stale

List live notes left untouched (by last-touch / updated_at) past a threshold, STALEST first — a deliberate review-pass tool that reproduces a manual sweep without eyeballing the whole corpus.

note_stats

Corpus shape in one cheap call — counts by status / confidence / captured_by / project, a standing count, capture velocity (last 7d / 30d), and age signals (oldest live note, count untouched 30d+, resolved:live ratio).

note_update

Edit a note's content, tags, confidence, or status without resolving it.

Example flows

Illustrative — sample data, not real usage.

User asks Claude

Before you start on the calendar bug — anything we already know?

Claude calls MCP toolnote_recall
{
  "project": "controlledchaos",
  "limit": 5
}
MCP server responds
[
  {
    "content_preview": "Day grouping may convert UTC → local twice in the week view.",
    "confidence": "suspicion",
    "recall_tier": "open"
  }
]
Claude replies

One open suspicion from last time: the week view might convert UTC to local twice. I'll check that first instead of starting from scratch.

The MCP layer behind ThreadNotes — a research journal for tracking academic questions across thematic threads. These tools let Claude save articles you're reading, surface excerpts you've highlighted, link readings to research questions, and pull thematic summaries when you're trying to remember what you've read.

Live app

Tools (51)

journal_add_article

Creates a new article in the library — a paper someone else wrote.

journal_add_decision

Records a design decision on a study — what was chosen, what was not, and WHY.

journal_add_entry

Creates a free-form journal entry in the active project — the right home for an observation, reflection, or cross-cutting thought that is not tied to a specific paper.

journal_add_excerpt

Adds a new excerpt (quote + optional comment) to an existing article.

journal_add_hypothesis

Adds a hypothesis to a study.

journal_add_note

Appends text to an existing article's notes field.

journal_add_project

Creates a new top-level project — an isolated container with its own themes, questions, library, and journal.

journal_add_question

Adds a new research question to an existing theme.

journal_add_question_source

Attaches a user source to a research question — a reference you want kept next to the question that is not (yet) an article in the library: a book, a talk, a URL, a citation from elsewhere.

journal_add_study

Creates a study — original research being designed, as opposed to a paper someone else wrote.

journal_add_theme

Creates a new research theme.

journal_delete_article

Permanently removes an article from the library by ID.

journal_delete_decision

Permanently removes a decision.

journal_delete_entry

Permanently removes a journal entry by ID.

journal_delete_excerpt

Removes a specific excerpt from an article by excerpt ID.

journal_delete_hypothesis

Permanently removes a hypothesis.

journal_delete_project

Soft-deletes a project, matching the app: it disappears from every read but keeps its whole subtree.

journal_delete_question

Permanently removes a research question and everything hanging off it: its notes, its user sources, its status and starred state.

journal_delete_question_note

Permanently removes a note from a research question by note ID.

journal_delete_question_source

Permanently removes a user source from a research question by source ID.

journal_delete_study

Permanently removes a study AND every hypothesis and decision on it.

journal_delete_theme

Deletes a research theme.

journal_get_article

Returns full details of a single article by ID, including all excerpts, notes, linked questions, AI summary, and metadata.

journal_get_entries

Returns journal entries from the active project, newest first.

journal_get_hypothesis_chain

The full revision history of one hypothesis, oldest to newest.

journal_get_library

Returns all saved articles with title, authors, year, tags, status, source, and excerpt count.

journal_get_open_decisions

Every decision still open — the "what have I not settled yet" list.

journal_get_questions

Returns all research questions across all themes, with their status, starred state, notes, user sources, and search phrases.

journal_get_studies

Lists every study in the active project with counts of active hypotheses and open decisions.

journal_get_study

Full detail for one study: design prose, every hypothesis and decision (superseded ones included, each carrying the id of what replaced it), and linked questions with their text.

journal_get_themes

Returns all research themes with their descriptions and which question IDs belong to each.

journal_link_question

Links or unlinks an article to a research question by updating the article's linkedQuestions array.

journal_link_questions

Links or unlinks two research questions as related.

journal_link_study_question

Links or unlinks a study and a research question.

journal_list_projects

Returns every top-level project with its icon, color, description, and content counts, and marks which one is currently active.

journal_restore_project

Restores a soft-deleted project with everything it held, and makes it the active project, matching the app.

journal_restore_theme

Restores a soft-deleted theme in the active project, matching Recently deleted in Manage Themes.

journal_search

Full-text search across the active project: research questions, articles, journal entries, and studies.

journal_set_active_project

Changes which project every other journal_* tool reads and writes.

journal_supersede_decision

Reverses a decision in ONE call: records the new decision, marks the old one superseded, and points it at the replacement.

journal_supersede_hypothesis

Replaces a hypothesis with a revised version in ONE call: creates the new hypothesis carrying the old one's label and question forward, marks the old one superseded, and points it at the new one.

journal_update_article

Updates fields on an existing article.

journal_update_decision

Edits a decision in place — typically to settle an open one by adding the rationale and setting status='settled'.

journal_update_entry

Updates an existing journal entry.

journal_update_hypothesis

Edits a hypothesis in place.

journal_update_project

Renames a project or changes its description, icon or color.

journal_update_question

Updates a research question.

journal_update_question_note

Replaces the content of an existing note on a research question.

journal_update_study

Updates a study.

journal_update_tags

Sets the tags array on an existing article, replacing whatever tags are currently there.

journal_update_theme

Renames a research theme or changes its description, color, or icon.

Example flows

Illustrative — sample data, not real usage.

User asks Claude

Save this article I'm reading on interlanguage theory by Selinker.

Claude calls MCP tooljournal_add_article
{
  "title": "Interlanguage",
  "authors": [
    "Larry Selinker"
  ],
  "source": "IRAL — International Review of Applied Linguistics",
  "year": 1972,
  "tags": [
    "SLA",
    "interlanguage",
    "fossilization"
  ]
}
MCP server responds
{
  "id": "art_72sel",
  "title": "Interlanguage",
  "year": 1972,
  "tags": [
    "SLA",
    "interlanguage",
    "fossilization"
  ]
}
Claude replies

Saved Selinker's 1972 "Interlanguage" under SLA / interlanguage / fossilization. Want me to link it to your fossilization research question?

User asks Claude

Pull my excerpts about fossilization.

Claude calls MCP tooljournal_search
{
  "query": "fossilization"
}
MCP server responds
[
  {
    "article": "Interlanguage (Selinker, 1972)",
    "excerpt": "Fossilization refers to the persistent retention of linguistic items, rules, and subsystems..."
  },
  {
    "article": "Rethinking Fossilization (Han, 2004)",
    "excerpt": "Fossilization is best understood not as a binary state but as a continuum of stabilized variability..."
  }
]
Claude replies

Two excerpts — Selinker's 1972 definition and Han's 2004 reframe of it as a continuum. Want me to draft a synthesis paragraph that holds both?

The MCP server behind Loose Change — the place half-formed thoughts land so they don't die. Claude can capture a thought straight from the chat, walk the untriaged inbox with you, keep or discard entries, and mark the ones that graduated to another app.

Live app

Tools (14)

lc_capture_text

Capture a thought directly from a chat conversation, skipping the app entirely (captureMode: chat).

lc_discard

Soft-delete an entry (starts the 30-day undo window, not instant-gone).

lc_get_entry

Full entry: transcript, audio ref, timestamp, capture mode.

lc_get_stats

Untriaged count and keep/discard/promote breakdown.

lc_keep

Mark an entry kept.

lc_list_archive

Paginated, triaged entries, newest first — the same three views the app's Archive screen offers: kept (default), promoted (sent to another app), or discarded (still inside their 30-day undo window).

lc_list_inbox

Paginated, untriaged entries, newest first.

lc_mark_promoted

Flag an entry as sent elsewhere and record the destination.

lc_retry_transcription

Retry a voice memo whose transcription timed out (transcriptionStatus: timed_out).

lc_return_to_inbox

Move a kept, promoted or discarded entry back to the untriaged inbox, clearing its destination and triage time.

lc_revert_transcript

Restore an edited entry's transcript to the text as originally captured.

lc_search

Full-text search across entries by transcript content.

lc_undo_discard

Restore a discarded entry to the status it was discarded from — untriaged if it was discarded during triage, kept if it was deleted from the archive.

lc_update_transcript

Correct an entry's transcript (e.g. a misheard word).

Example flows

Illustrative — sample data, not real usage.

User asks Claude

Let's triage my Loose Change inbox.

Claude calls MCP toollc_list_inbox
{
  "limit": 3
}
MCP server responds
[
  {
    "id": "lc_41",
    "transcript": "what if the reading list could tell me what I abandoned",
    "captureMode": "voice"
  },
  {
    "id": "lc_40",
    "transcript": "buy printer ink",
    "captureMode": "chat"
  }
]
Claude replies

Two waiting. The reading-list one sounds like a Kindling spark; printer ink is a task. Want me to move each one where it belongs?

The MCP layer behind Folio — a document editor for long-form writing. It's a reading door, never a writing one: Claude can list and read documents, search across them, and see exactly what changed since it last looked, tracked per key so each assistant keeps its own place.

Live app

Tools (8)

folio_diff_since_last_visit

What changed in a document since YOU (this key) last looked — added / edited / deleted blocks, keyed to this key's own watermark and independent of the writer's and any other AI's.

folio_list_documents

List the Folio documents this key can read — the user's own plus any shared with them.

folio_list_folders

The user's folder tree, flat and sorted by path ("Classes / Psycholinguistics").

folio_mark_all_caught_up

Advance YOUR (this key's) watermark on every document you can read to now.

folio_mark_caught_up

Advance YOUR (this key's) watermark for a document to now — 'I've seen everything up to here.'

folio_read_document

Read the current content of one Folio document — its live blocks in order, each as markdown text with author attribution.

folio_search

Full-text search across every Folio document this key can read (own + shared).

folio_whats_new

One-call catch-up: every document this key can read that changed since YOU (this key) last looked at it, most recently changed first.

Example flows

Illustrative — sample data, not real usage.

User asks Claude

What did I change in my thesis draft since we last talked?

Claude calls MCP toolfolio_diff_since_last_visit
{
  "documentId": "doc_7c21"
}
MCP server responds
{
  "added": 4,
  "edited": 2,
  "deleted": 1,
  "preview": "## Methods — participants were recruited from…"
}
Claude replies

Four new blocks, two edits, and one deletion — mostly in Methods, where you started the participants section. Want me to read it through?

The MCP server for what no codebase or task tracker holds — dated facts about you, your people, and which Claude is which. Each fact records when it was established and how it's known, so stale context announces itself; relationships carry pronouns, affiliations, and nicknames Claude would otherwise guess at; and each Claude that connects is told which one it is.

Live app

Tools (11)

pctx_add_claude_identity

Register a Claude identity — who you are, where you live, and what you can access.

pctx_add_fact

Record a durable fact about the user — something measured, diagnosed, or established that isn't reconstructible from a codebase or a task tracker.

pctx_add_relationship

Add a person to the relationships — personal or professional, one array for both.

pctx_delete_claude_identity

Delete a Claude identity by name.

pctx_delete_fact

Delete a fact by label.

pctx_delete_relationship

Delete a relationship by name.

pctx_get_context

Retrieve the personal context: the user, registered Claude identities, dated facts, and relationships.

pctx_update_claude_identity

Update an existing Claude identity by name.

pctx_update_context

Update top-level fields of the personal context (user, claudeIdentities, facts, relationships).

pctx_update_fact

Update an existing fact by label.

pctx_update_relationship

Update an existing relationship by name.

Example flows

Illustrative — sample data, not real usage.

User asks Claude

Remember that I passed the B1 Spanish exam in June.

Claude calls MCP toolpctx_add_fact
{
  "label": "Spanish level",
  "category": "linguistic",
  "content": "Passed the B1 Spanish exam.",
  "established": "2026-06",
  "confidence": "measured"
}
MCP server responds
{
  "label": "Spanish level",
  "category": "linguistic",
  "established": "2026-06",
  "confidence": "measured"
}
Claude replies

Saved — B1 Spanish, dated June 2026 and marked as measured. Any Claude you talk to will see it, along with how old it is.

User asks Claude

Add Sam — they're my brother, lives in Boston.

Claude calls MCP toolpctx_add_relationship
{
  "name": "Sam",
  "role": "Brother",
  "context": "Lives in Boston."
}
MCP server responds
{
  "name": "Sam",
  "role": "Brother",
  "pronouns": null
}
Claude replies

Got it — Sam, your brother in Boston. I didn't record pronouns since you didn't mention them; want to add those?

The MCP server behind LibraLex — a personal library for what you own, borrow, and want to read. Claude can add books to the right shelf, track library loans and due dates, update reading status and ratings, and pass recommendations between friends.

Live app

Tools (16)

accept_recommendation

Accept a friend's recommendation from the inbox: puts the book on the user's wishlist (or owned shelf) and removes it from the inbox.

active_loans

Active library loans (not yet returned), soonest due first.

add_book

Add a book to a specific shelf by title — use this (not add_to_wishlist) when the user owns it, is reading it, has read it, or borrowed it from the library.

add_to_wishlist

Add a book to the user's wishlist by title (optionally with author to disambiguate).

currently_reading

The books the user is reading right now (readStatus = reading), most-recently-started first.

dismiss_recommendation

Dismiss a friend's recommendation without adding it (removes it from the inbox).

list_books

List the user's books, optionally filtered.

reading_stats

The user's reading stats: books read all-time and this year, pages read, currently-reading and to-read counts, average rating + rating distribution, and shelf totals (owned/wishlist/active loans).

recommend_books

Suggest what the user should read next.

recommendation_inbox

Books friends have recommended to the user, newest first — each with who sent it and any note.

renew_loan

Renew (extend) an active library loan, by title.

return_loan

Mark an active library loan as returned, by title.

search_books

Search the global book catalog (Google Books) by title/author/keyword — NOT the user's shelf.

send_recommendation

Recommend a book to one of the user's friends, identified by their name.

update_reading_status

Update a book the user already has on a shelf: mark it reading/read/unread, set a 1–5 star rating, and/or save a review.

wishlist

The user's wishlist — books they want but don't own yet, newest first.

Example flows

Illustrative — sample data, not real usage.

User asks Claude

Is anything due back at the library soon?

Claude calls MCP toolactive_loans
{}
MCP server responds
[
  {
    "title": "Piranesi",
    "dueDate": "2026-10-09",
    "dueInDays": 4,
    "overdue": false
  }
]
Claude replies

Just Piranesi, due Thursday — four days out. Want me to renew it?

The MCP server behind ScribeCat — a lecture recorder with transcripts and notes. Four read tools let Claude find a session by course or keyword and pull its full transcript, so studying starts from what was actually said in class.

Live app

Tools (4)

get_session

Get the full content of a ScribeCat session including its transcript and notes.

list_courses

List all course names the user has tagged their sessions with.

list_sessions

List the user's ScribeCat lecture sessions.

search_sessions

Search the user's sessions by keyword.

Example flows

Illustrative — sample data, not real usage.

User asks Claude

Find the lecture where we covered garden-path sentences.

Claude calls MCP toolsearch_sessions
{
  "query": "garden-path",
  "course": "LING 202"
}
MCP server responds
[
  {
    "id": "ses_19",
    "title": "Parsing and ambiguity",
    "date": "2026-09-24"
  }
]
Claude replies

That's "Parsing and ambiguity" from September 24. Want me to pull the transcript and quiz you on it?

The MCP layer behind Vertex — a knowledge graph of concepts, people, works, claims, and questions joined by typed edges (connects to, tension with, contradicts, evidenced by). Claude can add and link nodes, walk the graph outward from any idea, and render a neighborhood as a Mermaid diagram.

Live app

Tools (10)

vtx_edge_create

Connect two existing nodes with a directed, typed edge.

vtx_edge_delete

Remove an edge between two nodes.

vtx_graph_query

BFS traversal from a starting node outward to `depth` hops.

vtx_graph_render

Run a BFS traversal and return the result as a Mermaid `graph LR` diagram string.

vtx_node_archive

Soft-delete a node.

vtx_node_create

Create a new node in the Vertexism knowledge graph.

vtx_node_get

Fetch a single node plus all its edges (both directions).

vtx_node_search

Full-text search across node names and descriptions.

vtx_node_update

Update the name, description, or tags on an existing node.

vtx_orphans_list

Returns all nodes with no edges, sorted by days orphaned (most neglected first).

Example flows

Illustrative — sample data, not real usage.

User asks Claude

Draw me what's connected to "Sacred Edges".

Claude calls MCP toolvtx_graph_render
{
  "node_id": "Sacred Edges",
  "depth": 1
}
MCP server responds
"graph LR\n  sacred-edges -->|tension_with| liminality\n  sacred-edges -->|evidenced_by| turner-1969"
Claude replies

Two direct links: a tension with Liminality, and evidence from Turner (1969). Here's the diagram, ready to paste.

The MCP layer behind ChaosLimbă — an English-to-Romanian language learning platform built on second language acquisition theory. These tools expose the diagnostic and adaptation pipeline so Claude can audit content coverage, surface error patterns, track proficiency trends, and check that the curriculum is progressing the way the SLA framework expects.

Live app

Tools (20)

cl_get_schema

Returns a summary of all tables and their columns in the ChaosLimba database.

cl_get_grammar_map

Returns all entries from grammar_feature_map, optionally filtered by CEFR level.

cl_get_prerequisite_chain

For a given grammar feature, returns its full recursive prerequisite chain so you can audit whether the sequencing is pedagogically sound.

cl_get_content

Returns content items, optionally filtered by difficulty level, topic, or type.

cl_coverage_report

Cross-references grammar_feature_map against content_items.language_features to show which grammar features have content coverage and which are gaps.

cl_add_content

Inserts a new content item into the content_items table.

cl_get_error_patterns

Returns aggregated error patterns from error_logs across all users (anonymized).

cl_get_adaptation_summary

Returns a summary of fossilization interventions — which patterns are being escalated and whether they are resolving.

cl_get_reading_questions

Returns reading comprehension questions, optionally filtered by CEFR level.

cl_get_stress_pairs

Returns stress minimal pairs — words where stress placement changes meaning (e.g., CÁsă vs caSĂ).

cl_get_suggested_questions

Returns AI tutor conversation starter questions, optionally filtered by CEFR level or category.

cl_get_tutor_openings

Returns tutor opening messages keyed by self-assessment level.

cl_add_reading_question

Inserts a new reading comprehension question into the reading_questions table.

cl_get_session_summary

Returns aggregated session data — session counts by type, average duration, and content engagement.

cl_get_proficiency_trends

Returns proficiency score history over time — overall, listening, reading, speaking, writing scores by period.

cl_get_feature_exposure

Returns aggregated feature exposure data — how many times each grammar feature has been seen by learners, with correctness rates.

cl_get_mystery_items

Returns mystery vocabulary items — words learners encountered and flagged for exploration.

cl_get_generated_content_summary

Returns aggregated stats on AI-generated content — what types are being generated, for which error targets, listening rates, and estimated TTS costs.

cl_get_learning_narratives

Returns AI-generated learning narrative summaries — periodic reflections on learner progress with stats.

cl_get_tts_usage

Returns TTS (text-to-speech) usage stats — characters consumed per day.

Example flows

Illustrative — sample data, not real usage.

User asks Claude

Which grammar features still don't have any content?

Claude calls MCP toolcl_coverage_report
{}
MCP server responds
{
  "features_with_content": 41,
  "gaps": [
    "conditional_perfect",
    "vocative_case",
    "supine"
  ]
}
Claude replies

41 features have content; three don't yet — the conditional perfect, the vocative, and the supine. The vocative is the easiest gap to close with short dialogues. Want me to draft a few?

User asks Claude

Pull a few stress pairs for a pronunciation drill.

Claude calls MCP toolcl_get_stress_pairs
{
  "limit": 3
}
MCP server responds
[
  {
    "a": "CÓpii",
    "a_meaning": "copies",
    "b": "coPÍI",
    "b_meaning": "children"
  },
  {
    "a": "ÁCele",
    "a_meaning": "the needles",
    "b": "aCÉle",
    "b_meaning": "those"
  },
  {
    "a": "MÓdele",
    "a_meaning": "fashions",
    "b": "moDÉle",
    "b_meaning": "models"
  }
]
Claude replies

Three pairs where stress flips the meaning: copii (copies / children), acele (the needles / those), modele (fashions / models). I'll say a sentence, you tell me which one I meant?

The MCP server behind ChaosLingua Lite — a Latin drill app built around the Suburani curriculum. Claude tutors from the app's verified grammar tables and chapter vocabulary instead of recalling forms from memory, and logs each answer so weak spots show up across both the app and the chat.

Live app

Tools (6)

cll_get_progress

Returns the ChaosLingua Lite app owner's overall drill stats: attempted, correct, and current streak.

cll_get_weak_areas

Returns accuracy from this account's logged attempts, sorted worst-first — grouped by drill type, and further by declension + case where recorded (e.g. parse, 3rd declension, genitive).

cll_get_grammar_reference

Returns the ChaosLingua Lite app's Suburani noun grammar exactly as its Learn section shows it: model-noun paradigm tables for all five declensions (forms copied from the Suburani Reference Grammar), the uses of each case with the textbook's own examples, vocative/locative notes, the app's drill types, and the class schedule for when each declension and chapter opens.

cll_get_glossary

Returns the app's glossary of grammar terms (case, declension, number, gender, neuter nom = acc, ambiguous forms) with learner-friendly definitions matching the app's own Learn section.

cll_get_vocab

Returns the Suburani "Vocabulary for learning" lists by chapter, copied from the textbook.

cll_log_tutoring_attempt

Records the outcome of a question asked during a conversational tutoring session.

Example flows

Illustrative — sample data, not real usage.

User asks Claude

Quiz me on what I keep getting wrong.

Claude calls MCP toolcll_get_weak_areas
{}
MCP server responds
[
  {
    "drillType": "parse",
    "declension": 3,
    "case": "genitive",
    "accuracy": 0.52,
    "attempts": 23
  }
]
Claude replies

Third-declension genitives are your weak spot — about half right over 23 tries. Let's start there: what case is noctis?