Summary
While building a CRM on top of the Notion MCP server, we encountered three distinct issues that make database management through the MCP unreliable:
API-create-a-data-source returns HTTP 400 invalid_request_url on every call, yet occasionally creates the database anyway (inconsistent side-effect)
API-update-a-data-source returns HTTP 400 invalid_request_url consistently — database properties can never be updated via MCP
API-patch-block-children only supports paragraph and bulleted_list_item block types — child_database and most other Notion block types are not supported
Environment
- MCP server:
@makenotion/notion-mcp-server (official)
- Notion API version used by MCP:
2025-09-03
- Integration type: Internal integration (bot)
- Workspace plan: Notion Plus
- Client: Claude Code (claude-sonnet-4-6)
Issue 1 — API-create-a-data-source returns invalid_request_url but sometimes creates the database
Steps to reproduce
{
"parent": { "page_id": "311804f8-2911-8032-8eb6-dc30052e7bbd" },
"title": [{ "type": "text", "text": { "content": "Test DB" } }],
"properties": {
"Name": { "title": {} }
}
}
Expected behavior
HTTP 200 with the created database object.
Actual behavior
{
"status": 400,
"object": "error",
"code": "invalid_request_url",
"message": "Invalid request URL.",
"request_id": "..."
}
During our session, the first call created the database despite returning 400. All subsequent calls (6+ attempts, varying payload size and page_id format) returned 400 and created nothing. The behavior is non-deterministic — the database was created as a side-effect of a failing request.
Root cause hypothesis
The MCP server appears to call a URL like /v1/data-sources instead of the standard POST /v1/databases. The Notion API returns invalid_request_url because /v1/data-sources does not exist. The one successful creation may have been a retry hitting the correct endpoint, or a race condition.
Issue 2 — API-update-a-data-source returns invalid_request_url consistently
Steps to reproduce
{
"data_source_id": "<valid-database-id>",
"properties": {
"New Field": { "rich_text": {} }
}
}
Expected behavior
HTTP 200 with updated database object (equivalent to PATCH /v1/databases/{id}).
Actual behavior
{
"status": 400,
"object": "error",
"code": "invalid_request_url",
"message": "Invalid request URL."
}
This completely blocks any post-creation property management via MCP.
Issue 3 — API-patch-block-children only supports 2 block types
Description
The children parameter of API-patch-block-children is typed as:
anyOf: [paragraphBlockRequest, bulletedListItemBlockRequest]
This means only paragraph and bulleted_list_item can be appended. Notably missing:
child_database (which would have served as a workaround for Issue 1)
heading_1, heading_2, heading_3
numbered_list_item, toggle, callout, divider, image, code
The Notion API supports 20+ block types — the MCP exposes only 2.
Workaround
We bypassed the MCP entirely by calling POST /v1/databases directly via Node.js HTTPS using the integration token — which worked correctly with Notion-Version: 2022-06-28.
Suggestions
- Rename
API-create-a-data-source → API-create-a-database and map it to POST /v1/databases (not /v1/data-sources)
- Rename
API-update-a-data-source → API-update-a-database and map it to PATCH /v1/databases/{id}
- Expand
API-patch-block-children to support all block types documented in the Notion API
- If "data source" is intentional (Notion AI feature), add a separate
API-create-a-database tool for the standard database creation endpoint
Discovered while building a CRM with Claude Code using the official Notion MCP server. Happy to provide the full session log if useful.
Summary
While building a CRM on top of the Notion MCP server, we encountered three distinct issues that make database management through the MCP unreliable:
API-create-a-data-sourcereturns HTTP 400invalid_request_urlon every call, yet occasionally creates the database anyway (inconsistent side-effect)API-update-a-data-sourcereturns HTTP 400invalid_request_urlconsistently — database properties can never be updated via MCPAPI-patch-block-childrenonly supportsparagraphandbulleted_list_itemblock types —child_databaseand most other Notion block types are not supportedEnvironment
@makenotion/notion-mcp-server(official)2025-09-03Issue 1 —
API-create-a-data-sourcereturnsinvalid_request_urlbut sometimes creates the databaseSteps to reproduce
{ "parent": { "page_id": "311804f8-2911-8032-8eb6-dc30052e7bbd" }, "title": [{ "type": "text", "text": { "content": "Test DB" } }], "properties": { "Name": { "title": {} } } }Expected behavior
HTTP 200 with the created database object.
Actual behavior
{ "status": 400, "object": "error", "code": "invalid_request_url", "message": "Invalid request URL.", "request_id": "..." }During our session, the first call created the database despite returning 400. All subsequent calls (6+ attempts, varying payload size and page_id format) returned 400 and created nothing. The behavior is non-deterministic — the database was created as a side-effect of a failing request.
Root cause hypothesis
The MCP server appears to call a URL like
/v1/data-sourcesinstead of the standardPOST /v1/databases. The Notion API returnsinvalid_request_urlbecause/v1/data-sourcesdoes not exist. The one successful creation may have been a retry hitting the correct endpoint, or a race condition.Issue 2 —
API-update-a-data-sourcereturnsinvalid_request_urlconsistentlySteps to reproduce
{ "data_source_id": "<valid-database-id>", "properties": { "New Field": { "rich_text": {} } } }Expected behavior
HTTP 200 with updated database object (equivalent to
PATCH /v1/databases/{id}).Actual behavior
{ "status": 400, "object": "error", "code": "invalid_request_url", "message": "Invalid request URL." }This completely blocks any post-creation property management via MCP.
Issue 3 —
API-patch-block-childrenonly supports 2 block typesDescription
The
childrenparameter ofAPI-patch-block-childrenis typed as:This means only
paragraphandbulleted_list_itemcan be appended. Notably missing:child_database(which would have served as a workaround for Issue 1)heading_1,heading_2,heading_3numbered_list_item,toggle,callout,divider,image,codeThe Notion API supports 20+ block types — the MCP exposes only 2.
Workaround
We bypassed the MCP entirely by calling
POST /v1/databasesdirectly via Node.js HTTPS using the integration token — which worked correctly withNotion-Version: 2022-06-28.Suggestions
API-create-a-data-source→API-create-a-databaseand map it toPOST /v1/databases(not/v1/data-sources)API-update-a-data-source→API-update-a-databaseand map it toPATCH /v1/databases/{id}API-patch-block-childrento support all block types documented in the Notion APIAPI-create-a-databasetool for the standard database creation endpoint