Skip to main content

Publish Markdown and mkdocs.yml-based documentation into Notion.

Project description

mkdocs2notion

A command-line tool that converts a directory of Markdown documents—optionally structured with mkdocs.yml—into a fully-organized Notion workspace.

This utility mirrors the publishing behavior of MkDocs, but targets Notion pages instead of a static site.

All parsing and conversion logic is implemented natively in this repository, with an adapter layer that can use Ultimate Notion (if installed) or a future Notion SDK integration.


Features

  • 🗂 Publish entire Markdown folders to Notion
  • 📄 Accurate Markdown → Notion block conversion
  • 📚 Optional mkdocs.yml navigation support
  • 🔗 Maintains hierarchical structure and ordering
  • 🆔 Local file-path ↔ page-ID mapping for updates
  • 🛠 Dry-run mode for testing without touching Notion
  • ⚙️ Adapter layer to support different Notion clients
  • ☑️ Markdown task lists render as Notion to-dos

Why This Exists

Markdown is easy to write. Notion is easy to share/control.

But getting a structured Markdown knowledge base into Notion—and keeping it updated—is hard.

mkdocs2notion solves that by:

  • replicating MkDocs’ handling of directories, files, and nav trees,
  • converting Markdown into rich Notion blocks,
  • creating/updating pages while maintaining structure,
  • allowing teams to turn entire docs folders into Notion workspaces.

Installation

mkdocs2notion is not yet on PyPI (until the core APIs stabilize), but you can install it locally:

pip install -e .

Or install from GitHub:

pip install git+https://github.com/mahbam42/mkdocs2notion

Basic Usage

Push a directory to Notion

mkdocs2notion push docs/

With mkdocs.yml navigation

mkdocs2notion push docs/ --mkdocs mkdocs.yml

Dry run (see what would happen)

mkdocs2notion dry-run docs/

Validate docs without publishing

mkdocs2notion validate docs/ --mkdocs mkdocs.yml

CLI options

  • --mkdocs <path>: Use mkdocs.yml navigation ordering without requiring MkDocs to be installed.
  • --parent <page_id>: Override NOTION_PARENT_PAGE_ID for where new pages should live.
  • --fresh: Ignore the cached page-ID map and rebuild it before pushing.
  • --strict: Treat warnings as errors (push/dry-run/validate exit with status 1 when warnings are present).

Configuration

Environment variables

You will need a Notion API token:

NOTION_TOKEN=your-secret-token

Optional:

NOTION_PARENT_PAGE_ID=...   # where new pages should be created

How It Works

mkdocs2notion processes content in stages:

1. Directory Loader

  • Walks the directory
  • Reads Markdown files
  • Extracts titles (frontmatter or H1)
  • Generates metadata for each page

2. mkdocs.yml Navigation Loader (optional)

  • Reads mkdocs.yml
  • Builds an ordered tree of sections/pages

3. Markdown Parser

  • Converts Markdown into internal block structures
  • Converts those blocks into Notion-ready representations

4. Notion Adapter

A thin abstraction around Notion operations (via Ultimate Notion or another SDK):

  • create/update pages
  • send block updates
  • maintain parent-child relationships

You can swap the adapter without touching the logic.


Project Structure

mkdocs2notion/
│
├── mkdocs2notion/
│   ├── markdown/
│   ├── loaders/
│   ├── notion/
│   ├── cli.py
│   └── runner.py
│
├── tests/
├── pyproject.toml
└── README.md

Roadmap

  • Core Markdown → Notion block converter
  • Directory import with ID mapping
  • mkdocs.yml → hierarchy builder
  • Initial CLI (Typer-based)
  • Add docs for block coverage
  • Publish PyPI v0.2.0

Contributing

See agents.md for strict guidelines on:

  • development workflow
  • linting + typing
  • testing
  • commit rules
  • agent behavior

Contributions are welcome—but must follow these standards to maintain reliability.


License

MIT License.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

mkdocs2notion-0.2.0.tar.gz (608.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

mkdocs2notion-0.2.0-py3-none-any.whl (36.4 kB view details)

Uploaded Python 3

File details

Details for the file mkdocs2notion-0.2.0.tar.gz.

File metadata

  • Download URL: mkdocs2notion-0.2.0.tar.gz
  • Upload date:
  • Size: 608.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: python-httpx/0.28.1

File hashes

Hashes for mkdocs2notion-0.2.0.tar.gz
Algorithm Hash digest
SHA256 df5f35c2b28b411f4cc465d5f1119912a1717f404a4d490247d8a02e2cd70ed9
MD5 d928de452beb52fa4cb3fedfbea43230
BLAKE2b-256 f9eecd7fa25c29fd0c44f77449181c9824b719cb0194a831232f7589fac77455

See more details on using hashes here.

File details

Details for the file mkdocs2notion-0.2.0-py3-none-any.whl.

File metadata

File hashes

Hashes for mkdocs2notion-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 19781fa0c17a8fef6b00f8d1f9f405abc361d2b242e671e474fe3a4cd35c069e
MD5 73db010e928a5cdcf6c07aee475a305d
BLAKE2b-256 34499d55b4fd076bc921abad9effce393e4cfcb244a64070698997abf8513083

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page