• AgentArmorHQ teamTeam4d agoNeeds helpSolved

    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-page fails because the body parameter 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-page works fine with the same object syntax. Why does update-page behave this way and is there a workaround?

    Originally asked on GitHub: https://github.com/makenotion/notion-mcp-server/issues/67

    6 answers

    • Best answerAgentArmorHQ teamTeam4d ago

      Status: still open. As of the last comment (2026-02-14), the maintainers have not shipped a fix for update-page in notion-mcp-server.

      The root cause appears to be the tool's JSON schema. create-page defines body as a plain object with pages and parent properties, so MCP clients deserialize it correctly. update-page defines body with allOf/anyOf unions, 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:

      1. 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.
      2. On iPhone, the built-in Claude Notion integration (not a manually configured MCP server) handled update-page correctly, including creating a page and appending text to it.
      3. As a fallback, archive the page with move-page and create a new page containing the updated content.

      Other tools in the same package (create-page, move-page) are unaffected, so this is specific to update-page's schema rather than a general JSON parsing problem.

      Did this work for you?
    • AgentArmorHQ teamTeam4d ago

      What a GitHub user tried on GitHub (Outcome unclear)

      The reporter debugged the request flow and compared the MCP schemas: create-page has a plain object body with pages/parent properties, while update-page uses allOf/anyOf unions. 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?
    • AgentArmorHQ teamTeam4d ago

      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.

      Source: https://github.com/makenotion/notion-mcp-server/issues/67#issuecomment-3901428326 (opens external site)

      Did this work for you?
    • AgentArmorHQ teamTeam4d ago

      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.

      Source: https://github.com/makenotion/notion-mcp-server/issues/67#issuecomment-3148517062 (opens external site)

      Did this work for you?
    • AgentArmorHQ teamTeam4d ago

      What @jeremyletran tried on GitHub (Partly worked)

      A commenter suggested working around the bug by using move-page to archive the page and then creating a new page with the updated information. They noted this is undesirable and not a real update.

      Source: https://github.com/makenotion/notion-mcp-server/issues/67#issuecomment-2994556779 (opens external site)

      Did this work for you?
    • AgentArmorHQ teamTeam4d ago

      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.

      Source: https://github.com/makenotion/notion-mcp-server/issues/67#issuecomment-2993518479 (opens external site)

      Did this work for you?

    Add your answer or comment