Ferry
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| FERRY_HOME | No | Where decks are stored. Decks are stored in ~/.ferry/decks (set FERRY_HOME to change it). | ~/.ferry/decks |
| FERRY_PORT | No | The port for the viewer, which starts automatically at http://localhost:4747 (set FERRY_PORT to change it). | 4747 |
| FERRY_CHAT_MODEL | No | Set FERRY_CHAT_MODEL to pick a model (e.g. sonnet for faster replies) for the viewer chat agent. | |
| FERRY_CLAUDE_BIN | No | Set FERRY_CLAUDE_BIN if claude isn't on your PATH. |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| prompts | {
"listChanged": true
} |
| resources | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| authoring_guideA | Slide types, JSON shapes, and storytelling rules for explaining code changes. Read once before building a deck. |
| inspect_changesA | List changed files (status, churn) and their numbered changes (contiguous blocks of added/removed/re-indented lines) with previews. Change numbers match diff slides with a |
| create_deckA | Create an empty presentation deck. Returns its id and live viewer URL. Add content with add_slides. |
| add_slidesA | Append slides to a deck (or insert after a slide id). Returns the outline and any warnings (unmatched callouts, unknown ids). Changes appear live in an open viewer. See authoring_guide for slide types. |
| update_slideA | Replace one slide with a new definition (send the complete slide). Keeps its id and position. |
| remove_slidesC | Remove slides by id. |
| reorder_slidesC | Set the slide order. Ids you omit keep their relative order after the listed ones. |
| update_deckC | Change deck metadata or theme. |
| get_deckB | Return the deck outline and the authoring JSON of its slides (or one slide), e.g. to edit with update_slide. |
| list_decksA | List saved decks, newest first. |
| delete_deckA | Permanently delete a deck, its change plan and its viewer chat. Only do this when the user asks: it cannot be undone. |
| draft_deck_from_gitA | Create a skeleton deck from a git range: title with stats, a file map, and one stepped diff slide per significant file (one step per hunk). Then refine: add narration, callouts, behavior slides, and a review checklist with update_slide/add_slides. |
| open_deckB | Open the deck in the user's browser (live: later edits appear immediately). Returns the URL. |
| export_deckB | Write the deck as one self-contained HTML file (viewer, fonts, and code inlined) to share or attach to a PR. |
| wait_for_feedbackA | Wait until the user sends a change plan from the viewer's feedback panel (C key), then return it: code changes they want in the repository the deck explains, each with the slide, step and pinned element (often a code line) it was written on, plus the slide's authoring JSON. Returns at once if requests are already pending. The viewer shows the user that you are listening. Make the changes in the code (not the slides), resolve_feedback, then call this again to keep reviewing together. |
| get_feedbackA | Return the pending change plan left in the viewer (without waiting) and mark it as being worked on: code changes to make in the repository the deck explains. Use when the user says they left feedback. |
| resolve_feedbackB | Close change requests after making the code changes (or declining them). Each reply appears in the viewer next to the request. |
| reply_feedbackA | Post a message in the viewer chat without closing anything: ask a clarifying question about a request (by id), or say something about the whole deck (no id). The user answers in the viewer; wait_for_feedback returns their answer. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| explain_changes | Build a narrated Ferry presentation that explains a set of code changes. |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| guide |
TDQS
Scored across 18 tools
Each tool targets a distinct resource or action, from deck and slide CRUD to git inspection and viewer feedback. The only subtle overlap is between get_feedback and wait_for_feedback, but their descriptions clearly distinguish immediate retrieval from blocking wait, and resolve_feedback vs reply_feedback are similarly well separated.
All operational tools follow a consistent snake_case verb_noun pattern (e.g., create_deck, add_slides, update_slide, wait_for_feedback). The lone deviation is authoring_guide, which is a noun phrase rather than an action, but the overall convention is predictable.
18 tools is slightly above the ideal 3-15 range, but the server's domain is genuinely broad: deck lifecycle, slide editing, git diff import, viewer control, and feedback handling. Each tool earns its place, though a few could conceivably be consolidated.
The surface covers full CRUD for decks and slides, list/open/export operations, git change inspection and skeleton deck generation, plus a complete feedback loop (wait, get, resolve, reply). No obvious dead ends exist for the stated purpose of building and refining code-explanation decks.