Read Tools

All 11 read tools are available to every token regardless of scope.


prepare_context

Build a task-specific context pack before multi-page product or coding work. Context Pack v2 runs BM25 retrieval across titles and bodies, combines native OKF-aligned metadata and the page link graph, prefers exact-revision human reviews, and penalizes stale/deprecated knowledge.

Parameter Type Required Default Description
task string Concrete task or question
maxTokens number 2000 Approximate response budget (100016000)
maxConcepts number 6 Maximum concepts (116)
trustPolicy string prefer-human-reviewed any, prefer-human-reviewed, or human-reviewed-only
includeRelated boolean true Include title/ID graph neighbors for targeted follow-up

Returns — a remnus-context-pack-v2 JSON object with selected concept bodies, OKF-aligned type/status/trust/freshness metadata, per-concept selectionReason, truncation and token estimates, link-neighbor references, warnings, plus a short-lived contextRunId. Concept content is explicitly labeled untrusted reference data and cannot override user/system instructions.

human-reviewed means an authenticated Remnus user reviewed the exact current title/body hash. An imported OKF human:* assertion is labeled external-human-asserted; it is never promoted to a local review merely because the file says so.

The contextRunId belongs to the current agent and workspace and expires after 30 minutes. Pass it to related write tools. Smart mode treats this as the recommended context-first flow; Strict mode rejects Remnus mutations without it. See Context-first MCP.

The budget applies to the compact JSON text returned by the tool. If a page cannot fit, its body is collapsed to an outline plus opening excerpt; if the pack still cannot fit, lower-ranked concepts are omitted and truncated becomes true.


search_workspace

Search the workspace by title and content. Matches standalone pages, databases, and database rows (each row is a page) on their title or body text.

Parameters

Parameter Type Required Default Description
query string Text to match against item titles and content (case-insensitive substring)
limit number 10 Maximum results

Returns{ results: [...] }, where each result has:

Field Type Description
id string Item ID (pass to get_page)
type string page | database | database_row
title string Item title
breadcrumb string[] Location path from the workspace root to the item (for a database_row, ends with its parent database name)
matchedOn string Where the query matched: title | content
snippet string Matching content snippet (empty when the match was on the title)
databaseId string? Parent database ID, present for database_row results (pass to query_database)
parentId string? Parent item ID for nested sidebar items

list_workspace

List workspace items (pages and databases). Supports cursor-based pagination and optional parent filtering.

Parameters

Parameter Type Required Default Description
parentId string Parent item ID — omit for root items
limit number 100 Items per page
cursor string Pagination cursor from a previous nextCursor

Returns{ items: [...], hasMore: boolean, nextCursor?: string }, where each item has { id, type, title, parentId, icon, databaseId? }.


get_page

Get the content of a workspace page or database row. Auto-detects the type — no flags needed.

Parameters

Parameter Type Required Default Description
pageId string Workspace item ID or database row ID
mode "full" | "outline" "full" "outline" collapses the body to headings + the first line of each section — a token-cheap skim for long pages

Returns{ id, title, content, properties, type }. In outline mode the response also carries mode: "outline" and fullContentChars (the size of the full body), so you can decide whether a "full" re-fetch is worth it.

Token tip — on long pages, skim with mode: "outline" first (typically 80–90% smaller), then fetch "full" only when the outline shows the page is relevant.


get_pages

Batch version of get_page — fetch a specific, already-known list of page/row IDs in one call, for example IDs returned by search_workspace, get_related_pages, or get_changes_since. IDs can span multiple databases or mix standalone pages with database rows.

Parameters

Parameter Type Required Default Description
pageIds string[] Page/row IDs to fetch (max 50)
mode "full" | "outline" "full" Same as get_page — applied to every fetched page

Returns{ results: [{ id, ok, page?, error? }] }. One missing or inaccessible ID does not fail the whole call — check each entry's ok field; page is present when ok is true (same shape as get_page's return value), error when it's false.

When to use this vs. query_database — if the rows you want all live in one database, query_database with filters/fields is a single query and is cheaper than N lookups. Reach for get_pages when the IDs are already known and don't share one database (or mix page/database-row types).


get_database_schema

Get the column schema and saved views of a database, without fetching rows. Use this before query_database to learn column names and IDs, or before create_database_view / update_database_view / delete_database_view to see existing view ids and config shape.

Parameters

Parameter Type Required Description
databaseId string Database ID (from list_workspace or search_workspace)

Returns{ name, schema: [{ id, name, type, options? }], views: [{ id, name, config, icon?, iconColor? }] } (views always has at least one entry — a database with no saved views implicitly has a default Table view).


query_database

Get the schema and rows of a database. Row markdown bodies are omitted by default — add "content" to fields to include them, or get_page a single row. Supports property filters, field projection, and cursor-based pagination.

Parameters

Parameter Type Required Default Description
databaseId string Database ID
limit number 50 Rows per page
filters object Filter rows by property value
fields string[] Only return these columns (matched by column id or name, case-insensitive); row titles are always included. Add "content" to include row markdown bodies — they are omitted by default, with or without a projection
cursor string Pagination cursor

Filters

Pass a JSON object where each key is a column ID and each value is the property value to match. Use get_database_schema to discover column IDs.

{
  "filters": {
    "col_abc123": "Done",
    "col_def456": ["Tag1", "Tag2"]
  }
}

Use a string for select columns and an array for multi_select columns.

Field projection

When you only need a few columns (e.g. checking statuses on a board), pass fields to cut the payload further — unrequested properties are dropped (row bodies are already omitted by default), and the returned schema is trimmed to match:

{
  "databaseId": "…",
  "fields": ["Status", "Priority"]
}

On a typical board this returns ~85% fewer tokens than a full query.

Returns{ schema, rows, hasMore, nextCursor? } (schema trimmed to the requested fields when projecting)


list_members

List all members of the workspace with their roles and join dates.

Parameters — none

Returns — array of { userId, email, name, role, joinedAt }


query_audit_log

Query the MCP agent activity audit log for the current workspace.

Parameters

Parameter Type Required Default Description
tool string Filter by tool name (e.g. "create_page")
status "success" | "error" Filter by call status
from string Start of date range — ISO 8601 (e.g. "2025-01-01T00:00:00Z")
to string End of date range — ISO 8601
limit number 50 Maximum results

Returns — array of audit log entries with tool, status, targetType, targetId, createdAt, agentName (the agent's brand id, if set), and tokenName (the token's label).


get_changes_since

Get a compact, chronological list of everything that changed in the workspace since a given time or a previous call's cursor — pages/databases edited, database rows edited, and items deleted. Built for recurring agents (a daily report, a standup summary, a memory refresh) so they can sync incrementally instead of re-reading the whole workspace on every run.

Parameters

Parameter Type Required Default Description
since string ISO 8601 timestamp — only return changes after this time. Ignored when cursor is provided
cursor string Pagination cursor from a previous response's nextCursor — takes priority over since for resuming a sync
limit number 100 Maximum changes per page

Returns{ changes: [...], hasMore: boolean, nextCursor?: string }, where each change has:

Field Type Description
id string Item ID (pass to get_page or query_database)
type string page | database | database_row
title string Item title (last known title for deleted items)
changeType string created | updated | deleted
updatedAt string When the change happened (ISO 8601) — for deleted, when the deletion happened
databaseId string? Parent database ID, present for database_row entries

Bootstrapping a sync — omit both since and cursor on the first call to crawl everything (every item comes back as created). Save the last page's nextCursor, or the updatedAt of the most recent change, and pass it back as cursor/since on the next call to pick up only what changed since.

{ "changes": [
  { "id": "…", "type": "page", "title": "Sprint Notes", "changeType": "updated", "updatedAt": "2026-07-04T09:12:00.000Z" },
  { "id": "…", "type": "database_row", "title": "Fix login bug", "changeType": "created", "updatedAt": "2026-07-04T10:03:00.000Z", "databaseId": "…" },
  { "id": "…", "type": "page", "title": "Old Draft", "changeType": "deleted", "updatedAt": "2026-07-04T11:20:00.000Z" }
], "hasMore": false }

What counts as a change — a page's own content edit, a database's schema edit, a database row's title/content/property edit, or moving/renaming an item. Deletions are tracked separately as tombstones, so a deleted item still shows up here (with its last known title) even though it no longer exists.

Note on old data — a handful of rows created before this app consistently stamped timestamps may have no reliable "last changed" time; those are only ever reported once, on a full crawl (no since/cursor), and won't reappear on later incremental calls.


Get a page's knowledge-graph neighborhood in one compact call: its parent, child pages, outgoing links (pages its body references), backlinks (pages whose bodies reference it), and — for database rows — sibling rows in the same database. Titles and IDs only, no page bodies, so orienting around a page costs a fraction of re-reading it and its neighbors; follow up with get_page on the ones that matter.

The link graph is derived from page content: inline @-mention links and child blocks (both embedded sub-pages and "Link to page" references) are extracted on every save, so the graph is always current — no separate indexing step.

Parameters

Parameter Type Required Default Description
pageId string Page ID — a standalone page, database, or database row (same IDs get_page accepts)

Returns{ page, parent, children, outgoingLinks, backlinks, siblings }:

Field Type Description
page object The subject — { id, title, type }
parent object? Parent item (for a database row, the database it belongs to); null at workspace root
children array Items nested under this page in the sidebar tree
outgoingLinks array Pages this page's body references (children already listed above are excluded)
backlinks array Pages whose bodies reference this page (the parent is excluded)
siblings object? { total, items: [{ id, title }] } — other rows in the same database (first 10); only for database rows, null otherwise

Every entry in parent/children/outgoingLinks/backlinks is { id, title, type, databaseId?, linkKind? }type is page | database | database_row, databaseId is present on database entries (pass it to query_database / get_database_schema), and linkKind says how the reference was made (page_link = inline @-mention, child_block = embedded or linked block).

{
  "page": { "id": "…", "title": "Auth Refactor Plan", "type": "page" },
  "parent": { "id": "…", "title": "Engineering", "type": "page" },
  "children": [ { "id": "…", "title": "Session Notes", "type": "page" } ],
  "outgoingLinks": [ { "id": "…", "title": "Login Bug", "type": "database_row", "linkKind": "page_link" } ],
  "backlinks": [ { "id": "…", "title": "Sprint Board", "type": "database", "databaseId": "…", "linkKind": "child_block" } ],
  "siblings": null
}

Typical use — after search_workspace or get_changes_since surfaces a page, call get_related_pages before reading bodies: it tells you what context exists around the page (specs it links to, tasks that reference it, its place in the tree) so you only get_page the neighbors you actually need.

We use cookies We use analytics cookies to understand how Remnus is used and improve it. Privacy Policy