Server has 25 tools with mostly complete schemas and descriptions. Naming follows verb_noun convention well (create_record, delete_record, search). However, descriptions vary in quality, some are detailed with examples (create_record, create_from_url), others are minimal (move_record, rename_record). Parameter descriptions are present but inconsistent in depth. Output schemas are not explicitly documented in the code. Error handling exists but lacks recovery guidance. No tool annotations (readOnlyHint/destructiveHint) despite clear risk classifications in the spec.
Adds tags to a DEVONthink record. Example: { "uuid": "1234-5678-90AB-CDEF", "tags": ["important", "work"] }
Get classification proposals for a DEVONthink record. Example: { "recordUuid": "1234-5678-90AB-CDEF" }
Compare DEVONthink records for similarities. Example 1: Find similar records { "recordUuid": "1234-5678-90AB-CDEF" } Example 2: Compare two specific records { "recordUuid": "1234-5678-90AB-CDEF", "compareWithUuid": "FEDC-BA09-8765-4321" }
Convert a record to a different format, creating a new record. Example: { "uuid": "1234-5678-90AB-CDEF", "format": "markdown" }
Create a record in DEVONthink from a web URL. Example: { "url": "https://www.example.com", "format": "markdown" }
Create a new record in DEVONthink. Example: { "name": "New Note", "type": "markdown", "content": "# Hello World" }
Minimal descriptions for 12 tools (move_record, get_record_properties, rename_record, remove_tags, replicate_record, update_record_content, etc.). Descriptions under 50 chars lack context for LLM tool selection.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite clear risk classifications in spec (READ_ONLY, WRITE, DESTRUCTIVE). LLMs cannot infer safety properties without explicit hints.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 39 | 2026-07-28+ | v2 |
Delete a record from DEVONthink. Example: { "uuid": "1234-5678-90AB-CDEF" }
Duplicate a record to any destination group, creating an independent copy. Example: { "uuid": "1234-5678-90AB-CDEF", "destinationGroupUuid": "FEDC-BA09-8765-4321" }
Find records in DEVONthink by citation key
Get bibliography metadata for a DEVONthink record
Get the current DEVONthink database
Get list of open DEVONthink databases
Get a record by its identifier (UUID, ID, or path)
Get the content of a DEVONthink record
Get properties of a DEVONthink record
Get selected records in DEVONthink
Check if DEVONthink is running
List contents of a group in DEVONthink
Look up a record in DEVONthink by various identifiers
Move a record to a different group in DEVONthink
Remove tags from a DEVONthink record
Rename a record in DEVONthink
Replicate a record to another database in DEVONthink
Search for records in DEVONthink
Update the content of a DEVONthink record
Output schemas not documented in tool definitions. LLMs cannot plan downstream calls or extract required fields (e.g., what does search() return? Does it include record UUIDs for chaining to get_record_content?).
Error handling in executeJxa (src/applescript/execute.ts) returns generic McpError with message only. No recovery guidance (e.g., 'DEVONthink not running? Try is_running() first').
Multiple tools accept flexible identifiers (uuid, recordId, recordPath) but descriptions do not clarify precedence or mutual exclusivity. LLMs may pass all three, causing ambiguous behavior.