A secure MCP server for Evernote integration with OAuth 1.0a authentication and automatic token expiration handling
The Evernote MCP server provides four read-only tools with complete input schemas and descriptions visible in mcp-server.js. Tool naming is clear and verb-based (create, get, search patterns). All four tools have descriptions (85-120 chars each), meeting the 10-1024 char baseline. Input schemas are properly typed with JSON Schema. However, OUTPUT SCHEMAS ARE NOT DOCUMENTED, a critical gap for the 'SCHEMAS & OUTPUT' dimension. The tool responses are never defined, so LLMs cannot predict what fields to expect or how to chain tools together. Additionally, error handling is not evident in the provided code, there is no recovery guidance or error categorization. The Dockerfile exposes HTTPS (port 3443), but the mcp-server.js code uses STDIO transport (StdioServerTransport), not HTTP. This is a hard transport mismatch: STDIO-only servers are capped at 50 per the rubric, but the architectural intent suggests HTTPS + WebSocket. Per-tool scores average to 62 across definition quality alone.
Search for notes in Evernote using natural language queries
Retrieve metadata and basic information for a specific note by its GUID
Retrieve the full content of a specific note in a readable format
Get details about a previously executed search by its ID
Output schemas not documented. LLMs cannot predict response structure or plan downstream tool calls. 'createSearch' returns a searchId, but what fields does it include? 'getNote' retrieves metadata, what fields are returned? Without documented outputs, agents cannot reliably extract data or chain tools.
No error handling or recovery guidance in tool implementations. If a search fails, the LLM receives no actionable error message, no categorization (retryable vs user-fixable vs fatal), and no suggestion for next steps. E.g., 'User not found. Try search_users() with a partial name.' is missing.
Transport mismatch: code uses STDIO (StdioServerTransport) but Dockerfile exposes HTTPS/3443. STDIO is not remotely accessible and cannot work with hosted MCP clients. Either migrate to HTTP+SSE or Streamable HTTP, or remove the Dockerfile.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 58 | 2026-07-28+ | v2 |
| 2026-03-09 | D | 55 | 2025-06-18+ | v1 |
Parameter descriptions could be more actionable. E.g., 'createdAfter' is described as 'Optional: Only return notes created after this date (YYYY-MM-DD)', good format, but missing guidance on timezone handling or whether the API supports partial dates. Baseline for A+ is 50-200 chars; descriptions here average ~80 chars and lack usage hints.
No pagination limit enforcement documented. 'createSearch' accepts maxResults up to 100, but real-world Evernote queries could return millions. No guidance on what happens if the result set is huge, or whether partial results + cursor are returned. Baseline: cap at 20-50 and document in description.
'format' enum in getNoteContent (text, html, enml) lacks description of what each format contains. Does 'enml' preserve Evernote native markup? Does 'html' include metadata? Ambiguity forces LLM to guess or retry with different formats.