Skip to content
Skillv1.0.0

evernote-sdk-patterns

Advanced Evernote SDK patterns and best practices. Use when implementing complex note operations, batch processing, search queries, or optimizing SDK usage. Trigger with phrases like "evernote sdk pat

by jeremylongshore(0) 0 installs
Free
Sign in to install

Free account. Installing gives you the manifest plus copy-paste snippets.

See reviews

About

Imported from jeremylongshore/tons-of-skills-marketplace (skills/.curated/evernote-sdk-patterns/SKILL.md). Install upstream with npx skills add jeremylongshore/tons-of-skills-marketplace --skill evernote-sdk-patterns. Copyright stays with the author (MIT).

Evernote SDK Patterns

Overview

Production-ready patterns for working with the Evernote SDK, including search with NoteFilter, pagination, attachments, tags, error handling wrappers, and batch operations with rate limit handling.

Prerequisites

  • Completed evernote-install-auth and evernote-hello-world
  • Understanding of Evernote data model (Notes, Notebooks, Tags, Resources)
  • Familiarity with async/await and Promises

Instructions

Pattern 1: Search with NoteFilter

Use NoteFilter for query terms and sort order, paired with NotesMetadataResultSpec to select returned fields. This avoids fetching full note content when only metadata is needed.

const filter = new Evernote.NoteStore.NoteFilter({
  words: 'tag:important 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, 100, spec);

Pattern 2: Creating Notes with Attachments

Compute the MD5 hash of the file buffer, create a Resource with the binary data and MIME type, embed it in ENML with <en-media type="..." hash="..."/>, and attach it to the note.

const hash = crypto.createHash('md5').update(fileBuffer).digest('hex');
const resource = new Evernote.Types.Resource();
resource.data = new Evernote.Types.Data();
resource.data.body = fileBuffer;
resource.mime = 'image/png';

const note = new Evernote.Types.Note();
note.title = 'Note with Attachment';
note.content = wrapInENML(`<en-media type="image/png" hash="${hash}"/>`);
note.resources = [resource];
await noteStore.createNote(note);

Pattern 3: Error Handling Wrapper

Wrap API calls to distinguish EDAMUserException (client errors), EDAMSystemException (rate limits, maintenance), and EDAMNotFoundException (invalid GUIDs). Use error.rateLimitDuration for automatic retry delays.

Pattern 4: Batch Operations

Process items sequentially with configurable delay between operations. On rate limit errors, wait for rateLimitDuration seconds then retry. Track progress with callbacks.

Pattern 5: Tag and Notebook Management

Implement getOrCreateTag() and getOrCreateNotebook() for idempotent operations. Use listTags() / listNotebooks() to check existence before creating.

For all nine patterns with complete implementations, see Implementation Guide.

Output

  • Search patterns using NoteFilter and NotesMetadataResultSpec
  • Async generator for paginated note retrieval
  • Attachment creation with MD5 hash and MIME type
  • Tag and notebook find-or-create utilities
  • EvernoteError wrapper class with isRateLimit, isNotFound, isInvalidData
  • Batch processor with rate limit retry and progress tracking

Error Handling

Error Cause Solution
RATE_LIMIT_REACHED Too many API calls Use rateLimitDuration, add delays between batch items
BAD_DATA_FORMAT Invalid ENML Validate with wrapInENML() before sending
DATA_CONFLICT Concurrent modification Refetch note metadata and retry update
QUOTA_REACHED Account storage full Check remaining quota via user.accounting

Resources

Next Steps

See evernote-core-workflow-a for note creation and management workflows.

Examples

Bulk tagging: Search for all notes matching a query, then batch-add a tag to each result with 200ms delay between operations and automatic rate limit retry.

Attachment upload: Read a PDF from disk, compute its MD5 hash, create a note with the PDF as an <en-media> resource, and verify the upload via getNote() with withResources: true.

Use it

Copy one of these into your project. Installing also returns the manifest and these snippets.

yaml
targets:
  - https://api.opensmartroute.ai/api/v1/registry/jeremylongshore-tons-of-skills-marketplace-evernote-sdk-af6c8d/manifest   # or paste the manifest below

Manifest

An Open Capability Manifest: the router reads it to know what this does, what it costs and when to pick it.

jeremylongshore-tons-of-skills-marketplace-evernote-sdk-af6c8d.ocm.jsonjson
{
  "ocm": "1",
  "id": "jeremylongshore-tons-of-skills-marketplace-evernote-sdk-af6c8d",
  "kind": "skill",
  "name": "evernote-sdk-patterns",
  "description": "Advanced Evernote SDK patterns and best practices. Use when implementing complex note operations, batch processing, search queries, or optimizing SDK usage. Trigger with phrases like \"evernote sdk patterns\", \"evernote best practices\", \"evernote advanced\", \"evernote batch operations\".",
  "publisher": "jeremylongshore",
  "version": "1.0.0",
  "capabilities": {
    "domains": [
      "general"
    ],
    "tags": [
      "skill-md",
      "saas",
      "evernote",
      "evernote-sdk",
      "skills-sh"
    ],
    "languages": [
      "en"
    ]
  },
  "quality_prior": 0.6,
  "examples": [
    "Advanced Evernote SDK patterns and best practices. Use when implementing complex note operations, batch processing, search queries, or optimizing SDK usage. Trigger with phrases like \"evernote sdk patterns\", \"evernote best practices\", \"evernote advanced\", \"evernote batch operations\"."
  ],
  "primary": false,
  "metadata": {
    "source": {
      "provider": "skills.sh",
      "repository": "https://github.com/jeremylongshore/tons-of-skills-marketplace",
      "path": "skills/.curated/evernote-sdk-patterns/SKILL.md",
      "ref": "HEAD",
      "url": "https://github.com/jeremylongshore/tons-of-skills-marketplace/blob/HEAD/skills/.curated/evernote-sdk-patterns/SKILL.md",
      "key": "jeremylongshore/tons-of-skills-marketplace/skills/.curated/evernote-sdk-patterns/SKILL.md"
    },
    "compatibility": "Designed for Claude Code",
    "allowed_tools": [
      "Read,",
      "Write,",
      "Edit,",
      "Grep"
    ],
    "license": "MIT"
  },
  "instructions": "# Evernote SDK Patterns\n\n## Overview\n\nProduction-ready patterns for working with the Evernote SDK, including search with NoteFilter, pagination, attachments, tags, error handling wrappers, and batch operations with rate limit handling.\n\n## Prerequisites\n\n- Completed `evernote-install-auth` and `evernote-hello-world`\n- Understanding of Evernote data model (Notes, Notebooks, Tags, Resources)\n- Familiarity with async/await and Promises\n\n## Instructions\n\n### Pattern 1: Search with NoteFilter\n\nUse `NoteFilter` for query terms and sort order, paired with `NotesMetadataResultSpec` to select returned ",
  "cost": {
    "context_tokens": 1030
  }
}

Fetch it by URL: GET /api/v1/registry/jeremylongshore-tons-of-skills-marketplace-evernote-sdk-af6c8d/manifest?version=1.0.0

Reviews

Star ratings from people who tried it. One review per account; edit yours any time.

No reviews yet. Install it, try it, and be the first to rate it.