> ## Documentation Index
> Fetch the complete documentation index at: https://fayneos.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Tool reference

> Every tool the Fayne MCP server offers your AI assistant: what it does, whether it changes anything, which access it needs, and its input.

This is the complete list of what a connected assistant can do in Fayne: 85 capabilities. You don't need it to use Fayne with an assistant; ask in your own words and the assistant finds the right tool. It's here so you can see exactly what an assistant is able to do, and for builders who want the details.

## How tools are organized

Your assistant sees a short list of tools directly: the course and lesson tools behind almost every request, plus a few that lead to everything else. The rest are found by what you ask for:

| Tool | What it does |
| - | - |
| `find_capabilities` | Searches everything Fayne can do by your words ("put the course on sale for \$49") or by area. |
| `describe_capability` | Shows one capability's exact input and how to run it. |
| `read_guide` | Reads a short guide for an area (courses, design, sell, people, insights, academies), plus writing standards and the About page blocks. |
| `query` | Runs a capability that only reads, including previews. |
| `act` | Runs a capability that changes something. |
| `confirm` | Carries out a previewed price, sale, invitation, reminder or access change after you agree. |

Each capability below is marked:

* **Reads only**: looks, changes nothing.
* **Changes your academy**: creates, edits, deletes or publishes. Learners may see some changes at once.
* **Preview, then confirm**: returns a preview of exactly what will happen. Nothing changes until your assistant calls `confirm` after you say yes.

The second label says whether every connection can use it (**Always available**) or only one you've given that area: **Analytics and people**, **Pricing and offers**, or **Members and messages**. See [Permissions](https://fayneos.com/docs/ai-assistants/permissions.md).

Two inputs appear on many tools and aren't repeated below. `academyId` picks the academy when your connection reaches more than one; it's optional when there's only one, or when a `courseId` already says which. `idempotencyKey` is an optional value on every change, so a request that timed out can be resent without doing the change twice.

## Courses and lessons

Courses, modules, lessons, publishing, drip, collections, the Explore Library, and images.

> [accordion] apply\_edits
>
> Changes your academy · Always available
>
> Insert, replace or delete lesson blocks atomically. Read the lesson first and supply its revision as expectedRevision. Every index refers to that one read snapshot, not shifted indices; afterIndex -1 inserts at the top. Blocks marked representable:false can be left intact or deleted, but not replaced with markdown. Returns fresh block indices. A conflict requires a fresh read before retrying.
>
> Listed directly in your assistant's tools.
>
> | Input | Type | Required | Notes |
> | - | - | - | - |
> | `courseId` | string | Yes | The course to operate on (from list\_courses). |
> | `lessonId` | string | Yes | The lesson to edit (from get\_course\_context). |
> | `expectedRevision` | integer | | The revision returned by read\_lesson; prevents overwriting changes made since that read. |
> | `edits` | object\[] | Yes | The edits to apply, all addressing the lesson as you last read it. |

> [accordion] create\_course
>
> Changes your academy · Always available
>
> Create a new course in an academy. It starts unpublished with a single blank 'Lesson 1' that you can fill in with apply\_edits or update\_lesson. Use this for a course that does not exist yet; create\_lesson adds lessons to an existing course. Returns the new course id and the academy it was created in.
>
> Listed directly in your assistant's tools.
>
> | Input | Type | Required | Notes |
> | - | - | - | - |
> | `title` | string | Yes | The course title shown to students. |

> [accordion] create\_lesson
>
> Changes your academy · Always available
>
> Create a NEW lesson in this course. It is appended to the end of the course. Use this when the owner wants to add a lesson that does not exist yet (e.g. 'add a lesson on X', 'build out the next module'). Provide a `title`, and optionally `markdown` for the starting body content in the documented format: if you omit it, the lesson starts empty for the owner to fill in. Pass `kind: "check"` to create a graded knowledge check (a lesson whose body is quiz blocks; it grades on submit and can gate later lessons). Pass `kind: "survey"` ONLY when the owner explicitly asks for a survey, questionnaire, feedback form, poll or pre/post assessment: never add one unprompted, and never turn a requested lesson into a survey. A survey's `markdown` must be survey question blocks (:::ratingQuestion, :::choiceQuestion, :::textQuestion) plus short intro prose, never quiz blocks; its settings go in `survey`. Returns the new lesson's id and block list. To put content into a lesson that already exists, use apply\_edits instead.
>
> Listed directly in your assistant's tools.
>
> | Input | Type | Required | Notes |
> | - | - | - | - |
> | `courseId` | string | Yes | The course to operate on (from list\_courses). |
> | `title` | string | Yes | The lesson title shown to students. |
> | `markdown` | string | | Optional starting body content in the documented markdown format. Omit for an empty lesson. Required for a survey. |
> | `kind` | "lesson" or "check" or "survey" | | Default 'lesson'. 'check' creates a graded knowledge check: fill its body with quiz blocks (multipleChoice, trueFalse, fillBlank, ordering, matching). 'survey' creates an ungraded survey: use it ONLY when the owner explicitly asks for a survey, questionnaire, feedback form, poll or pre/post assessment, never on your own initiative and never in place of a lesson they asked for. Fill a survey's body with ratingQuestion, choiceQuestion and textQuestion blocks. |
> | `survey` | object | | Survey settings. Only with kind 'survey'. |

> [accordion] create\_module
>
> Changes your academy · Always available
>
> Create an empty module at the end of the course. Returns the current structure, including any ungrouped lessons. Use set\_course\_structure to assign lessons to modules.
>
> Listed directly in your assistant's tools.
>
> | Input | Type | Required | Notes |
> | - | - | - | - |
> | `courseId` | string | Yes | The course to operate on (from list\_courses). |
> | `title` | string | Yes | Module title, e.g. 'Getting Started'. |

> [accordion] delete\_lesson
>
> Changes your academy · Always available
>
> Delete a lesson from this course. ONLY use this when the owner explicitly asks to remove a specific lesson. Never delete a lesson as a side effect of another edit, and if you're unsure which lesson they mean, ask before deleting. The deletion is reversible by the team but disappears from the course immediately. Returns confirmation.
>
> Listed directly in your assistant's tools.
>
> | Input | Type | Required | Notes |
> | - | - | - | - |
> | `courseId` | string | Yes | The course to operate on (from list\_courses). |
> | `lessonId` | string | Yes | The id of the lesson to delete (from get\_course\_context). |

> [accordion] delete\_module
>
> Changes your academy · Always available
>
> Delete a module when requested. Its lessons remain: they merge into the preceding module, or the following module when deleting the first. Deleting the only module leaves a flat course. Returns the resulting structure.
>
> Listed directly in your assistant's tools.
>
> | Input | Type | Required | Notes |
> | - | - | - | - |
> | `courseId` | string | Yes | The course to operate on (from list\_courses). |
> | `moduleId` | string | Yes | The module id (from get\_course\_context). |

> [accordion] get\_course\_context
>
> Reads only · Always available
>
> Orient yourself in a course in one call: returns the course outline: every lesson's id, title, position, word count, published state, and the `moduleId` it belongs to: the course's `modules` (chapters grouping the lessons, in display order; empty array = unsectioned course), AND the lesson markdown format reference (every supported `:::` block and what it's for). Always call this before writing or editing so you use real directives instead of guessing. Use list\_courses first to find the right courseId.
>
> Listed directly in your assistant's tools.
>
> | Input | Type | Required | Notes |
> | - | - | - | - |
> | `courseId` | string | Yes | The course to operate on (from list\_courses). |

> [accordion] get\_lesson\_markdown\_reference
>
> Reads only · Always available
>
> Return the full reference for Fayne's lesson markdown: every supported `:::` block, what each is for, and its attributes. Call this before writing or editing lesson content so you use real directives instead of guessing: an unknown directive is rejected and nothing is saved.
>
> Listed directly in your assistant's tools.
>
> No input of its own.

> [accordion] list\_courses
>
> Reads only · Always available
>
> List the courses in an academy: id, title, lesson count, published state and the academy each belongs to. Pass academyId for one academy; omit it to list every academy this connection reaches. Call this first to find the courseId the other tools need.
>
> Listed directly in your assistant's tools.
>
> No input of its own.

> [accordion] read\_course\_lesson
>
> Reads only · Always available
>
> Read a lesson in the same academy as reference markdown using a lessonId from search\_courses. Long output is truncated and marked. This tool does not edit the source lesson.
>
> Listed directly in your assistant's tools.
>
> | Input | Type | Required | Notes |
> | - | - | - | - |
> | `courseId` | string | Yes | The course to operate on (from list\_courses). |
> | `lessonId` | string | Yes | The lesson to read (from search\_courses). |

> [accordion] read\_lesson
>
> Reads only · Always available
>
> Read a single lesson (by id) as an ordered list of blocks. Read a lesson before editing it. Each block has a 0-based `index` (used to target edits), its `type`, and its `markdown`. `representable: false` means that block can't be expressed in markdown (e.g. a custom interactive block): you can insert around it or delete it, but don't try to replace it with markdown. `markdownEditable` reports whether the whole lesson is safe for a full `update_lesson` rewrite.
>
> Listed directly in your assistant's tools.
>
> | Input | Type | Required | Notes |
> | - | - | - | - |
> | `courseId` | string | Yes | The course to operate on (from list\_courses). |
> | `lessonId` | string | Yes | The id of the lesson to read (from get\_course\_context). |

> [accordion] read\_source
>
> Reads only · Always available
>
> Read an authoring-enabled knowledge source in the course's academy by sourceId from search\_knowledge. Returns its title and text, capped at 12,000 characters with a truncation notice.
>
> Listed directly in your assistant's tools.
>
> | Input | Type | Required | Notes |
> | - | - | - | - |
> | `courseId` | string | Yes | The course to operate on (from list\_courses). |
> | `sourceId` | string | Yes | The source to read (from search\_knowledge). |

> [accordion] rename\_module
>
> Changes your academy · Always available
>
> Replace a module's title. Lesson content and ordering are unchanged.
>
> Listed directly in your assistant's tools.
>
> | Input | Type | Required | Notes |
> | - | - | - | - |
> | `courseId` | string | Yes | The course to operate on (from list\_courses). |
> | `moduleId` | string | Yes | The module id (from get\_course\_context). |
> | `title` | string | Yes | The new module title. |

> [accordion] search\_courses
>
> Reads only · Always available
>
> Search lesson titles and content in the academy's other courses, excluding courseId. Returns up to 12 matches with course and lesson identifiers, titles and short snippets.
>
> Listed directly in your assistant's tools.
>
> | Input | Type | Required | Notes |
> | - | - | - | - |
> | `courseId` | string | Yes | The course to operate on (from list\_courses). |
> | `query` | string | Yes | Text to search for across the academy's other courses. |

> [accordion] search\_knowledge
>
> Reads only · Always available
>
> Search authoring-enabled knowledge sources in the course's academy for relevant reference material. Returns up to five source identifiers, titles and snippets; read\_source retrieves their text.
>
> Listed directly in your assistant's tools.
>
> | Input | Type | Required | Notes |
> | - | - | - | - |
> | `courseId` | string | Yes | The course to operate on (from list\_courses). |
> | `query` | string | Yes | Search terms, e.g. 'discovery call framework'. |

> [accordion] search\_lessons
>
> Reads only · Always available
>
> Find lessons in this course whose title or body text contains the given query (case-insensitive), including text inside blocks such as quiz questions and practice-block prompts, titles and lines. Use this to locate the right lesson when the owner refers to a topic or a block rather than a position.
>
> Listed directly in your assistant's tools.
>
> | Input | Type | Required | Notes |
> | - | - | - | - |
> | `courseId` | string | Yes | The course to operate on (from list\_courses). |
> | `query` | string | Yes | Text to search for across lesson titles and bodies. |

> [accordion] set\_course\_structure
>
> Changes your academy · Always available
>
> Reorder modules and assign lessons for the whole course. Include every module and every lesson exactly once. Invalid or incomplete arrangements are rejected. This changes the live course order, including drip unlock order and knowledge-check gating; use only for requested restructuring.
>
> Listed directly in your assistant's tools.
>
> | Input | Type | Required | Notes |
> | - | - | - | - |
> | `courseId` | string | Yes | The course to operate on (from list\_courses). |
> | `modules` | object\[] | Yes | Every module in the desired display order, each with its lessons in the desired order. Together they must cover every lesson in the course. |

> [accordion] update\_lesson
>
> Changes your academy · Always available
>
> Replace a whole lesson body with documented lesson markdown. Requires a markdownEditable lesson; pass the revision from read\_lesson as expectedRevision. Prefer apply\_edits for smaller changes. Saves the draft without publishing it.
>
> Listed directly in your assistant's tools.
>
> | Input | Type | Required | Notes |
> | - | - | - | - |
> | `courseId` | string | Yes | The course to operate on (from list\_courses). |
> | `lessonId` | string | Yes | The lesson to edit (from get\_course\_context). |
> | `expectedRevision` | integer | | The revision returned by read\_lesson; prevents overwriting changes made since that read. |
> | `markdown` | string | Yes | The complete new lesson body in the documented markdown format. |

> [accordion] add\_library\_course
>
> Changes your academy · Always available
>
> Add an Explore Library course to an academy as its own editable copy (a draft unless publish is true and the plan allows another published course). Adding a course the academy already has returns the existing copy. Counts against the academy's course limit.
>
> Runs through `act` (found with `find_capabilities`).
>
> | Input | Type | Required | Notes |
> | - | - | - | - |
> | `masterCourseId` | string | Yes | From search\_library. |
> | `publish` | boolean | | Publish it right away. Default `false`. |

> [accordion] complete\_upload
>
> Changes your academy · Always available
>
> Finish a direct upload after your PUT to create\_upload\_link's directUpload.url returned 200: checks the file (type from its bytes, size, no scripts in SVGs), copies it onto the academy's CDN and returns the same result as get\_upload. Safe to call again. Changes nothing visible in the academy by itself.
>
> Runs through `act` (found with `find_capabilities`).
>
> | Input | Type | Required | Notes |
> | - | - | - | - |
> | `uploadId` | string | Yes | The uploadId from create\_upload\_link. |
> | `alt` | string | | For content images: what the image shows, put into the returned :::image block. |

> [accordion] create\_upload\_link
>
> Changes your academy · Always available
>
> Get an image the owner has on their computer, or attached in a chat that can't pass files to tools, into the academy. Returns uploadPageUrl: give it to the owner to open and drop the image on (one image, works 30 minutes, no sign-in), then call get\_upload(uploadId) once they say it's done. If you can run shell commands and have the file yourself, pass contentType and size (exact bytes): directUpload is a presigned PUT; send the raw bytes with exactly directUpload.headers (e.g. curl -X PUT --data-binary @file -H 'Content-Type: application/octet-stream' '\<url>'; the size must match exactly), then call complete\_upload(uploadId). purpose: content for lessons and the About page, or the branding slot it will fill (logo, logoDark, favicon, cover, socialImage, certificateSignature). Images with a public link don't need this: use import\_image or set\_branding\_image with the link.
>
> Runs through `act` (found with `find_capabilities`).
>
> | Input | Type | Required | Notes |
> | - | - | - | - |
> | `purpose` | "content" or "logo" or "logoDark" or "favicon" or "cover" or "socialImage" or "certificateSignature" | | What the image is for: content (lessons, About page) or the branding slot it will fill. Default `"content"`. |
> | `contentType` | string | | Only for a direct upload from a shell: the file's type (image/png, image/jpeg, image/webp, image/gif, image/svg+xml). |
> | `size` | integer | | Only for a direct upload: the file's exact size in bytes. |
> | `fileName` | string | | Only for a direct upload: the file's name, for reference. |

> [accordion] delete\_collection
>
> Changes your academy · Always available
>
> Delete a catalog collection. Its courses move to the uncategorized section. Offers that sold the collection keep giving access: they list its courses individually instead. Only call it when the owner asked.
>
> Runs through `act` (found with `find_capabilities`).
>
> | Input | Type | Required | Notes |
> | - | - | - | - |
> | `collectionId` | string | Yes | From list\_collections. |

> [accordion] delete\_course
>
> Changes your academy · Always available
>
> Delete a course. Learners lose it from the catalog and course pages at once. It's a soft delete: Fayne support can restore it, but there is no undo tool. Only call it when the owner asked to delete this course by name.
>
> Runs through `act` (found with `find_capabilities`).
>
> | Input | Type | Required | Notes |
> | - | - | - | - |
> | `courseId` | string | Yes | The course to operate on (from list\_courses). |

> [accordion] duplicate\_course
>
> Changes your academy · Always available
>
> Copy a course (lessons, modules, settings) as a new unpublished course, in the same academy or in another academy this connection reaches (targetAcademyId). Both academies must belong to the same owner. Counts against the destination's course limit.
>
> Runs through `act` (found with `find_capabilities`).
>
> | Input | Type | Required | Notes |
> | - | - | - | - |
> | `courseId` | string | Yes | The course to operate on (from list\_courses). |
> | `targetAcademyId` | string | | Copy into this academy (from list\_academies). Omit for the same academy. |

> [accordion] get\_course\_settings
>
> Reads only · Always available
>
> A course's settings and publish state: title, slug, published or not, the learner URL, short description, "What you'll learn" points, catalog collection, drip schedule, and which lessons have changes that aren't live yet. Call it before publishing so you can tell the owner what will go live.
>
> Runs through `query` (found with `find_capabilities`).
>
> | Input | Type | Required | Notes |
> | - | - | - | - |
> | `courseId` | string | Yes | The course to operate on (from list\_courses). |

> [accordion] get\_upload
>
> Reads only · Always available
>
> Check an upload made with create\_upload\_link: waiting (nothing yet), uploading, ready (imageUrl is on the academy's CDN; for content, markdown is a ready :::image block), failed (problem says why; the owner can try another file on the same page) or expired. Read-only. After a direct PUT of your own, call complete\_upload instead.
>
> Runs through `query` (found with `find_capabilities`).
>
> | Input | Type | Required | Notes |
> | - | - | - | - |
> | `uploadId` | string | Yes | The uploadId from create\_upload\_link. |
> | `alt` | string | | For content images: what the image shows, put into the returned :::image block. |

> [accordion] import\_image
>
> Changes your academy · Always available
>
> Copy an image onto the academy's CDN and get back a URL and a ready :::image block for lessons or the About page. Use it for every image you put into content (a link to another site can break or be blocked). Pass url, a direct public link to the file (no sign-in). In ChatGPT, an image the owner attached to the chat comes through act's file field instead. An image only on the owner's computer: create\_upload\_link. PNG, JPEG, WebP, GIF or SVG up to 10MB. Changes nothing visible by itself: paste the returned markdown into apply\_edits / update\_lesson / create\_lesson / edit\_about\_page. For the logo, favicon or cover use set\_branding\_image instead.
>
> Runs through `act` (found with `find_capabilities`).
>
> | Input | Type | Required | Notes |
> | - | - | - | - |
> | `url` | string | | A direct, public link to the image file. |
> | `file` | object | | Set by ChatGPT from an attached image (act's file field). Don't fill it yourself. |
> | `alt` | string | | What the image shows, for screen readers and when it can't load. Describe it; don't start with "image of". |

> [accordion] list\_collections
>
> Reads only · Always available
>
> The academy's catalog collections (sections of the course catalog) in display order, with the courses in each, plus courses in no collection. Collections are grouping only: pricing and access live on offers.
>
> Runs through `query` (found with `find_capabilities`).
>
> No input of its own.

> [accordion] publish\_lesson\_changes
>
> Changes your academy · Always available
>
> Make lesson drafts live: copies each lesson's draft to the version learners see, and publishes the course page. Omit lessonIds to publish every lesson with pending changes (see get\_course\_settings). Refused when a lesson changed since you read it (pass expectedRevisions from read\_lesson), when a lesson's content can't be published, or over the plan's lesson limit. Tell the owner what will go live before calling it.
>
> Runs through `act` (found with `find_capabilities`).
>
> | Input | Type | Required | Notes |
> | - | - | - | - |
> | `courseId` | string | Yes | The course to operate on (from list\_courses). |
> | `lessonIds` | string\[] | | Lessons to publish. Omit for every lesson with pending changes. |
> | `expectedRevisions` | object | | lessonId → the revision you last read; a lesson edited since is refused. |

> [accordion] save\_collection
>
> Changes your academy · Always available
>
> Create a catalog collection (omit collectionId) or update one (name, description, layout). layout: grid shows course cards, slider a horizontal row. Use set\_course\_collection to put courses in it.
>
> Runs through `act` (found with `find_capabilities`).
>
> | Input | Type | Required | Notes |
> | - | - | - | - |
> | `collectionId` | string | | The collection to update (from list\_collections). Omit to create one. |
> | `name` | string | | Required when creating. |
> | `description` | string or null | | Optional text shown under the collection title in the catalog, up to 280 characters. null clears it. |
> | `layout` | "grid" or "slider" | | grid shows course cards, slider a horizontal row. New collections default to grid. |

> [accordion] search\_library
>
> Reads only · Always available
>
> Search Fayne's Explore Library: ready-made courses an owner can add to their academy as an editable copy. Returns each course's masterCourseId, description, level, topics and size, and whether this academy already has it. Use add\_library\_course to add one.
>
> Runs through `query` (found with `find_capabilities`).
>
> | Input | Type | Required | Notes |
> | - | - | - | - |
> | `query` | string | | Words to search for. Omit to browse. |
> | `page` | integer | | Which page of results, starting at 1. Default `1`. |
> | `pageSize` | integer | | Courses per page, 1 to 25. Default `10`. |

> [accordion] set\_course\_collection
>
> Changes your academy · Always available
>
> Put a course into a catalog collection, or take it out (collectionId: null). A course is in at most one collection. Leaving a collection never removes access that an offer sold.
>
> Runs through `act` (found with `find_capabilities`).
>
> | Input | Type | Required | Notes |
> | - | - | - | - |
> | `courseId` | string | Yes | The course to operate on (from list\_courses). |
> | `collectionId` | string or null | Yes | From list\_collections, or null for none. |

> [accordion] set\_course\_drip
>
> Changes your academy · Always available
>
> Set how a course's lessons unlock over time, or turn drip off (drip: null). completion: the next lesson unlocks intervalHours after the previous one is completed. calendar: lesson N unlocks N×intervalHours after enrollment. emails.onUnlock emails learners when a lesson unlocks; emails.reengagement nudges quiet learners after afterDays. Takes effect for every learner on their next visit.
>
> Runs through `act` (found with `find_capabilities`).
>
> | Input | Type | Required | Notes |
> | - | - | - | - |
> | `courseId` | string | Yes | The course to operate on (from list\_courses). |
> | `drip` | object or null | Yes | The schedule, or null to turn drip off. |

> [accordion] set\_course\_published
>
> Changes your academy · Always available
>
> Publish a course (learners can see it, subject to its pricing and access) or unpublish it (it disappears from the catalog; nobody loses progress). Publishing counts against the plan's published-course limit. This publishes the course, not lesson drafts: use publish\_lesson\_changes for those.
>
> Runs through `act` (found with `find_capabilities`).
>
> | Input | Type | Required | Notes |
> | - | - | - | - |
> | `courseId` | string | Yes | The course to operate on (from list\_courses). |
> | `isPublished` | boolean | Yes | true to publish, false to unpublish. |

> [accordion] update\_course\_info
>
> Changes your academy · Always available
>
> Change a course's title, its short description (the catalog card text), and its "What you'll learn" points. Only the fields you pass change. The title and short description save as drafts and go live with publish\_lesson\_changes; the learning points go live at once. learningOutcomes: null resets them to the lesson titles, \[] shows none.
>
> Runs through `act` (found with `find_capabilities`).
>
> | Input | Type | Required | Notes |
> | - | - | - | - |
> | `courseId` | string | Yes | The course to operate on (from list\_courses). |
> | `title` | string | | The new course title, up to 200 characters. |
> | `descriptionShort` | string | | The catalog card text, up to 500 characters. |
> | `learningOutcomes` | string\[] or null | | The "What you'll learn" points, at most 20 of up to 300 characters each. null resets them to the lesson titles; \[] shows none. |

## Look and feel

Branding, images, the About page, sidebar links and welcome questions.

> [accordion] edit\_about\_page
>
> Changes your academy · Always available
>
> Change the About page draft: insert, replace, remove or move blocks, written as markdown. One insert may carry many blocks separated by blank lines; to write the page from scratch send one insert with the whole page. Ops apply top to bottom against the blocks as last read. Saves the draft only: publish\_about\_page makes it live. Read get\_about\_page first.
>
> Runs through `act` (found with `find_capabilities`).
>
> | Input | Type | Required | Notes |
> | - | - | - | - |
> | `ops` | object\[] | Yes | 1 to 20 ops: insert (afterIndex, -1 for the top, plus markdown), replace (index, markdown), remove (index) or move (index, toIndex). They run in order, each on the page as the previous op left it, so later indices shift. If one fails, none apply. |

> [accordion] get\_about\_page
>
> Reads only · Always available
>
> Read the academy's About page (the landing page visitors see first) as an ordered list of blocks, each with its index, type and markdown, plus whether it's live and whether there's an unpublished draft. Returns the page's block guide too. Read it before edit\_about\_page.
>
> Runs through `query` (found with `find_capabilities`).
>
> No input of its own.

> [accordion] get\_branding
>
> Reads only · Always available
>
> The academy's look: primary color, tagline, theme (light/dark/auto/system), catalog hero style and text, what learners are called, logo and favicon URLs, and certificate design. previewUrl opens the live academy.
>
> Runs through `query` (found with `find_capabilities`).
>
> No input of its own.

> [accordion] get\_nav\_links
>
> Reads only · Always available
>
> The custom links in the learner sidebar (to the owner's website, community, booking page), in order.
>
> Runs through `query` (found with `find_capabilities`).
>
> No input of its own.

> [accordion] get\_welcome\_questions
>
> Reads only · Always available
>
> The questions new members answer when they join (what they want, their level), whether the step is on, and its intro and closing text. Their answers show up per member in get\_person.
>
> Runs through `query` (found with `find_capabilities`).
>
> No input of its own.

> [accordion] publish\_about\_page
>
> Changes your academy · Always available
>
> Publish the About page draft so visitors see it. A draft with no content removes the About page from the academy. Tell the owner what will change first.
>
> Runs through `act` (found with `find_capabilities`).
>
> No input of its own.

> [accordion] set\_branding\_image
>
> Changes your academy · Always available
>
> Set one of the academy's images from a public link: logo = the logo (shown in the header; on light backgrounds when a dark logo is also set); logoDark = the logo for dark backgrounds; favicon = the browser-tab icon (square, 512px or smaller is plenty); cover = the cover image on the About page and learner profiles; socialImage = the preview image when a link to the academy is shared (1200x630 works best); certificateSignature = the signature on certificates (a transparent PNG works best). The file is copied onto the academy's CDN (PNG, JPEG, WebP or SVG; logos, favicons and signatures up to 2MB, covers up to 8MB), so the link only has to work once. Pass url null to remove the image. In ChatGPT, an image the owner attached to the chat comes through act's file field instead of url. An image only on the owner's computer: create\_upload\_link with this purpose, then pass its imageUrl here. Live for learners at once; give the owner previewUrl to check.
>
> Runs through `act` (found with `find_capabilities`).
>
> | Input | Type | Required | Notes |
> | - | - | - | - |
> | `image` | "logo" or "logoDark" or "favicon" or "cover" or "socialImage" or "certificateSignature" | Yes | Which image to set. |
> | `url` | string or null | | A direct link to the image file (opens as just the image in a browser), or null to remove it. |
> | `file` | object | | Set by ChatGPT from an attached image (act's file field). Don't fill it yourself. |

> [accordion] set\_nav\_links
>
> Changes your academy · Always available
>
> Replace the learner sidebar's custom links with this list, in order (at most 10). Keep an existing link by passing its id; links left out are removed. URLs must be https. icon is a Lucide name like "icon:Calendar" or an emoji, or null. Read get\_nav\_links first so you don't drop links the owner wants.
>
> Runs through `act` (found with `find_capabilities`).
>
> | Input | Type | Required | Notes |
> | - | - | - | - |
> | `links` | object\[] | Yes | The full list in display order, at most 10. Each link: id (an existing link's id from get\_nav\_links, or null for a new one), label (up to 40 characters), url (https only) and icon (a Lucide name like "icon:Calendar", an emoji, or null). |

> [accordion] set\_welcome\_questions
>
> Changes your academy · Always available
>
> Change the join questions. settings turns the step on or off and sets its intro and closing text. questions replaces the whole list, in order (at most 4): keep a question by passing its id (its answers stay attached), omit id for a new one; questions left out stop being asked, and their past answers stay readable. single and multi questions need 2 to 6 options with unique ids. Read get\_welcome\_questions first.
>
> Runs through `act` (found with `find_capabilities`).
>
> | Input | Type | Required | Notes |
> | - | - | - | - |
> | `settings` | object | | Pass all three fields: enabled turns the join questions on or off, intro (up to 240 characters) and closing (up to 160) set the step's text. |
> | `questions` | object\[] | | The whole question list in order, at most 4. Each question: id (from get\_welcome\_questions to keep it, omit for a new one), kind (single, multi or text), prompt, optional placeholder, and options (2 to 6 with unique ids for single and multi). |

> [accordion] update\_branding
>
> Changes your academy · Always available
>
> Change the academy's look. Only the fields you pass change; the rest stay as they are. Changes are live for learners at once, so describe them to the owner first and give them previewUrl to check. Images (logo, favicon, cover, social image, certificate signature) go through set\_branding\_image.
>
> Runs through `act` (found with `find_capabilities`).
>
> | Input | Type | Required | Notes |
> | - | - | - | - |
> | `primaryColor` | string | | Buttons, links and accents. |
> | `tagline` | string or null | | One line under the academy name; null clears it. Trimmed to 160 characters. |
> | `theme` | "auto" or "light" or "dark" or "system" | | auto follows the logo, system follows the learner's device. |
> | `heroTemplate` | "full" or "floating" | | Catalog hero style. |
> | `headline` | string or null | | Catalog hero headline; null clears it. |
> | `description` | string or null | | Catalog hero text; null clears it. |
> | `learnerNoun` | "member" or "student" or "client" or "participant" or "learner" | | What the academy calls its audience in learner-facing copy. |
> | `certificate` | object | | Certificate design; only the given fields change. |

## Pricing and offers

Course prices, offers, bundles, the Academy Pass and coupons. Every price change or sale is previewed first.

> [accordion] create\_coupon
>
> Changes your academy · Needs Pricing and offers
>
> Create a coupon code buyers can enter at checkout: a percent off (1–100) or an amount off (cents), once or for every renewal of a subscription (duration forever), with an optional use limit and expiry. Needs payments set up. A coupon works for anyone who has the code, and it's live at once: 100% off with no use limit gives the product away. Confirm the code and discount with the owner first.
>
> Runs through `act` (found with `find_capabilities`).
>
> | Input | Type | Required | Notes |
> | - | - | - | - |
> | `code` | string | Yes | 3–32 letters, numbers, dashes or underscores; uppercased. |
> | `discountType` | "percent" or "amount" | Yes | percent takes a percentage off; amount takes a fixed sum off, in cents of the academy's currency. |
> | `discountValue` | integer | Yes | Percent (1–100) or cents. |
> | `duration` | "once" or "forever" | | For subscriptions: once discounts the first payment only, forever discounts every renewal. Default `"once"`. |
> | `maxRedemptions` | integer or null | | How many times the code can be used in total. Omit or null for no limit. |
> | `expiresAt` | string or null | | When the code stops working: an ISO 8601 date-time with a timezone offset, in the future. Omit or null for no expiry. |

> [accordion] create\_offer
>
> Changes your academy · Needs Pricing and offers
>
> Create a bundle (several courses or collections) or the Academy Pass (includes: \[\{ kind: all }]), with its price options. It's created OFF SALE so nothing is sold by accident: show the owner, then prepare\_set\_offer\_on\_sale. A paid offer needs payments set up (get\_payments\_setup). For one course's own price use the course pricing tools instead.
>
> Runs through `act` (found with `find_capabilities`).
>
> | Input | Type | Required | Notes |
> | - | - | - | - |
> | `name` | string | Yes | The offer's name buyers see, up to 80 characters. |
> | `headline` | string or null | | A short line shown with the name, up to 160 characters. |
> | `includes` | object\[] | Yes | \{ kind: course, courseId } / \{ kind: collection, collectionId } / \{ kind: all } (all can't be combined) |
> | `plans` | object\[] | | Price options; omit or \[] for a free offer. priceCents in the academy's currency. |
> | `showInStore` | boolean | | List it in the store once it's on sale (default true). |

> [accordion] get\_course\_pricing
>
> Reads only · Needs Pricing and offers
>
> A course's own pricing: free, paid at a price, or members only (not sold on its own, reached through a bundle, the Pass or a grant), plus every offer that includes it and whether payments are ready.
>
> Runs through `query` (found with `find_capabilities`).
>
> | Input | Type | Required | Notes |
> | - | - | - | - |
> | `courseId` | string | Yes | The course to operate on (from list\_courses). |

> [accordion] get\_offer
>
> Reads only · Needs Pricing and offers
>
> One offer in full: details, every price option, what it includes, whether it's on sale, holders and link.
>
> Runs through `query` (found with `find_capabilities`).
>
> | Input | Type | Required | Notes |
> | - | - | - | - |
> | `offerId` | string | Yes | From list\_offers. |

> [accordion] get\_payments\_setup
>
> Reads only · Needs Pricing and offers
>
> Whether the academy can take payments: Stripe connected, able to charge, what Stripe still needs, and the selling currency. Connecting Stripe and finishing its identity checks happen in the app (Stripe hosts them): send the owner to settingsPath.
>
> Runs through `query` (found with `find_capabilities`).
>
> No input of its own.

> [accordion] list\_coupons
>
> Reads only · Needs Pricing and offers
>
> The academy's coupon codes: discount, how long it applies to subscriptions, limits, expiry, whether it's active, and how often it was used.
>
> Runs through `query` (found with `find_capabilities`).
>
> No input of its own.

> [accordion] list\_offers
>
> Reads only · Needs Pricing and offers
>
> Every offer in the academy: bundles, the Academy Pass, and each course's own price (isCoursePrice; change those with the course pricing tools). Shows price, whether it's on sale and listed in the store, how many people hold it, and its public link.
>
> Runs through `query` (found with `find_capabilities`).
>
> No input of its own.

> [accordion] prepare\_set\_course\_pricing
>
> Preview, then confirm · Needs Pricing and offers
>
> Preview changing a course's own pricing to free, paid at a price (cents, in the academy's currency), or members only. Shows what changes for current learners and buyers. Changes nothing: returns a preview and an intentId. Show the preview to the owner in plain words, and only after they approve call confirm with the intentId. It expires in 10 minutes.
>
> Runs through `query`. Changes nothing: it returns a preview and an `intentId`, and `confirm` carries it out after you agree.
>
> | Input | Type | Required | Notes |
> | - | - | - | - |
> | `courseId` | string | Yes | The course to operate on (from list\_courses). |
> | `pricing` | object | Yes | free, \{ kind: paid, priceCents }, or members\_only |

> [accordion] prepare\_set\_offer\_courses
>
> Preview, then confirm · Needs Pricing and offers
>
> Preview replacing what an offer includes: courses, collections, or everything (the Academy Pass). Removing something takes it away from everyone who holds the offer (unless they have it another way); the preview says what's added, what's removed and how many holders there are. Changes nothing: returns a preview and an intentId. Show the preview to the owner in plain words, and only after they approve call confirm with the intentId. It expires in 10 minutes.
>
> Runs through `query`. Changes nothing: it returns a preview and an `intentId`, and `confirm` carries it out after you agree.
>
> | Input | Type | Required | Notes |
> | - | - | - | - |
> | `offerId` | string | Yes | The offerId from list\_offers. |
> | `includes` | object\[] | Yes | The full new list, replacing what the offer includes: \{ kind: course, courseId } (from list\_courses), \{ kind: collection, collectionId } (from list\_collections), or \{ kind: all } for every course, which can't be combined with others. |

> [accordion] prepare\_set\_offer\_on\_sale
>
> Preview, then confirm · Needs Pricing and offers
>
> Preview putting an offer on sale (people can buy or claim it on course pages, its /o/ link and the store) or taking it off sale (no new purchases; everyone who has it keeps it). Changes nothing: returns a preview and an intentId. Show the preview to the owner in plain words, and only after they approve call confirm with the intentId. It expires in 10 minutes.
>
> Runs through `query`. Changes nothing: it returns a preview and an `intentId`, and `confirm` carries it out after you agree.
>
> | Input | Type | Required | Notes |
> | - | - | - | - |
> | `offerId` | string | Yes | The offerId from list\_offers. |
> | `onSale` | boolean | Yes | true puts the offer on sale; false takes it off sale, and everyone who has it keeps it. |

> [accordion] prepare\_set\_offer\_prices
>
> Preview, then confirm · Needs Pricing and offers
>
> Preview replacing an offer's price options (one-time, monthly, yearly; at most one of each). Keep an option by passing its planId unchanged. \[] makes the offer free. People already subscribed keep paying their current price until they cancel; the preview says how many. Changes nothing: returns a preview and an intentId. Show the preview to the owner in plain words, and only after they approve call confirm with the intentId. It expires in 10 minutes.
>
> Runs through `query`. Changes nothing: it returns a preview and an `intentId`, and `confirm` carries it out after you agree.
>
> | Input | Type | Required | Notes |
> | - | - | - | - |
> | `offerId` | string | Yes | The offerId from list\_offers. |
> | `plans` | object\[] | Yes | The full new set of price options. Each: billingShape (one\_time or recurring), priceCents in the academy's currency, interval (month or year, required for recurring), and id (a planId from get\_offer) to keep an existing option. \[] makes the offer free. |

> [accordion] set\_coupon\_active
>
> Changes your academy · Needs Pricing and offers
>
> Pause a coupon (the code stops working at checkout) or resume it. Expired coupons can't be resumed.
>
> Runs through `act` (found with `find_capabilities`).
>
> | Input | Type | Required | Notes |
> | - | - | - | - |
> | `couponId` | string | Yes | From list\_coupons. |
> | `isActive` | boolean | Yes | false pauses the code; true resumes it. |

> [accordion] update\_offer
>
> Changes your academy · Needs Pricing and offers
>
> Change an offer's name, headline, description, buy-button text, public link slug, or whether it's listed in the store. Prices, what it includes and whether it's on sale have their own confirmed tools. A course's own price offer can't be edited here.
>
> Runs through `act` (found with `find_capabilities`).
>
> | Input | Type | Required | Notes |
> | - | - | - | - |
> | `offerId` | string | Yes | The offerId from list\_offers. |
> | `name` | string | | The offer's name buyers see, up to 80 characters. |
> | `slug` | string | | The public link path, as in /o/your-slug. It is turned into a URL-safe slug. Changing it changes the offer's link. |
> | `headline` | string or null | | A short line shown with the name, up to 160 characters. null clears it. |
> | `description` | string or null | | The longer text about the offer, up to 2000 characters. null clears it. |
> | `purchaseButtonText` | string | | The buy button's label, up to 40 characters. |
> | `showInStore` | boolean | | Whether it is listed in the academy store while it's on sale. |

## Members and messages

Invitations, course access, lists, reminders and removing members. Anything that emails people or changes their access is previewed first.

> [accordion] list\_lists
>
> Reads only · Needs Members and messages
>
> The academy's member lists (cohorts, VIPs, imports) with member counts, and the offers each list grants to everyone on it. Lists managed by an offer (its buyers) can't be edited here.
>
> Runs through `query` (found with `find_capabilities`).
>
> No input of its own.

> [accordion] prepare\_assign\_courses
>
> Preview, then confirm · Needs Members and messages
>
> Preview giving members published courses for free (up to 50 grants per call, people × courses). They get access at once, the course lands in My Learning, and each gets an email. For a paid course this is a comp: they don't pay. Changes nothing: returns a preview and an intentId. Show the preview to the owner in plain words, and only after they approve call confirm with the intentId. It expires in 10 minutes.
>
> Runs through `query`. Changes nothing: it returns a preview and an `intentId`, and `confirm` carries it out after you agree.
>
> | Input | Type | Required | Notes |
> | - | - | - | - |
> | `userIds` | string\[] | Yes | Members to give the courses to: userIds from search\_people, 1 to 25. |
> | `courseIds` | string\[] | Yes | Published courses from list\_courses, 1 to 10. |

> [accordion] prepare\_invite\_members
>
> Preview, then confirm · Needs Members and messages
>
> Preview inviting people by email (up to 25), optionally giving them published courses, active offers or lists when they join. Each person gets an invitation email unless sendEmail is false. Counts against the plan's member limit. Changes nothing: returns a preview and an intentId. Show the preview to the owner in plain words, and only after they approve call confirm with the intentId. It expires in 10 minutes.
>
> Runs through `query`. Changes nothing: it returns a preview and an `intentId`, and `confirm` carries it out after you agree.
>
> | Input | Type | Required | Notes |
> | - | - | - | - |
> | `emails` | string\[] | Yes | Email addresses to invite, 1 to 25. Existing members and people already invited are skipped. |
> | `courseIds` | string\[] | | Published courses (from list\_courses) they get free when they accept. Default `[]`. |
> | `offerIds` | string\[] | | Active offers (from list\_offers) they get free when they accept. Default `[]`. |
> | `listIds` | string\[] | | Lists (from list\_lists) they join when they accept. Lists managed by an offer can't be used; pass the offer. Default `[]`. |
> | `sendEmail` | boolean | | false creates the invitations without emailing them; each link can be copied from Members → Invited in the app. Default `true`. |

> [accordion] prepare\_remove\_member
>
> Preview, then confirm · Needs Members and messages
>
> Preview removing a member from the academy: they lose free and granted access, leave manual lists, and their progress is deleted; anything they paid for stays theirs. They get an email. There is no undo tool. Changes nothing: returns a preview and an intentId. Show the preview to the owner in plain words, and only after they approve call confirm with the intentId. It expires in 10 minutes.
>
> Runs through `query`. Changes nothing: it returns a preview and an `intentId`, and `confirm` carries it out after you agree.
>
> | Input | Type | Required | Notes |
> | - | - | - | - |
> | `userId` | string | Yes | From search\_people. |

> [accordion] prepare\_send\_reminder
>
> Preview, then confirm · Needs Members and messages
>
> Preview a reminder email about a course to a list, segment or set of people, narrowed by progress (not started, not finished, hasn't answered a survey). At most 3 reminders a day per academy, and one per audience per 24 hours. Anonymous surveys can't be targeted. Changes nothing: returns a preview and an intentId. Show the preview to the owner in plain words, and only after they approve call confirm with the intentId. It expires in 10 minutes.
>
> Runs through `query`. Changes nothing: it returns a preview and an `intentId`, and `confirm` carries it out after you agree.
>
> | Input | Type | Required | Notes |
> | - | - | - | - |
> | `courseId` | string | Yes | The course the reminder is about; its link goes in the email. |
> | `audience` | object | Yes | \{ kind: list, id } / \{ kind: segment, id } / \{ kind: people, userIds } |
> | `filter` | "everyone" or "not\_started" or "not\_finished" or "survey\_unanswered" | Yes | everyone, not\_started, not\_finished, or survey\_unanswered (named surveys only). |
> | `surveyLessonId` | string or null | | Required with filter survey\_unanswered: the lessonId of a published, non-anonymous survey in this course (lessonKind survey in get\_course\_context). |
> | `subject` | string | Yes | The email subject, up to 150 characters. |
> | `body` | string | Yes | The message as plain text, up to 4,000 characters; blank lines start new paragraphs. The email adds a button to each person's next lesson. |

> [accordion] prepare\_update\_list\_members
>
> Preview, then confirm · Needs Members and messages
>
> Preview adding members to a list and/or removing them (up to 25 each). If the list grants offers, added people get those offers' courses and removed people lose them, which the preview spells out. Changes nothing: returns a preview and an intentId. Show the preview to the owner in plain words, and only after they approve call confirm with the intentId. It expires in 10 minutes.
>
> Runs through `query`. Changes nothing: it returns a preview and an `intentId`, and `confirm` carries it out after you agree.
>
> | Input | Type | Required | Notes |
> | - | - | - | - |
> | `listId` | string | Yes | From list\_lists. |
> | `add` | string\[] | | userIds from search\_people. Default `[]`. |
> | `remove` | string\[] | | userIds from search\_people to take off the list. Default `[]`. |

## Analytics and people (read-only)

Engagement, revenue, surveys, members and who has gone quiet.

> [accordion] find\_quiet\_learners
>
> Reads only · Needs Analytics and people
>
> Learners who started a course, haven't finished it, can still open it, and have gone quiet for a while: the people worth a nudge. Returns names, emails, days quiet, the course, and the last lesson they completed. Most invested first. Use for "who's stuck", "who should I reach out to". Contact them only when the owner asks.
>
> Runs through `query` (found with `find_capabilities`).
>
> | Input | Type | Required | Notes |
> | - | - | - | - |
> | `courseId` | string | | Limit to one course. Omit for all courses. |

> [accordion] get\_academy\_stats
>
> Reads only · Needs Analytics and people
>
> Period-over-period numbers for one academy: new learners, active learners, lessons completed, course starts and course completions, for the last N days vs the N days before, in total and per course. Use for "how are we doing", "did X drop", "which course is growing". Counts exclude the owner and admins.
>
> Runs through `query` (found with `find_capabilities`).
>
> | Input | Type | Required | Notes |
> | - | - | - | - |
> | `days` | integer | | Window length in days. 30 matches the owner home's numbers. Default `30`. |

> [accordion] get\_engagement\_insights
>
> Reads only · Needs Analytics and people
>
> Where learners engage and where they drop off, all-time. Without a courseId: the audience (learners, how many ever started, active in 7/30 days, by acquisition source), every published course's starts/completions/median progress, course-to-course handoffs, and the strongest findings (lesson drop-offs, skimmed lessons, practice gaps, learners who never started). With a courseId: that course lesson by lesson (who completed each lesson, who opened it, median minutes spent vs reading time, skim rate) plus its practice blocks. Use it to explain why a number moved and to find the lesson to improve, then read and edit that lesson.
>
> Runs through `query` (found with `find_capabilities`).
>
> | Input | Type | Required | Notes |
> | - | - | - | - |
> | `courseId` | string | | A published course (from list\_courses). Omit for the whole academy. |

> [accordion] get\_person
>
> Reads only · Needs Analytics and people
>
> One member of an academy: when they joined, the courses they're enrolled in with lessons completed, overall progress, how they got access (pass, offers, purchases), certificates, and their answers to the academy's welcome questions. Never includes what they wrote in private exercises or tutor chats.
>
> Runs through `query` (found with `find_capabilities`).
>
> | Input | Type | Required | Notes |
> | - | - | - | - |
> | `userId` | string | Yes | The member's userId (from search\_people). |

> [accordion] get\_revenue
>
> Reads only · Needs Analytics and people
>
> Realized sales for one academy over the last N days: gross, refunds, Fayne and Stripe fees, estimated net, sale count, per product (course or offer) and per day. Amounts are in the academy's selling currency, in cents. Use for "how much did we make", "which course sells".
>
> Runs through `query` (found with `find_capabilities`).
>
> | Input | Type | Required | Notes |
> | - | - | - | - |
> | `days` | integer | | Window length in days, ending today. Default `30`. |

> [accordion] get\_survey\_results
>
> Reads only · Needs Analytics and people
>
> Results of every published survey lesson in a course, across all its learners: ratings (mean and distribution), choice counts, written answers, and before/after comparisons between paired surveys. Named surveys attribute written answers to the member; anonymous surveys never do, and small anonymous groups are withheld.
>
> Runs through `query` (found with `find_capabilities`).
>
> | Input | Type | Required | Notes |
> | - | - | - | - |
> | `courseId` | string | Yes | The course to operate on (from list\_courses). |

> [accordion] search\_people
>
> Reads only · Needs Analytics and people or Members and messages
>
> Find members of an academy by name or email. An empty query returns the most recent members. Returns userId, name and email; call get\_person with a userId for their courses, progress, access and welcome answers. Also available to connections with Members and messages, to find who to give a course, remove or add to a list.
>
> Runs through `query` (found with `find_capabilities`).
>
> | Input | Type | Required | Notes |
> | - | - | - | - |
> | `query` | string | | Part of a name or email. Empty for the most recent members. Default `""`. |
> | `limit` | integer | | Most members to return, 1 to 50. Default `25`. |

## Academies

Your academies, their overview and memory, and creating a new one.

> [accordion] get\_academy\_overview
>
> Reads only · Always available
>
> Orient yourself in one academy in a single call: name and public URL, plan state (read-only when locked), course and lesson counts, how many learners and how many were active in 30 days, whether payments are set up and how many offers are live, knowledge sources, what's missing, and which tools to use next. Call it at the start of a conversation about an academy.
>
> Listed directly in your assistant's tools.
>
> No input of its own.

> [accordion] list\_academies
>
> Reads only · Always available
>
> List the academies this connection can work in: id, name, subdomain and your role. Call this first when the owner runs more than one academy, then pass academyId (or a courseId) to the other tools. Also reports which areas this connection may use.
>
> Listed directly in your assistant's tools.
>
> No input of its own.

> [accordion] create\_academy
>
> Changes your academy · Always available
>
> Create a new academy for the owner, optionally copying branding and library courses from one of their own academies (copyFromAcademyId). Counts against the plan's academy limit. Works only on connections set to reach all the owner's academies, so the new one is reachable at once. It starts empty and unpublished: add courses, then the owner publishes it in Settings → General. There's no delete tool.
>
> Runs through `act` (found with `find_capabilities`).
>
> | Input | Type | Required | Notes |
> | - | - | - | - |
> | `name` | string | Yes | The new academy's name, up to 80 characters. |
> | `copyFromAcademyId` | string | | An academy you own (from list\_academies) to copy branding and library courses from. |

> [accordion] get\_academy\_memory
>
> Reads only · Always available
>
> The academy's memory: what the owner has told Fayne about their business, audience, voice and preferences. The in-app agents read it before writing; read it before drafting or rewriting anything so the result sounds like this academy.
>
> Runs through `query` (found with `find_capabilities`).
>
> No input of its own.

> [accordion] update\_academy\_memory
>
> Changes your academy · Always available
>
> Replace the academy's memory with new text (at most 10,000 characters). It's the whole memory, not a patch: read it first and keep what's there unless the owner asked to drop it. The in-app agents use it too.
>
> Runs through `act` (found with `find_capabilities`).
>
> | Input | Type | Required | Notes |
> | - | - | - | - |
> | `memory` | string | Yes | The full new memory text. It replaces the current memory entirely, so start from what get\_academy\_memory returns; an empty string clears it. |


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.