A local, read-only index of personal text and markdown documents with full-text search, retrieval, and listing capabilities via MCP tools. Indexing and removal are exclusive to the REST API.
Three read-only tools with strong descriptions (194 - 392 chars, well above baseline 194 avg) and clear parameter documentation. All tools have explicit input schemas with types and descriptions. Tool names follow verb_noun convention (search_documents, get_document, list_documents). Error handling includes actionable recovery guidance ('Use list_documents to discover valid ids'). Main gaps: no output schemas documented in code, no enum constraints on numeric parameters (size, page, pageSize), and no explicit tool annotations (readOnlyHint present via [McpServerTool(ReadOnly=true)] but not in MCP protocol response format visible here).
Retrieves the full text of one indexed document by its opaque id. Ids are base64url-encoded paths taken from search_documents hits or list_documents entries — they cannot be guessed or constructed. Unknown ids produce an error result explaining what went wrong; use list_documents to discover valid ids.
Paginated listing of everything currently in the index (newest modified first), newest-first with totals for pagination. Use it to discover what is searchable and to obtain ids for get_document. Read-only: nothing here adds, updates, or removes entries — indexing itself is a REST-API operation.
Full-text search over the indexed document corpus using Lucene's standard query syntax. Returns ranked hits with context snippets and opaque document ids usable with get_document. Syntax: a bare word matches documents containing it; multiple bare words combine as OR by default — AND (or +word) requires every term, -word excludes, quoted strings match exact phrases in order, and a trailing * gives prefix matching ("sec*" finds "security"; no stemming or fuzzy matching). Field targeting beyond the document body is not available. If a query returns nothing, loosen it (drop required clauses, prefer OR) rather than repeating it verbatim — an empty result means no document satisfies the constraints, not an error. Malformed syntax returns an actionable message describing where parsing failed.
Output schemas not documented in source code. LLMs cannot infer response structure (SearchResult, DocumentContent, DocumentPage fields) without explicit schema definitions.
Numeric parameters (size, page, pageSize) lack enum or explicit min/max constraints in schema. Descriptions mention bounds ('1-100', '1-500') but JSON Schema does not enforce them, allowing LLMs to pass invalid values.
Tool annotations (readOnlyHint) present in C# attributes but not visible in MCP protocol response. Verify that [McpServerTool(ReadOnly=true)] translates to proper MCP tool annotation in the server's tool registration response.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 60 | 2026-07-28+ | v2 |
search_documents returns 'context snippets' per description but no snippet field documented in output schema. Unclear what SearchResult.hits[] contains or how snippets are formatted.
list_documents description mentions 'newest modified first' and 'totals for pagination' but output schema (DocumentPage) not visible. Cannot verify if total_count, next_cursor, or page metadata is returned.