io.github.seunghan91/ainote
REMOTE · API.AINOTE.DEV · 2 COMPONENTS · SCANNED AUG 3
Agent-native notes, tasks, dev-docs, vaults, sync & handoffs. MCP + OpenAPI dual surface.
Available components
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 →
Endpoint Security63
- The endpoint's TLS certificate is valid, in date, and uses a strong key. View diagnostics → Pass
- Authorisation check failed: no authorisation is required to call this server, and it exposes a tool marked destructive (delete_task). See how to fix → View diagnostics → Fail
- HTTPS is enforced; there's no plaintext access path. View diagnostics → Pass
- The HSTS (Strict-Transport-Security) header is present. View diagnostics → Pass
- DNSSEC check failed: this domain isn't protected by DNSSEC. See how to fix → View diagnostics → Fail
Transport & Reachability100
- Verified streamable-http transport via a live MCP handshake. View diagnostics → Pass
Schema Quality & AI Usability69
- 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
- AI-judged instruction clarity (fair).Partial
- Context-footprint check failed: tool/resource definitions use about 7421 tokens (~137/item across 54 items; 52 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 Management27
- Stability observed for 8 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage91
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 74% of tool parameters carry a description.Partial
Capabilities40
- Spec-recency check failed: implements MCP spec 2025-03-26; the latest is 2026-07-28. See how to fix → Fail
Add this component to your MCP client. Where a client-specific snippet is available, pick your client below and copy it straight into your config; otherwise use the connection detail shown.
remote · api.ainote.dev
claude mcp add --transport http seunghan91-ainote https://api.ainote.dev/api/mcp
[mcp_servers.seunghan91-ainote] url = "https://api.ainote.dev/api/mcp"
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"seunghan91-ainote": {
"type": "remote",
"url": "https://api.ainote.dev/api/mcp",
"enabled": true
}
}
} openclaw mcp add seunghan91-ainote --url https://api.ainote.dev/api/mcp --transport streamable-http
mcp_servers:
seunghan91-ainote:
url: "https://api.ainote.dev/api/mcp" {
"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.
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.
- 2 Aug 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 20 to 23. That category is still filling its 30-day observation window: 6 days of observed history at the previous scan, 7 at this one. The score rises as the window fills, whether or not the server changes.
- 31 Jul 26 +2
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
- 30 Jul 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
- 28 Jul 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 3 to 7. That category is still filling its 30-day observation window: 1 days of observed history at the previous scan, 2 at this one. The score rises as the window fills, whether or not the server changes.
- 27 Jul 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
- 26 Jul 26 59
First indexed and scored.
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 3 Aug 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 | 21 Jul 2026 | 19 Oct 2026 | ECDSA 256 | ECDSA-SHA256 | 1c88ee15526688df0e49aca011eb192b |
| 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 |
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'; 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-OM35Xnw6SOLy1PT+hZfDSg=='; 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 |
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 |
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.
create_dev_doc ~427
Save a document to AI Note cloud for multi-device sync and persistent storage. PRIMARY USE CASES: - Memory files: ~/.claude/projects/.../memory/MEMORY.md (AI context that survives device switches) - AI config files: CLAUDE.md, .cursorrules, .windsurfrules (not in git, local-only) - Local env notes: API keys reference, server credentials (NOT actual secret values) - Project notes: architecture decisions, dev diaries, planning docs MULTI-DEVICE WORKFLOW: Laptop → push: create_dev_doc(title, content, local_path="~/.claude/.../MEMORY.md") Desktop → pull: pull_dev_docs() → automatically writes files to their local paths CATEGORIES (subcategories under dev/): - memory: Claude/AI memory files (~/.claude/projects/.../memory/) - claude: CLAUDE.md files and Claude-specific configs - cursor: .cursorrules files - env: environment notes and config references - docs: general project documentation Set local_path to enable pull_dev_docs auto-sync to this machine.
| Name | Type | Req | Description |
|---|---|---|---|
| category | string | — | Subcategory: memory | claude | cursor | env | docs | custom. Default: docs |
| content | string | yes | Full file content (markdown, json, yaml, text) |
| content_type | string | — | Content type. Auto-detected from title extension if omitted. |
| local_path | string | — | 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. |
| memory_type | string | — | 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 plain docum… |
| title | string | yes | Filename as title (e.g., ainote-memory.md, project-claude.md) |
No output schema declared.
No examples provided.
create_task ~406
Create a new task in AI Note. Supports full task creation with dates, times, location, notes, and notifications.
| Name | Type | Req | Description |
|---|---|---|---|
| category_id | string | — | Category ID (UUID) to organize the task |
| content | string | yes | Task content (required) |
| due_date | string | — | Due date in ISO format (e.g., '2026-01-28' or '2026-01-28T15:00:00+09:00') |
| due_time | string | — | Due time in HH:MM format (e.g., '15:00'). If not provided, task is treated as all-day. |
| has_notification | boolean | — | Enable reminder notifications (default: false) |
| is_all_day | boolean | — | Mark as all-day event — suppresses time-of-day rendering. |
| is_important | boolean | — | Mark task as important (default: false) |
| location | string | — | Location where the task takes place |
| location_lat | number | — | GPS latitude. Pair with location_lng. |
| location_lng | number | — | GPS longitude. Pair with location_lat. |
| notes | string | — | Additional notes or details for the task |
| reminder_timing | integer | — | Minutes before due time to send reminder (e.g., 10 for 10 minutes before). Default: 30. Only used when has_notification is true. |
| reminder_timings | array | — | Multiple reminder offsets in minutes before due time (e.g., [10, 60] fires 10 min and 1 hour before). Overrides reminder_timing if provided. |
| repeat_rule | string | — | Recurrence rule (e.g., 'daily', 'weekly', 'monthly', 'yearly', or RRULE format) |
| start_date | string | — | Start date for date range tasks in ISO format (e.g., for multi-day events) |
| travel_time | number | — | Minutes of travel time to allow before due_date. |
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).
| Name | Type | Req | Description |
|---|---|---|---|
| category | string | — | Subcategory to disambiguate title |
| id | string | — | Document UUID |
| title | string | — | Document 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.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | Task ID to delete |
No output schema declared.
No examples provided.
env_sync_txn_pull ~67
Paginated read of env_sync transaction log, HLC-ordered. Read-only; filterable by since_hlc + op.
| Name | Type | Req | Description |
|---|---|---|---|
| cursor | string | — | — |
| limit | integer | — | — |
| op | string | — | — |
| since_hlc | string | — | — |
No output schema declared.
No examples provided.
env_sync_txn_push ~43
Ingest a batched envelope of client-recorded env_sync mutations. HLC-skew gated, partial-success on conflict.
| Name | Type | Req | Description |
|---|---|---|---|
| operations | array | yes | — |
No output schema declared.
No examples provided.
env_sync_txn_rollback ~63
Inverse-apply a prior env_sync transaction. Safety gates: ownership, idempotency, descendant-conflict (force opt-out).
| Name | Type | Req | Description |
|---|---|---|---|
| force | boolean | — | — |
| include_descendants | boolean | — | — |
| txn_id | string | yes | — |
No output schema declared.
No examples provided.
env_sync.device_enroll ~65
Complete device enrollment by exchanging a one-shot enrollment_token for a registered device row with the device's age public key.
| Name | Type | Req | Description |
|---|---|---|---|
| age_pubkey | string | yes | — |
| alias | string | yes | — |
| capabilities | object | — | — |
| enrollment_token | string | yes | — |
No output schema declared.
No examples provided.
env_sync.device_list ~40
List enrolled devices for the calling user. Each entry includes age pubkey, capabilities, last_sync_at.
| Name | Type | Req | Description |
|---|---|---|---|
| include_stale | boolean | — | — |
No output schema declared.
No examples provided.
env_sync.device_request_secret_share ~86
Share existing secrets with a newly enrolled device by uploading re-encrypted ciphertexts. Plaintext never transits.
| Name | Type | Req | Description |
|---|---|---|---|
| client_hlc | string | — | — |
| device_id | string | yes | The existing device performing the re-encryption (must own access to all secret_node_ids). |
| secret_shares | array | yes | — |
| target_device_id | string | yes | — |
No output schema declared.
No examples provided.
env_sync.drift_status ~39
Cross-device drift report. Lists skills present on one device but missing on another, with dwell time.
| Name | Type | Req | Description |
|---|---|---|---|
| device_id | string | — | — |
No output schema declared.
No examples provided.
env_sync.heartbeat_ping ~106
Device heartbeat ping. Updates last_sync_at + capabilities, triggers fast-path drift recheck if installed-set hashes changed.
| Name | Type | Req | Description |
|---|---|---|---|
| claude_code_version | string | — | — |
| device_id | string | yes | — |
| installed_hooks | array | — | — |
| installed_hooks_hash | string | yes | — |
| installed_mcp_servers_hash | string | — | — |
| installed_skills | array | — | — |
| installed_skills_hash | string | yes | — |
| os | string | — | — |
No output schema declared.
No examples provided.
env_sync.secret_pull ~46
Pull an encrypted secret blob. Response is ciphertext_b64 only — server never sees and never returns plaintext.
| Name | Type | Req | Description |
|---|---|---|---|
| alias | string | — | — |
| node_id | string | — | — |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| alias | string | yes | — |
| ciphertext_b64 | string | yes | — |
| client_hlc | string | — | — |
| device_id | string | yes | — |
| kind | string | yes | — |
| recipients | array | yes | — |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| client_hlc | string | — | — |
| device_id | string | yes | — |
| new_ciphertext_b64 | string | yes | — |
| new_recipients | array | yes | — |
| node_id | string | yes | — |
No output schema declared.
No examples provided.
env_sync.sync_status ~29
User-level vault health snapshot: node counts, pending conflicts, last transaction, device liveness.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
get_dev_doc ~86
Get a single dev document by title or id. Returns full content.
| Name | Type | Req | Description |
|---|---|---|---|
| category | string | — | Subcategory (claude, cursor, etc.) to disambiguate title |
| id | string | — | Document UUID |
| include_versions | boolean | — | Include version history (default: false) |
| title | string | — | Document title (e.g., project-a-memory.md) |
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_add_entity ~81
Create a new env_sync graph node (skill/hook/mcp_server/secret/setting_fragment). Same-alias collisions open a conflict bucket — no silent overwrite.
| Name | Type | Req | Description |
|---|---|---|---|
| alias | string | yes | — |
| client_hlc | string | — | — |
| device_id | string | yes | — |
| node_type | string | yes | — |
| payload | object | yes | — |
No output schema declared.
No examples provided.
graph_get_node ~58
Read a live env_sync graph node and its per-field LWW state. Lookup by node_id OR (alias + node_type).
| Name | Type | Req | Description |
|---|---|---|---|
| alias | string | — | — |
| node_id | string | — | — |
| node_type | string | — | — |
No output schema declared.
No examples provided.
graph_list_nodes ~78
List live env_sync graph nodes for the calling user with optional node_type and HLC-since filters.
| Name | Type | Req | Description |
|---|---|---|---|
| cursor | string | — | Opaque cursor (created_at ISO + id) from previous page's next_cursor |
| limit | integer | — | — |
| node_type | string | — | — |
| updated_since_hlc | string | — | — |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| client_hlc | string | — | — |
| device_id | string | yes | — |
| node_id | string | yes | — |
No output schema declared.
No examples provided.
graph_update_entity ~69
Per-field LWW update for an env_sync graph node. Identity-immutable field mismatches open a conflict bucket (no partial writes).
| Name | Type | Req | Description |
|---|---|---|---|
| client_hlc | string | — | — |
| device_id | string | yes | — |
| field_updates | array | yes | — |
| node_id | string | yes | — |
No output schema declared.
No examples provided.
handoff_get ~164
Retrieve a session handoff by project + topic. If date is omitted, returns the most recent matching handoff. Pass `time` (HHMM, KST) to fetch a specific same-day save when multiple exist. Read-only: handoffs older than 7 days are not returned (a daily server-side cleanup job permanently deletes them).
| Name | Type | Req | Description |
|---|---|---|---|
| date | string | — | Optional YYYY-MM-DD. Omit for latest. |
| project | string | yes | Project slug used at handoff_save time. |
| time | string | — | Optional HHMM (24h, KST) — same value passed at save time. Required to disambiguate when multiple handoffs share the same project/topic/date. |
| topic | string | yes | Topic slug used at handoff_save time. |
No output schema declared.
No examples provided.
handoff_list ~286
List session handoff notes saved in the primary vault under handoffs/, most-recent first. v2 frontmatter fields (status / has_blockers / tags / task_type) can be filtered server-side and are exposed in each entry without fetching the body. Read-only: entries older than 7 days are filtered out of results (a daily server-side cleanup job permanently deletes them).
| Name | Type | Req | Description |
|---|---|---|---|
| has_blockers | boolean | — | v2 only: filter by frontmatter has_blockers (true/false). |
| limit | integer | — | Max entries to return (default 50). |
| project | string | — | Optional project filter, e.g. 'logi' to list only logi-* handoffs. |
| since | string | — | ISO8601 timestamp — only entries with updated_at >= since are returned. |
| status | string | — | v2 only: filter by frontmatter status (e.g. 'in_progress', 'paused', 'completed', 'blocked'). v1 handoffs without frontmatter are excluded when this filter is set. |
| tags | array | — | v2 only: AND match — entries must contain ALL given tags. Example: ['auth', 'mobile']. |
| task_type | string | — | v2 only: filter by frontmatter task_type (e.g. 'feature', 'bugfix', 'refactor', 'research', 'ops'). |
No output schema declared.
No examples provided.
handoff_save ~379
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).
| Name | Type | Req | Description |
|---|---|---|---|
| content | string | yes | Full handoff text. Should follow the session-handoff skill template (현재 상태 / 작업 위치 / 수정 파일 / 결정 사항 / 다음 STEP / 알려진 이슈). WAF-bypass tip: prefix the string with '__B64__:' followed by base64-encoded pa… |
| content_b64 | string | — | Optional: base64-encoded handoff text (use INSTEAD of `content`). For WAF-bypass on large bodies. Server decodes before storing. |
| date | string | — | Optional override date (YYYY-MM-DD). Defaults to today in server timezone. |
| project | string | yes | Project slug, e.g. 'logi', 'ainote', 'krx_ai'. Lowercase, no spaces. |
| time | string | — | 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 | yes | Short topic slug for this handoff, e.g. 'phase-d-port', 'oauth-fix'. Lowercase-hyphen. |
No output schema declared.
No examples provided.
list_categories ~42
List all task categories for the authenticated user. Returns id/name/color/icon/task_count tuples. Read-only — use create_task with category_id to assign tasks to a category.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
list_dev_categories ~53
List all subcategories under dev/ (memory, claude, cursor, env, docs, mcp, custom...) with document counts. Use to discover which categories exist before calling list_dev_docs with a category filter.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
list_dev_docs ~106
List dev documents under the dev/ category hierarchy. Filter by subcategory (claude, cursor, windsurf, copilot, docs, etc.), search by title, or filter by content type.
| Name | Type | Req | Description |
|---|---|---|---|
| category | string | — | Subcategory filter (claude, cursor, windsurf, copilot, docs, etc.). Omit to list all dev docs. |
| content_type | string | — | Filter by content type |
| search | string | — | Search keyword in document title |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| category_id | string | — | Filter by category UUID |
| limit | number | — | Maximum number of papers to return (default: 25, max: 200) |
| offset | number | — | Number to skip for pagination (default: 0) |
| paper_category_id | string | — | Filter by paper-specific folder UUID |
| search | string | — | Keyword to match in paper title or content (case-insensitive partial match) |
| sort_by | string | — | Sort field (default: updated_at) |
| sort_order | string | — | Sort order (default: desc) |
| source_type | string | — | Filter by source type (e.g., 'manual', 'youtube', 'url', 'clipboard') |
No output schema declared.
No examples provided.
list_tasks ~358
List all tasks from AI Note with advanced filtering, date ranges, location search, and sorting
| Name | Type | Req | Description |
|---|---|---|---|
| category_id | string | — | Filter by category UUID |
| completed_date_end | string | — | Filter tasks completed <= this date (ISO 8601 format) |
| completed_date_start | string | — | Filter tasks completed >= this date (ISO 8601 format) |
| created_date_end | string | — | Filter tasks created <= this date (ISO 8601 format) |
| created_date_start | string | — | Filter tasks created >= this date (ISO 8601 format) |
| due_date_end | string | — | Filter tasks with due_date <= this date (ISO 8601 format) |
| due_date_start | string | — | Filter tasks with due_date >= this date (ISO 8601 format) |
| due_today | boolean | — | Filter tasks due today |
| has_notification | boolean | — | Filter by notification enabled status |
| is_important | boolean | — | Filter by important tasks only |
| limit | number | — | Maximum number of tasks to return (default: 25, max: 500) |
| location | string | — | Filter by location (partial match, e.g., '여의도', '서울') |
| offset | number | — | Number of tasks to skip for pagination (default: 0). Use with limit to fetch additional pages. |
| overdue | boolean | — | Filter overdue incomplete tasks (due_date < today) |
| search | string | — | Search keyword in task content and notes (case-insensitive partial match) |
| sort_by | string | — | Sort field (default: created_at) |
| sort_order | string | — | Sort order (default: desc) |
| status | string | — | Filter by task status |
No output schema declared.
No examples provided.
login_and_get_key ~93
Log in to an existing AI Note account and return an MCP API key. No prior authentication required. SIDE EFFECT: if the user has no MCP key yet, this call creates one (write to user.mcp_keys), so it is NOT idempotent and must be gated like other key-creation flows.
| Name | Type | Req | Description |
|---|---|---|---|
| string | yes | Your account email address | |
| password | string | yes | Your account password |
No output schema declared.
No examples provided.
memory_get ~133
Fetch the full content of ONE memory item found via memory_search. source='paper' requires `id`; source='vault_file' accepts `id` or `path`. Only the authenticated user's own items are accessible. Returns { found: false } when the item does not exist (or belongs to another user).
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | — | Item ID returned by memory_search |
| path | string | — | vault_file only: file path inside the vault (e.g. 'global/MEMORY.md') |
| source | string | yes | Which store the item lives in (use the `source` field from memory_search results) |
No output schema declared.
No examples provided.
memory_search ~206
Search your memory (dev docs / papers + vault markdown files) and get ranked snippets with IDs. COST PRINCIPLE: search returns snippets only; call memory_get for full content. MODES: - keyword (default): hybrid keyword + semantic match across title/path/content - latest_state: most recent memory, preferring entries saved with memory_type='state' (falls back to plain recency when no typed entries exist) Returns { found: false, message: "no memory found" } when nothing matches — treat that as a definitive empty signal and stop searching (do not guess).
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | — | Max results (default 10, max 20) |
| mode | string | — | keyword (default) or latest_state |
| query | string | yes | Search text (e.g. 'render deploy key', 'ainote jwt'). May be blank only in latest_state mode. |
| sources | array | — | Memory stores to search. Default: both. |
No output schema declared.
No examples provided.
pull_dev_docs ~232
Restore all synced files to this device. Fetches every dev doc that has a local_path set and writes the content to that path on disk. WHEN TO USE: - First time setup on a new machine (desktop, laptop, etc.) - After reinstalling macOS or setting up a fresh environment - To restore Claude memory files, CLAUDE.md configs, and other local-only files WHAT IT DOES: 1. Fetches all your dev docs that have local_path set 2. Creates any missing parent directories automatically 3. Writes the file content to each local_path on THIS machine 4. Reports success/failure for each file TYPICAL FILES RESTORED: - ~/.claude/projects/.../memory/MEMORY.md (AI context memory) - ~/projects/*/CLAUDE.md (project-specific AI instructions) - .cursorrules, .windsurfrules (editor AI configs) Run this once after setting up ainote MCP on a new device.
| Name | Type | Req | Description |
|---|---|---|---|
| category | string | — | Subcategory filter. Omit to pull all docs with local_path. |
No output schema declared.
No examples provided.
signup_and_get_key ~74
Create a new AI Note account and get an MCP API key. No authentication required. Use this if you don't have an account yet.
| Name | Type | Req | Description |
|---|---|---|---|
| string | yes | Email address for the new account | |
| name | string | — | Display name (optional) |
| password | string | yes | Password (minimum 6 characters) |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| chunk_count | integer | — | Optional: number of diff chunks the client fed to codex. |
| duration_ms | integer | — | Optional: wall-clock time of the codex review on the client. |
| path | string | yes | Vault path the review covered. |
| summary | string | — | Free-form codex output summary. Server HMACs this; raw text is NEVER stored. |
| verdict | string | yes | One of: pass, flag, block, error. |
No output schema declared.
No examples provided.
sync_delete ~220
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/claude-config/, handoffs/) require base_sha or explicit force:true (audited). Idempotent: deleting a non-existent path returns success with deleted:false.
| Name | Type | Req | Description |
|---|---|---|---|
| base_sha | string | — | 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_id | string | — | Optional: client device identifier for audit log (e.g., from ~/.claude/ainote-sync/device.id). |
| force | boolean | — | 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 | yes | Relative file path to delete (e.g., 'global/_waf_probe.md'). No leading slash, no '..'. |
No output schema declared.
No examples provided.
sync_diff ~167
Return the unified diff (and raw remote text) of a vault file. Useful for surfacing what `sync_merge` would conflict on, or for the client to render a `git diff` view before pushing. NO database mutation. Server has no history — base_text must be supplied by the caller if a 3-way view is needed; otherwise this returns remote_text only.
| Name | Type | Req | Description |
|---|---|---|---|
| base_text | string | — | 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. |
| local_text | string | — | Optional: client's current text. When supplied, response includes unified diff (remote → local). |
| path | string | yes | Relative vault path. |
No output schema declared.
No examples provided.
sync_list ~41
Legacy alias for listing files in the primary vault.
| Name | Type | Req | Description |
|---|---|---|---|
| path | string | — | Directory to list (e.g., 'global'). Omit to list all files. |
No output schema declared.
No examples provided.
sync_merge ~222
Compute a stateless 3-way merge for a vault file. Server runs `git merge-file --diff3 --stdout` over (base_text, local_text, current remote from file_indices) and returns the merged text plus the exact remote_sha it merged against. NO database mutation — to commit the result, follow up with sync_push(content=merged_text, base_sha=merged_against.remote_sha, resolves_conflict_id=conflict_id).
| Name | Type | Req | Description |
|---|---|---|---|
| base_sha | string | — | Optional: git_sha the client believes is the merge base. When supplied, server verifies (informational; merge still runs). |
| base_text | string | yes | Common ancestor text — what the client had cached when it started editing. Source: client state.json baseline. Required. |
| device_id | string | — | Optional: client device identifier. Recorded on any vault_conflict row created downstream. |
| local_text | string | yes | Current local text on the client (post-edit). Required. |
| path | string | yes | Relative vault path (e.g., 'global/MEMORY.md'). |
No output schema declared.
No examples provided.
sync_pending_conflicts ~90
List unresolved vault_conflicts rows for the authenticated user's primary vault. Used by clients (e.g. SessionStart hook) to surface conflicts that need merge attention. Returns up to `limit` rows ordered by most recent first.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | — | Optional: max rows to return (default 50, max 200). |
| path | string | — | Optional: filter to a specific path. |
No output schema declared.
No examples provided.
sync_pull ~67
Legacy alias for pulling files from the primary vault.
| Name | Type | Req | Description |
|---|---|---|---|
| path | string | — | Optional directory filter (e.g., 'global' to pull only global files) |
| since | string | — | ISO 8601 timestamp. Only return files updated after this time. Omit to get all files. |
No output schema declared.
No examples provided.
sync_push ~519
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.
| Name | Type | Req | Description |
|---|---|---|---|
| base_sha | string | — | 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 le… |
| content | string | — | Full file content (markdown text). Alternatively prefix with '__B64__:' followed by base64 payload for WAF bypass. |
| content_b64 | string | — | 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_id | string | — | 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. |
| force | boolean | — | 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 | yes | Relative file path (e.g., 'global/MEMORY.md', 'launchcrew/firebase.md'). No leading slash, no '..'. |
| resolves_conflict_id | string | — | 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 transac… |
| supports_superseded | boolean | — | 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 {s… |
No output schema declared.
No examples provided.
sync_push_batch ~372
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.
| Name | Type | Req | Description |
|---|---|---|---|
| device_id | string | — | Optional batch-level device identifier; per-item device_id overrides it. |
| idempotency_key | string | yes | 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), and… |
| items | array | yes | Up to 200 push items, 4MB total, one entry per unique path. Duplicate paths reject the whole batch. |
| supports_superseded | boolean | — | Same capability opt-in as sync_push, applied to every item in the batch. |
No output schema declared.
No examples provided.
update_dev_doc ~132
Update an existing dev document. Supports replace (default), append, or prepend modes. Optionally update the local_path for sync.
| Name | Type | Req | Description |
|---|---|---|---|
| category | string | — | Subcategory to disambiguate title |
| content | string | yes | New content |
| id | string | — | Document UUID |
| local_path | string | — | Update the local file path for multi-device sync |
| memory_type | string | — | Set the memory update semantics (state | event | preference). Pass null/empty to clear. |
| mode | string | — | Update mode (default: replace) |
| title | string | — | Document title |
No output schema declared.
No examples provided.
update_task ~343
Update an existing task. All fields are optional except id.
| Name | Type | Req | Description |
|---|---|---|---|
| category_id | string | — | Update category ID (or 'null' to remove category) |
| completed_at | string | — | Mark as completed (ISO format) or 'null' to uncomplete |
| content | string | — | New task content |
| due_date | string | — | Update due date in ISO format (or 'null' to clear) |
| due_time | string | — | Update due time in HH:MM format (or 'null' to make all-day) |
| has_notification | boolean | — | Enable/disable reminder notifications |
| id | string | yes | Task ID (required) |
| is_all_day | boolean | — | Toggle all-day mode. |
| is_important | boolean | — | Update important status |
| location | string | — | Update location (or 'null' to clear) |
| location_lat | number | — | Update GPS latitude. |
| location_lng | number | — | Update GPS longitude. |
| notes | string | — | Update notes (or 'null' to clear) |
| reminder_timing | integer | — | Minutes before due time to send reminder (e.g., 10 for 10 minutes before). Only used when has_notification is true. |
| reminder_timings | array | — | Multiple reminder offsets in minutes before due time (e.g., [10, 60]). Pass empty array [] to clear. |
| repeat_rule | string | — | Update recurrence rule (or 'null' to make non-recurring) |
| start_date | string | — | Update start date in ISO format (or 'null' to clear) |
| travel_time | number | — | Update travel-time minutes. |
No output schema declared.
No examples provided.
vault_clone ~62
Return the GitHub HTTPS clone URL for an existing vault. Authentication is via the user's normal GitHub credentials (PAT or gh CLI).
| Name | Type | Req | Description |
|---|---|---|---|
| name | string | yes | Vault name or slug. |
| target_path | string | — | Preferred local clone path for the returned instructions. |
No output schema declared.
No examples provided.
vault_connect_status ~54
Check whether the user has installed the ainote GitHub App. If connected, returns account_login + installation_id. If not, returns an install_url to surface to the user. Read-only; talks to GitHub API.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
vault_create ~74
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.
| Name | Type | Req | Description |
|---|---|---|---|
| description | string | — | Optional GitHub repo description. |
| name | string | yes | Vault name. Slug is derived from this value and used as the GitHub repo name. |
No output schema declared.
No examples provided.