Skip to content

synced_block_reference: URL inside url= attribute gets auto-converted to <mention-page>, mangling the tag #286

@aochtman

Description

@aochtman

Summary

The hosted MCP server at https://mcp.notion.com/mcp cannot create a <synced_block_reference> block via markdown. The parser auto-converts any Notion URL it encounters in the input — including URLs inside url="..." attributes — to <mention-page> tags. For synced_block_reference, this mid-attribute rewrite breaks the surrounding tag structure.

This worked correctly as recently as ~24 hours ago. Likely server-side regression tied to the Notion Agents feature rollout (one variant returned an "Invalid agent URL" error, suggesting the parser's URL-recognition was broadened to include agent URLs but over-fires on ALL Notion URLs in attribute positions).

Reproduction

  1. Create a source page with a synced block via create-pages:
<synced_block>
hello from source
</synced_block>
  1. Fetch the page; capture the synced_block URL (e.g., https://www.notion.so/<PAGE_UUID>#<BLOCK_UUID>).

  2. On a different page, try to write a synced_block_reference pointing at that URL via update_content:

<synced_block_reference url="https://www.notion.so/<PAGE_UUID>#<BLOCK_UUID>">
\thello from source
</synced_block_reference>

Expected behavior

A synced_block_reference block is created on the target page that mirrors the source synced_block's content, with two-way sync (per enhanced-markdown-spec).

Actual behavior

One of two failure modes, depending on whether the tag has children:

With children → API returns 400 Failed to create block. Block not created.

Empty (self-close or open-close with no body) → API succeeds, but the block is stored as escaped plain text. Fetching the target page returns:

\<synced_block_reference url="<mention-page url=\"https://www.notion.so/<PAGE_UUID>\"/>
</synced_block_reference>

The #<BLOCK_UUID> fragment is stripped (mention-page URLs don't preserve fragments). The original url="..." attribute's closing " is orphaned. The > of the injected <mention-page> tag prematurely closes the outer tag. Structure is malformed.

Variants tested (all fail the same way)

Variant Result
URL with #<block-uuid> fragment Fails
URL without fragment Fails
Dashed page/block UUIDs Fails
Dashless UUIDs Fails
Inside <callout> Fails
At root level Fails
With children content Failed to create block
Self-closing / empty Accepted but mangled to plain text
With notice="" attribute Fails
Workspace-prefixed URL with title slug Fails
Via update_content Fails
Via create-pages (inline in initial content) Fails

Suspected cause

The markdown parser performs URL → <mention-page> auto-conversion globally on the input text, without checking whether the URL is in a content position vs. inside a tag's attribute string. The conversion correctly fires for content-positioned URLs (e.g., "type a URL, get a mention") but should be suppressed inside tag attributes.

One test variant returned Invalid agent URL: Failed to parse as URL: <BLOCK_UUID_HEX>. Expected a Notion page or block URL. — the "agent URL" terminology suggests the affected code path is shared with the new <mention-agent> tag handling.

Suggested fix

Skip URL auto-conversion when the parser is inside a tag's attribute string. The XML/markdown parser should distinguish attribute-position URLs (preserve literally) from content-position URLs (convert to mention).

Evidence / test artifacts

Reproduced today (2026-05-13). Test pages with the broken render captured for inspection:

  • Empty synced_block_reference via update_content, mangled-text render captured.
  • Empty synced_block_reference via create-pages, mangled-text render captured.

Pre-regression reference: pages where the synced_block_reference was written successfully ~24 hours earlier render correctly and continue to work for cross-page sync — the bug is only in the block CREATION parsing path, not in storage or rendering of already-created blocks.

Impact

Any markdown automation that creates synced_block_references via this MCP server (e.g., customer-support reply workflows where a draft is mirrored from a Reply card to a Support Case body) is broken. Workarounds require manual UI conversion or removing the cross-page synced reference architecture entirely.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions