Notion MCP update-page fails: body parameter arrives as JSON string instead of object
I'm using the Notion MCP server (notion-mcp-server) with Claude Desktop on macOS. Calling
update-pagefails because thebodyparameter arrives at the MCP layer as a JSON string (e.g.{"page_id": "abc", "command": "insert_content_after", ...}) instead of an object, so the Notion API rejects it.create-pageworks fine with the same object syntax. Why doesupdate-pagebehave this way and is there a workaround?Originally asked on GitHub: https://github.com/makenotion/notion-mcp-server/issues/67
6 answers
Status: still open. As of the last comment (2026-02-14), the maintainers have not shipped a fix for
update-pagein notion-mcp-server.The root cause appears to be the tool's JSON schema.
create-pagedefinesbodyas a plain object withpagesandparentproperties, so MCP clients deserialize it correctly.update-pagedefinesbodywithallOf/anyOfunions, and in that case clients (Claude Desktop, Claude web, Claude Code, and even Codex CLI per the thread) pass the value as a JSON string, e.g."{\"page_id\": \"abc\", \"command\": \"insert_content_after\", ...}", which the Notion API rejects because it expects an object.Workarounds that were reported:
- When updating properties, explicitly prompt the model to include
"command": "update_properties"in the body. One user found this was the deciding factor between calls that succeeded and calls that failed; it was flaky, but prompting it did make property updates work. - On iPhone, the built-in Claude Notion integration (not a manually configured MCP server) handled
update-pagecorrectly, including creating a page and appending text to it. - As a fallback, archive the page with
move-pageand create a new page containing the updated content.
Other tools in the same package (
create-page,move-page) are unaffected, so this is specific toupdate-page's schema rather than a general JSON parsing problem.Did this work for you?- When updating properties, explicitly prompt the model to include
What a GitHub user tried on GitHub (Outcome unclear)
The reporter debugged the request flow and compared the MCP schemas:
create-pagehas a plain object body withpages/parentproperties, whileupdate-pageusesallOf/anyOfunions. They concluded the union schema prevents the body from being deserialized from a JSON string into an object.Source: https://github.com/makenotion/notion-mcp-server/issues/67 (opens external site)
Did this work for you?What @JesperDramsch tried on GitHub (Partly worked)
A user found the failure was flaky. The main difference when it worked was that the model included
"command": "update_properties"in the request; prompting the model to add that command when it failed made property updates work.Did this work for you?What @Ze1598 tried on GitHub (Worked)
On the Claude mobile app (iPhone), the built-in Notion integration was used instead of a manually configured MCP server. Creating a new page and then updating it with more text worked as expected.
Did this work for you?What @jeremyletran tried on GitHub (Partly worked)
A commenter suggested working around the bug by using
move-pageto archive the page and then creating a new page with the updated information. They noted this is undesirable and not a real update.Did this work for you?What @CJPoll tried on GitHub (Outcome unclear)
A commenter reproduced the exact failure in Claude Desktop with a full body payload for
insert_content_after(e.g."command": "insert_content_after",selection_with_ellipsis,new_str), confirming the body arrives as a string.Did this work for you?