Skip to content

MCP Tools Reference

Becoming’s MCP server exposes 20 tools — 12 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.

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 costs 1 credit for a web page, or 1 per ~15 minutes of transcript for a YouTube video. Adding a book costs nothing.
  • start_theme_generation66 credits from your whole library, or 10 from a seed_highlight_id or an intent. 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, 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 and list_sources 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.