MCP server for semantic search of Roam Research pages using OpenAI embeddings and Supabase
Single tool with good naming and clear description, but with noticeable gaps in parameter documentation and output schema definition. The tool name 'search_roam_pages' properly uses the verb_noun pattern and clearly conveys its action. The description (234 chars) exceeds the rubric baseline (194 avg) and includes helpful context about semantic search, when to use it, and examples. However, parameter descriptions lack constraint details and the output schema is undocumented in the source code, only mentioned in docstring prose rather than formal JSON Schema. Error handling returns JSON strings but provides minimal recovery guidance. The server lacks validation guidance for the threshold range (0.0-1.0) and match_count limit (max 50) in the source code implementation.
Search for Roam Research pages by semantic similarity using AI embeddings. Uses OpenAI's text-embedding-3-small model to find pages with similar meaning to your query, even if they don't contain the exact keywords. Perfect for discovering related content and finding the right page to write new information.
Output schema is documented only in docstring prose, not in formal MCP input/output schema. The tool returns JSON but no OutputSchema is registered with fastmcp, LLMs cannot reliably parse expected fields from OpenAPI/JSON Schema.
Parameter descriptions lack formal constraints. 'threshold' description mentions range 0.0-1.0 and examples of precise/exploratory searches, but does not explicitly state validation bounds in a way the MCP schema enforces. 'match_count' mentions 'max: 50' in docstring but source code validation is missing, tool could accept invalid values.
Error handling is generic. On OpenAI or Supabase failures, the tool returns a JSON error object with only 'error' and 'query' fields. No recovery guidance (e.g., 'Check OPENAI_API_KEY is set' or 'Verify Supabase credentials') and no distinction between retryable vs. fatal errors.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 5 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 45 | - | v1 |
No pagination support documented or implemented. While the match_count parameter caps individual results, there is no offset/cursor mechanism for iterating through large result sets. If an agent needs all matching pages, it cannot paginate.
Default threshold (0.7) is hardcoded in function signature but differs from docstring example (0.5) mentioned as default for exploratory results. Inconsistency between code default and documentation.