Skip to main content
Glama

Find notion mentions

well_find_notion_mentions
Read-only

Read every Notion page or comment that changed after since and names one of this workspace's own members — a person-valued property, an inline @mention in a page, or an @mention inside a comment. The match against a member comes only from Notion's own <mention-user url="user://..."> tag: never a name, an email, or free text in the page's prose.

This tool makes no judgment: it does not decide whether a page asks the member to act, is informational, is noise, or is an echo of a comment Well itself posted. That triage is the caller's own job, using each row's zone, excerpt and the fact that the row exists at all (a comment line Well itself wrote still carries no <mention-user> tag unless it names someone, so a plain acknowledgement never appears here).

With no Notion connector live in this workspace, returns connected: false and reads nothing. Bounded at 25 changed pages per call, oldest changes first; truncated: true means either more pages changed than this call read, or a transient or connection failure (timeout, 5xx, rate limit, revoked grant) stopped the run partway through rather than skip the failed page. Either way, pass cursor as the next call's since and cursor_note_id as its after_note_id to keep going from the last page this call fully read, never re-reading what it covered and never skipping a page changed at the same instant.

A failure that belongs to the connection (a revoked or expired grant, a missing scope or capability, a 401, 402 or 403, or any other typed 4xx outside the two codes below) stops the run at once with truncated: true and the cursor unchanged, so no page is lost while the member reconnects. A page whose own request is settled as wrong — Notion's own object_not_found code with a typed 404 or 410, or its validation_error code with a typed 400, and only those two — is skipped immediately, with no retry: its id and updated_at are reported in failed_pages, the cursor advances past it, and the run keeps reading later pages. A caller sees a page in failed_pages when mentions on that page may be incomplete for this and every future run, until the page is shared back or re-created.

dedup_key is stable across runs for the same page/comment, zone and member: a caller uses it to never act on the same appearance twice.

Input Schema

NameRequiredDescriptionDefault
sinceYesOnly pages and comments that changed strictly after this ISO-8601 instant are read. Pass the workspace's own last-run watermark, never a guessed date.
workspace_idNoTarget workspace. Omit when the token authorizes one workspace. Required when it authorizes several: this read reports one workspace's own figures and will not choose which.
after_note_idNoThe previous call's cursor_note_id, passed with its cursor as since: the read then also takes the pages changed at that same instant after this note.
conversation_idNoThe conversation id returned by the previous Well result, in its meta under well/conversation_id, in its structuredContent, or in its JSON text block. Pass it back on every call in the same conversation, including a call a card makes, so the chosen workspace and the earlier answers still apply. It decides the conversation on its own: nothing the host states about the session replaces it. Omit it only on the first call of a conversation.
workspace_scopeNoRestrict this call to the family: the token's primary workspace plus the company workspaces under it that you are a member of. Unrelated authorized workspaces drop out of the read; row reads merge across the family, while a per-workspace figure still reports exactly one workspace.

Output Schema

NameRequiredDescriptionDefault
cursorYesPass as the next call's `since` to continue past a truncated result.
connectedYesFalse when this workspace has no live Notion connector; every other field is then empty.
truncatedYes
pages_readYes
appearancesYes
failed_pagesYesPages this run skipped because the provider answered with Notion's own object_not_found code on a typed 404/410, or validation_error code on a typed 400 — never any other failure, which stops the run instead. The cursor advances past each of these, so mentions on them may be incomplete for this and every future run.
cursor_note_idYesPass as the next call's `after_note_id`, with cursor as since. Null when there is no page to resume after.
conversation_idNoThe conversation this result belongs to. Pass it back as the conversation_id argument on every later Well call in the same conversation.
newly_connectedNoTools that connected to this workspace since the last result and that no session was told about yet, oldest first. Present only when at least one tool is new. The connected-line rule says when to tell an entry; when it does, one line per entry, in the person's language: "<name> is connected.". Never fold several entries into one sentence. Each entry comes back once, on one result only: never repeat its line later.
resolved_workspaceNoThe workspace that answered, when the caller named none and the token authorizes several.
conversation_id_noteNoPresent only when the server opened a fresh lane, stating that no choice recorded earlier was read.
conversation_id_sourceNoWhere the conversation id came from: the host's own request meta, the caller's argument, or a fresh lane the server opened.
workspace_connector_idYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed11 schema fields changed
    • changedInput schema / properties / since / pattern
      Previous value: -"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"New value: +"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
    • removedOutput schema / properties / appearances / items / properties / comment_id / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / appearances / items / properties / comment_id / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • addedOutput schema / properties / appearances / items / properties / self_mention
      Added value: +{
      +  "description": "True when zone is comment and the comment's own author is the member it names: the member wrote it to themselves. False otherwise, and on a page or property zone.",
      +  "type": "boolean"
      +}
    • changedOutput schema / properties / appearances / items / required
      Previous value: -[
      -  "dedup_key",
      -  "member_id",
      -  "notion_user_id",
      -  "zone",
      -  "provider_note_id",
      -  "comment_id",
      -  "excerpt",
      -  "property_names"
      -]New value: +[
      +  "dedup_key",
      +  "member_id",
      +  "notion_user_id",
      +  "zone",
      +  "provider_note_id",
      +  "comment_id",
      +  "excerpt",
      +  "property_names",
      +  "self_mention"
      +]
    • removedOutput schema / properties / cursor_note_id / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / cursor_note_id / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / resolved_workspace / properties / name / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / resolved_workspace / properties / name / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / workspace_connector_id / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / workspace_connector_id / type
      Added value: +[
      +  "string",
      +  "null"
      +]
  2. Changed2 schema fields changed
    • addedOutput schema / properties / appearances / items / properties / property_names
      Added value: +{
      +  "description": "Every Notion property's own JSON key (`Assignee`, `Created by`, a custom label, …) that names the member, in key order, when zone is properties; an empty array otherwise. A member named under more than one property gets every label here, never only the first — this tool reads no property type, so a caller judging whether any label names a real assignment reads the labels themselves, not a type this tool does not have.",
      +  "items": {
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
    • changedOutput schema / properties / appearances / items / required
      Previous value: -[
      -  "dedup_key",
      -  "member_id",
      -  "notion_user_id",
      -  "zone",
      -  "provider_note_id",
      -  "comment_id",
      -  "excerpt"
      -]New value: +[
      +  "dedup_key",
      +  "member_id",
      +  "notion_user_id",
      +  "zone",
      +  "provider_note_id",
      +  "comment_id",
      +  "excerpt",
      +  "property_names"
      +]
  3. Added

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well past the readOnly/openWorld annotations: documents the 25-page bound, oldest-first ordering, what `truncated: true` actually means (backlog vs. partial failure), which failure classes abort vs. skip into `failed_pages`, cursor immutability on connection failure, and `dedup_key` stability across runs. This is exactly the non-obvious operational context an agent cannot infer from structured fields.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose and the no-triage caveat are front-loaded, and the paragraphs follow a logical order (what it reads, what it doesn't decide, pagination, failure classes, dedup). It is long and the failure-taxonomy sentences are dense, but each carries distinct operational information rather than restating the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, the description still supplies the pieces the schema alone wouldn't convey: resume protocol, `truncated` interpretation, `failed_pages` meaning ('mentions may be incomplete for this and every future run'), and `dedup_key` usage. An agent can call this correctly and safely on the first attempt.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is already 100%, and the description still adds meaning: `since` as the workspace's last-run watermark (never a guessed date) and `after_note_id` as the same-instant tiebreaker paired with the previous cursor. `workspace_id`, `conversation_id`, and `workspace_scope` are left entirely to their schema descriptions, so it doesn't fully cover the parameter set.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: reads Notion pages and comments changed after `since` that name a workspace member, and pins the matching rule to Notion's `<mention-user>` tag rather than names/emails/prose. This is unambiguous and clearly separable from siblings like `well_post_notion_comment`, which writes rather than finds.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly defines the tool's scope of responsibility ('makes no judgment... triage is the caller's own job') and gives operating instructions for continuation (pass `cursor` as next `since`, `cursor_note_id` as `after_note_id`) plus the `connected: false` precondition. It stops short of naming an alternative tool for the neighboring task (e.g. searching Notion content without mention semantics), so not a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources