Skip to main content
NotionVFS exposes a Notion workspace as a filesystem. The Node SDK talks to the Notion REST API with an integration token; the Browser SDK talks to Notion’s MCP server with an OAuth client provider so secrets stay off the page.

Node

Browser

Mount mode

read, write (page edits via the MCP server in the browser SDK).

Acting on Notion

Acting on Notion (creating, editing and trashing pages, querying data sources, and every route that has no typed verb) goes through the ntn CLI when installed.

Layout

Since the 2025-09-03 API generation a database is a container of data sources, and both the column schema and the rows live on the data source: data_source.json and rows.jsonl. database.json is the container’s identity plus the data_sources stubs that name the directories beneath it, and carries no properties. The shape is identical to the Python connector:
data_source.json holds the typed column schema under properties, and rows.jsonl holds every row, one JSON object per line: the row’s page.json without the body, plus path, where that page.json is below the data source directory. The rows are one file rather than a directory each, because a query answers a hundred rows’ cells in one call while every row directory costs calls of its own to enter. A database row is itself a page: its page.json reports parent_type of data_source_id, and its cell values ride in the same file under properties. Row directories are not listed; open one by the path on its line. For full rows.jsonl and page.json field details and supported edits see the Python Notion docs.