Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

io.github.seunghan91/ainote

REMOTE · API.AINOTE.DEV · 2 COMPONENTS · SCANNED SEP 22

Agent-native notes, tasks, dev-docs, vaults, sync & handoffs. MCP + OpenAPI dual surface.

0 this week 81 Trust /100
Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score → Why this is hard to score →

Endpoint Security63
Transport & Reachability100
Schema Quality & AI Usability76
  • 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
  • AI-judged instruction clarity (excellent).Pass
  • Context-footprint check failed: tool/resource definitions use about 8311 tokens (~224/item across 37 items; 35 tools + 2 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management100
  • No destabilizing schema changes in the last 30 days.Pass
Tool Coverage97
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 91% of tool parameters carry a description.Partial
Tool Safety100
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • All 4 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
  • An AI judge read all 36 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a current MCP spec version (2026-07-28).Pass
Install

How do I install the io.github.seunghan91/ainote MCP server?

io.github.seunghan91/ainote is a hosted endpoint at https://api.ainote.dev/api/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

remote · api.ainote.dev

# add to Claude Code
claude mcp add --transport http seunghan91-ainote 'https://api.ainote.dev/api/mcp'
// .cursor/mcp.json
{
  "mcpServers": {
    "seunghan91-ainote": {
      "url": "https://api.ainote.dev/api/mcp"
    }
  }
}
// .vscode/mcp.json
{
  "servers": {
    "seunghan91-ainote": {
      "type": "http",
      "url": "https://api.ainote.dev/api/mcp"
    }
  }
}
# ~/.codex/config.toml
[mcp_servers.seunghan91-ainote]
url = "https://api.ainote.dev/api/mcp"
// opencode.json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "seunghan91-ainote": {
      "type": "remote",
      "url": "https://api.ainote.dev/api/mcp",
      "enabled": true
    }
  }
}
# add to OpenClaw
openclaw mcp add seunghan91-ainote --url 'https://api.ainote.dev/api/mcp' --transport streamable-http
# ~/.hermes/config.yaml
mcp_servers:
  seunghan91-ainote:
    url: "https://api.ainote.dev/api/mcp"
// ~/.netclaw/config/netclaw.json
{
  "McpServers": {
    "seunghan91-ainote": {
      "Transport": "http",
      "Url": "https://api.ainote.dev/api/mcp"
    }
  }
}
# add to Vellum
assistant mcp add seunghan91-ainote -t streamable-http -u 'https://api.ainote.dev/api/mcp'
// mcp.json
{
  "mcpServers": {
    "seunghan91-ainote": {
      "type": "http",
      "url": "https://api.ainote.dev/api/mcp"
    }
  }
}

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 9 Sept 26 0
    • Tool “sync_delete” rewrote its description, which is the text the model reads security
  • 7 Sept 26 +10
    • Stability: fail → pass security
  • 26 Aug 26 +1
    • We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
  • 25 Aug 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 29 to 32.

  • 19 Aug 26 0
    • Tool “vault_sync” rewrote its description, which is the text the model reads security
    • “vault_sync” added an optional parameter “limit” cosmetic
    • “vault_sync” added an optional parameter “cursor” cosmetic
    • “sync_read” added an optional parameter “cursor” cosmetic
    • “sync_read” reworded the description of “path” cosmetic
    • “sync_read” reworded the description of “since” cosmetic
    • “sync_read” reworded the description of “limit” cosmetic
  • 13 Aug 26 0
    • MCP protocol: Implements a current MCP spec version (2026-07-28). functional
    • MCP protocol version: 2025-11-25 → 2026-07-28 functional
  • 12 Aug 26 0
    • “env_sync.secret_pull” added an optional parameter “device_id” cosmetic
    • “graph_read” added an optional parameter “device_id” cosmetic
    • “env_sync_txn_rollback” added an optional parameter “device_id” cosmetic
    • “env_sync_txn_push” added an optional parameter “device_id” cosmetic
    • “env_sync_read” reworded the description of “device_id” cosmetic
    • “env_sync_write” reworded the description of “device_id” cosmetic

    6 cosmetic changes on this day. Switch on “Show cosmetic changes” to see them.

  • 11 Aug 26 0
    • We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 22 Sept 2026 · Probed https://api.ainote.dev/api/mcp

TLS valid

Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .

Subject Issuer Valid from Valid until Key Signature Serial
CN=api.ainote.dev CN=WE1,O=Google Trust Services,C=US 18 Sept 2026 17 Dec 2026 ECDSA 256 ECDSA-SHA256 8a32e54e7f935a510e8215f30dbca9b4
SANs: api.ainote.dev
CN=WE1,O=Google Trust Services,C=US (CA) CN=GTS Root R4,O=Google Trust Services LLC,C=US 13 Dec 2023 20 Feb 2029 ECDSA 256 ECDSA-SHA384 7ff31977972c224a76155d13b6d685e3
CN=GTS Root R4,O=Google Trust Services LLC,C=US (CA) CN=GlobalSign Root CA,OU=Root CA,O=GlobalSign nv-sa,C=BE 15 Nov 2023 28 Jan 2028 ECDSA 384 SHA256-RSA 7fe530bf331343bedd821610493d8a1b

Background: What to check on a remote MCP endpoint →

DNSSEC insecure

Validation of api.ainote.dev. Not signed

Zone DS Keys Algorithms Outcome
. trust_anchor 20326, 38696 8, 8 Verified
dev. present 60074 8 Verified
ainote.dev. absent Unsigned (proven) parent-signed NSEC/NSEC3 proves an unsigned delegation
Authentication No authorisation required

The endpoint answered without asking for a token. Anyone who knows the URL can reach it.

Result No authorisation required
HTTP status 200
Header Value
strict-transport-security max-age=63072000; includeSubDomains
content-security-policy default-src 'self'; base-uri 'self'; object-src 'none'; frame-ancestors 'self'; form-action 'self' https://accounts.google.com https://appleid.apple.com; img-src 'self' data: blob: https:; font-src 'self' data: https:; style-src 'self' 'unsafe-inline' https:; connect-src 'self' https:; script-src 'self' https: 'nonce-TNgz3cTFSXlhc1nAhYSv5Q=='; frame-src 'self' https:; manifest-src 'self'; worker-src 'self' blob:
x-content-type-options nosniff
x-frame-options SAMEORIGIN
referrer-policy strict-origin-when-cross-origin

Background: How OAuth 2.1 works in the 2026 MCP spec →

Transports 2 probes
Transport URL Outcome Status Location
streamable-http https://api.ainote.dev/api/mcp Verified 200
http (plaintext) http://api.ainote.dev/api/mcp HTTPS enforced 301 https://api.ainote.dev/api/mcp
MCP tools · 35 exposed · ~8,257 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
assumption_write ~216

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 can only shape the assumption itself: what is being assumed, how critical it is, and what evidence would settle it.

NameTypeReqDescription
bmc_blockstringOptional Business Model Canvas block this assumption belongs to. Pass 'null' to clear.
criticalityinteger1=critical if wrong … 3=minor.
evidence_conditionstringWhat would be observed to settle this assumption. Pass 'null' to clear.
idstringAssumption UUID to update. Omit to create a new assumption.
project_idstringyesProject UUID this assumption belongs to (required).
statementstringWhat is being assumed true (required to create).

No output schema declared.

No examples provided.

auth_key ~117

Obtain an MCP key. action: login | signup (consolidated surface — same handlers as the legacy tools) Required per action — login: email, password | signup: email, password.

NameTypeReqDescription
actionstringyeswhich operation to run
emailstring[login] Your account email address [signup] Email address for the new account
namestring[signup] Display name (optional)
passwordstring[login] Your account password [signup] Password (minimum 6 characters)

No output schema declared.

No examples provided.

delete_dev_doc ~80

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).

NameTypeReqDescription
categorystringSubcategory to disambiguate title
idstringDocument UUID
titlestringDocument title

No output schema declared.

No examples provided.

delete_task ~67

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.

NameTypeReqDescription
idstringyesTask ID to delete

No output schema declared.

No examples provided.

dev_doc_write ~364

Create or update a dev doc (non-destructive). 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.

NameTypeReqDescription
actionstringyeswhich operation to run
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.
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 l…
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 pl…
modestring[update] Update mode (default: replace)
titlestring[create] Filename as title (e.g., ainote-memory.md, project-claude.md) [update] Document title

No output schema declared.

No examples provided.

dev_docs_read ~197

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

NameTypeReqDescription
actionstringyeswhich operation to run
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 to…
content_typestring[list] Filter by content type
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)

No output schema declared.

No examples provided.

env_sync_read ~300

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)

NameTypeReqDescription
actionstringyeswhich operation to run
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 head…
include_staleboolean[devices]
limitinteger[txn_pull]
opstring[txn_pull]
since_hlcstring[txn_pull]

No output schema declared.

No examples provided.

env_sync_txn_push ~105

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

NameTypeReqDescription
device_idstringOptional 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 bot…
operationsarrayyes

No output schema declared.

No examples provided.

env_sync_txn_rollback ~125

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

NameTypeReqDescription
device_idstringOptional 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 bot…
forceboolean
include_descendantsboolean
txn_idstringyes

No output schema declared.

No examples provided.

env_sync_write ~348

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, secret_shares, device_id | heartbeat: device_id, installed_skills_hash, installed_hooks_hash.

NameTypeReqDescription
actionstringyeswhich operation to run
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 heade…
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]

No output schema declared.

No examples provided.

env_sync.secret_pull ~108

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

NameTypeReqDescription
aliasstring
device_idstringOptional 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 bot…
node_idstring

No output schema declared.

No examples provided.

env_sync.secret_push ~86

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

NameTypeReqDescription
aliasstringyes
ciphertext_b64stringyes
client_hlcstring
device_idstringyes
kindstringyes
recipientsarrayyes

No output schema declared.

No examples provided.

env_sync.secret_rotate ~95

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.

NameTypeReqDescription
client_hlcstring
device_idstringyes
new_ciphertext_b64stringyes
new_recipientsarrayyes
node_idstringyes

No output schema declared.

No examples provided.

get_setup_guide ~33

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

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

graph_read ~245

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

NameTypeReqDescription
actionstringyeswhich operation to run
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]
node_idstring[get]
node_typestring[get] [list]
updated_since_hlcstring[list]

No output schema declared.

No examples provided.

graph_soft_delete ~70

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.

NameTypeReqDescription
client_hlcstring
device_idstringyes
node_idstringyes

No output schema declared.

No examples provided.

graph_write ~162

Add or update a graph entity (non-destructive). 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.

NameTypeReqDescription
actionstringyeswhich operation to run
aliasstring[add]
client_hlcstring[add] [update]
device_idstring[add] [update]
field_updatesarray[update]
node_idstring[update]
node_typestring[add]
payloadobject[add]

No output schema declared.

No examples provided.

handoff_read ~366

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

NameTypeReqDescription
actionstringyeswhich operation to run
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.

No output schema declared.

No examples provided.

handoff_save ~430

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 the topic slug (e.g. topic='phase-d', time='1555' → handoffs/{project}-phase-d-1555-{date}.txt).

NameTypeReqDescription
contentstringFull handoff text. Should follow the session-handoff skill template (현재 상태 / 작업 위치 / 수정 파일 / 결정 사항 / 다음 STEP / 알려진 이슈). WAF-bypass tip: prefix the string with '__B64__:' followed by base64-encoded pa…
content_b64stringOptional: base64-encoded handoff text (use INSTEAD of `content`). For WAF-bypass on large bodies. Server decodes before storing.
datestringOptional override date (YYYY-MM-DD). Defaults to today in server timezone.
device_idstringOptional: 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_push…
projectstringyesProject slug, e.g. 'logi', 'ainote', 'krx_ai'. Lowercase, no spaces.
timestringOptional 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.
topicstringyesShort topic slug for this handoff, e.g. 'phase-d-port', 'oauth-fix'. Lowercase-hyphen.

No output schema declared.

No examples provided.

judgment_list ~155

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.

NameTypeReqDescription
decisionstringFilter by decision. Omit for all.
kindstringFilter by kind.
limitintegerMax rows to return (default 50, max 200).
project_idstringFilter by project UUID.
risk_tierintegerFilter by risk_tier.
subject_idstringFilter by subject UUID (pair with subject_type).
subject_typestringFilter by subject type.

No output schema declared.

No examples provided.

judgment_submit ~270

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 decides them (from the /command queue). Use judgment_list afterwards to check whether this judgment has since been decided. risk_tier controls urgency: 1=destructive (blocks execution until decided), 2=reversible (may auto-proceed after a wait window), 3=informational (auto-expires after 24h).

NameTypeReqDescription
evidenceobjectFree-form evidence attached to the request — links, numbers, diff summaries.
kindstringyesapproval | evidence | verdict.
project_idstringOptional project this judgment relates to.
risk_tierinteger1=destructive 2=reversible 3=informational. Default: 2.
subject_idstringOptional. UUID of the Assumption or Task this judgment is about.
subject_typestringOptional. Pair with subject_id. Only Assumption or Task are allowed.
summarystringyesOne sentence: what is being judged (required).

No output schema declared.

No examples provided.

list_papers ~217

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 search their knowledge base.

NameTypeReqDescription
category_idstringFilter by category UUID
limitnumberMaximum number of papers to return (default: 25, max: 200)
offsetnumberNumber to skip for pagination (default: 0)
paper_category_idstringFilter by paper-specific folder UUID
searchstringKeyword to match in paper title or content (case-insensitive partial match)
sort_bystringSort field (default: updated_at)
sort_orderstringSort order (default: desc)
source_typestringFilter by source type (e.g., 'manual', 'youtube', 'url', 'clipboard')

No output schema declared.

No examples provided.

memory_read ~256

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

NameTypeReqDescription
actionstringyeswhich operation to run
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_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)
sourcesarray[search] Memory stores to search. Default: both.

No output schema declared.

No examples provided.

project_read ~92

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).

NameTypeReqDescription
idstringFetch a single project by UUID. Omit to list all.
statusstringFilter by status. Omit to list all statuses.

No output schema declared.

No examples provided.

project_write ~138

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.

NameTypeReqDescription
idstringProject UUID to update. Omit to create a new project.
intentstringWhy this project exists, in one paragraph. Pass 'null' to clear.
namestringProject name (required to create).
statusstringactive | paused | archived.
success_criteriastringWhat observable outcome counts as success. Pass 'null' to clear.

No output schema declared.

No examples provided.

sync_audit_layer5 ~214

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 success) unless ENV['AINOTE_LAYER5_AUDIT']='on' AND a versioned HMAC secret is configured. Used by the sync.py SessionStart hook + merge command to surface 'why was this blocked?' across multi-PC sessions.

NameTypeReqDescription
chunk_countintegerOptional: number of diff chunks the client fed to codex.
duration_msintegerOptional: wall-clock time of the codex review on the client.
pathstringyesVault path the review covered.
summarystringFree-form codex output summary. Server HMACs this; raw text is NEVER stored.
verdictstringyesOne of: pass, flag, block, error.

No output schema declared.

No examples provided.

sync_delete ~224

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). Idempotent: deleting a non-existent path returns success with deleted:false.

NameTypeReqDescription
base_shastringOptional: 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_idstringOptional: client device identifier for audit log (e.g., from ~/.claude/ainote-sync/device.id).
forcebooleanOptional: when true, skip CAS check even if base_sha is supplied. Use only for intentional overwrites; presence is auditable via warning logs.
pathstringyesRelative file path to delete (e.g., 'global/_waf_probe.md'). No leading slash, no '..'.

No output schema declared.

No examples provided.

sync_push ~599

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 `content` prefixed with `__B64__:` instead. When the push CREATES a new .md file, the response may carry `dedup_candidates` — existing memory files that look similar (keyword + title similarity, no LLM). It is an advisory, not a rejection: YOU decide to merge into one of them (re-push that path), drop this write as a duplicate (skip), or keep it as a new memory (store).

NameTypeReqDescription
base_shastringOptional: 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 le…
contentstringFull file content (markdown text). Alternatively prefix with '__B64__:' followed by base64 payload for WAF bypass.
content_b64stringOptional: 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_idstringOptional: 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.
forcebooleanOptional: when true, skip CAS check even if base_sha is supplied. Use only for intentional overwrites; presence is auditable via warning logs.
pathstringyesRelative file path (e.g., 'global/MEMORY.md', 'launchcrew/firebase.md'). No leading slash, no '..'.
resolves_conflict_idstringOptional: 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 transac…
supports_supersededbooleanOptional 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 {s…

No output schema declared.

No examples provided.

sync_push_batch ~420

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 contract, content_b64 WAF fallback). Partial success is normal and returns HTTP 200: read `results[]` and match entries by `path`, NOT by position. A conflict result always carries `remote_sha` + `conflict_reason` so you can go straight to sync_merge. Request-level failures (duplicate paths in one batch, idempotency key reused with a different payload, >200 items, >4MB) return 4xx and apply NOTHING. Each item MUST carry `content_sha` (SHA1 hex of the decoded body, same algorithm as git_sha) — it powers both the integrity check and the retry-safe `skipped_identical` result. Newly created .md items may carry `dedup_candidates` (same merge/skip/store advisory as sync_push); a batch creating more than 10 new files skips the check entirely and reports `dedup_skipped: "bulk"`.

NameTypeReqDescription
device_idstringOptional batch-level device identifier; per-item device_id overrides it.
idempotency_keystringyesREQUIRED. 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), and…
itemsarrayyesUp to 200 push items, 4MB total, one entry per unique path. Duplicate paths reject the whole batch.
supports_supersededbooleanSame capability opt-in as sync_push, applied to every item in the batch.

No output schema declared.

No examples provided.

sync_read ~478

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.

NameTypeReqDescription
actionstringyeswhich operation to run
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] Directory to list (e.g., 'global'). Omit to list from the first page. [pull] Optional directory filter (e.g., 'global' to pull only global files) [diff] Relative vault path. [merge] Relative v…
sincestring[pull] ISO 8601 timestamp. Only return files updated after this time. Omit to start from the first page.

No output schema declared.

No examples provided.

task_write ~752

Create or update a task (non-destructive). 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.

NameTypeReqDescription
actionstringyeswhich operation to run
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 f…
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 bef…
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.

No output schema declared.

No examples provided.

tasks_read ~428

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

NameTypeReqDescription
actionstringyeswhich operation to run
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)
sort_orderstring[tasks] Sort order (default: desc)
statusstring[tasks] Filter by task status

No output schema declared.

No examples provided.

vault_create ~124

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.

NameTypeReqDescription
descriptionstringOptional GitHub repo description.
namestringyesVault display name. The GitHub repo name (slug) is derived from it unless `slug` is given.
slugstringOptional 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.

No output schema declared.

No examples provided.

vault_read ~129

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

NameTypeReqDescription
actionstringyeswhich operation to run
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.

No output schema declared.

No examples provided.

vault_sync ~247

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. For push: WAF-bypass via `content_b64` or `content: '__B64__:...'` prefix (mirrors sync_push).

NameTypeReqDescription
actionstringSync action. Default list.
contentstringRequired for push (or `content_b64`). Prefix with '__B64__:' for WAF bypass.
content_b64stringOptional: base64-encoded content (use INSTEAD of `content`) for WAF-bypass on large bodies. Server decodes before storing.
cursorstringPass `next_cursor` from the previous response to fetch the next page.
limitintegerMax entries per page. list: default 200, max 1000. pull: default 25, max 100.
pathstringRelative path filter or target file path.
sincestringISO 8601 timestamp for incremental pull.

No output schema declared.

No examples provided.

Common questions

What is the io.github.seunghan91/ainote MCP server?

io.github.seunghan91/ainote is an MCP server listed in the public MCP registry as io.github.seunghan91/ainote. Agent-native notes, tasks, dev-docs, vaults, sync & handoffs. MCP + OpenAPI dual surface. This page covers its hosted endpoint (https://api.ainote.dev/api/mcp).

Is the io.github.seunghan91/ainote MCP server safe to use?

io.github.seunghan91/ainote scores 81 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the io.github.seunghan91/ainote MCP server expose?

io.github.seunghan91/ainote exposes 35 tools: delete_task, list_papers, project_read, project_write, assumption_write, and 30 more. Their descriptions and schemas cost roughly 8,257 tokens of context every time the server is loaded.

Does the io.github.seunghan91/ainote MCP server require authentication?

No. We connected to io.github.seunghan91/ainote without credentials and it answered, so anything it exposes is reachable by anyone who knows the address.

Is the io.github.seunghan91/ainote MCP server still maintained?

io.github.seunghan91/ainote is still listed as active in the MCP registry. We last reached this channel on 22 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.