Skip to main content
Glama
iangray001

applenotes-mcp

by iangray001

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault

No arguments

Capabilities

Features and capabilities supported by this server

CapabilityDetails
tools
{
  "listChanged": false
}
prompts
{
  "listChanged": false
}
resources
{
  "subscribe": false,
  "listChanged": false
}
experimental
{}

Tools

Functions exposed to the LLM to take actions

NameDescription
list_foldersA

List the folders a note can be filed into, as full paths, one per line.

create_note can only file a note into a folder that already exists -- it never creates one -- so call this rather than guessing a folder name. To file into a folder that is not listed here, call create_folder first.

Paths are shown because folder names are NOT unique: nesting allows both "Personal/Recipes" and "Personal/Projects/Brewing/Recipes". Pass the full path to create_note whenever a bare name appears more than once here; an ambiguous name is rejected rather than guessed at.

list_folderA

List the notes and immediate subfolders inside folder.

folder is a path (or a name, where unique) as shown by list_folders; an ambiguous name is rejected rather than guessed at. Subfolders are given as full paths (pass one back here to descend into it). Notes are listed newest first, one per line, tab-separated as id, title, modified (YYYY-MM-DD HH:MM), snippet -- the same id that read_note and edit_note take. This is how to browse the library by structure, where search_notes/search_note_text find notes by their text.

create_folderA

Create a folder at path, making any missing parent folders along the way.

path is a full path like "Personal/Projects/Roadmap"; each segment that does not exist yet is created under the one before it (the first under the top level). A path that already exists is left untouched. This is separate from create_note on purpose: create_note still REFUSES an unknown folder, so a typo files nothing by surprise -- call this first to make the folder deliberately, then create the note into it.

Folders are addressed by id (built from the store UUID), so nesting under a folder whose name is not unique still works. Refuses if a parent path is itself ambiguous.

create_noteA

Create an Apple Note from markdown, preserving real formatting.

Headings, bullet and numbered lists, tables, bold and italic all survive as real Notes objects -- unlike AppleScript-based servers, which force the whole note to a fixed font size and cannot produce tables at all.

Attachments: a whole-line image ![alt](/path/to/file) or link [name](/path) whose target is a LOCAL file (an absolute path or a file:// URL) is attached to the note at that point, of any byte size. An http(s) link stays an ordinary link. A display size may be added after a pipe -- ![alt|small](...) -- as small, medium or large.

Args: title: the note's title -- the bold first line Apple shows in the notes list, not just metadata. Give it a real, descriptive value. If left blank, it is taken from the first heading or line of prose in the markdown (never an image). markdown: the body. Do NOT repeat the title as a # <title> heading at the top -- Notes already shows the title, and a leading one matching title is dropped. For section headings inside the note use ## and ###: # is Apple's Title style, so a # heading renders as a second title. ## Foo round-trips as ## Foo; only ### and deeper flatten (to ##). folder: optional existing folder to file the note under, given as a name or, where the name is not unique, as a full path like "Personal/Projects/Recipes". Call list_folders to see what exists; an ambiguous name is rejected, not guessed.

Returns the new note's ID.

read_noteA

Read a note as markdown, for inspecting or editing it.

Reconstructed from Notes' own protobuf, so checklists come back with their ticked state, and a numbered list is not confused with a bullet list -- neither of which the HTML AppleScript exports can express. Tables are taken from the HTML, since the protobuf holds them only as a placeholder. File attachments (images, PDFs) come back as ![name](file://...) / [name](file://...) pointing at the file on disk.

Heading depth is preserved through ##; only ### and deeper are flattened (to ##), and that is a write-side loss, not a read-side one -- ### Foo was already stored as a Heading. # is Apple's Title style, so the note's own title reads back as # <title>.

Falls back to the HTML alone if the protobuf cannot be read, which loses checklists; edit_note refuses to run in that state rather than rewrite from a degraded read.

edit_noteA

Replace a note's body with new markdown, keeping its title and folder.

IMPORTANT -- this is destructive. Apple provides no way to rewrite a note in place with real formatting, so the note is deleted and recreated: it gets a NEW note ID and a new creation date. The original is backed up to ~/.local/share/applenotes-mcp/backups first.

Attachments are preserved: keep their ![name](file://...) / [name](file://...) lines in the markdown you pass back and they are re-attached; drop a line to remove that attachment. The one exception is an attachment that is not downloaded locally (evicted to iCloud) -- the note is refused, since that file cannot be re-attached. The normal flow is to read_note, edit that markdown, and pass it back here.

Returns the new note's ID.

search_notesA

Find notes whose TITLE contains query, most recently modified first.

Returns one row per match, tab-separated: id, title, folder, modified (YYYY-MM-DD HH:MM), snippet (a one-line body preview). The id is the only way to obtain a note ID, which read_note and edit_note both need; the other columns are for telling apart notes that share a title -- present several to the user by folder and date rather than guessing which is meant.

This searches TITLES only and is fast. If it returns no matches -- or you are after notes that mention something rather than are titled after it -- fall back to search_note_text, which also searches bodies. "no matches" here never means the content is absent, only that no title contains query.

search_note_textA

Full-text search: find notes whose TEXT (title and body) contains query.

Same row format as search_notes (id, title, folder, modified, snippet), most recently modified first. Use this when looking for notes that mention something rather than notes titled after it; use search_notes when you know the title, as it is faster. Matching is on the note's plain text, so formatting (checklists, tables) does not affect what matches.

Prompts

Interactive templates invoked by user choice

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription

No resources

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/iangray001/applenotes-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server