Skip to content

MCP Tools Reference

Becoming’s MCP server exposes 22 tools — 14 for reading your library and Themes, and 8 for taking action: adding highlights and sources to your library and acting on The Academy — plus several resources for MCP-compatible AI clients.

Read tools need a matching :read scope. Write tools need a matching :write scope and require the client to confirm each action (see Write tools below).

If you haven’t yet connected a client, see Connecting an MCP Client.

Search highlights in the user’s library using full-text, semantic (vector), or hybrid retrieval. Hybrid is the default and combines both signals via reciprocal-rank fusion; it falls back to full-text when an embedding for the query isn’t available.

Required scope: highlights:read

Inputs:

FieldTypeNotes
querystring (required)The search text.
modefulltext | semantic | hybridDefault hybrid.
source_idintegerRestrict to highlights from a single source.
limitinteger (1–50)Page size. Default 10.
cursorstringReturned in the previous response’s meta.next_cursor.

Returns: matching highlights with content, location, source metadata, note count, and pagination metadata.

List sources in the user’s library.

Required scope: sources:read

Inputs:

FieldTypeNotes
qstringOptional title/author search.
typeBook | Article | Video | PodcastOptional filter.
limitinteger (1–50)Page size. Default 20.
cursorstringReturned in the previous response’s meta.next_cursor.

Returns: sources with title, type, author, cover URL, and per-source highlight counts.

Fetch a single source and the user’s highlights attached to it.

Required scope: sources:read

Inputs:

FieldTypeNotes
idinteger (required)Source id.

Returns: source metadata plus the user’s highlights for that source.

Fetch a single highlight with its source metadata.

Required scope: highlights:read

Inputs:

FieldTypeNotes
idinteger (required)Highlight id.

Returns: highlight content, location, source metadata, and the user’s note count for the highlight.

Export the user’s whole library as CSV text — one row per highlight with its source, notes, tags and dates, the same file as Export Your Highlights. The result is paged: the first page carries the header row, and the client appends the pages into one file.

Required scope: highlights:read

Inputs:

FieldTypeNotes
cursorstringReturned in the previous response’s meta.next_cursor. Omit for the first page.
limitinteger (1–1000)Rows per page. Default 500.

Returns: csv (the page’s text), row_count, and meta.next_cursor — null on the last page.

Export one source as a Markdown file — the same file the Markdown export produces: YAML frontmatter with the source’s details, the highlights in reading order with their tags, notes and location links, and the notes on the source itself. The text block carries the file verbatim, so the client can save it as .md as is. The whole-library zip is not offered over MCP; fetch sources one at a time.

Required scope: highlights:read

Inputs:

FieldTypeNotes
idinteger (required)Source id, from list_sources.

Returns: markdown (the file’s text), source_id and highlight_count.

Poll the status of an import started by add_source. Imports run in the background; once one completes, confirm the new source with list_sources.

Required scope: sources:read

Inputs:

FieldTypeNotes
idinteger (required)The import_id returned by add_source.

Returns: the import’s status (pending | processing | completed | failed), its result counts, and the failure reason when it failed.

For a video cut short by credits, note that the nightly sweep resumes it as a new import: the original import_id keeps its out-of-credits result for good, so re-polling that id reports a truncated video long after the rest has been highlighted. Follow the source’s highlights_count with list_sources or get_source instead — it rises as the sweep lands chunks. Neither is a completion flag, so expect a rising count rather than a terminal state.

These tools read your Academy data. get_academy_status needs no scope — a client can call it to check whether the Theme and Practice tools are available before using them.

ToolPurposeInputsRequired scope
get_academy_statusCheck Academy access and Theme/Practice availabilityNoneNone
list_themesList the user’s Themes, active and pastNonethemes:read
get_theme_timelineGet one week of a Theme’s Practice timeline, around a datetheme_id (required); date (optional ISO date, defaults to today)themes:read
get_theme_generationCheck the status and result of a Theme generationid (required)themes:read
list_theme_practicesList the Practices belonging to a Themetheme_id (required)practices:read
get_today_practicesGet today’s PracticesNonepractices:read
get_practice_reflectionRead a saved reflection for a Practicepractice_id (required)reflections:read

Write tools change data in your library, so they carry an extra safeguard. Each one requires the matching :write scope, and the client must pass confirm: true together with a short user_intent string describing what you asked for. If either is missing, the call is rejected — nothing is written by accident.

add_highlights and add_source work on every plan; the Theme, Practice, and reflection write tools are available on The Academy only.

Every write tool takes confirm: true and user_intent in addition to the tool-specific inputs below.

ToolPurposeInputsRequired scope
add_highlightsSave up to 20 passages as highlights — to an existing library source, or to a Book/Article found or created from metadatasource_id or source (type Book | Article; title; author required for Book; url required for Article; language optional); highlights (array of content with optional location, timestamp_seconds)highlights:write
add_sourceAdd a source without highlights — a link (YouTube videos import their transcript; other pages are fetched and saved as readable articles) or a bookurl or book (title + author, language optional). Async: poll the returned import_id with get_importsources:write
start_theme_generationStart generating a new Theme from your library, a highlight, or an intentintent (optional, max 280 characters); seed_highlight_id (optional)themes:write
generate_theme_practicesGenerate the daily Practices for a Themetheme_id (required); context (work | personal | both, required); mix (act | reflect | balanced, required)practices:write
complete_themeFinish a Themetheme_id (required)themes:write
complete_practiceMark a Practice donepractice_id (required)practices:write
skip_practiceSkip a Practicepractice_id (required)practices:write
log_practice_reflectionSave a reflection for a Reflect practicepractice_id (required); body (required, non-empty)reflections:write

Two of these tools spend AI credits from the same allowance the apps draw on:

  • add_source with a url — Becoming fetches the page and reads it for you, which spends credits; a YouTube video costs more the longer it runs. Adding a book costs nothing.
  • start_theme_generation — the most expensive action in Becoming when it runs across your whole library. A seed_highlight_id or an intent costs a fraction of that. The Practices are included, so generate_theme_practices costs nothing on top.

Everything else here — add_highlights included — is free. Out of credits, add_source still saves the source; only the highlighting waits.

Resources are stable URIs that an MCP client can read on demand. Becoming exposes both collection URIs (returning a list) and per-item templates.

URIWhat it returnsRequired scope
becoming://highlightsRecent highlights collectionhighlights:read
becoming://highlights/{id}A single highlighthighlights:read
becoming://sourcesSources collectionsources:read
becoming://sources/{id}A single source with its highlightssources:read
becoming://notesNotes collectionnotes:read
becoming://notes/{id}A single notenotes:read

Eleven scopes are available; you grant them at the consent screen when connecting a client. get_academy_status needs no scope.

ScopeAllows
highlights:readsearch_highlights, get_highlight, export_highlights, get_source_markdown, highlight resources
highlights:writeadd_highlights
sources:readlist_sources, get_source, get_import, source resources
sources:writeadd_source
notes:readNotes collection and per-note resources
themes:readlist_themes, get_theme_timeline, get_theme_generation
themes:writestart_theme_generation, complete_theme
practices:readlist_theme_practices, get_today_practices
practices:writegenerate_theme_practices, complete_practice, skip_practice
reflections:readget_practice_reflection
reflections:writelog_practice_reflection

Granting fewer scopes is fine — tools or resources requiring scopes the connection didn’t grant simply return a permission error. Theme, Practice, and reflection write scopes take effect on The Academy; highlights:write and sources:write work on every plan.

The MCP server uses standard JSON-RPC error codes for protocol-level failures and tool-result errors for application-level failures. Notable codes:

CodeMeaning
-32001Authentication required (token invalid, expired, or revoked).
-32002Insufficient scope or subscription required.
-32003Resource not found.
-32004Rate limited; back off and retry.
-32010Academy subscription required for this tool.
-32011Invalid input — e.g. a write tool called without confirm: true and user_intent, or a validation failure.
-32099Unexpected backend failure; retry later.

Per-connection rate limits apply. Most clients handle backoff automatically.

search_highlights, list_sources and export_highlights use cursor-based pagination. Pass the meta.next_cursor value from the previous response as the cursor input on the next call. Continue until next_cursor is null.