Problem
There is no way to get a block ID out of the remote MCP, so an agent cannot build an anchor link to a specific section of a page. Only whole-page links are possible.
Notion supports block links natively (https://www.notion.so/<page-id>#<block-id-without-dashes>, right-click → Copy link to block). None of the MCP tools expose the IDs needed to construct one.
Repro
All three surfaces on mcp.notion.com, as of 2026-07-31:
| Surface |
Result |
notion-fetch |
enhanced Markdown, zero block identifiers — a page with six ## headings comes back with no way to address any of them |
notion-search scoped to one page (page_url) |
results[].id is the page ID, never the matched block |
notion://docs/enhanced-markdown-spec |
no id/url attribute for ordinary blocks; attribute lists support only color and toggle |
Use case
Alert rules linking to the matching runbook section. Each alert definition wants a URL pointing at its own ## AlertName heading in a shared runbook page. With page-level links only, whoever gets paged lands at the top of a long document and scrolls.
These URLs are hand-copied from the UI and go stale on every restructure — the one thing an agent should be able to regenerate, it can't.
Proposal
Add block IDs to notion-fetch output using the attribute-list syntax the format already has:
## AlertName {block_id="3221ca43-55c3-80cf-84cc-f204f1af3c1d"}
Opt-in via include_block_ids: true keeps the default token cost unchanged.
This is consistent with block-scoped URLs the format already emits: <synced_block url="{{URL}}"> in the spec, and discussion:// markers under include_discussions: true.
Alternative: a tool returning block IDs for a page, equivalent to GET /v1/blocks/{block_id}/children. The local server already exposes this as get-block-children; the remote MCP has no equivalent.
Related
Problem
There is no way to get a block ID out of the remote MCP, so an agent cannot build an anchor link to a specific section of a page. Only whole-page links are possible.
Notion supports block links natively (
https://www.notion.so/<page-id>#<block-id-without-dashes>, right-click → Copy link to block). None of the MCP tools expose the IDs needed to construct one.Repro
All three surfaces on
mcp.notion.com, as of 2026-07-31:notion-fetch##headings comes back with no way to address any of themnotion-searchscoped to one page (page_url)results[].idis the page ID, never the matched blocknotion://docs/enhanced-markdown-speccolorandtoggleUse case
Alert rules linking to the matching runbook section. Each alert definition wants a URL pointing at its own
## AlertNameheading in a shared runbook page. With page-level links only, whoever gets paged lands at the top of a long document and scrolls.These URLs are hand-copied from the UI and go stale on every restructure — the one thing an agent should be able to regenerate, it can't.
Proposal
Add block IDs to
notion-fetchoutput using the attribute-list syntax the format already has:Opt-in via
include_block_ids: truekeeps the default token cost unchanged.This is consistent with block-scoped URLs the format already emits:
<synced_block url="{{URL}}">in the spec, anddiscussion://markers underinclude_discussions: true.Alternative: a tool returning block IDs for a page, equivalent to
GET /v1/blocks/{block_id}/children. The local server already exposes this asget-block-children; the remote MCP has no equivalent.Related
public_urlnot exposed in fetch results. Different field, same "data exists in the API, not surfaced through the MCP layer" shape.