From evernote-pack
Implements Evernote search and retrieval using JavaScript SDK: filters, QueryBuilder, pagination, related notes, and result enrichment for note finding and search UIs.
npx claudepluginhub jeremylongshore/claude-code-plugins-plus-skills --plugin evernote-packThis skill is limited to using the following tools:
Comprehensive search and retrieval workflow for Evernote, including search grammar, filters, pagination, related notes discovery, and result enrichment with notebook/tag names.
Delivers JavaScript patterns for Evernote SDK: NoteFilter searches, paginated metadata, attachments with MD5/ENML, rate-limited batch ops, error wrappers, idempotent tags/notebooks.
Deep searches WPS notes to uncover cross-note associations, perform semantic expansions, and build knowledge graphs. Triggers on '深度搜索', '帮我深挖', '关联查询'; skip simple keyword searches.
Query OneNote pages with OData $filter on title/dates, implement cross-notebook search, and handle pagination via Microsoft Graph SDKs in Python/Node.
Share bugs, ideas, or general feedback.
Comprehensive search and retrieval workflow for Evernote, including search grammar, filters, pagination, related notes discovery, and result enrichment with notebook/tag names.
evernote-install-auth setupBuild a SearchService wrapping findNotesMetadata(). Use NoteFilter for query terms, sort order, and notebook scope. Use NotesMetadataResultSpec to control which metadata fields are returned (title, dates, tags, notebook GUID).
const filter = new Evernote.NoteStore.NoteFilter({
words: 'tag:urgent notebook:"Work"',
ascending: false,
order: Evernote.Types.NoteSortOrder.UPDATED
});
const spec = new Evernote.NoteStore.NotesMetadataResultSpec({
includeTitle: true, includeUpdated: true,
includeTagGuids: true, includeNotebookGuid: true
});
const result = await noteStore.findNotesMetadata(filter, 0, 50, spec);
Implement a fluent QueryBuilder class that chains operators: notebook("Work"), tag("urgent"), intitle("meeting"), createdAfter(date), hasUncompletedTodos(), hasAttachments(). Call .build() to produce the query string. Use any: prefix for OR logic.
const query = new QueryBuilder()
.notebook('Work')
.tag('urgent')
.lastNDays(7)
.hasUncompletedTodos()
.build();
// Result: 'notebook:"Work" tag:"urgent" created:day-7 todo:false'
Use an async generator to iterate through large result sets page by page. Track offset and compare against totalNotes to determine when to stop. Default page size of 50-100 balances API calls versus response size.
Call noteStore.findRelated() with a RelatedQuery (by note GUID or plain text) and RelatedResultSpec to discover related notes, notebooks, and tags.
Cache notebook and tag lookups, then map GUIDs to human-readable names. Return enriched results with notebookName, tags[], created, and updated fields.
For the full SearchService, QueryBuilder, pagination, and enrichment implementations, see Implementation Guide.
| Operator | Example | Description |
|---|---|---|
notebook: | notebook:"Work" | Restrict to notebook |
tag: | tag:urgent | Has tag |
-tag: | -tag:archived | Exclude tag |
intitle: | intitle:meeting | Word in title |
created: | created:day-7 | Created within last 7 days |
updated: | updated:week | Updated this week |
todo: | todo:false | Has uncompleted todos |
resource: | resource:image/* | Has attachment type |
any: | any: term1 term2 | Match ANY term (default is AND) |
SearchService with text search, notebook search, and tag searchQueryBuilder for composing search grammar queriesfindRelated()| Error | Cause | Solution |
|---|---|---|
RATE_LIMIT_REACHED | Too many search calls | Add delay between paginated requests |
BAD_DATA_FORMAT | Invalid search grammar syntax | Validate query with QueryBuilder |
QUOTA_REACHED | Search quota exceeded | Reduce search frequency, cache results |
For error handling patterns, see evernote-common-errors.
Find action items: Search for notes with uncompleted todos from the past week using QueryBuilder().thisWeek().hasUncompletedTodos().build(). Enrich results with notebook names.
Meeting search: Find all notes titled "meeting" in the "Work" notebook from the last 30 days, paginate through results, and export titles with tags.