The server defines 9 tools with complete JSON Schema input definitions and risk labels, which is good. However, tool descriptions are generic and many parameter descriptions lack specificity. The descriptions fail to explain WHEN to use each tool (e.g., when should an agent call search_pages vs get_page?), what the tool returns in detail, or any prerequisites. Parameter descriptions are present but minimal, most are single phrases like 'The content of the block' without format guidance, constraints, or examples. No output schemas are documented anywhere. Error handling exists in the code but is not reflected in tool definitions. No tool has the actionable error guidance pattern. The code shows defensive practices (permission gating for delete, logging), but these are not exposed in the tool definitions where LLMs need them. Average tool description length is ~40 chars, well below the 194-char production baseline. Parameter descriptions average ~30 chars, below the 72-char baseline. No parameter uses enums despite multiple tools (e.g., create_block, update_block) accepting enum-like values (block properties, page names). The tools follow verb_noun naming correctly and have logical composition, but lack the LLM-optimized descriptions and constraints needed for reliable agent planning.
Create a new block in Logseq
Create a new page in Logseq
Delete a block from Logseq
Execute a Datalog query in Logseq
Get all pages in the current Logseq graph
Get a journal page by date. Automatically converts the date to Logseq's journal format.
Get a page from Logseq by name
Missing output schemas: No tool definition documents what fields the response contains. LLMs cannot plan downstream calls (e.g., what field name contains the block ID for use in update_block?) or extract relevant data without guessing.
Generic, short descriptions (avg 40 chars vs 194-char baseline): Descriptions like 'Update an existing block in Logseq' do not explain WHEN to call this tool vs similar ones, what happens to nested blocks, whether it replaces all properties or merges them, or what errors can occur. LLMs cannot disambiguate between get_page and get_journal_page based on current descriptions.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 54 | <=2025-11-25 | v2 |
| 2026-03-09 | F | 44 | - | v1 |
Search for pages in Logseq
Update an existing block in Logseq
No parameter constraints or enums: Properties parameter accepts 'object' type but no enum/examples for valid property keys (e.g., 'tags', 'author', 'status'). Datalog query parameter has no format guidance (simple queries vs complex queries?). Date parameter in get_journal_page claims to accept multiple formats but does not validate or constrain input, LLMs may pass invalid dates and get cryptic Logseq API errors.
Minimal parameter descriptions (avg 30 chars): 'The content of the block' does not specify max length, format (plaintext vs markdown), or whether special characters/HTML are allowed. 'The ID of the block to update' does not explain what a block ID looks like or where to obtain one. Parameter descriptions should be 50 - 150 chars with format and constraint details.
No error guidance in tool definitions: Code shows error handling (e.g., 'Block created successfully: {result}' vs 'Failed to create block: {e}'), but tool descriptions never mention possible errors or recovery steps. LLMs see a tool succeed or fail with no context for what to do next. E.g., delete_block returns a permission error but the tool definition does not hint at this.
No tool annotations for destructive/read-only operations: Tools have Risk labels (WRITE, DESTRUCTIVE, READ_ONLY) in the metadata, but the MCP protocol does not expose these via toolAnnotations. LLMs cannot reason about safety, delete_block should carry a destructiveHint annotation so agents know it is irreversible.
Unclear tool distinctions: get_page, get_journal_page, get_all_pages, and search_pages all retrieve pages but descriptions do not explain when to use each. Should agents call search_pages with a query, or get_page with an exact name? Does get_journal_page auto-convert dates or expect pre-formatted strings? Ambiguity forces LLMs to guess or try multiple tools.
No pagination support documented: get_all_pages accepts include_journals boolean but does not document max results, pagination, or offset/limit parameters. If a Logseq graph has thousands of pages, returning all of them will blow the context window. Descriptions should state limits and offer pagination.
Optional parameters with no defaults documented: content in create_page is optional but no description of what happens if omitted (empty page? error?). properties in create_block/update_block is optional but no guidance on valid keys or merge vs replace semantics.