seunghan91 avatar

Ainote

seunghan91/ainote

Exposes 26 tools over both MCP JSON-RPC and OpenAPI 3.1, so the same task/note/vault operations work in Claude, Cursor, ChatGPT Custom GPTs, and LangChain without maintaining separate integrations. Gives you list_tasks, create_dev_doc, vault_sync, and handoff_save/get for passing session context between agents or devices with HHMM timestamps. All tools carry four-hint annotations (readOnlyHint, destructiveHint, idempotentHint, openWorldHint) to help autonomous agents avoid destructive calls. Backend sits on Render PostgreSQL plus user-owned GitHub repos for Obsidian-compatible markdown vaults. Reach for this when you want agents to manage todos, dev docs, or cross-session handoffs without building your own dual-protocol gateway.

tools
35
auth
Secret needed
transport
STDIO, HTTP
env var
1
last updated
May 14, 2026

Install

From registry metadata
$ npx add-mcp https://api.ainote.dev/api/mcp --name ainote --header 'Authorization: Bearer ${API_TOKEN}'

Run in your terminal. add-mcp asks which agents to add it to, then asks for each value it needs. Add -g to install it for every project.

Review the command, arguments and environment values before installing. MCP servers run with your local permissions.

Other ways

Claude Code

$ claude mcp add --transport http ainote https://api.ainote.dev/api/mcp --header 'Authorization: YOUR_AUTHORIZATION'

Run in your terminal. Add --scope user to make it available in every project.

Tools

Verified live · 35 tools

Verified live against the running server on Nov 6, 2026.

delete_taskSoft-delete a task by ID. Destructive but reversible within 30 days (TaskCleanupJob purges trash daily at 2am KST). Returns 404 if the task does not exist or is not owned by the authenticated user.1 params

Soft-delete a task by ID. Destructive but reversible within 30 days (TaskCleanupJob purges trash daily at 2am KST). Returns 404 if the task does not exist or is not owned by the authenticated user.

Parameters* required
id*string
Task ID to delete
list_papersList notes/papers from AI Note. Supports keyword search across title and content, category filtering, pagination, and sorting. Returns id/title/content_preview/category_id/created_at. Use this when the user asks 'find my note about X', 'what did I write on Y', or wants to sear...8 params

List notes/papers from AI Note. Supports keyword search across title and content, category filtering, pagination, and sorting. Returns id/title/content_preview/category_id/created_at. Use this when the user asks 'find my note about X', 'what did I write on Y', or wants to sear...

Parameters* required
category_idstring
Filter by category UUID
limitnumber
Maximum number of papers to return (default: 25, max: 200)
offsetnumber
Number to skip for pagination (default: 0)
paper_category_idstring
Filter by paper-specific folder UUID
searchstring
Keyword to match in paper title or content (case-insensitive partial match)
sort_bystring
Sort field (default: updated_at)one of created_at · updated_at · title
sort_orderstring
Sort order (default: desc)one of asc · desc
source_typestring
Filter by source type (e.g., 'manual', 'youtube', 'url', 'clipboard')
project_readList the authenticated user's projects (L2 intent layer), or fetch one by id. Each entry includes riskiest_assumption — the single highest-priority unverified assumption (or, if all are verified, the highest-criticality one).2 params

List the authenticated user's projects (L2 intent layer), or fetch one by id. Each entry includes riskiest_assumption — the single highest-priority unverified assumption (or, if all are verified, the highest-criticality one).

Parameters* required
idstring
Fetch a single project by UUID. Omit to list all.
statusstring
Filter by status. Omit to list all statuses.one of active · paused · archived
project_writeCreate or update a project (L2 intent layer). Omit `id` to create, pass it to update. There is no delete tool — use status: 'archived' to retire a project.5 params

Create or update a project (L2 intent layer). Omit `id` to create, pass it to update. There is no delete tool — use status: 'archived' to retire a project.

Parameters* required
idstring
Project UUID to update. Omit to create a new project.
intentstring
Why this project exists, in one paragraph. Pass 'null' to clear.
namestring
Project name (required to create).
statusstring
active | paused | archived.one of active · paused · archived
success_criteriastring
What observable outcome counts as success. Pass 'null' to clear.
assumption_writeCreate or update an assumption under a project (L2 intent layer). Omit `id` to create, pass it to update. There is no delete tool. 🔴 `verdict` is REJECTED with an error if passed — verdict is confirmed only through a human judgment decision (see judgment_submit). This tool ca...6 params

Create or update an assumption under a project (L2 intent layer). Omit `id` to create, pass it to update. There is no delete tool. 🔴 `verdict` is REJECTED with an error if passed — verdict is confirmed only through a human judgment decision (see judgment_submit). This tool ca...

Parameters* required
bmc_blockstring
Optional Business Model Canvas block this assumption belongs to. Pass 'null' to clear.one of key_partners · key_activities · key_resources · value_propositions · customer_relationships · channels
criticalityinteger
1=critical if wrong … 3=minor.one of 1 · 2 · 3
evidence_conditionstring
What would be observed to settle this assumption. Pass 'null' to clear.
idstring
Assumption UUID to update. Omit to create a new assumption.
project_id*string
Project UUID this assumption belongs to (required).
statementstring
What is being assumed true (required to create).
judgment_submitRequest a human judgment (L3 layer) by attaching evidence — approval, evidence, or verdict. This is the ONLY door an agent has into the judgment queue. 🔴 `decision` is REJECTED with an error if passed — judgments are always created with decision='pending'. Only a human decide...7 params

Request a human judgment (L3 layer) by attaching evidence — approval, evidence, or verdict. This is the ONLY door an agent has into the judgment queue. 🔴 `decision` is REJECTED with an error if passed — judgments are always created with decision='pending'. Only a human decide...

Parameters* required
evidenceobject
Free-form evidence attached to the request — links, numbers, diff summaries.
kind*string
approval | evidence | verdict.one of approval · evidence · verdict
project_idstring
Optional project this judgment relates to.
risk_tierinteger
1=destructive 2=reversible 3=informational. Default: 2.one of 1 · 2 · 3
subject_idstring
Optional. UUID of the Assumption or Task this judgment is about.
subject_typestring
Optional. Pair with subject_id. Only Assumption or Task are allowed.one of Assumption · Task
summary*string
One sentence: what is being judged (required).
judgment_listList the authenticated user's own judgments (L3 layer) — use this to check your own blocking status (risk_tier 1 pending = execution blocked). Default order matches the /command queue: risk_tier ascending, then arrival order.7 params

List the authenticated user's own judgments (L3 layer) — use this to check your own blocking status (risk_tier 1 pending = execution blocked). Default order matches the /command queue: risk_tier ascending, then arrival order.

Parameters* required
decisionstring
Filter by decision. Omit for all.one of pending · approved · rejected · deferred · superseded · expired
kindstring
Filter by kind.one of approval · evidence · verdict
limitinteger
Max rows to return (default 50, max 200).
project_idstring
Filter by project UUID.
risk_tierinteger
Filter by risk_tier.one of 1 · 2 · 3
subject_idstring
Filter by subject UUID (pair with subject_type).
subject_typestring
Filter by subject type.one of Assumption · Task
delete_dev_docSoft-delete a dev document by title or UUID. Reversible from trash. Pass `category` when multiple docs share the same title across subcategories (memory/claude/cursor/env/docs).3 params

Soft-delete a dev document by title or UUID. Reversible from trash. Pass `category` when multiple docs share the same title across subcategories (memory/claude/cursor/env/docs).

Parameters* required
categorystring
Subcategory to disambiguate title
idstring
Document UUID
titlestring
Document title
get_setup_guideGet instructions for setting up AI Note MCP in Claude Desktop, Cursor, or other MCP clients. No authentication required.

Get instructions for setting up AI Note MCP in Claude Desktop, Cursor, or other MCP clients. No authentication required.

No parameters. Call it with no arguments.

vault_createCreate a new private vault as a GitHub repository under the user's account. Requires the user to have completed the GitHub App install flow first.3 params

Create a new private vault as a GitHub repository under the user's account. Requires the user to have completed the GitHub App install flow first.

Parameters* required
descriptionstring
Optional GitHub repo description.
name*string
Vault display name. The GitHub repo name (slug) is derived from it unless `slug` is given.
slugstring
Optional explicit repo slug (ASCII lowercase-hyphen). Required when `name` has no ASCII letters or digits — e.g. a Korean-only name — because GitHub repo names are ASCII-only.
vault_syncWrapper around vault file sync. action=list|pull|push to work against the primary vault. list/pull are paginated — narrow with `path`/`since` and follow `next_cursor` instead of pulling the whole vault. To fetch specific files, pull with `paths` (up to 100 exact paths, one cal...8 params

Wrapper around vault file sync. action=list|pull|push to work against the primary vault. list/pull are paginated — narrow with `path`/`since` and follow `next_cursor` instead of pulling the whole vault. To fetch specific files, pull with `paths` (up to 100 exact paths, one cal...

Parameters* required
actionstring
Sync action. Default list.one of list · pull · push
contentstring
Required for push (or `content_b64`). Prefix with '__B64__:' for WAF bypass.
content_b64string
Optional: base64-encoded content (use INSTEAD of `content`) for WAF-bypass on large bodies. Server decodes before storing.
cursorstring
Pass `next_cursor` from the previous response to fetch the next page.
limitinteger
Max entries per page. list: default 200, max 1000. pull: default 25, max 100.
pathstring
push: target file path. list/pull: a directory (everything under it, e.g. 'global') or an exact file path (e.g. 'global/MEMORY.md'); a trailing slash is ignored.
pathsarray
pull only: up to 100 exact file paths fetched in ONE call. The response lists absent paths in `missing`. Cannot be combined with path/since/cursor.
sincestring
ISO 8601 timestamp for incremental list/pull (files updated strictly after it). Deletions are not reported — compare a full list against your local copy to find them.
sync_pushPush a markdown file into the primary vault. Optional CAS via base_sha to detect concurrent multi-PC writes (Layer 3 of multi-PC sync plan). WAF-bypass tip: large bodies (~10KB+) that get false-positive blocked at Cloudflare can be sent via `content_b64` (base64-encoded) OR `c...8 params

Push a markdown file into the primary vault. Optional CAS via base_sha to detect concurrent multi-PC writes (Layer 3 of multi-PC sync plan). WAF-bypass tip: large bodies (~10KB+) that get false-positive blocked at Cloudflare can be sent via `content_b64` (base64-encoded) OR `c...

Parameters* required
base_shastring
Optional: git_sha the client last observed for this path. When present, server compares with current git_sha and returns -32009 conflict on mismatch (with current content for 3-way diff). Omit for...
contentstring
Full file content (markdown text). Alternatively prefix with '__B64__:' followed by base64 payload for WAF bypass.
content_b64string
Optional: base64-encoded file content (use INSTEAD of `content`). For WAF-bypass on large bodies. Server decodes before storing. If both supplied, content_b64 wins.
device_idstring
Optional: client device identifier (e.g., from ~/.claude/ainote-sync/device.id). Stored on FileIndex so future conflict responses can report which device last wrote the path.
forceboolean
Optional: when true, skip CAS check even if base_sha is supplied. Use only for intentional overwrites; presence is auditable via warning logs.
path*string
Relative file path (e.g., 'global/MEMORY.md', 'launchcrew/firebase.md'). No leading slash, no '..'.
resolves_conflict_idstring
Optional: UUID of a vault_conflicts row this push resolves. When supplied, server validates ownership/unresolved/path/sha and atomically marks the conflict as resolution=clean inside the same trans...
supports_supersededboolean
Optional capability opt-in. When true AND resolves_conflict_id points at an already-resolved conflict whose (path, remote_sha) matches this push, the server returns a NORMAL 200 with resource_data...
sync_push_batchPush MANY files into the primary vault in ONE call. Use this instead of looping sync_push whenever you have more than a couple of changed paths — the cost of sync_push is round trips, not bytes. Per-item semantics are identical to sync_push (Layer 3 base_sha CAS, superseded co...4 params

Push MANY files into the primary vault in ONE call. Use this instead of looping sync_push whenever you have more than a couple of changed paths — the cost of sync_push is round trips, not bytes. Per-item semantics are identical to sync_push (Layer 3 base_sha CAS, superseded co...

Parameters* required
device_idstring
Optional batch-level device identifier; per-item device_id overrides it.
idempotency_key*string
REQUIRED. Opaque client-generated UUID, one per batch ATTEMPT-SET: reuse the same key when retrying the same items after a timeout (the server replays the stored results instead of re-applying), an...
items*array
Up to 200 push items, 4MB total, one entry per unique path. Duplicate paths reject the whole batch.
supports_supersededboolean
Same capability opt-in as sync_push, applied to every item in the batch.
sync_changesRead changes from the primary vault in sequence order, including deletions. Start with since_seq=0 for a full listing; then pass next_seq and feed_epoch on each page. Default limit 500, max 1000. On reset_required, discard the cursor and restart from 0 without an epoch. On fee...3 params

Read changes from the primary vault in sequence order, including deletions. Start with since_seq=0 for a full listing; then pass next_seq and feed_epoch on each page. Default limit 500, max 1000. On reset_required, discard the cursor and restart from 0 without an epoch. On fee...

Parameters* required
feed_epochstring
Epoch from the previous response; a mismatch requires a full reset.
limitinteger
Max combined file and deletion entries per page.default: 500
since_seqinteger
Last applied sequence; 0 starts a full listing.default: 0
sync_deleteDelete a file from the primary vault. Optional CAS via base_sha to detect concurrent multi-PC writes. Protected paths (global/memory/, global/skills/, global/planning/, global/intent/, global/claude-config/, handoffs/) require base_sha or explicit force:true (audited). Idempot...4 params

Delete a file from the primary vault. Optional CAS via base_sha to detect concurrent multi-PC writes. Protected paths (global/memory/, global/skills/, global/planning/, global/intent/, global/claude-config/, handoffs/) require base_sha or explicit force:true (audited). Idempot...

Parameters* required
base_shastring
Optional: git_sha the client last observed for this path. When present, server compares with current git_sha and returns -32009 conflict on mismatch (with current content for 3-way diff).
device_idstring
Optional: client device identifier for audit log (e.g., from ~/.claude/ainote-sync/device.id).
forceboolean
Optional: when true, skip CAS check even if base_sha is supplied. Use only for intentional overwrites; presence is auditable via warning logs.
path*string
Relative file path to delete (e.g., 'global/_waf_probe.md'). No leading slash, no '..'.
sync_audit_layer5Record the result of a client-side Layer 5 codex review (sync.py merge gate) as a vault_events row. Body of the review is NOT stored — only an HMAC digest of the summary so operators can correlate without exposing review content. Opt-in: server skips writes (still returns succ...5 params

Record the result of a client-side Layer 5 codex review (sync.py merge gate) as a vault_events row. Body of the review is NOT stored — only an HMAC digest of the summary so operators can correlate without exposing review content. Opt-in: server skips writes (still returns succ...

Parameters* required
chunk_countinteger
Optional: number of diff chunks the client fed to codex.
duration_msinteger
Optional: wall-clock time of the codex review on the client.
path*string
Vault path the review covered.
summarystring
Free-form codex output summary. Server HMACs this; raw text is NEVER stored.
verdict*string
One of: pass, flag, block, error.
handoff_saveSave a session handoff note for cross-device / cross-session continuation. Stored at handoffs/{project}-{topic}-{YYYY-MM-DD}.txt in the user's primary vault. Use the optional `time` param (HHMM, KST) to disambiguate multiple handoffs saved on the same day — it is appended to t...7 params

Save a session handoff note for cross-device / cross-session continuation. Stored at handoffs/{project}-{topic}-{YYYY-MM-DD}.txt in the user's primary vault. Use the optional `time` param (HHMM, KST) to disambiguate multiple handoffs saved on the same day — it is appended to t...

Parameters* required
contentstring
Full handoff text. Should follow the session-handoff skill template (현재 상태 / 작업 위치 / 수정 파일 / 결정 사항 / 다음 STEP / 알려진 이슈). WAF-bypass tip: prefix the string with '__B64__:' followed by base64-encoded...
content_b64string
Optional: base64-encoded handoff text (use INSTEAD of `content`). For WAF-bypass on large bodies. Server decodes before storing.
datestring
Optional override date (YYYY-MM-DD). Defaults to today in server timezone.
device_idstring
Optional: client device identifier (e.g., from ~/.claude/ainote-sync/device.id). Stored on FileIndex so future conflict responses can report which device last wrote the handoff. Same field sync_pus...
project*string
Project slug, e.g. 'logi', 'ainote', 'krx_ai'. Lowercase, no spaces.
timestring
Optional time-of-day suffix in HHMM 24h format (KST), e.g. '1555'. Appended to the topic slug so multiple handoffs on the same day stay distinguishable. Omit for once-per-day saves.
topic*string
Short topic slug for this handoff, e.g. 'phase-d-port', 'oauth-fix'. Lowercase-hyphen.
graph_soft_deleteSoft-delete an env_sync graph node (sets deleted_at; .live scope hides it from reads). Idempotent — re-deleting a deleted node is a no-op success.3 params

Soft-delete an env_sync graph node (sets deleted_at; .live scope hides it from reads). Idempotent — re-deleting a deleted node is a no-op success.

Parameters* required
client_hlcstring
device_id*string
node_id*string
env_sync.secret_pushPush a new client-encrypted secret. Ciphertext only — server never sees plaintext. Recipients must include the pushing device's own pubkey.6 params

Push a new client-encrypted secret. Ciphertext only — server never sees plaintext. Recipients must include the pushing device's own pubkey.

Parameters* required
alias*string
ciphertext_b64*string
client_hlcstring
device_id*string
kind*string
one of api_key · oauth_token · private_key · passphrase
recipients*array
env_sync.secret_pullPull an encrypted secret blob. Response is ciphertext_b64 only — server never sees and never returns plaintext.3 params

Pull an encrypted secret blob. Response is ciphertext_b64 only — server never sees and never returns plaintext.

Parameters* required
aliasstring
device_idstring
Optional calling device id for audit attribution. The X-Ainote-Device-Id header is the canonical source; this argument is the backwards-compatible fallback for clients that predate the header. If b...
node_idstring
env_sync.secret_rotateRotate a secret: soft-delete the old node, create a new live node with the same alias and the new ciphertext+recipients. 7-day grace before hard delete of old ciphertext bytes.5 params

Rotate a secret: soft-delete the old node, create a new live node with the same alias and the new ciphertext+recipients. 7-day grace before hard delete of old ciphertext bytes.

Parameters* required
client_hlcstring
device_id*string
new_ciphertext_b64*string
new_recipients*array
node_id*string
env_sync_txn_pushIngest a batched envelope of client-recorded env_sync mutations. HLC-skew gated, partial-success on conflict.2 params

Ingest a batched envelope of client-recorded env_sync mutations. HLC-skew gated, partial-success on conflict.

Parameters* required
device_idstring
Optional calling device id for audit attribution. The X-Ainote-Device-Id header is the canonical source; this argument is the backwards-compatible fallback for clients that predate the header. If b...
operations*array
env_sync_txn_rollbackInverse-apply a prior env_sync transaction. Safety gates: ownership, idempotency, descendant-conflict (force opt-out).4 params

Inverse-apply a prior env_sync transaction. Safety gates: ownership, idempotency, descendant-conflict (force opt-out).

Parameters* required
device_idstring
Optional calling device id for audit attribution. The X-Ainote-Device-Id header is the canonical source; this argument is the backwards-compatible fallback for clients that predate the header. If b...
forceboolean
default: false
include_descendantsboolean
default: false
txn_id*string
tasks_readRead tasks and task categories. action: tasks | categories (consolidated surface — same handlers as the legacy tools)19 params

Read tasks and task categories. action: tasks | categories (consolidated surface — same handlers as the legacy tools)

Parameters* required
action*string
which operation to runone of tasks · categories
category_idstring
[tasks] Filter by category UUID
completed_date_endstring
[tasks] Filter tasks completed <= this date (ISO 8601 format)
completed_date_startstring
[tasks] Filter tasks completed >= this date (ISO 8601 format)
created_date_endstring
[tasks] Filter tasks created <= this date (ISO 8601 format)
created_date_startstring
[tasks] Filter tasks created >= this date (ISO 8601 format)
due_date_endstring
[tasks] Filter tasks with due_date <= this date (ISO 8601 format)
due_date_startstring
[tasks] Filter tasks with due_date >= this date (ISO 8601 format)
due_todayboolean
[tasks] Filter tasks due today
has_notificationboolean
[tasks] Filter by notification enabled status
is_importantboolean
[tasks] Filter by important tasks only
limitnumber
[tasks] Maximum number of tasks to return (default: 25, max: 500)
locationstring
[tasks] Filter by location (partial match, e.g., '여의도', '서울')
offsetnumber
[tasks] Number of tasks to skip for pagination (default: 0). Use with limit to fetch additional pages.
overdueboolean
[tasks] Filter overdue incomplete tasks (due_date < today)
searchstring
[tasks] Search keyword in task content and notes (case-insensitive partial match)
sort_bystring
[tasks] Sort field (default: created_at)one of due_date · created_at · completed_at · updated_at · is_important
sort_orderstring
[tasks] Sort order (default: desc)one of asc · desc
statusstring
[tasks] Filter by task statusone of pending · completed
task_writeCreate or update a task. action: create | update. Deletion is a separate tool (delete_task). (consolidated surface — same handlers as the legacy tools) Required per action — create: content | update: id.19 params

Create or update a task. action: create | update. Deletion is a separate tool (delete_task). (consolidated surface — same handlers as the legacy tools) Required per action — create: content | update: id.

Parameters* required
action*string
which operation to runone of create · update
category_idstring
[create] Category ID (UUID) to organize the task [update] Update category ID (or 'null' to remove category)
completed_atstring
[update] Mark as completed (ISO format) or 'null' to uncomplete
contentstring
[create] Task content (required) [update] New task content
due_datestring
[create] Due date in ISO format (e.g., '2026-01-28' or '2026-01-28T15:00:00+09:00') [update] Update due date in ISO format (or 'null' to clear)
due_timestring
[create] Due time in HH:MM format (e.g., '15:00'). If not provided, task is treated as all-day. [update] Update due time in HH:MM format (or 'null' to make all-day)
has_notificationboolean
[create] Enable reminder notifications (default: false) [update] Enable/disable reminder notifications
idstring
[update] Task ID (required)
is_all_dayboolean
[create] Mark as all-day event — suppresses time-of-day rendering. [update] Toggle all-day mode.
is_importantboolean
[create] Mark task as important (default: false) [update] Update important status
locationstring
[create] Location where the task takes place [update] Update location (or 'null' to clear)
location_latnumber
[create] GPS latitude. Pair with location_lng. [update] Update GPS latitude.
location_lngnumber
[create] GPS longitude. Pair with location_lat. [update] Update GPS longitude.
notesstring
[create] Additional notes or details for the task [update] Update notes (or 'null' to clear)
reminder_timinginteger
[create] Minutes before due time to send reminder (e.g., 10 for 10 minutes before). Default: 30. Only used when has_notification is true. [update] Minutes before due time to send reminder (e.g., 10...
reminder_timingsarray
[create] Multiple reminder offsets in minutes before due time (e.g., [10, 60] fires 10 min and 1 hour before). Overrides reminder_timing if provided. [update] Multiple reminder offsets in minutes b...
repeat_rulestring
[create] Recurrence rule (e.g., 'daily', 'weekly', 'monthly', 'yearly', or RRULE format) [update] Update recurrence rule (or 'null' to make non-recurring)
start_datestring
[create] Start date for date range tasks in ISO format (e.g., for multi-day events) [update] Update start date in ISO format (or 'null' to clear)
travel_timenumber
[create] Minutes of travel time to allow before due_date. [update] Update travel-time minutes.
dev_docs_readRead dev docs. action: get | list | categories | pull (consolidated surface — same handlers as the legacy tools)7 params

Read dev docs. action: get | list | categories | pull (consolidated surface — same handlers as the legacy tools)

Parameters* required
action*string
which operation to runone of get · list · categories · pull
categorystring
[get] Subcategory (claude, cursor, etc.) to disambiguate title [list] Subcategory filter (claude, cursor, windsurf, copilot, docs, etc.). Omit to list all dev docs. [pull] Subcategory filter. Omit...
content_typestring
[list] Filter by content typeone of markdown · json · yaml · text
idstring
[get] Document UUID
include_versionsboolean
[get] Include version history (default: false)
searchstring
[list] Search keyword in document title
titlestring
[get] Document title (e.g., project-a-memory.md)
dev_doc_writeCreate or update a dev doc. action: create | update. Deletion is a separate tool (delete_dev_doc). (consolidated surface — same handlers as the legacy tools) Required per action — create: title, content | update: content.9 params

Create or update a dev doc. action: create | update. Deletion is a separate tool (delete_dev_doc). (consolidated surface — same handlers as the legacy tools) Required per action — create: title, content | update: content.

Parameters* required
action*string
which operation to runone of create · update
categorystring
[create] Subcategory: memory | claude | cursor | env | docs | custom. Default: docs [update] Subcategory to disambiguate title
contentstring
[create] Full file content (markdown, json, yaml, text) [update] New content
content_typestring
[create] Content type. Auto-detected from title extension if omitted.one of markdown · json · yaml · text
idstring
[update] Document UUID
local_pathstring
[create] Absolute path on this machine (e.g., ~/.claude/projects/-Users-seunghan/memory/MEMORY.md). Used by pull_dev_docs to restore file on other devices. Supports ~ expansion. [update] Update the...
memory_typestring
[create] Memory update semantics: 'state' = latest value replaces the past (used by memory_search latest_state mode), 'event' = immutable accumulating log, 'preference' = user preference. Omit for...one of state · event · preference
modestring
[update] Update mode (default: replace)one of replace · append · prepend
titlestring
[create] Filename as title (e.g., ainote-memory.md, project-claude.md) [update] Document title
sync_readRead-only vault sync operations. action: list | pull | diff | merge | conflicts. Writes (push/delete) are separate tools — they carry CAS semantics. (consolidated surface — same handlers as the legacy tools) Required per action — diff: path | merge: path, base_text, local_text.10 params

Read-only vault sync operations. action: list | pull | diff | merge | conflicts. Writes (push/delete) are separate tools — they carry CAS semantics. (consolidated surface — same handlers as the legacy tools) Required per action — diff: path | merge: path, base_text, local_text.

Parameters* required
action*string
which operation to runone of list · pull · diff · merge · conflicts
base_shastring
[merge] Optional: git_sha the client believes is the merge base. When supplied, server verifies (informational; merge still runs).
base_textstring
[diff] Optional: client's baseline (last-known remote). When supplied along with local_text, response includes both diffs (base → remote, base → local) so the client can render a 3-way view. [merge...
cursorstring
[list] Pass `next_cursor` from the previous response to fetch the next page. [pull] Pass `next_cursor` from the previous response to fetch the next page.
device_idstring
[merge] Optional: client device identifier. Recorded on any vault_conflict row created downstream.
limitinteger
[list] Max entries per page. Default 200, max 1000. [pull] Max files per page. Default 25, max 100. [conflicts] Optional: max rows to return (default 50, max 200).
local_textstring
[diff] Optional: client's current text. When supplied, response includes unified diff (remote → local). [merge] Current local text on the client (post-edit). Required.
pathstring
[list] A directory to list (everything under it, e.g. 'global') or an exact file path (e.g. 'global/MEMORY.md'). A trailing slash is ignored. Omit to list from the first page. [pull] Optional filte...
pathsarray
[pull] Up to 100 exact file paths fetched in ONE call. Absent paths are listed in `missing`. Cannot be combined with path/since/cursor.
sincestring
[list] ISO 8601 timestamp. Only list files updated strictly after this time. Deletions are not reported — diff a full list against your local copy to find them. [pull] ISO 8601 timestamp. Only retu...
vault_readRead vault metadata. action: list | clone | status (consolidated surface — same handlers as the legacy tools) Required per action — clone: name.4 params

Read vault metadata. action: list | clone | status (consolidated surface — same handlers as the legacy tools) Required per action — clone: name.

Parameters* required
action*string
which operation to runone of list · clone · status
include_commit_shaboolean
[list] Include each vault's latest_commit_sha (default false). Costs one GitHub API round-trip per vault, so only ask for it when you actually need the remote HEAD.
namestring
[clone] Vault name or slug.
target_pathstring
[clone] Preferred local clone path for the returned instructions.
env_sync_readRead env-sync state. action: devices | drift | status | txn_pull. Secret reads are a separate tool (env_sync.secret_pull). (consolidated surface — same handlers as the legacy tools)7 params

Read env-sync state. action: devices | drift | status | txn_pull. Secret reads are a separate tool (env_sync.secret_pull). (consolidated surface — same handlers as the legacy tools)

Parameters* required
action*string
which operation to runone of devices · drift · status · txn_pull
cursorstring
[txn_pull]
device_idstring
[devices] Optional calling device id for audit attribution. The X-Ainote-Device-Id header is the canonical source; this argument is the backwards-compatible fallback for clients that predate the he...
include_staleboolean
[devices]default: true
limitinteger
[txn_pull]
opstring
[txn_pull]one of push · install · uninstall · reconcile · migrate · rollback
since_hlcstring
[txn_pull]
env_sync_writeNon-destructive env-sync writes. action: enroll | request_share | heartbeat. Secret push/rotate are separate tools. (consolidated surface — same handlers as the legacy tools) Required per action — enroll: alias, age_pubkey, enrollment_token | request_share: target_device_id, s...16 params

Non-destructive env-sync writes. action: enroll | request_share | heartbeat. Secret push/rotate are separate tools. (consolidated surface — same handlers as the legacy tools) Required per action — enroll: alias, age_pubkey, enrollment_token | request_share: target_device_id, s...

Parameters* required
action*string
which operation to runone of enroll · request_share · heartbeat
age_pubkeystring
[enroll]
aliasstring
[enroll]
capabilitiesobject
[enroll]
claude_code_versionstring
[heartbeat]
client_hlcstring
[request_share]
device_idstring
[enroll] Optional calling device id for audit attribution. The X-Ainote-Device-Id header is the canonical source; this argument is the backwards-compatible fallback for clients that predate the hea...
enrollment_tokenstring
[enroll]
installed_hooksarray
[heartbeat]
installed_hooks_hashstring
[heartbeat]
installed_mcp_servers_hashstring
[heartbeat]
installed_skillsarray
[heartbeat]
installed_skills_hashstring
[heartbeat]
osstring
[heartbeat]
secret_sharesarray
[request_share]
target_device_idstring
[request_share]
graph_readRead knowledge-graph nodes. action: get | list (consolidated surface — same handlers as the legacy tools)8 params

Read knowledge-graph nodes. action: get | list (consolidated surface — same handlers as the legacy tools)

Parameters* required
action*string
which operation to runone of get · list
aliasstring
[get]
cursorstring
[list] Opaque cursor (created_at ISO + id) from previous page's next_cursor
device_idstring
[get] Optional calling device id for audit attribution. The X-Ainote-Device-Id header is the canonical source; this argument is the backwards-compatible fallback for clients that predate the header...
limitinteger
[list]default: 100
node_idstring
[get]
node_typestring
[get] [list]one of skill · hook · mcp_server · secret · setting_fragment
updated_since_hlcstring
[list]
graph_writeAdd or update a graph entity. action: add | update. Deletion is a separate tool (graph_soft_delete). (consolidated surface — same handlers as the legacy tools) Required per action — add: node_type, alias, payload, device_id | update: node_id, device_id, field_updates.8 params

Add or update a graph entity. action: add | update. Deletion is a separate tool (graph_soft_delete). (consolidated surface — same handlers as the legacy tools) Required per action — add: node_type, alias, payload, device_id | update: node_id, device_id, field_updates.

Parameters* required
action*string
which operation to runone of add · update
aliasstring
[add]
client_hlcstring
[add] [update]
device_idstring
[add] [update]
field_updatesarray
[update]
node_idstring
[update]
node_typestring
[add]one of skill · hook · mcp_server · secret · setting_fragment
payloadobject
[add]
handoff_readRead session handoffs. action: get | list (consolidated surface — same handlers as the legacy tools) Required per action — get: project, topic.11 params

Read session handoffs. action: get | list (consolidated surface — same handlers as the legacy tools) Required per action — get: project, topic.

Parameters* required
action*string
which operation to runone of get · list
datestring
[get] Optional YYYY-MM-DD. Omit for latest.
has_blockersboolean
[list] v2 only: filter by frontmatter has_blockers (true/false).
limitinteger
[list] Max entries to return (default 50).
projectstring
[get] Project slug used at handoff_save time. [list] Optional project filter, e.g. 'logi' to list only logi-* handoffs.
sincestring
[list] ISO8601 timestamp — only entries with updated_at >= since are returned.
statusstring
[list] v2 only: filter by frontmatter status (e.g. 'in_progress', 'paused', 'completed', 'blocked'). v1 handoffs without frontmatter are excluded when this filter is set.
tagsarray
[list] v2 only: AND match — entries must contain ALL given tags. Example: ['auth', 'mobile'].
task_typestring
[list] v2 only: filter by frontmatter task_type (e.g. 'feature', 'bugfix', 'refactor', 'research', 'ops').
timestring
[get] Optional HHMM (24h, KST) — same value passed at save time. Required to disambiguate when multiple handoffs share the same project/topic/date.
topicstring
[get] Topic slug used at handoff_save time.
memory_readRead agent memory. action: get | search (consolidated surface — same handlers as the legacy tools) Required per action — get: source | search: query.9 params

Read agent memory. action: get | search (consolidated surface — same handlers as the legacy tools) Required per action — get: source | search: query.

Parameters* required
action*string
which operation to runone of get · search
hopinteger
[search] Expand results by following [[wikilinks]] N hops from keyword hits (vault only). Scores decay 0.5 per hop. Default 0 (off).
idstring
[get] Item ID returned by memory_search
limitinteger
[search] Max results (default 10, max 20)
modestring
[search] keyword (default) or latest_stateone of keyword · latest_state
pathstring
[get] vault_file only: file path inside the vault (e.g. 'global/MEMORY.md')
querystring
[search] Search text (e.g. 'render deploy key', 'ainote jwt'). May be blank only in latest_state mode.
sourcestring
[get] Which store the item lives in (use the `source` field from memory_search results)one of paper · vault_file
sourcesarray
[search] Memory stores to search. Default: both.

Sponsors

Configuration

AINOTE_API_KEY*secret

64-character ainote MCP key. Issue one via `npx @ainote/mcp signup` (RFC 8628 device flow), or in a Claude session by calling signup_and_get_key, or at https://app.ainote.dev -> Settings -> MCP keys.

Readme

Details

Repository
github.com/seunghan91/ainote
Website
docs.ainote.dev
Category
AI & LLM Tools
Package
@ainote/mcp
Transport
STDIO, HTTP
Auth
Required
Registry
MCP registry, active
Tools verified
Nov 6, 2026

Related AI & LLM Tools MCP servers

View all
1shelldrop-sh avatarShell Dropshelldrop-sh/agent-skillsRead-only help with SSH, tmux and Tailscale setup for running AI agents from an iPhone or iPad.0stars
2shree-git avatarSendItshree-git/sendit-agent-integrationsPublish and schedule social posts, upload media, and review analytics through OAuth.0stars
3solonai-com avatarGrantAi Memorysolonai-com/grantaiPersistent memory for AI agents. Infinite context with sub-millisecond recall.0stars
4solvohq avatarDependency Migration Mcpsolvohq/dependency-migration-mcpThrough-the-upgrade dependency-migration briefs for LLM coding agents.0stars
5srotzin avatarHive Address Screensrotzin/hive-mcp-address-screenHiveAddressScreen MCP — pre-settlement on-chain risk screen. 17-vector GoPlus rail0stars
6srotzin avatarHive Keet Bridgesrotzin/hive-mcp-keet-bridgeMCP server bridging holepunchto/keet-identity-key to the Hive agentic identity network0stars