Roam Research MCP Server
Provides comprehensive access to Roam Research's API, enabling creation and management of pages, blocks, and outlines; searching by text, tags, dates, and status; importing markdown content; executing Datomic queries; and managing hierarchical note structures including tables and nested content.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Roam Research MCP Servercreate a new page titled 'Project Brainstorm' with these notes from our meeting"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.

Roam Research MCP Server
A Model Context Protocol (MCP) server that provides comprehensive access to Roam Research's API functionality. This server enables AI assistants like Claude to interact with your Roam Research graph through a standardized interface. It supports standard input/output (stdio) and HTTP Stream communication. (A WORK-IN-PROGRESS, personal project not officially endorsed by Roam Research)
Installation and Usage
This MCP server supports two primary communication methods:
Stdio (Standard Input/Output): Ideal for local inter-process communication, command-line tools, and direct integration with applications running on the same machine. This is the default communication method when running the server directly.
HTTP Stream: Provides network-based communication, suitable for web-based clients, remote applications, or scenarios requiring real-time updates over HTTP. The HTTP Stream endpoint runs on port
8088by default.
Running with Stdio
You can install the package globally and run it:
npm install -g roam-research-mcp
roam-research-mcpOr clone the repository and build from source:
git clone https://github.com/2b3pro/roam-research-mcp.git
cd roam-research-mcp
npm install
npm run build
npm startRunning with HTTP Stream
To run the server with HTTP Stream support, you can either:
Use the default ports: Run
npm startafter building (as shown above). The server will automatically listen on port8088for HTTP Stream.Specify custom ports: Set the
HTTP_STREAM_PORTenvironment variable before starting the server.HTTP_STREAM_PORT=9000 npm startOr, if using a
.envfile, addHTTP_STREAM_PORT=9000to it.
Docker
This project can be easily containerized using Docker. A Dockerfile is provided at the root of the repository.
Build the Docker Image
To build the Docker image, navigate to the project root and run:
docker build -t roam-research-mcp .Run the Docker Container
To run the Docker container and map the necessary ports, you must also provide the required environment variables. Use the -e flag to pass ROAM_API_TOKEN, ROAM_GRAPH_NAME, and optionally MEMORIES_TAG and HTTP_STREAM_PORT:
docker run -p 3000:3000 -p 8088:8088 \
-e ROAM_API_TOKEN="your-api-token" \
-e ROAM_GRAPH_NAME="your-graph-name" \
-e MEMORIES_TAG="#[[LLM/Memories]]" \
-e CUSTOM_INSTRUCTIONS_PATH="/path/to/your/custom_instructions_file.md" \
-e HTTP_STREAM_PORT="8088" \
roam-research-mcpAlternatively, if you have a .env file in the project root (which is copied into the Docker image during build), you can use the --env-file flag:
docker run -p 3000:3000 -p 8088:8088 --env-file .env roam-research-mcpStandalone CLI: roam-import
A standalone command-line tool for importing markdown content directly into Roam Research, without running the MCP server.
Usage
# From a file
cat document.md | roam-import "Meeting Notes"
# From clipboard (macOS)
pbpaste | roam-import "Ideas"
# From here-doc
roam-import "Quick Note" << EOF
# Heading
- Item 1
- Item 2
- Nested item
EOFFeatures
Reads markdown from stdin
Creates a new page with the specified title (or appends to existing page)
Automatically links the new page from today's daily page
Converts standard markdown to Roam-flavored markdown (bold, italic, highlights, tasks, code blocks)
Installation
After building the project, make the command globally available:
npm linkOr run directly without linking:
cat document.md | node build/cli/import-markdown.js "Page Title"Requirements
Same environment variables as the MCP server:
ROAM_API_TOKEN: Your Roam Research API tokenROAM_GRAPH_NAME: Your Roam graph name
Configure via .env file in the project root or set as environment variables.
To Test
Run MCP Inspector after build using the provided npm script:
npm run inspectorFeatures
The server provides powerful tools for interacting with Roam Research:
Environment variable handling with .env support
Comprehensive input validation
Case-insensitive page title matching
Recursive block reference resolution
Markdown parsing and conversion
Daily page integration
Detailed debug logging
Efficient batch operations
Hierarchical outline creation
Enhanced documentation for Roam Tables in
Roam_Markdown_Cheatsheet.mdfor clearer guidance on nesting.Custom instruction appended to the cheat sheet about your specific Roam notes.
roam_fetch_page_by_title: Fetch page content by title. Returns content in the specified format.roam_fetch_block_with_children: Fetch a block by its UID along with its hierarchical children down to a specified depth. Automatically handles((UID))formatting.roam_create_page: Create new pages with optional content and headings. Now creates a block on the daily page linking to the newly created page.roam_import_markdown: Import nested markdown content under a specific block. (Internally usesroam_process_batch_actions.)roam_add_todo: Add a list of todo items to today's daily page. (Internally usesroam_process_batch_actions.)roam_create_outline: Add a structured outline to an existing page or block, with support forchildren_view_type. Best for simpler, sequential outlines. For complex nesting (e.g., tables), considerroam_process_batch_actions. Ifpage_title_uidandblock_text_uidare both blank, content defaults to the daily page. (Internally usesroam_process_batch_actions.)roam_search_block_refs: Search for block references within a page or across the entire graph.roam_search_hierarchy: Search for parent or child blocks in the block hierarchy.roam_find_pages_modified_today: Find pages that have been modified today (since midnight), with pagination and sorting options.roam_search_by_text: Search for blocks containing specific text across all pages or within a specific page. This tool supports pagination via thelimitandoffsetparameters.roam_search_by_status: Search for blocks with a specific status (TODO/DONE) across all pages or within a specific page.roam_search_by_date: Search for blocks or pages based on creation or modification dates.roam_search_for_tag: Search for blocks containing a specific tag and optionally filter by blocks that also contain another tag nearby or exclude blocks with a specific tag. This tool supports pagination via thelimitandoffsetparameters.roam_remember: Add a memory or piece of information to remember. (Internally usesroam_process_batch_actions.)roam_recall: Retrieve all stored memories.roam_datomic_query: Execute a custom Datomic query on the Roam graph for advanced data retrieval beyond the available search tools. Now supports client-side regex filtering for enhanced post-query processing. Optimal for complex filtering (including regex), highly complex boolean logic, arbitrary sorting criteria, and proximity search.roam_markdown_cheatsheet: Provides the content of the Roam Markdown Cheatsheet resource, optionally concatenated with custom instructions ifCUSTOM_INSTRUCTIONS_PATHenvironment variable is set.roam_process_batch_actions: Execute a sequence of low-level block actions (create, update, move, delete) in a single, non-transactional batch. Provides granular control for complex nesting like tables. (Note: For actions on existing blocks or within a specific page context, it is often necessary to first obtain valid page or block UIDs using tools likeroam_fetch_page_by_title.)
Deprecated Tools:
The following tools have been deprecated as of v0.36.2 in favor of the more powerful and flexible roam_process_batch_actions:
roam_create_block: Useroam_process_batch_actionswith thecreate-blockaction.roam_update_block: Useroam_process_batch_actionswith theupdate-blockaction.roam_update_multiple_blocks: Useroam_process_batch_actionswith multipleupdate-blockactions.
Tool Usage Guidelines and Best Practices
Pre-computation and Context Loading:
✅ Before attempting any Roam operations, it is highly recommended to load the Roam Markdown Cheatsheet resource into your context. This ensures you have immediate access to the correct Roam-flavored Markdown syntax, including details for tables, block references, and other special formatting. Example prompt: "Read the Roam cheatsheet first. Then, … "
Specific notes and preferences concerning my Roam Research graph. Users can add their own specific notes and preferences for working with their own graph in the Cheatsheet.
Identifying Pages and Blocks for Manipulation: To ensure accurate operations, always strive to identify target pages and blocks using their Unique Identifiers (UIDs) whenever possible. While some tools accept case-sensitive text titles or content, UIDs provide unambiguous references, reducing the risk of errors due to ambiguity or changes in text.
For Pages: Use
roam_fetch_page_by_titleto retrieve a page's UID if you only have its title. Example: "Read the page titled 'Trip to Las Vegas'"For Blocks: If you need to manipulate an existing block, first use search tools like
roam_search_by_text,roam_search_for_tag, orroam_fetch_page_by_title(with raw format) to find the block and obtain its UID. If the block exists on a page that has already been read, then a search isn't necessary.
Case-Sensitivity: Be aware that text-based inputs (e.g., page titles, block content for search) are generally case-sensitive in Roam. Always match the exact casing of the text as it appears in your graph.
Iterative Refinement and Verification: For complex operations, especially those involving nested structures or multiple changes, it is often beneficial to break down the task into smaller, verifiable steps. After each significant tool call, consider fetching the affected content to verify the changes before proceeding.
Understanding Tool Nuances:
Familiarize yourself with the specific behaviors and limitations of each tool. For instance, roam_create_outline is best for sequential outlines, while roam_process_batch_actions offers granular control for complex structures like tables. Refer to the individual tool descriptions for detailed usage notes.
When making changes to your Roam graph, precision in your requests is crucial for achieving desired outcomes.
Specificity in Requests:
Some tools allow for identifying blocks or pages by their text content (e.g., parent_string, title). While convenient, using Unique Identifiers (UIDs) is always preferred for accuracy and reliability. Text-based matching can be prone to errors if there are multiple blocks with similar content or if the content changes. Tools are designed to work best when provided with explicit UIDs where available.
Example of Specificity:
Instead of:
"parent_string": "My project notes"
Prefer:
"parent_uid": "((some-unique-uid))"
Caveat Regarding Heading Formatting:
Please note that while the roam_process_batch_actions tool can set block headings (H1, H2, H3), directly removing an existing heading (i.e., reverting a heading block to a plain text block) through this tool is not currently supported by the Roam API. The heading attribute persists its value once set, and attempting to remove it by setting heading to 0, null, or omitting the property will not unset the heading.
Example Prompts
Here are some examples of how to creatively use the Roam tool in an LLM to interact with your Roam graph, particularly leveraging roam_process_batch_actions for complex operations.
Example 1: Creating a Project Outline
This prompt demonstrates creating a new page and populating it with a structured outline using a single roam_process_batch_actions call.
"Create a new Roam page titled 'Project Alpha Planning' and add the following outline:
- Overview
- Goals
- Scope
- Team Members
- John Doe
- Jane Smith
- Tasks
- Task 1
- Subtask 1.1
- Subtask 1.2
- Task 2
- Deadlines"Example 2: Updating Multiple To-Dos and Adding a New One
This example shows how to mark existing to-do items as DONE and add a new one, all within a single batch.
"Mark 'Finish report' and 'Review presentation' as done on today's daily page, and add a new todo 'Prepare for meeting'."Example 3: Moving and Updating a Block
This demonstrates moving a block from one location to another and simultaneously updating its content.
"Move the block 'Important note about client feedback' (from page 'Meeting Notes 2025-06-30') under the 'Action Items' section on the 'Project Alpha Planning' page, and change its content to 'Client feedback reviewed and incorporated'."Example 4: Making a Table
This demonstrates moving a block from one location to another and simultaneously updating its content.
"In Roam, add a new table on the page "Fruity Tables" that compares four types of fruits: apples, oranges, grapes, and dates. Choose randomly four areas to compare."Setup
Create a Roam Research API token:
Go to your graph settings
Navigate to the "API tokens" section (Settings > "Graph" tab > "API Tokens" section and click on the "+ New API Token" button)
Create a new token
Configure the environment variables: You have two options for configuring the required environment variables:
Option 1: Using a .env file (Recommended for development) Create a
.envfile in the roam-research directory:ROAM_API_TOKEN=your-api-token ROAM_GRAPH_NAME=your-graph-name MEMORIES_TAG='#[[LLM/Memories]]' CUSTOM_INSTRUCTIONS_PATH='/path/to/your/custom_instructions_file.md' HTTP_STREAM_PORT=8088 # Or your desired port for HTTP Stream communicationOption 2: Using MCP settings (Alternative method) Add the configuration to your MCP settings file. Note that you may need to update the
argsto["/path/to/roam-research-mcp/build/index.js"]if you are running the server directly.For Cline (
~/Library/Application Support/Code/User/globalStorage/saoudrizwan.claude-dev/settings/cline_mcp_settings.json):For Claude desktop app (
~/Library/Application Support/Claude/claude_desktop_config.json):
{ "mcpServers": { "roam-research": { "command": "node", "args": ["/path/to/roam-research-mcp/build/index.js"], "env": { "ROAM_API_TOKEN": "your-api-token", "ROAM_GRAPH_NAME": "your-graph-name", "MEMORIES_TAG": "#[[LLM/Memories]]", "CUSTOM_INSTRUCTIONS_PATH": "/path/to/your/custom_instructions_file.md", "HTTP_STREAM_PORT": "8088" } } } }Note: The server will first try to load from .env file, then fall back to environment variables from MCP settings.
Build the server (make sure you're in the root directory of the MCP):
Note: Customize 'Roam_Markdown_Cheatsheet.md' with any notes and preferences specific to your graph BEFORE building.
cd roam-research-mcp npm install npm run build
Error Handling
The server provides comprehensive error handling for common scenarios:
Configuration errors:
Missing API token or graph name
Invalid environment variables
API errors:
Authentication failures
Invalid requests
Failed operations
Tool-specific errors:
Page not found (with case-insensitive search)
Block not found by string match
Invalid markdown format
Missing required parameters
Invalid outline structure or content
Each error response includes:
Standard MCP error code
Detailed error message
Suggestions for resolution when applicable
Development
Building
To build the server:
npm install
npm run buildThis will:
Install all required dependencies
Compile TypeScript to JavaScript
Make the output file executable
You can also use npm run watch during development to automatically recompile when files change.
Testing with MCP Inspector
The MCP Inspector is a tool that helps test and debug MCP servers. To test the server:
# Inspect with npx:
npx @modelcontextprotocol/inspector node build/index.jsThis will:
Start the server in inspector mode
Provide an interactive interface to:
List available tools and resources
Execute tools with custom parameters
View tool responses and error handling
License
MIT License
About the Author
This project is maintained by Ian Shen.
Available Tools
18 toolsroam_add_todoA
Add a list of todo items as individual blocks to today's daily page in Roam. Each item becomes its own actionable block with todo status. NOTE on Roam-flavored markdown: For direct linking: use [[link]] syntax. For aliased linking, use alias syntax. Do not concatenate words in links/hashtags - correct: #[[multiple words]] #self-esteem (for typically hyphenated words). IMPORTANT: Before using this tool, ensure that you have loaded into context the 'Roam Markdown Cheatsheet' resource.
| Name | Required | Description | Default |
|---|---|---|---|
| todos | Yes | List of todo items to add |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It effectively describes the tool's behavior (adding todos as individual blocks with todo status) and includes important usage notes on Roam-flavored markdown syntax, which adds valuable context beyond basic functionality. However, it doesn't mention potential side effects like rate limits or authentication needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is appropriately sized and front-loaded with the core purpose, followed by important notes. While informative, the markdown syntax section could be more concise, but overall it maintains good structure without unnecessary verbosity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity (single parameter, no output schema, no annotations), the description is reasonably complete. It covers purpose, usage guidelines, and behavioral notes, though it lacks details on return values or error handling, which would be helpful for a mutation tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents the 'todos' parameter as a list of todo item texts. The description adds minimal value beyond this, mentioning that items become 'individual blocks' but not providing additional semantic context about parameter usage or constraints.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific action ('Add a list of todo items as individual blocks') and target resource ('today's daily page in Roam'), distinguishing it from siblings like roam_create_page or roam_import_markdown. It specifies that each item becomes an actionable block with todo status, providing precise functionality.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use this tool ('add... to today's daily page') and includes a prerequisite ('Before using this tool, ensure that you have loaded into context the 'Roam Markdown Cheatsheet' resource'), providing clear guidance on timing and preparation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
roam_create_outlineA
Add a structured outline to an existing page or block (by title text or uid), with customizable nesting levels. To create a new page with an outline, use the roam_create_page tool instead. The outline parameter defines new blocks to be created. To nest content under an existing block, provide its UID or exact text in block_text_uid, and ensure the outline array contains only the child blocks with levels relative to that parent. Including the parent block's text in the outline array will create a duplicate block. Best for:
Adding supplementary structured content to existing pages
Creating temporary or working outlines (meeting notes, brainstorms)
Organizing thoughts or research under a specific topic
Breaking down subtopics or components of a larger concept Best for simpler, contiguous hierarchical content. For complex nesting (e.g., tables) or granular control over block placement, consider
roam_process_batch_actionsinstead. IMPORTANT: Before using this tool, ensure that you have loaded into context the 'Roam Markdown Cheatsheet' resource.
| Name | Required | Description | Default |
|---|---|---|---|
| page_title_uid | No | Title or UID of the page (UID is preferred for accuracy). Leave blank to use the default daily page. | |
| block_text_uid | No | The text content or UID of the block to nest the outline under (UID is preferred for accuracy). If blank, content is nested directly under the page (or the default daily page if page_title_uid is also blank). | |
| outline | Yes | Array of outline items with block text and explicit nesting level. Must be a valid hierarchy: the first item must be level 1, and subsequent levels cannot increase by more than 1 at a time (e.g., a level 3 cannot follow a level 1). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It effectively explains key behaviors: the tool creates new blocks (implied mutation), warns about duplicate creation if parent blocks are included, and clarifies that the outline defines new blocks to be created. However, it lacks details on error handling, permissions, or rate limits, which are common for mutation tools.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured and front-loaded with the core purpose, but it includes a lengthy 'Best for' list and an 'IMPORTANT' note that, while useful, could be more concise. Most sentences earn their place by providing critical guidance, though some redundancy exists in the nesting explanations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (mutation with hierarchical data), no annotations, and no output schema, the description does a good job covering usage scenarios, alternatives, and parameter semantics. However, it lacks details on return values, error cases, or system limitations, leaving some gaps in contextual understanding.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema description coverage is 100%, so the baseline is 3. The description adds meaningful context beyond the schema: it explains that `outline` defines new blocks, clarifies how to nest under existing blocks using `block_text_uid`, and warns against including parent blocks to prevent duplicates. This enhances understanding but does not fully compensate for all parameter nuances.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose with specific verbs ('Add a structured outline to an existing page or block') and resources ('page or block'), and explicitly distinguishes it from the sibling tool `roam_create_page` for creating new pages with outlines. This provides precise differentiation and avoids ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance on when to use this tool versus alternatives: it specifies to use `roam_create_page` for new pages with outlines, warns against including parent blocks in the outline to avoid duplicates, and recommends `roam_process_batch_actions` for complex nesting or granular control. It also includes a prerequisite to load the 'Roam Markdown Cheatsheet' resource before use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
roam_create_pageA
Create a new standalone page in Roam with optional content, including structured outlines, using explicit nesting levels and headings (H1-H3). This is the preferred method for creating a new page with an outline in a single step. Best for:
Creating foundational concept pages that other pages will link to/from
Establishing new topic areas that need their own namespace
Setting up reference materials or documentation
Making permanent collections of information. IMPORTANT: Before using this tool, ensure that you have loaded into context the 'Roam Markdown Cheatsheet' resource.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | Title of the new page | |
| content | No | Initial content for the page as an array of blocks with explicit nesting levels. Note: While empty blocks (e.g., {"text": "", "level": 1}) can be used for visual spacing, they create empty entities in the database. Please use them sparingly and only for structural purposes, not for simple visual separation. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It effectively describes key behavioral traits: it's a creation tool (implied mutation), it creates 'standalone' pages with 'permanent collections,' and it requires loading a specific resource beforehand. However, it doesn't mention potential side effects like duplicate pages, error conditions, or what happens if the cheatsheet isn't loaded.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear sections: purpose statement, use cases in bullet points, and an important prerequisite. While slightly longer than minimal, every sentence adds value. The bullet points could be more concise, but overall the information density is high.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a creation tool with no annotations and no output schema, the description does a good job covering purpose, usage guidelines, and prerequisites. It could be more complete by mentioning what the tool returns (e.g., success confirmation, page reference) or potential error conditions, but given the context signals, it provides substantial guidance for proper use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both parameters thoroughly. The description adds some context about 'structured outlines' and 'explicit nesting levels' which aligns with the content parameter's structure, but doesn't provide additional syntax or format details beyond what the schema provides. This meets the baseline for high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Create a new standalone page in Roam with optional content, including structured outlines, using explicit nesting levels and headings (H1-H3).' It specifies the verb ('create'), resource ('standalone page'), and distinguishes it from siblings by emphasizing it's the 'preferred method for creating a new page with an outline in a single step.'
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance on when to use this tool: 'Best for: Creating foundational concept pages... Establishing new topic areas... Setting up reference materials... Making permanent collections of information.' It also includes an important prerequisite: 'Before using this tool, ensure that you have loaded into context the 'Roam Markdown Cheatsheet' resource.' This clearly defines appropriate use cases and prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
roam_datomic_queryA
Execute a custom Datomic query on the Roam graph for advanced data retrieval beyond the available search tools. This provides direct access to Roam's query engine. Note: Roam graph is case-sensitive.
Optimal Use Cases for roam_datomic_query:
Advanced Filtering (including Regex): Use for scenarios requiring complex filtering, including regex matching on results post-query, which Datalog does not natively support for all data types. It can fetch broader results for client-side post-processing.
Highly Complex Boolean Logic: Ideal for intricate combinations of "AND", "OR", and "NOT" conditions across multiple terms or attributes.
Arbitrary Sorting Criteria: The go-to for highly customized sorting needs beyond default options.
Proximity Search: For advanced search capabilities involving proximity, which are difficult to implement efficiently with simpler tools.
List of some of Roam's data model Namespaces and Attributes: ancestor (descendants), attrs (lookup), block (children, heading, open, order, page, parents, props, refs, string, text-align, uid), children (view-type), create (email, time), descendant (ancestors), edit (email, seen-by, time), entity (attrs), log (id), node (title), page (uid, title), refs (text). Predicates (clojure.string/includes?, clojure.string/starts-with?, clojure.string/ends-with?, <, >, <=, >=, =, not=, !=). Aggregates (distinct, count, sum, max, min, avg, limit). Tips: Use :block/parents for all ancestor levels, :block/children for direct descendants only; combine clojure.string for complex matching, use distinct to deduplicate, leverage Pull patterns for hierarchies, handle case-sensitivity carefully, and chain ancestry rules for multi-level queries.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | The Datomic query to execute (in Datalog syntax). Example: `[:find ?block-string :where [?block :block/string ?block-string] (or [(clojure.string/includes? ?block-string "hypnosis")] [(clojure.string/includes? ?block-string "trance")] [(clojure.string/includes? ?block-string "suggestion")]) :limit 25]` | |
| inputs | No | Optional array of input parameters for the query | |
| regexFilter | No | Optional: A regex pattern to filter the results client-side after the Datomic query. Applied to JSON.stringify(result) or specific fields if regexTargetField is provided. | |
| regexFlags | No | Optional: Flags for the regex filter (e.g., "i" for case-insensitive, "g" for global). | |
| regexTargetField | No | Optional: An array of field paths (e.g., ["block_string", "page_title"]) within each Datomic result object to apply the regex filter to. If not provided, the regex is applied to the stringified full result. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It effectively describes key behavioral traits: it provides 'direct access to Roam's query engine,' notes that 'Roam graph is case-sensitive,' explains that regex filtering is applied 'client-side after the Datomic query,' and offers tips on query construction (e.g., using :block/parents for ancestors, handling case-sensitivity). It doesn't cover rate limits, authentication needs, or error handling, but provides substantial operational context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear sections (purpose, optimal use cases, data model reference, tips) and front-loaded with the core purpose. However, it includes extensive details like the full list of namespaces/attributes and predicates/aggregates, which might be excessive for a tool description—some of this could be referenced elsewhere. Most sentences earn their place by providing actionable guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (custom query execution with 5 parameters) and no annotations or output schema, the description does a good job of providing context. It explains the tool's role, when to use it, behavioral notes (case-sensitivity, client-side filtering), and includes tips for effective querying. It could benefit from examples of return values or error cases, but overall it's quite complete for guiding usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 5 parameters thoroughly. The description adds some context by mentioning 'regex matching on results post-query' and 'client-side post-processing,' which relates to the regexFilter parameter, but doesn't provide significant additional semantic meaning beyond what's in the schema descriptions. This meets the baseline of 3 for high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states the tool's purpose: 'Execute a custom Datomic query on the Roam graph for advanced data retrieval beyond the available search tools.' This clearly specifies the verb (execute), resource (custom Datomic query on Roam graph), and distinguishes it from sibling tools by emphasizing it's for 'advanced data retrieval beyond the available search tools.' The title being null doesn't affect this clarity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance on when to use this tool vs alternatives through the 'Optimal Use Cases' section, which lists four specific scenarios (Advanced Filtering, Highly Complex Boolean Logic, Arbitrary Sorting Criteria, Proximity Search). It also implies when not to use it by stating it's for 'advanced data retrieval beyond the available search tools,' suggesting simpler sibling tools like roam_search_by_text or roam_search_hierarchy should be used for basic queries.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
roam_fetch_block_with_childrenA
Fetch a block by its UID along with its hierarchical children down to a specified depth. Returns a nested object structure containing the block's UID, text, order, and an array of its children.
| Name | Required | Description | Default |
|---|---|---|---|
| block_uid | Yes | The UID of the block to fetch. | |
| depth | No | Optional: The number of levels deep to fetch children. Defaults to 4. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses that the tool returns a nested object structure with specific fields (UID, text, order, children array), which adds context beyond the input schema. However, it doesn't mention potential errors (e.g., invalid UID), performance aspects, or authentication needs, leaving some behavioral traits unclear.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, well-structured sentence that front-loads the purpose and key details (fetching block with children, depth specification, return structure). Every part earns its place without waste, making it highly efficient and easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity (fetching hierarchical data), no annotations, and no output schema, the description is fairly complete. It explains the return structure (nested object with fields), which compensates for the lack of output schema. However, it could improve by mentioning error handling or example usage, but it's sufficient for basic understanding.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both parameters (block_uid and depth) with descriptions and constraints. The description adds value by explaining that depth controls 'the number of levels deep to fetch children,' but this is largely redundant with the schema. Baseline 3 is appropriate as the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific action ('Fetch a block by its UID'), the resource ('block'), and the scope ('along with its hierarchical children down to a specified depth'). It distinguishes itself from siblings like roam_fetch_page_by_title (which fetches pages, not blocks with children) and roam_search_block_refs (which searches for references, not fetches hierarchical structure).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage by specifying 'fetch a block by its UID along with its hierarchical children,' suggesting it's for retrieving nested block structures. However, it doesn't explicitly state when to use this tool versus alternatives like roam_fetch_page_by_title (for pages) or roam_search_hierarchy (which might search but not fetch full nested data). No exclusions or prerequisites are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
roam_fetch_page_by_titleB
Fetch page by title. Returns content in the specified format.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | Title of the page. For date pages, use ordinal date formats such as January 2nd, 2025 | |
| format | No | Format output as markdown or JSON. 'markdown' returns as string; 'raw' returns JSON string of the page's blocks | raw |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It mentions the return format options but doesn't disclose critical behavioral traits: whether this requires authentication, what happens if the title doesn't exist (error vs. null), rate limits, or performance characteristics. 'Fetch' implies read-only, but this isn't explicitly stated, leaving gaps for a tool with no annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise with two short sentences that are front-loaded: the first states the core purpose, the second adds key behavioral detail about output format. Every word earns its place with zero waste or redundancy, making it easy for an agent to parse quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 2 parameters with full schema coverage but no annotations or output schema, the description is minimally adequate. It covers the basic purpose and output format, but for a fetch operation with potential complexities (e.g., title matching, error handling), it lacks completeness. Without annotations, more behavioral context would be helpful, though the concise nature keeps it at a baseline level.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with both parameters well-documented in the schema. The description adds minimal value beyond the schema, only mentioning 'content in the specified format' which echoes the schema's format parameter. It doesn't provide additional context like examples or edge cases, so baseline 3 is appropriate given the comprehensive schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'fetch' and resource 'page by title', specifying what the tool does. It distinguishes from siblings like roam_search_by_text or roam_search_by_date by focusing on exact title matching rather than search operations. However, it doesn't explicitly contrast with roam_fetch_block_with_children, which might be a similar fetch operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. With many sibling search tools (roam_search_by_text, roam_search_by_date, etc.), there's no indication whether this is for exact title matches versus broader searches, or when to prefer this over roam_fetch_block_with_children. The agent must infer usage from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
roam_find_pages_modified_todayB
Find pages that have been modified today (since midnight), with pagination and sorting options.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | The maximum number of pages to retrieve (default: 50). Use -1 for no limit, but be aware that very large result sets can impact performance. | |
| offset | No | The number of pages to skip before returning matches. Useful for pagination. Defaults to 0. | |
| sort_order | No | Sort order for pages based on modification date. "desc" for most recent first, "asc" for oldest first. | desc |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It mentions 'pagination and sorting options' and implies a read operation, but fails to detail performance impacts (e.g., from large result sets), authentication needs, rate limits, or error handling. This is inadequate for a tool with no annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that front-loads the core purpose and briefly notes additional features. There is no wasted text, and it is appropriately sized for the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 3 parameters with full schema coverage and no output schema, the description is minimally complete but lacks depth. It covers the basic purpose and hints at functionality but does not address behavioral aspects like performance or error handling, which are important for a tool with no annotations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, providing full documentation for all parameters (limit, offset, sort_order). The description adds minimal value beyond the schema by mentioning 'pagination and sorting options,' which aligns with the parameters but does not elaborate on their semantics or usage. Baseline 3 is appropriate as the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Find pages that have been modified today (since midnight)' with 'pagination and sorting options.' It specifies the verb ('Find'), resource ('pages'), and temporal scope ('today'), but does not explicitly differentiate from sibling tools like 'roam_search_by_date' or 'roam_search_by_text,' which could have overlapping functionality.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It mentions 'pagination and sorting options' but does not specify use cases, prerequisites, or exclusions compared to sibling tools such as 'roam_search_by_date' or 'roam_search_by_text,' leaving the agent without contextual direction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
roam_import_markdownA
Import nested markdown content into Roam under a specific block. Can locate the parent block by UID (preferred) or by exact string match within a specific page. If a parent_string is provided and the block does not exist, it will be created. Returns a nested structure of the created blocks.
IMPORTANT: Before using this tool, ensure that you have loaded into context the 'Roam Markdown Cheatsheet' resource.
| Name | Required | Description | Default |
|---|---|---|---|
| content | Yes | Nested markdown content to import | |
| page_uid | No | Optional: UID of the page containing the parent block (preferred for accuracy). | |
| page_title | No | Optional: Title of the page containing the parent block (used if page_uid is not provided). | |
| parent_uid | No | Optional: UID of the parent block to add content under (preferred for accuracy). | |
| parent_string | No | Optional: Exact string content of an existing parent block to add content under (used if parent_uid is not provided; requires page_uid or page_title). If the block does not exist, it will be created. | |
| order | No | Optional: Where to add the content under the parent ("first" or "last") | first |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It effectively describes key behaviors: the tool can locate parent blocks by UID or string match, creates blocks if they don't exist when using parent_string, and returns a nested structure of created blocks. However, it doesn't mention potential side effects like overwriting existing content or error handling, leaving some gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is appropriately sized and front-loaded, with the core purpose stated first, followed by operational details and an important prerequisite. Every sentence adds value, though the two-sentence structure could be slightly more streamlined without losing clarity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (6 parameters, no annotations, no output schema), the description is reasonably complete. It covers the tool's purpose, usage context, key behaviors, and prerequisites. However, without an output schema, it doesn't fully explain the return value's structure, and some behavioral aspects like error conditions are omitted.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all parameters thoroughly. The description adds minimal parameter semantics beyond the schema, mainly emphasizing the preference for UID over string matching and the creation behavior for parent_string. This meets the baseline of 3 since the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose with specific verbs ('import nested markdown content') and resources ('into Roam under a specific block'), distinguishing it from siblings like roam_create_page or roam_add_todo which handle different operations. It precisely defines what the tool does beyond just the name.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit usage guidance: it specifies when to use this tool (for importing markdown content under a parent block), mentions prerequisites (loading the 'Roam Markdown Cheatsheet' resource), and distinguishes it from alternatives by focusing on nested content import rather than page creation or querying. The 'IMPORTANT' note adds clear context for proper use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
roam_markdown_cheatsheetB
Provides the content of the Roam Markdown Cheatsheet resource, optionally concatenated with custom instructions if CUSTOM_INSTRUCTIONS_PATH is set.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It describes the tool as providing content and optionally concatenating with custom instructions, but it lacks details on critical behaviors: for example, whether this is a read-only operation, if it requires authentication, what the output format is (e.g., plain text, structured data), or any rate limits. The description is minimal and does not compensate for the absence of annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that front-loads the main purpose ('Provides the content of the Roam Markdown Cheatsheet resource') and adds a conditional detail without unnecessary elaboration. Every word earns its place, making it appropriately sized and well-structured for clarity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the context: no annotations, no output schema, and 0 parameters, the description is incomplete. It explains what the tool does but lacks essential details for an AI agent, such as the return type (e.g., markdown text, error handling), behavioral traits (e.g., read-only, side effects), or how it integrates with sibling tools. The description does not compensate for the missing structured information, making it inadequate for full understanding.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 0 parameters with 100% coverage, so no parameters are documented in the schema. The description mentions an optional 'CUSTOM_INSTRUCTIONS_PATH' parameter, adding semantic meaning beyond the schema by indicating that custom instructions can be concatenated if this path is set. This provides useful context for potential parameter usage, though it's not a formal parameter in the schema. Since there are 0 parameters, the baseline is 4, and the description adds value by hinting at optional behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: it provides content from a specific resource (the Roam Markdown Cheatsheet). It specifies the verb 'provides' and the resource 'Roam Markdown Cheatsheet', making the action and target explicit. However, it does not distinguish this from sibling tools like 'roam_import_markdown' or 'roam_search_by_text', which might also involve markdown or content retrieval, so it lacks sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description includes no guidance on when to use this tool versus alternatives. It mentions an optional feature (concatenation with custom instructions) but does not explain scenarios where this tool is preferred over other content-fetching or markdown-related siblings, such as 'roam_fetch_page_by_title' or 'roam_import_markdown'. There is no explicit when/when-not or alternative tool references, leaving usage context unclear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
roam_process_batch_actionsA
Executes a sequence of low-level block actions (create, update, move, delete) in a single, non-transactional batch. Actions are executed in the provided order. For creating nested blocks, you can use a temporary client-side UID in a parent block and refer to it in a child block within the same batch. For actions on existing blocks, a valid block UID is required. Note: Roam-flavored markdown, including block embedding with ((UID)) syntax, is supported within the string property for create-block and update-block actions. For actions on existing blocks or within a specific page context, it is often necessary to first obtain valid page or block UIDs. Tools like roam_fetch_page_by_title or other search tools can be used to retrieve these UIDs before executing batch actions. For simpler, sequential outlines, roam_create_outline is often more suitable.
IMPORTANT: Before using this tool, ensure that you have loaded into context the 'Roam Markdown Cheatsheet' resource.
| Name | Required | Description | Default |
|---|---|---|---|
| actions | Yes | An array of action objects to execute in order. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It does well by describing the execution order ('Actions are executed in the provided order'), transactional nature ('non-transactional batch'), and specific capabilities like temporary UIDs for nested blocks and support for Roam-flavored markdown. However, it doesn't mention error handling, rate limits, or authentication requirements, which are common behavioral traits for batch operations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is appropriately sized and front-loaded with the core purpose in the first sentence. Each subsequent sentence adds valuable information about usage, prerequisites, and alternatives. While comprehensive, it could be slightly more concise by combining some of the guidance sentences, but overall it earns its place with useful content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of a batch operation tool with no annotations and no output schema, the description does well to cover execution behavior, prerequisites, alternatives, and specific capabilities. It mentions the need for UIDs from other tools and references the markdown cheatsheet resource. The main gap is the lack of information about return values or error responses, which would be helpful given there's no output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents the single 'actions' parameter thoroughly. The description adds some context about how parameters are used (e.g., 'For creating nested blocks, you can use a temporary client-side UID...'), but doesn't provide significant additional semantic meaning beyond what the schema already specifies. This meets the baseline of 3 when schema coverage is high.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool 'executes a sequence of low-level block actions (create, update, move, delete) in a single, non-transactional batch,' specifying both the verb (execute) and resource (block actions). It distinguishes from siblings by explicitly mentioning 'roam_create_outline' as an alternative for simpler outlines, showing clear differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance on when to use this tool vs alternatives: 'For simpler, sequential outlines, `roam_create_outline` is often more suitable.' It also specifies prerequisites: 'Before using this tool, ensure that you have loaded into context the 'Roam Markdown Cheatsheet' resource,' and mentions when other tools are needed first: 'Tools like `roam_fetch_page_by_title` or other search tools can be used to retrieve these UIDs before executing batch actions.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
roam_recallB
Retrieve all stored memories on page titled MEMORIES_TAG, or tagged block content with the same name. Returns a combined, deduplicated list of memories. Optionally filter blocks with a specific tag and sort by creation date.
| Name | Required | Description | Default |
|---|---|---|---|
| sort_by | No | Sort order for memories based on creation date | newest |
| filter_tag | No | Include only memories with a specific filter tag. For single word tags use format "tag", for multi-word tags use format "tag word" (without brackets) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses that the tool returns a 'combined, deduplicated list of memories' and mentions optional filtering and sorting. However, it lacks details about permissions needed, rate limits, error conditions, or what constitutes a 'memory' versus other content types. The behavioral disclosure is basic but not comprehensive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is appropriately sized with two sentences that efficiently convey the core functionality and options. It's front-loaded with the main purpose, followed by additional features. There's no wasted text, though it could be slightly more structured for clarity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity (2 parameters, no output schema, no annotations), the description is adequate but has gaps. It explains what the tool does and mentions return behavior (deduplicated list), but doesn't detail the output format, error handling, or how memories are defined. With no annotations, more behavioral context would improve completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already fully documents both parameters (sort_by and filter_tag). The description adds minimal value beyond the schema by mentioning 'optionally filter blocks with a specific tag and sort by creation date,' which essentially restates what the schema provides. No additional syntax or format details are given.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Retrieve all stored memories on page titled MEMORIES_TAG, or tagged block content with the same name.' It specifies the verb 'retrieve' and resource 'memories' with location details. However, it doesn't explicitly differentiate from sibling tools like roam_search_for_tag or roam_search_by_text, which might have overlapping functionality.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for retrieving memories from specific pages or tagged blocks, but doesn't provide explicit guidance on when to use this tool versus alternatives like roam_search_for_tag or roam_search_by_text. No exclusions or prerequisites are mentioned, leaving the context somewhat open-ended.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
roam_rememberA
Add a memory or piece of information to remember, stored on the daily page with MEMORIES_TAG tag and optional categories. NOTE on Roam-flavored markdown: For direct linking: use [[link]] syntax. For aliased linking, use alias syntax. Do not concatenate words in links/hashtags - correct: #[[multiple words]] #self-esteem (for typically hyphenated words). IMPORTANT: Before using this tool, ensure that you have loaded into context the 'Roam Markdown Cheatsheet' resource.
| Name | Required | Description | Default |
|---|---|---|---|
| memory | Yes | The memory detail or information to remember | |
| categories | No | Optional categories to tag the memory with (will be converted to Roam tags) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It adds valuable context beyond the input schema: it explains that memories are stored on the 'daily page' with a specific tag ('MEMORIES_TAG'), mentions optional categories are converted to Roam tags, and provides detailed formatting rules for Roam-flavored markdown (e.g., linking syntax, hashtag usage). However, it doesn't cover aspects like error handling, rate limits, or authentication needs, which could be relevant for a tool that modifies data.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is appropriately sized and front-loaded: the first sentence clearly states the tool's purpose. Subsequent sentences provide necessary formatting guidelines and a prerequisite note. While the formatting details are somewhat lengthy, they are relevant for correct usage in the Roam context. There is minimal waste, though the structure could be slightly more streamlined (e.g., integrating the note more seamlessly).
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the context: no annotations, no output schema, 2 parameters with full schema coverage, and moderate complexity (involving markdown formatting and tagging), the description is partially complete. It covers the core purpose, storage location, formatting rules, and a prerequisite, but lacks details on behavioral aspects like what happens on failure, whether the operation is idempotent, or example outputs. For a tool that adds data to a system, more behavioral transparency would improve completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both parameters ('memory' and 'categories'). The description adds some semantic context: it clarifies that 'memory' is 'detail or information to remember' and that 'categories' are 'optional' and 'will be converted to Roam tags.' This provides marginal value over the schema but doesn't significantly enhance understanding of parameter usage or constraints. The baseline of 3 is appropriate given high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Add a memory or piece of information to remember, stored on the daily page with MEMORIES_TAG tag and optional categories.' It specifies the verb ('Add'), resource ('memory or piece of information'), and destination ('daily page with MEMORIES_TAG tag'). However, it doesn't explicitly differentiate from sibling tools like 'roam_recall' (which likely retrieves memories) or 'roam_create_page' (which creates pages rather than adding to daily pages).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides some usage context: it mentions storing on the 'daily page' and includes an 'IMPORTANT' note to load the 'Roam Markdown Cheatsheet' resource before use. However, it doesn't explicitly state when to use this tool versus alternatives (e.g., 'roam_create_page' for non-daily pages or 'roam_add_todo' for tasks). The guidance is implied rather than explicit, lacking clear exclusions or comparisons to siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
roam_search_block_refsC
Search for block references within a page or across the entire graph. Can search for references to a specific block or find all block references.
| Name | Required | Description | Default |
|---|---|---|---|
| block_uid | No | Optional: UID of the block to find references to | |
| page_title_uid | No | Optional: Title or UID of the page to search in (UID is preferred for accuracy). If not provided, searches across all pages. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It states the tool 'can search for references to a specific block or find all block references,' which hints at functionality but lacks critical details: it doesn't specify output format, pagination, rate limits, authentication requirements, or error handling. For a search tool with zero annotation coverage, this leaves significant gaps in understanding how the tool behaves.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and front-loaded, with two sentences that directly state the tool's purpose and key capabilities. There is no wasted language or redundancy. However, it could be slightly more structured by explicitly separating scope and parameter usage, which prevents a perfect score.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (search functionality with optional parameters), lack of annotations, and absence of an output schema, the description is incomplete. It fails to explain what the search returns (e.g., list of blocks, metadata), how results are formatted, or any limitations (e.g., search depth, performance considerations). This leaves the agent with insufficient context to use the tool effectively.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage, clearly documenting both optional parameters (block_uid and page_title_uid). The description adds minimal value beyond the schema: it implies the parameters are optional ('can search for references to a specific block') and mentions scope ('within a page or across the entire graph'), but doesn't provide additional syntax, format details, or interaction effects. With high schema coverage, a baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Search for block references within a page or across the entire graph.' It specifies the verb ('search') and resource ('block references'), and distinguishes scope options (page-specific vs. graph-wide). However, it doesn't explicitly differentiate from sibling search tools like roam_search_by_text or roam_search_for_tag, which prevents a perfect score.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides minimal guidance: it mentions searching 'within a page or across the entire graph' and references optional parameters, but offers no explicit advice on when to use this tool versus alternatives (e.g., roam_search_by_text for general text searches or roam_search_for_tag for tag-based searches). No prerequisites, exclusions, or comparative context are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
roam_search_by_dateA
Search for blocks or pages based on creation or modification dates. Not for daily pages with ordinal date titles.
| Name | Required | Description | Default |
|---|---|---|---|
| start_date | Yes | Start date in ISO format (YYYY-MM-DD) | |
| end_date | No | Optional: End date in ISO format (YYYY-MM-DD) | |
| type | Yes | Whether to search by creation date, modification date, or both | |
| scope | Yes | Whether to search blocks, pages | |
| include_content | No | Whether to include the content of matching blocks/pages |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses the search behavior and a key exclusion (not for daily pages), but lacks details on permissions, rate limits, pagination, or error handling. For a search tool with no annotations, this is a moderate gap, as it covers basic intent but not operational traits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the core purpose and followed by a critical exclusion. Every sentence earns its place by providing essential guidance without redundancy, making it highly efficient and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no annotations and no output schema, the description is moderately complete. It covers the purpose and a key exclusion, but lacks details on return values, error cases, or behavioral constraints. For a search tool with 5 parameters and no structured output, it should do more to guide the agent on what to expect.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema fully documents all parameters. The description adds no additional parameter semantics beyond implying date-based filtering, which is already covered in the schema. Baseline 3 is appropriate when the schema does the heavy lifting, with no extra value from the description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific action ('Search for blocks or pages'), resource ('blocks or pages'), and distinguishing scope ('based on creation or modification dates'). It explicitly differentiates from sibling tools by stating 'Not for daily pages with ordinal date titles,' which distinguishes it from tools like roam_find_pages_modified_today that might handle daily pages differently.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance on when not to use this tool ('Not for daily pages with ordinal date titles'), which helps the agent avoid misuse. It also implies usage context by specifying date-based search, distinguishing it from text-based (roam_search_by_text), tag-based (roam_search_for_tag), or status-based (roam_search_by_status) siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
roam_search_by_statusB
Search for blocks with a specific status (TODO/DONE) across all pages or within a specific page.
| Name | Required | Description | Default |
|---|---|---|---|
| status | Yes | Status to search for (TODO or DONE) | |
| page_title_uid | No | Optional: Title or UID of the page to search in (UID is preferred for accuracy). If not provided, searches across all pages. | |
| include | No | Optional: Comma-separated list of terms to filter results by inclusion (matches content or page title) | |
| exclude | No | Optional: Comma-separated list of terms to filter results by exclusion (matches content or page title) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It mentions searching 'across all pages or within a specific page', which adds some behavioral context, but it doesn't disclose critical traits like whether this is a read-only operation, potential rate limits, authentication needs, or what the output format looks like (e.g., list of blocks). For a search tool with no annotations, this is a significant gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that front-loads the core purpose ('Search for blocks with a specific status') and includes key details (status types and scope). There is no wasted verbiage, making it appropriately sized and structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no annotations and no output schema, the description is incomplete. It lacks information on behavioral traits (e.g., read-only nature, error handling) and output format, which are crucial for a search tool. While the schema covers inputs well, the overall context for an AI agent to use this tool effectively is insufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all parameters thoroughly. The description adds minimal value beyond the schema by mentioning 'across all pages or within a specific page', which loosely relates to the 'page_title_uid' parameter, but it doesn't provide additional syntax or format details. Baseline 3 is appropriate when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'search' and resource 'blocks with a specific status (TODO/DONE)', making the purpose unambiguous. However, it doesn't explicitly differentiate from sibling tools like 'roam_search_by_text' or 'roam_search_for_tag', which also search blocks but with different criteria, so it falls short of a perfect 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage by mentioning 'across all pages or within a specific page', providing some context, but it doesn't explicitly state when to use this tool versus alternatives like other search tools (e.g., 'roam_search_by_text' for text-based searches). No exclusions or clear alternatives are named, so it's not fully explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
roam_search_by_textA
Search for blocks containing specific text across all pages or within a specific page. This tool supports pagination via the limit and offset parameters.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | The text to search for | |
| page_title_uid | No | Optional: Title or UID of the page to search in (UID is preferred for accuracy). If not provided, searches across all pages. | |
| case_sensitive | No | Optional: Whether the search should be case-sensitive. If false, it will search for the provided text, capitalized versions, and first word capitalized versions. | |
| limit | No | Optional: The maximum number of results to return. Defaults to 50. Use -1 for no limit, but be aware that very large results sets can impact performance. | |
| offset | No | Optional: The number of results to skip before returning matches. Useful for pagination. Defaults to 0. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses pagination behavior and performance implications ('very large results sets can impact performance'), which is valuable. However, it doesn't mention authentication needs, rate limits, error conditions, or what the return format looks like.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with zero waste. The first sentence states the core purpose and scope, the second adds crucial behavioral detail about pagination. Every word earns its place in this efficiently structured description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a search tool with 5 parameters and no output schema, the description covers the basic operation and pagination but lacks information about return format, error handling, or performance characteristics beyond a brief warning. With no annotations and no output schema, more behavioral context would be helpful.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all parameters thoroughly. The description adds minimal value beyond the schema by mentioning pagination support for limit/offset parameters, but doesn't provide additional semantic context beyond what's in the parameter descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific action ('Search for blocks containing specific text') and resource ('across all pages or within a specific page'), distinguishing it from sibling tools like roam_search_by_date or roam_search_for_tag. It precisely defines the search scope and target.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context about when to use this tool (text-based searches across pages) and implicitly differentiates it from siblings by focusing on text content rather than dates, tags, or references. However, it doesn't explicitly name alternatives or state when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
roam_search_for_tagA
Search for blocks containing a specific tag and optionally filter by blocks that also contain another tag nearby or exclude blocks with a specific tag. This tool supports pagination via the limit and offset parameters. Use this tool to search for memories tagged with the MEMORIES_TAG.
| Name | Required | Description | Default |
|---|---|---|---|
| primary_tag | Yes | The main tag to search for (without the [[ ]] brackets) | |
| page_title_uid | No | Optional: Title or UID of the page to search in (UID is preferred for accuracy). Defaults to today's daily page if not provided. | |
| near_tag | No | Optional: Another tag to filter results by - will only return blocks where both tags appear | |
| case_sensitive | No | Optional: Whether the search should be case-sensitive. If false, it will search for the provided tag, capitalized versions, and first word capitalized versions. | |
| limit | No | Optional: The maximum number of results to return. Defaults to 50. Use -1 for no limit, but be aware that very large results sets can impact performance. | |
| offset | No | Optional: The number of results to skip before returning matches. Useful for pagination. Defaults to 0. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden for behavioral disclosure. It mentions pagination support and performance considerations for large result sets, which adds useful context beyond the schema. However, it doesn't cover important aspects like error conditions, rate limits, authentication requirements, or what happens when no matches are found, leaving gaps for a search tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is appropriately sized with three sentences that each serve a purpose: stating the core functionality, explaining pagination support, and providing a usage example. It's front-loaded with the main purpose and avoids unnecessary repetition. However, the third sentence about MEMORIES_TAG feels somewhat tacked on rather than integrated into the flow.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a search tool with 6 parameters, no annotations, and no output schema, the description provides adequate but incomplete coverage. It explains the core functionality and pagination but lacks information about return format, error handling, performance characteristics beyond the brief mention, and how results are ordered. The MEMORIES_TAG example helps but doesn't compensate for the missing output information.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 100% description coverage, so parameters are well-documented in the structured schema. The description adds minimal value by mentioning the 'limit' and 'offset' parameters specifically for pagination and the MEMORIES_TAG use case for primary_tag, but doesn't provide additional semantic context beyond what's already in the schema descriptions. With high schema coverage, the baseline is 3, and the slight additional context justifies a 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool searches for blocks containing a specific tag with optional filtering capabilities. It specifies the resource ('blocks') and action ('search for'), distinguishing it from siblings like roam_search_by_text or roam_search_by_date. However, it doesn't explicitly differentiate from roam_search_block_refs which might also involve tags.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides some usage context with 'Use this tool to search for memories tagged with the MEMORIES_TAG,' giving a specific application scenario. However, it doesn't explicitly state when to use this versus other search tools like roam_search_by_text or roam_search_block_refs, nor does it provide clear exclusion criteria or alternatives for similar tag-based operations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
roam_search_hierarchyB
Search for parent or child blocks in the block hierarchy. Can search up or down the hierarchy from a given block.
| Name | Required | Description | Default |
|---|---|---|---|
| parent_uid | No | Optional: UID of the block to find children of | |
| child_uid | No | Optional: UID of the block to find parents of | |
| page_title_uid | No | Optional: Title or UID of the page to search in (UID is preferred for accuracy). | |
| max_depth | No | Optional: How many levels deep to search (default: 1) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It mentions the ability to search 'up or down' and 'from a given block,' but doesn't cover critical aspects like whether this is a read-only operation, potential performance impacts, rate limits, authentication needs, or what the output looks like (since there's no output schema). For a search tool with no annotation coverage, this leaves significant gaps in understanding its behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is highly concise and front-loaded: two sentences that directly state the tool's purpose and key capability ('search up or down'). There's no wasted verbiage, and every sentence earns its place by conveying essential information efficiently, making it easy for an agent to parse quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (hierarchical search with 4 parameters), lack of annotations, and no output schema, the description is incomplete. It doesn't explain the return values, error conditions, or behavioral nuances like how parameters interact (e.g., if both parent_uid and child_uid are provided). For a search tool without structured output or safety hints, more context is needed to ensure reliable agent usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, meaning all parameters are documented in the schema itself (e.g., parent_uid for finding children, child_uid for finding parents, page_title_uid for scoping, max_depth for depth control). The description adds no additional parameter semantics beyond what the schema provides, such as clarifying interactions between parameters or usage examples. With high schema coverage, the baseline is 3, as the description doesn't compensate with extra insights.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Search for parent or child blocks in the block hierarchy. Can search up or down the hierarchy from a given block.' This specifies the verb ('search'), resource ('parent or child blocks'), and scope ('block hierarchy'), distinguishing it from siblings like roam_search_by_text or roam_search_block_refs. However, it doesn't explicitly differentiate from all siblings (e.g., roam_fetch_block_with_children), keeping it at 4 rather than 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage by stating 'Can search up or down the hierarchy from a given block,' which suggests when to use it (for hierarchical searches) but doesn't provide explicit guidance on when to choose this tool over alternatives like roam_search_block_refs or roam_fetch_block_with_children. No exclusions or prerequisites are mentioned, so it's adequate but lacks detailed differentiation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
Most tools have distinct purposes, such as roam_create_page for new pages versus roam_create_outline for adding to existing pages. However, some overlap exists: roam_search_by_text and roam_search_for_tag both search for blocks, and roam_process_batch_actions can perform tasks covered by simpler tools like roam_add_todo, which might cause confusion in tool selection.
All tool names follow a consistent snake_case pattern with a 'roam_' prefix and descriptive verb_noun combinations, such as roam_fetch_page_by_title and roam_search_by_status. This uniformity makes the tool set predictable and easy to navigate for an agent.
With 18 tools, the count is slightly high but reasonable for a comprehensive Roam Research server covering creation, querying, search, and memory management. It avoids being overwhelming by grouping related functionalities, though some tools could potentially be consolidated to reduce complexity.
The tool set provides complete coverage for Roam Research operations, including CRUD actions (e.g., roam_create_page, roam_process_batch_actions), advanced querying (roam_datomic_query), various search methods (e.g., by text, tag, date), and specialized features like memory management (roam_remember, roam_recall). No obvious gaps exist for the domain.
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Full-control memory API for AI agents — memories, collections, links, search, and bulk operations.
Personal wiki and memory layer for AI assistants. Persistent, structured memory across sessions.
Persistent memory and knowledge graph for AI assistants — keyword + vector + graph search.
Connect AI assistants to your GitHub-hosted Obsidian vault to seamlessly access, search, and analy…
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/camiloluvino/roamMCP'
If you have feedback or need assistance with the MCP directory API, please join our Discord server