# io.github.seunghan91/ainote (npm · @ainote/mcp)

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

- Trust score: 60/100 (medium)
- Change this week: +42
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-08-03

## Components

- remote · `api.ainote.dev`: 64/100, [markdown](https://verifymcp.io/servers/seunghan91-ainote/api-mcp.md), [page](https://verifymcp.io/servers/seunghan91-ainote/api-mcp)
- npm · `@ainote/mcp`: 60/100 (this document), [markdown](https://verifymcp.io/servers/seunghan91-ainote/ainote-mcp.md), [page](https://verifymcp.io/servers/seunghan91-ainote/ainote-mcp)

## Channel facts

- Registry: `npm`
- Package: `@ainote/mcp`
- Version: `1.3.2`
- Transport: `stdio`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-08-03.

- **Supply Chain Security**: 87/100
  - No malware found by supply-chain analysis.
  - Only part of the dependency tree could be resolved (168 of 169), so this covers what we could see, not the whole tree.
  - No install/post-install scripts declared.
  - Only part of the dependency tree could be resolved (168 of 169), so this covers what we could see, not the whole tree.
- **Provenance & Transparency**: 19/100
  - Repository check failed: the declared repository URL returned HTTP 404.
  - Provenance check failed: no build-provenance attestation is published.
  - Clear OSI-approved license (MIT).
  - Actively maintained (last published 80 days ago).
  - Security-disclosure policy not yet verified: we couldn't inspect the source repository.
- **Schema Quality & AI Usability**: 58/100
  - AI-judged instruction clarity (good).
  - Context-footprint check failed: tool/resource definitions use about 3499 tokens (~139/item across 25 items; 25 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 23/100
  - Stability observed for 7 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

## Install

### Claude

```bash
claude mcp add seunghan91-ainote -- npx -y @ainote/mcp
```

### Codex

```bash
codex mcp add seunghan91-ainote -- npx -y @ainote/mcp
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "seunghan91-ainote": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "@ainote/mcp"
      ],
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add seunghan91-ainote --command npx --arg -y --arg @ainote/mcp
```

### Hermes

```yaml
mcp_servers:
  seunghan91-ainote:
    command: "npx"
    args: ["-y", "@ainote/mcp"]
```

### Other

```json
{
  "mcpServers": {
    "seunghan91-ainote": {
      "command": "npx",
      "args": [
        "-y",
        "@ainote/mcp"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-08-03 (score 60, +3)

- [functional improvement] Stability: unverified → 0.23

### 2026-08-02 (score 57, +42)

- [security regression] Provenance: unverified → fail
- [security improvement] Known CVEs: unverified → partial
- [security improvement] Install scripts: unverified → pass
- [security] Stability: Stability not yet verified: not enough scan history yet (needs a 30-day window).
- [functional improvement] License: unverified → pass
- [functional improvement] Maintenance: unverified → pass
- [functional improvement] Dependency health: unverified → partial
- [functional improvement] MCP protocol: unverified → pass
- [functional improvement] Tool coverage: unverified → 100
- [functional] Licence: MIT

### 2026-08-01 (score 15, −12)

- [security improvement] Malware scan: unverified → pass
- [security] Stability: Stability not yet verified: we do not have a sandbox capture of the MCP schema this version of the package serves yet.
- [functional regression] Tool coverage: 100 → unverified
- [functional regression] Capabilities: pass → unverified

### 2026-07-31 (score 27, +27)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-30 (score 0, −21)

- [security regression] Malware scan: pass → unverified
- [functional regression] Dependency health: partial → unverified

### 2026-07-29 (score 21, −48)

- [security regression] Install scripts: pass → unverified
- [security regression] Provenance: fail → unverified
- [security regression] Known CVEs: partial → unverified
- [functional regression] License: pass → unverified
- [functional regression] Tool coverage: 100 → unverified
- [functional regression] Maintenance: pass → unverified
- [functional] Licence: MIT

### 2026-07-28 (score 69, +51)

- [security regression] Provenance: unverified → fail
- [security improvement] Known CVEs: unverified → partial
- [security improvement] Install scripts: unverified → pass
- [functional improvement] Maintenance: unverified → pass
- [functional improvement] License: unverified → pass
- [functional improvement] Tool coverage: unverified → 100
- [functional] First check of Schema quality: fail
- [functional] First check of Schema quality: fail
- [functional] First check of Tool coverage: 100
- [functional] First check of Schema quality: good
- [functional] Licence: MIT

### 2026-07-27 (score 18)

First indexed and scored.

## MCP tools (25)

### `signup_and_get_key` (~88 tokens)

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. After getting the key, add it to your MCP config and restart.

Input parameters:

- `email` (string, required): Email address for the new account
- `name` (string): Display name (optional)
- `password` (string, required): Password (minimum 6 characters)

### `login_and_get_key` (~64 tokens)

Log in to an existing AI Note account and get an MCP API key. No authentication required.
Use this if you already have an account but need your MCP key.

Input parameters:

- `email` (string, required): Your account email address
- `password` (string, required): Your account password

### `get_setup_guide` (~47 tokens)

Get instructions for setting up AI Note MCP in Claude Desktop, Cursor, or other MCP clients. Includes CLI signup method (npx @ainote/mcp signup). No authentication required.

### `list_tasks` (~829 tokens)

List tasks from AI Note with natural language support and advanced filtering.

NATURAL LANGUAGE EXAMPLES:
• Location: "여의도에서", "서울에 있는", "강남 관련"
• Time: "오늘", "이번 주", "다음 주", "지난달", "1월에"
• Importance: "중요한", "우선순위 높은", "급한"
• Status: "완료한", "미완료", "안 끝난"
• Special: "마감일 지난", "늦어진", "오늘 마감", "알림 설정된"
• Sort: "마감일 순으로", "최신순으로", "오래된 순으로"

QUERY EXAMPLES:
1\. "여의도에서 이번 주 마감인 중요한 미완료 할일"
   → {location: "여의도", due_date_start: "2025-01-27", due_date_end: "2025-02-02",
       is_important: true, status: "pending"}

2\. "지난달 완료한 업무 카테고리 할일들을 완료일 순으로"
   → {category_id: "...", status: "completed",
       completed_date_start: "2024-12-01", completed_date_end: "2024-12-31",
       sort_by: "completed_at", sort_order: "asc"}

3\. "마감일 지났는데 아직 안 끝난 할일들 마감일 빠른 순으로"
   → {overdue: true, sort_by: "due_date", sort_order: "asc"}

TIME CALCULATIONS (today = 2025-01-27):
• "오늘" → due_today: true
• "이번 주" → due_date_start: "2025-01-27", due_date_end: "2025-02-02"
• "다음 주" → due_date_start: "2025-02-03", due_date_end: "2025-02-09"
• "이번 달" → due_date_start: "2025-01-01", due_date_end: "2025-01-31"
• "지난 주" → completed_date_start: "2025-01-20", completed_date_end: "2025-01-26"
• "지난 달" → completed_date_start: "2024-12-01", completed_date_end: "2024-12-31"

Returns structured data with all task fields including location, dates, and categories.

Input parameters:

- `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., "여의도", "서울")
- `overdue` (boolean): Filter overdue incomplete tasks (due_date < today)
- `search` (string): Search keyword in task content
- `sort_by` (string): Sort field (default: created_at)
- `sort_order` (string): Sort order (default: desc)
- `status` (string): Filter by task status

### `create_task` (~345 tokens)

Create a new task in AI Note with optional notification, location, recurrence, and details.

Input parameters:

- `category_id` (string): Category ID. Must be owned by or shared to this user.
- `content` (string, required): Task content
- `due_date` (string): Due date in ISO format (e.g., 2026-04-21T15:00:00+09:00)
- `due_time` (string): Time of day in HH:MM (24h). Optional when due_date already carries a time.
- `is_all_day` (boolean): Mark as all-day event — suppresses time-of-day rendering.
- `is_important` (boolean): Mark task as important
- `location` (string): Human-readable location (e.g., "Starbucks Gangnam"). For GPS use location_lat/lng.
- `location_lat` (number): GPS latitude. Pair with location_lng.
- `location_lng` (number): GPS longitude. Pair with location_lat.
- `notes` (string): Free-form notes / details attached to the task.
- `notification_minutes_before` (number): Schedule a reminder N minutes before due_date. Pass null/omit to clear existing MCP reminder on update. Requires due_date.
- `repeat_rule` (string): Recurrence rule. Accepted values depend on server (e.g., "daily", "weekly", "monthly", or RRULE). Creates a recurring series.
- `start_date` (string): Start date for multi-day events (ISO format). For single-day tasks, use due_date.
- `travel_time` (number): Minutes of travel time before due_date to allow for. Used by reminder scheduling.

### `update_task` (~382 tokens)

Update an existing task — any subset of fields. Pass notification_minutes_before to reschedule the reminder (or null to clear it).

Input parameters:

- `category_id` (string): Category ID. Must be owned by or shared to this user.
- `completed_at` (string): Mark as completed (ISO format) or null to uncomplete
- `content` (string): Task content
- `due_date` (string): Due date in ISO format (e.g., 2026-04-21T15:00:00+09:00)
- `due_time` (string): Time of day in HH:MM (24h). Optional when due_date already carries a time.
- `id` (string, required): Task ID
- `is_all_day` (boolean): Mark as all-day event — suppresses time-of-day rendering.
- `is_important` (boolean): Mark task as important
- `location` (string): Human-readable location (e.g., "Starbucks Gangnam"). For GPS use location_lat/lng.
- `location_lat` (number): GPS latitude. Pair with location_lng.
- `location_lng` (number): GPS longitude. Pair with location_lat.
- `notes` (string): Free-form notes / details attached to the task.
- `notification_minutes_before` (number): Schedule a reminder N minutes before due_date. Pass null/omit to clear existing MCP reminder on update. Requires due_date.
- `repeat_rule` (string): Recurrence rule. Accepted values depend on server (e.g., "daily", "weekly", "monthly", or RRULE). Creates a recurring series.
- `start_date` (string): Start date for multi-day events (ISO format). For single-day tasks, use due_date.
- `travel_time` (number): Minutes of travel time before due_date to allow for. Used by reminder scheduling.

### `delete_task` (~26 tokens)

Delete a task (soft delete)

Input parameters:

- `id` (string, required): Task ID to delete

### `list_categories` (~12 tokens)

List all categories

### `list_dev_docs` (~126 tokens)

List your synced dev documents stored in AI Note cloud.

Shows all documents under dev/ category including memory files, AI configs, and project docs.
Use this to see what's synced and which files have local_path set for multi-device sync.

Categories: memory, claude, cursor, windsurf, env, docs, or custom subcategories.

Input parameters:

- `category` (string): Subcategory filter (claude, cursor, windsurf, copilot, docs, etc.)
- `content_type` (string): Filter by content type
- `search` (string): Search keyword in document title

### `get_dev_doc` (~85 tokens)

Get a single dev document by title or id. Returns full content.

Input parameters:

- `category` (string): Subcategory (claude, cursor, etc.) to disambiguate
- `id` (string): Document UUID
- `include_versions` (boolean): Include version history (default: false)
- `title` (string): Document title (e.g., project-a-memory.md)

### `create_dev_doc` (~212 tokens)

Save a file to AI Note cloud for multi-device sync.

PRIMARY USE CASES:
\- Memory files: ~/.claude/projects/.../memory/MEMORY.md
\- AI configs: CLAUDE.md, .cursorrules, .windsurfrules (not in git)
\- Project docs: architecture notes, planning docs

Set local_path to enable pull_dev_docs auto-sync on other devices.
Categories: memory | claude | cursor | env | docs

Input parameters:

- `category` (string): Subcategory (claude, cursor, windsurf, copilot, docs). Default: docs
- `content` (string, required): Document content (markdown, json, yaml)
- `content_type` (string): Content type. Auto-detected from title extension if omitted.
- `local_path` (string): Absolute local file path for multi-device sync (e.g., ~/.claude/projects/.../MEMORY.md)
- `title` (string, required): Document title (e.g., project-a-claude.md)

### `update_dev_doc` (~93 tokens)

Update a dev document. Supports replace, append, or prepend modes.

Input parameters:

- `category` (string): Subcategory to disambiguate
- `content` (string, required): New content
- `id` (string): Document UUID
- `local_path` (string): Update the local file path for multi-device sync
- `mode` (string): Update mode (default: replace)
- `title` (string): Document title

### `delete_dev_doc` (~48 tokens)

Delete a dev document (soft delete).

Input parameters:

- `category` (string): Subcategory to disambiguate
- `id` (string): Document UUID
- `title` (string): Document title

### `pull_dev_docs` (~214 tokens)

Restore all synced files to THIS device. Writes files to their local paths on disk.

USE THIS WHEN:
\- Setting up a new machine (desktop, laptop, WSL)
\- Switching between macOS / Windows / Linux
\- Want to sync latest versions of memory/config files from cloud

WHAT HAPPENS:
1\. Fetches all dev docs with local_path set
2\. Auto-detects platform (macOS/WSL/Linux/Windows) and maps paths accordingly
3\. Creates missing parent directories
4\. Writes content to each mapped local_path on this machine

CROSS-PLATFORM PATH MAPPING (automatic):
\- macOS ~/... ↔ WSL ~/... ↔ Linux ~/...
\- Claude project keys mapped per platform (e.g., -Users-seunghan ↔ -mnt-c-Users-Owner)

Run once after installing ainote MCP on a new device to restore everything.

Input parameters:

- `category` (string): Subcategory filter. Omit to pull all docs with local_path.

### `list_dev_categories` (~22 tokens)

List all subcategories under dev/. Shows document count per category.

### `discover_claude_sync_targets` (~112 tokens)

Preview what would be synced from ~/.claude/ to ainote cloud.

Read-only. Shows file counts, sizes, and sample names for:
\- skills/      (directory bundles like ui-ux-pro-max/)
\- agents/      (single .md files)
\- commands/    (slash command definitions)
\- hooks/       (event handler scripts)
\- mcp_servers  (mcpServers section of ~/.claude.json)

Run this BEFORE push_claude_* tools to see scope.

### `push_claude_skills` (~99 tokens)

Push ~/.claude/skills/ tree (each file as a dev_doc, category=skills).

Walks subdirectories. Each SKILL.md, reference, asset is uploaded separately
with local_path set so pull_dev_docs can restore on another machine.

Input parameters:

- `dry_run` (boolean): Preview without uploading. Default: false
- `max_files` (number): Max files to push (safety cap). Default: 500

### `push_claude_agents` (~64 tokens)

Push ~/.claude/agents/ files (category=agents). Subagent definitions.

Input parameters:

- `dry_run` (boolean): Preview without uploading. Default: false
- `max_files` (number): Max files to push (safety cap). Default: 500

### `push_claude_commands` (~64 tokens)

Push ~/.claude/commands/ tree (category=commands). Slash command definitions.

Input parameters:

- `dry_run` (boolean): Preview without uploading. Default: false
- `max_files` (number): Max files to push (safety cap). Default: 500

### `push_claude_hooks` (~63 tokens)

Push ~/.claude/hooks/ tree (category=hooks). Event handler scripts.

Input parameters:

- `dry_run` (boolean): Preview without uploading. Default: false
- `max_files` (number): Max files to push (safety cap). Default: 500

### `push_claude_mcp_servers` (~107 tokens)

Snapshot ~/.claude.json mcpServers section to ainote cloud (mcp category).

Stores as a single JSON dev_doc titled "mcp-servers-snapshot.json".
Includes API keys/env vars currently — Phase B will add encryption.

⚠️ Until encryption lands, only run when comfortable storing keys server-side
(server is private to your account, but keys are not zero-knowledge yet).

Input parameters:

- `dry_run` (boolean): Preview only. Default: false

### `pull_claude_mcp_servers` (~169 tokens)

Restore mcpServers snapshot from ainote cloud to a SIDECAR file.

Writes to ~/.claude/mcp-servers.d/from-ainote.json (NOT ~/.claude.json directly).
This avoids corrupting the live-written ~/.claude.json while Claude is running.

After pull, to actually activate the servers you must either:
  (a) merge manually: jq -s '.[0] * .[1]' ~/.claude.json ~/.claude/mcp-servers.d/from-ainote.json > new.json
  (b) close Claude, then run a future merge tool (Phase B)

Sidecar approach = safe always, manual merge step required.

Input parameters:

- `sidecar_name` (string): Sidecar filename stem. Default: from-ainote

### `sync_init_encryption` (~116 tokens)

Initialize age encryption on THIS machine (first-time setup).

Generates an age keypair, stores the secret key in OS keychain (or ~/.config/ainote/ fallback),
and sets this machine as the sole recipient. Run once per machine.

After running on the FIRST machine, share its public key (recipient) with subsequent machines
via sync_add_recipient so they can decrypt shared secrets.

Input parameters:

- `force` (boolean): Regenerate even if identity already exists. WARNING: invalidates existing ciphertexts unless old recipients retained.

### `sync_add_recipient` (~87 tokens)

Add an age recipient (public key) to the encryption set for this machine.

Future encryptions on this machine will include this recipient.
Already-encrypted ciphertexts on the server are NOT re-encrypted retroactively —
call push_claude_mcp_servers again to re-encrypt with the updated recipient list.

Input parameters:

- `recipient` (string, required): age public key (starts with age1...)

### `sync_encryption_status` (~25 tokens)

Show encryption setup status (backend, identity present, recipients, age binary).

## Diagnostics

Captured diagnostic sections: Provenance, Dependencies. The full working is on the page: https://verifymcp.io/servers/seunghan91-ainote/ainote-mcp#diagnostics

## Score history

- 2026-08-03: 60
- 2026-08-02: 57
- 2026-08-01: 15
- 2026-07-31: 27
- 2026-07-30: 0
- 2026-07-29: 21
- 2026-07-28: 69
- 2026-07-27: 18

## Links

- npm package: https://www.npmjs.com/package/@ainote/mcp
- Socket report: https://socket.dev/npm/package/@ainote/mcp
- Website: https://docs.ainote.dev/
- Changelog RSS feed: https://verifymcp.io/servers/seunghan91-ainote/ainote-mcp/changelog.xml
- Changelog JSON feed: https://verifymcp.io/servers/seunghan91-ainote/ainote-mcp/changelog.json
- HTML version of this page: https://verifymcp.io/servers/seunghan91-ainote/ainote-mcp
