Skip to main content

Overview

search_notes returns notes matching a keyword together with their primary documents (one-pager, custom). Use it when you need the content of the notes, such as decisions or action items. For lightweight metadata-only listing (e.g., “which notes are in folder X”), use list_notes instead. When to use
  • “What did the team decide about OKR Q2?”
  • “Where is the source note for this decision?”
  • “Show me the notes that mention 네이버.”
How it works
  • Keyword required; results ordered by full-text relevance with createdAt desc as tiebreaker.
  • Each matched note carries its primary documents inline (one-pager, custom).
  • HTML stripped from document content; documents larger than 5,000 chars are truncated and flagged.
  • When the search index is unavailable, a normal response is returned with degraded: true, an empty notes array, and degradedReason.
A workspace-scoped API key drops notes in private folders from the results even when the keyword matches (What notes a system API key reads).
Heavier than list_notes. Each result includes document content (~1,500 tokens per note). Default page size is 10, max 30. If you only need metadata, use list_notes.

Parameters

keyword (required)

The search term. Tokenized server-side; Korean text is morphologically analyzed (e.g., 네이버[네, 버]). Empty or whitespace-only keywords return 400. Keyword search accepts both user-scoped and workspace-scoped API keys. Omit workspaceGuid to search across every workspace you can access. A workspace-scoped API key searches only the workspace it is connected to. To scope the search to a specific workspace, pass a workspaceGuid.

filter.folderId (optional)

Same semantics as list_notes — recursive folder scope, authorized server-side.

filter.createdAtFrom / filter.createdAtTo (optional)

Half-open [from, to) range filter on createdAt. Both accept ISO 8601 UTC datetime ending in Z. It is applied before the relevance-ranked result limit. For calendar years, months, or days, convert the boundaries from the user’s timezone to UTC. For example, July–August 2025 in Korea Standard Time is createdAtFrom: "2025-06-30T15:00:00Z", createdAtTo: "2025-08-31T15:00:00Z".

pagination (optional)

{ cursor, size }. Default size: 10, max 30. The cap reflects the higher per-result cost (each note carries its documents).

Response Format

Success Response

Field Descriptions:
Don’t discriminate on templateTitle. It’s a display label, not an enum. For boolean checks (“is this a one-pager?”) use templateId against a known managed-template id, or surface both fields and let your UI choose by label.

Degraded Response

When the search index is unavailable, the response sets degraded=true and returns an empty notes array:
degradedReason is one of:
  • search_index_unavailable — the search index is disabled in this environment.
  • search_index_degraded — the search index threw an error mid-query.
Surface this to the LLM/user so retries can be deferred or the result interpreted appropriately.

Usage Examples

Request:
Returns the 10 most relevant notes mentioning OKR, each with its primary documents inline.

Example 2: Folder-scoped Korean keyword

Request:
Searches 네이버 only inside folder 455765 (and descendants). Korean morphological analysis runs server-side. Request:

Best Practices

Use list_notes first to find which notes match. If the LLM still needs document content to answer, switch to search_notes for the same keyword. This is the cheapest progressive-disclosure path.
A folder-scoped search is faster and returns better-ranked results because the relevance space is smaller. Pair with list_notes(filter.folderId) to find folder candidates first.
The deep-search endpoint currently emits nextCursor: null. If 30 results aren’t enough, refine the keyword (more specific) or scope by folderId/dateRange instead of paginating.
A degraded=true response is honest — the search index couldn’t run. Don’t treat the empty notes array as “no matches”; instead, surface the degradation to the user/LLM so retries can be timed appropriately.

Common Errors

Empty keyword

keyword must be at least 1 character (zod min(1)). An empty keyword is rejected as a standard MCP validation error, not a custom error code.

Token Usage

Per Note (with documents): ~1,500 tokens average. Truncated documents cap at ~1,500 tokens regardless of source size.
Compared to get_note_transcript (~3,000–5,000 tokens per hour of meeting), search_notes returns curated documents that are typically 10× more compact and cover the same key decisions. Reach for transcripts only when you need exact spoken words.