MCP Tools Reference
This page lists core Basic Memory MCP tools and their current parameters.
project parameter -> default_project fallback.Common parameters
Most tools accept these optional parameters. They are not repeated in every table below.
| Parameter | Type | Default | Notes |
|---|---|---|---|
project | string | resolved via fallback | Project name. Constrained project env → explicit parameter → default_project config |
project_id | string | — | Project external UUID from list_memory_projects. Prefer this when the same project name exists in more than one workspace |
output_format | "text" or "json" | "text" | Machine-readable JSON output. build_context defaults to "json"; most other tools default to "text" |
workspace is not a universal parameter. It appears on the note-writing tools (write_note, edit_note) and on the tools that create or delete cloud projects. For ordinary read, search, and schema calls, use project or project_id.
Knowledge tools
write_note
Create or update a markdown note.
| Parameter | Type | Required | Notes |
|---|---|---|---|
title | string | Yes | Note title |
content | string | Yes | Markdown body |
directory | string | Yes | Relative folder path. Since v0.23.2, each segment resolves to a unique existing case-insensitive folder match |
tags | liststring or string | No | Comma-separated string accepted |
note_type | string | No | Default note. Sets the type frontmatter field (e.g., person, meeting, decision) |
metadata | object or JSON string | No | Extra frontmatter fields merged into the note's YAML header |
overwrite | boolean | No | Default follows write_note_overwrite_default config (false unless changed). Pass true to replace an existing note; without it, writing to an existing path returns an error |
workspace | string | No | Cloud workspace to write into (name or tenant ID) |
The note_type parameter controls the type field in frontmatter, which is used for schema resolution and filtering. The metadata parameter accepts any key-value pairs that get written directly into the note's frontmatter — useful for custom fields like status, priority, or due_date.
Aliases accepted for directory: folder, dir, and path.
Folder casing resolution uses known indexed directories, so local and Cloud writes behave identically. Exact matches win; a unique case-insensitive match reuses the existing spelling; no match creates the folder as requested; and existing case-variant siblings keep exact-match behavior.
read_note
Read note content by title/permalink/memory URL.
| Parameter | Type | Required | Notes |
|---|---|---|---|
identifier | string | Yes | Title, permalink, or memory://... |
page | integer | No | Pagination page number |
page_size | integer | No | Results per page |
include_frontmatter | boolean | No | Default false. When true, includes YAML frontmatter in output |
review_mode | structured or raw | No | Cloud only; default structured. Returns clean prose and typed review threads, or exact persisted CriticMarkup in raw mode |
On Cloud, structured JSON also returns revision_checksum and a review object containing summary counts and typed comment/suggestion items. Use that checksum for review decisions and for ordinary edits while review work is open. Raw mode is an inspection escape hatch; agents should not author or mutate CriticMarkup directly.
edit_note
Edit an existing note incrementally.
| Parameter | Type | Required | Notes |
|---|---|---|---|
identifier | string | Yes | Exact note identifier |
operation | string | Yes | append, prepend, find_replace, replace_section, insert_before_section, insert_after_section |
content | string | Yes | New content |
section | string | Conditional | Required for replace_section, insert_before_section, insert_after_section |
find_text | string | Conditional | Required for find_replace |
expected_replacements | integer | No | Default 1 |
replace_subsections | boolean | No | For replace_section; default true replaces nested subsections. Set false to preserve them |
metadata | object | No | Merge frontmatter fields independently of the body operation; provided keys overwrite or add values |
workspace | string | No | Cloud workspace containing the note (name or tenant ID) |
expected_checksum | string | No | Cloud reviewed notes require the checksum from structured read_note; stale or intersecting edits are rejected |
replace_section now follows Markdown heading levels. By default, a selected section extends through the next heading of the same or higher level, so replacing an ## section also replaces its nested ### subsections. Set replace_subsections=false to stop at the next heading of any level and keep nested subsections.
metadata preserves unrelated frontmatter and the note body. It ignores title, type, and permalink, which have dedicated handling, and does not support deleting keys.
On Cloud, edit_note preserves active review markers byte-for-byte. If an edit would change an anchored review range, it fails with the blocking review ID; use review_note to resolve or decide that item first. write_note(overwrite=true) is a full replacement and may remove review state.
review_note (Cloud)
Manage comments and suggestions on an existing Markdown note. Always begin with read_note(review_mode="structured", output_format="json"), and do not write CriticMarkup directly.
| Parameter | Type | Required | Notes |
|---|---|---|---|
identifier | string | Yes | Exact title, permalink, file path, external ID, or memory:// URL |
command | comment, suggest, reply, resolve, accept, or reject | Yes | One review lifecycle action |
anchor | object | Conditional | Required for comment and suggest. exact is a single-line prose selection; optional prefix, suffix, or one-based occurrence disambiguates repeated text |
body | string | Conditional | Required for comment and reply; optional final reply when resolving a comment |
suggestion_kind | addition, deletion, or replacement | Conditional | Required for suggest |
replacement | string | Conditional | Required for addition and replacement suggestions; omit for deletion |
review_id | string | Conditional | Required for reply, resolve, accept, and reject; obtain it from structured read_note or a prior mutation response |
expected_checksum | string | Conditional | Required for accept and reject; optional stale-write guard for other commands |
comment and suggest create attributed review records and return their IDs. reply works on comments or suggestions. resolve closes a comment without changing its anchored prose and can include a final reply. accept applies a pending suggestion; reject keeps the original prose. Every mutation is atomic and returns the new revision_checksum.
# Create a replacement suggestion
review_note(
identifier="Launch plan",
command="suggest",
anchor={"exact": "Ship the beta on Friday."},
suggestion_kind="replacement",
replacement="Ship the beta after the security review."
)
# After a fresh structured read, accept it
review_note(
identifier="Launch plan",
command="accept",
review_id="suggestion-id",
expected_checksum="checksum-from-read-note"
)
See Comments and Suggestions for the complete human-and-agent workflow.
move_note
Move a note or directory.
| Parameter | Type | Required | Notes |
|---|---|---|---|
identifier | string | Yes | Note or directory identifier |
destination_path | string | Conditional | Target path. Mutually exclusive with destination_folder; parent folders receive v0.23.2 casing resolution |
destination_folder | string | Conditional | Target folder — moves note into folder preserving filename. Mutually exclusive with destination_path; each segment can reuse a unique case-insensitive folder match |
is_directory | boolean | No | Default false. Set to true to move an entire directory |
Folder casing resolution applies to note destinations, not directory renames. The response reports the actual landing path after a case-corrected move. Case-only folder renames and merging already duplicated case variants remain separate operations.
delete_note
Delete a note or directory.
| Parameter | Type | Required | Notes |
|---|---|---|---|
identifier | string | Yes | Note or directory |
is_directory | boolean | No | Set to true to delete an entire directory and its contents |
read_content
Read a file's content by path or permalink. Text files return as plain text; images are resized/optimized for display; other binary files return base64-encoded (subject to size limits). Useful for non-markdown files like images, PDFs, or attachments.
| Parameter | Type | Required | Notes |
|---|---|---|---|
path | string | Yes | File path, permalink, or memory://... URL. Aliases: file_path, filepath, file |
view_note
Render a note as a formatted artifact for display in MCP clients. Returns the note content in a presentation-friendly format.
| Parameter | Type | Required | Notes |
|---|---|---|---|
identifier | string | Yes | Note title, permalink, or memory://... URL |
open_basic_memory (Cloud)
Open the interactive Pocketbook in a compatible client. Use this when the user wants to see, browse, navigate, or interact with Basic Memory visually. Use read_note, search_notes, or list_directory instead when the assistant only needs data for its answer.
The default workspace and project resolve automatically. Do not call list_memory_projects first unless the user asks for project metadata or wants a non-default location.
| Parameter | Type | Required | Notes |
|---|---|---|---|
view | notes, note, folders, search, or graph | No | Default notes. Destination screen |
workspace | string | No | Workspace slug, name, or tenant ID. Omit for the default |
project | string | No | Project name or qualified workspace/project name. Omit for the default |
project_id | string | No | Exact external project UUID. Takes precedence over project |
directory | string | No | Initial folder for notes, folders, note, or search views |
identifier | string | Conditional | Required for view="note"; optional for view="graph" to focus a note. Accepts a title, permalink, memory:// URL, or exact note UUID |
query | string | No | Initial query for view="search" only |
graph_mode | overview or full | No | Default overview. Used only with view="graph" |
note_mode | view or edit | No | Default view. Use edit to open a note directly in the editor; used only with view="note" |
Examples:
open_basic_memory()
open_basic_memory(view="search", query="authentication")
open_basic_memory(view="folders", directory="research")
open_basic_memory(view="note", identifier="memory://main/plans/api", note_mode="edit")
open_basic_memory(view="graph", identifier="Architecture", graph_mode="full")
See Pocketbook for the user workflow.
Search and context tools
search_notes
Main search tool with text, vector, and hybrid modes plus structured filters.
| Parameter | Type | Required | Notes |
|---|---|---|---|
query | string | No | Search query. Optional for metadata-only searches. Supports tag: shorthand (e.g., "tag:security") |
page | integer | No | Default 1 |
page_size | integer | No | Default 10 |
search_type | string | No | Default None — resolves to hybrid when semantic search is enabled, text otherwise. Options: text, title, permalink, vector, semantic, hybrid |
note_types | liststring or string | No | Case-insensitive frontmatter type filter (e.g., ["person", "meeting"]). Aliases: note_type, types |
entity_types | liststring or string | No | Knowledge graph result filter: entity, observation, relation. Alias: entity_type |
categories | liststring or string | No | Exact observation category filter (e.g., ["decision", "rule"]). When provided without entity_types, results default to observations. |
after_date | string | No | Date/time filter (ISO format) |
metadata_filters | object or JSON string | No | Structured metadata filters |
tags | liststring | No | Tag filter shorthand |
status | string | No | Status shorthand |
min_similarity | float | No | Overrides global semantic_min_similarity threshold per query |
search_all_projects | boolean | No | Default false. Search stays scoped to the resolved project; set true to search across every accessible project and workspace |
The search_type parameter controls the search strategy. hybrid is the default — it combines keyword and semantic search. text is keyword-only. vector and semantic are equivalent — pure meaning-based similarity. See Semantic Search for details on each mode.
Search results expose each note's stable external_id in JSON and Markdown output. Use it for web-app deep links or exact follow-up operations instead of parsing a title or permalink.
Cloud search projects reviewed notes as clean prose rather than CriticMarkup. JSON note results include review_summary counts (open_comments, resolved_comments, pending_suggestions, and total_pending). If a stale search fragment splits or exposes review markup during asynchronous index reconciliation, Cloud omits that hit instead of returning ambiguous storage bytes.
Use categories for observation categories such as [decision], [rule], or [follow-up]. metadata_filters only checks note frontmatter, so metadata_filters={"category": "decision"} matches a frontmatter field named category, not observation categories. The singular category is accepted as an alias, and comma-separated strings work (categories="decision,rule"). Matching is exact, and categories only exist on observations — explicitly passing entity_types=["entity"] alongside categories returns nothing.
search_notes accepts q, search, or text as aliases for query; all_projects for search_all_projects; page_number for page; and limit / per_page for page_size. Search responses also include a result total for pagination.build_context
Build context graph from a memory URL. Traverses the knowledge graph from a starting entity, following relations to a configurable depth.
| Parameter | Type | Required | Notes |
|---|---|---|---|
url | string | Yes | memory:// URL or path |
depth | string or integer | No | Traversal depth (default 1). Use 2 or 3 for broader context |
timeframe | string | No | Time window filter (default 7d). Accepts formats like 7d, 1 week, 30d, 3 months |
page | integer | No | Default 1 |
page_size | integer | No | Default 10 |
max_related | integer | No | Maximum related entities per level (default 10) |
output_format | string | No | Default "json". Also accepts "text" for human-readable output |
TimeFrame examples:
| Value | Meaning |
|---|---|
7d | Last 7 days |
30d | Last 30 days |
1 week | Last week |
3 months | Last 3 months |
1 year | Last year |
recent_activity
Recent activity in one project or cross-project discovery mode. When no project can be resolved at all (no parameter, no default project), it returns activity across all projects (discovery mode); otherwise it uses the resolved project.
Entity rows include external_id so clients can address the exact note returned.
| Parameter | Type | Required | Notes |
|---|---|---|---|
type | string or liststring | No | Filter by result type: "entity", "relation", "observation" |
depth | integer | No | Relation traversal depth for context |
timeframe | string | No | Time window (e.g., 7d, 30d, 1 week) |
page | integer | No | Default 1 |
page_size | integer | No | Default 10 |
Project and filesystem tools
list_memory_projects
List projects and project stats. Returns name, path, default status, note count, external project ID, and sync/workspace metadata for each project. In cloud mode, this discovers projects across every accessible workspace, not just the current one — so a team's projects show up without switching workspaces first.
| Parameter | Type | Required | Notes |
|---|---|---|---|
output_format | "text" or "json" | No | Use "json" when an agent needs exact project_id values for later tool calls |
create_memory_project
Create a project.
| Parameter | Type | Required | Notes |
|---|---|---|---|
project_name | string | Yes | Name for the new project |
project_path | string | Yes | Filesystem path for the project |
set_default | boolean | No | Default false. Set to true to make this the default project |
workspace | string | No | Cloud workspace name or slug to create the project in (cloud only) |
delete_project
Remove a project from Basic Memory. Note files are retained by default.
| Parameter | Type | Required | Notes |
|---|---|---|---|
project_name | string | Yes | Name of the project to remove |
delete_notes | boolean | No | Default false. Set to true to delete local files or purge every active cloud object under the project's storage prefix |
workspace | string | No | Cloud workspace selector. From a local stdio MCP session, provide this to route deletion to cloud unless the session is already explicitly cloud-routed |
Cloud purge behavior applies when the MCP session is hosted or factory-routed to cloud, explicitly cloud-routed, or given a workspace selector. From a local stdio MCP session, delete_notes=true alone does not switch this tool to cloud routing; pass workspace to ensure the hosted project and objects are targeted. Hosted deletion is asynchronous. The tool response reports the project deletion status and background job ID when the cloud backend queues the work. With delete_notes=false, cloud objects are retained even though the project and its indexed database rows are removed. With delete_notes=true, the background job removes indexed and unindexed objects under the exact project prefix before completing the hard delete. Existing snapshots follow their separate retention lifecycle.
list_directory
List directory contents with optional depth, glob filter, and sorting.
| Parameter | Type | Required | Notes |
|---|---|---|---|
dir_name | string | No | Directory path to list (root if omitted) |
depth | integer | No | How many levels deep to list |
file_name_glob | string | No | Glob pattern to filter returned files (e.g., *.md, schemas/*). Nonmatching directories are still traversed within depth |
sort | string | No | Ordering: title_asc, title_desc, updated_asc, or updated_desc. Omit for the default filename ordering |
page | integer | No | One-indexed page; default 1 |
page_size | integer | No | Nodes per page; default 10, maximum 200. Aliases: limit, per_page |
output_format | "text" or "json" | No | JSON includes structured pagination metadata |
Large listings are bounded. Continue with the next page instead of assuming one response contains every file. File nodes include external_id in both text and JSON output.
Glob filtering applies to returned nodes, not traversal. For example, depth=2 with file_name_glob="*.md" still finds Markdown files inside a folder whose own name does not match *.md.
Explicit sorts (v0.23) order folders before files, apply deterministically before pagination, and use note titles for title_* modes. Folders have no canonical update timestamp, so updated_* modes keep folders name-ascending while still listing them first.
list_workspaces
List available cloud workspaces. Returns workspace names and tenant IDs for the authenticated user.
Schema tools
Tools for defining, validating, and evolving note structure. See Schema System for concepts and workflow.
schema_validate
Validate notes against their schema. Pass note_type to validate all notes of a type, or identifier to validate a specific note.
| Parameter | Type | Required | Notes |
|---|---|---|---|
note_type | string | Conditional | Note type to validate (e.g., person). One of note_type or identifier required |
identifier | string | Conditional | Specific note path or permalink to validate |
output_format | "text" or "json" | No | Machine-readable validation report |
schema_infer
Analyze existing notes of a type and suggest a schema based on common patterns.
| Parameter | Type | Required | Notes |
|---|---|---|---|
note_type | string | Yes | Note type to analyze (e.g., person) |
threshold | float | No | Minimum field frequency for inclusion (default 0.25) |
output_format | "text" or "json" | No | Machine-readable inference report |
schema_diff
Compare a schema definition against actual note usage to detect drift.
| Parameter | Type | Required | Notes |
|---|---|---|---|
note_type | string | Yes | Note type to compare (e.g., person) |
output_format | "text" or "json" | No | Machine-readable drift report |
Diagnostics
basic_memory_diagnostics
Return a read-only Markdown report for support and installation troubleshooting. It takes no parameters and includes:
- Basic Memory package and API versions;
- Python, operating-system, and architecture details; and
- the config path and current config contents with secrets and URL credentials redacted.
canvas, cloud_info, and release_notes MCP tools. Use the Cloud documentation, GitHub release notes, and your editor's native visualization features instead. See Upgrade to v0.23.ChatGPT compatibility tools
These are compatibility wrappers for ChatGPT's MCP implementation, which uses a simplified two-tool interface by default. v0.23 gates them by MCP client identity: only OpenAI clients can call them.
search(query)— Search across the knowledge base. Equivalent tosearch_noteswith default parameters.fetch(id)— Retrieve full document content by permalink. Equivalent toread_note.
Non-OpenAI MCP clients receive a clear rejection and must call search_notes and read_note directly.
See the ChatGPT integration guide for usage details and limitations.

