📝

Notionで手軽にMarkdownを読み書きできるMCPサーバー「NotionMCP Light」を作りました

に公開

はじめに

最近話題のModel Context Protocol(MCP)は外部システムやAPIとAI(LLM)を接続する重要な橋渡し役となっています。MCPに関しては同僚の李さんが素晴らしい記事を書いてくださいましたので、MCP自体の概要に関しては以下記事参照ください。

https://zenn.dev/mkj/articles/0ed4d02ef3439c

私自身も、MCPには興味を持っていて、いろいろなMCPサーバを試しています。詳しくはModel Context Protocol (MCP) サーバを使ってみた・作ってみたを参照ください。

そのような中、先日Notion 公式MCPサーバが公開され話題になっていました。私は、プライベートでも仕事でもNotionを愛用しているので、早速公式のガイドを参考にセットアップしてみました。

ただ、Notionの公式ガイドでも以下のように言及されていますが、Markdown形式のドキュメントをNotionに書き込んだり、逆に読み込んでMarkdown形式のファイルに書き出そうとすると、とにかく時間がかかります。また、トークンもかなり消費します。

Notionでは、1行ずつをブロックという単位で扱うため、マークダウン形式の長めのドキュメント一回で全て上げようとすると少し時間がかかります

そこで、NotionとMarkdown形式のファイルを効率的に同期できる「NotionMCP Light」MCPサーバを作ったので、概要と使い方を紹介します。

NotionMCP LightはGitHubでOSSとして公開しています。

https://github.com/karaage0703/notion-mcp-light

NotionMCP Lightの概要

NotionMCP Lightは、Notion APIを使用してMarkdown形式のファイルとNotionページを同期するMCPサーバです。このMarkdown形式のファイルとNotionページの同期する機能に関してのNotion 公式MCPサーバとの違いは、LLMトークンの消費を押さえつつ直接API経由でMarkdownとNotionを同期できる点です(注:NotionMCP Lightは、あくまでこのMarkdown形式のファイルとNotionの同期に特化した小さいツールで、Notion 公式APIの多様な機能を置き換えるものではないことに注意ください)。

と書くと凄そうですが、要はMarkdown形式のファイルをNotionページのフォーマットに合わせて変換してNotion API経由で書き込むスクリプトをMCPサーバ化しただけです。

処理の流れで説明すると、Notion 公式MCPサーバで、Markdown形式のファイルをNotionページに書き込むときのシーケンスの概略は、自分の理解では以下のようになっています。

ブロック単位でLLMがMarkdown形式のファイルを読み込み、MCPサーバを使って書き込んでいるので、時間がかかる上に、トークンが消費されています。

これを以下のように、自作コンバーターで一気に変換してNotionページに書き込むシーケンスにすることで時間とトークンを圧縮します。

図だけみてもピンとこないかと思いますので、実際に速度とトークン数(料金)の違いを確認してみましょう。実際に約1000文字のkaraage_recipi.mdというマークダウン形式の文章をNotionに書き込んで速度と料金を比較してみました。サンプル文章は以下です。

サンプル文章
# 美味しい唐揚げの作り方

外はカリッと、中はジューシー!誰もが大好きな唐揚げの作り方を、プロの技とコツを交えて徹底解説します。

## 目次

1. [美味しい唐揚げの基本](#美味しい唐揚げの基本)
2. [材料](#材料)
3. [下準備と下味のポイント](#下準備と下味のポイント)
4. [衣のつけ方](#衣のつけ方)
5. [揚げ方のコツ](#揚げ方のコツ)
6. [アレンジレシピ](#アレンジレシピ)
7. [よくある質問と回答](#よくある質問と回答)

## 美味しい唐揚げの基本

美味しい唐揚げを作るための3つの重要なポイントは以下の通りです:

1. **下味をしっかり漬け込む** - 最低でも2時間、できれば一晩漬け込むことで、鶏肉の繊維の中まで味がしみこみます。
2. **衣は適切につける** - 衣のつけ方で食感が大きく変わります。ふわりとつけてから時間をおいてなじませるのがコツです。
3. **二度揚げする** - 一度目は中温で火を通し、二度目は高温で表面をカリッと仕上げることで、中はジューシー、外はカリカリに仕上がります。

## 材料

### 基本の材料(2人分)

- 鶏もも肉:2枚(約350g×2)
- 片栗粉:適量
- 小麦粉:適量(片栗粉と小麦粉を混ぜる場合)
- 揚げ油:適量

### 下味の材料

- しょうゆ:大さじ2と1/2
- 料理酒:大さじ2と1/2
- しょうが汁:2片分
- にんにくのすりおろし:1片分
- マヨネーズ:大さじ2(オプション)

## 下準備と下味のポイント

### 鶏肉の下処理

1. 鶏もも肉は大きめに切る(一口大、約80g程度)
2. 余分な脂肪やスジは取り除く
3. 肉は繊維が傷つくと肉汁が逃げやすくなるため、できるだけ関節部分で切る

### 下味のつけ方

下味をつける順番が重要です:

1. **塩・こしょう** - まず塩こしょうを全体になじむまでしっかり揉み込む
2. **おろしにんにく・おろししょうが** - 香味野菜を加えて揉み込む
3. **酒・しょうゆ** - 液体調味料を加えて揉み込み、常温で5分置く
4. **ごま油またはマヨネーズ** - 最後に油分を加える(マヨネーズを使うとよりジューシーに)

### 漬け込み時間

- 最低でも2時間、できれば一晩冷蔵庫で漬け込む
- 長時間漬けることで味がしみ込むだけでなく、調味料の水分も鶏肉の中に蓄えられる
- 漬け込む際はラップを密着させて風味が逃げないようにする

以下が比較した動画です。
https://x.com/karaage0703/status/1911927963865817360

Notionの公式MCPサーバだとMarkdownファイルのNotionへの書き込みが約120秒なのに対して、NotionMCP Lightでは約20秒と6倍の速度になりました。使用するコスト(トークン数)も約1/6に圧縮されています(※Clineの計算で0.2ドル→0.035ドル)。

これだけ書くとNotionMCP Lightがいいとこだらけのようですが、NotionMCP LighはMarkdown形式のファイルをNotionに書き出すことと、読み出すことに特化していて他のNotionのAPI操作は一切できないことには注意してください。Notion 公式MCPサーバは、Notion APIでできることは一通り全てに対応した汎用的なつくりになっているのが大きな特徴でありメリットです。あくまで特定の用途に特化しているので、高速化が実現できています。

NotionMCP Lightのセットアップ方法

セットアップ方法は、READMEにも記載されていますが、簡単に記載します。以下のセットアップはOSはmacOSでの例となります。

MCPサーバのセットアップ

NotionMCP Lightは、uvパッケージマネージャーを使用して簡単にインストールできます。

uvがインストールされていないときは、まずuvをインストールしましょう。uvのセットアップは以下記事を参照してください。

https://zenn.dev/karaage0703/articles/029b45ff78bc57

uvがインストールされていれば、以下でセットアップできます。

$ git clone https://github.com/karaage0703/notion-mcp-light
$ cd notion-mcp-light
$ uv sync

Cline(Roo Code)との連携

Cline(Roo Code)などのAIツールでNotionMCP Lightを使用するには、cline_mcp_settings.jsonファイルに以下のような設定を追加します:

{
  "mcpServers": {
    "notion-mcp-light": {
      "command": "uv",
      "args": [
        "run",
        "--directory",
        "/path/to/notion-mcp-light",
        "python",
        "-m",
        "src.main"
      ],
      "env": {
        "NOTION_TOKEN": "your_notion_api_token"
      },
      "disabled": false,
      "alwaysAllow": []
    }
  }
}

/path/to/notion-mcp-lightは、NotionMCP Lightのインストールディレクトリに置き換えてください。絶対パスで指定する必要があります。

"your_notion_api_token"には、NotionのAPIアクセストークンを入力してください。NotionのAPIアクセストークンに関しては公式のガイドを参照ください。

NotionMCP Lightの使い方

セットアップできたら、以下のようなプロンプトでNotionにMarkdown形式のファイルを書き込めます。

notion-mcp-light MCPサーバを使って以下のNotionページに @/karaage_recipe.md (絶対パス)を新しいページを作って書き込んでください
https://www.notion.so/Writing-Lab-1cebd1ff57e080a99297c25b2d94e513

ページへの書き込みの他、データベースへの書き込み、ページからの読み出し、データベースからの読み出しが可能です。また、Markdown形式のファイルは絶対パスで指定する必要があるので注意してください(プロンプトに一言書いておけば絶対パスで指定してくれます)。検索などはできないので、そちらはNotion 公式MCPサーバを活用ください。なお、Notion 公式MCPサーバとNotionMCP Light、同時に動かしていても、Markdown形式のファイルを書き込むときは、ちゃんとLLMがNotionMCP Lightを使うよういい感じに判断してくれました。もしうまく使ってくれない場合は「notion-mcp-light」を使うことをプロンプトで明示的に指定するのがよいと思います。

応用例として、他の複数のMCPサーバ(検索するBrave SearchとWebページを取得するfetch)を組み合わせると、以下のようなプロンプトで「AIがWebで調査してレポートにまとめてNotionに記録」までをシームレスにできます。ちょっとしたDeep Researchですね。

brave-searchで、人気のからあげについて調査してMarkdown形式でレポートにまとめて。notion-mcp-lightで以下のページに新規ページとして追加してください(ファイルは絶対パスで指定してください)
https://www.notion.so/Writing-Lab-1cebd1ff57e080a99297c25b2d94e513

https://x.com/karaage0703/status/1911986071732469803

少し、プロンプト長く複雑にも思えますが、このあたりはClineやCursorのrulesに書くことでもっと簡単な指示で同じことが実現できるようになると思います。

NotionMCP Lightの作り方

NotionMCP Lightは、ほぼClineを使って作りました。AIでのコーディング手法に関しては以下記事を参照してください。

https://zenn.dev/mkj/articles/cf8536923d9cd7

Pythonで作成しているのは、自分が慣れているのとMCP入門で紹介されていたpython-sdkを使ってみたかったからです。

最初に、仕様書を作成してからコードを書いています。自作のGPTsを使っています。

https://chatgpt.com/g/g-67cf74b06f6481918b430240ce431c02-docubot

仕様書を作成するためのプロンプトは以下です。この後、ChatGPTと仕様に関して色々チャットでやりとりして作成しました。

Notionの公式Model Context Protocol (MCP) サーバが、Markdownから読み書きするとき、ブロック単位で読み書きするので、速度も遅いしLLMもトークン数使うので勿体ないです。
https://github.com/makenotion/notion-mcp-server

なので非公式なNotionのMCPサーバを作りたいです。Pythonでつくりたいです。python-sdkを使って欲しいです。
https://github.com/modelcontextprotocol/python-sdk

MarkdownのファイルをLLMのトークンを使わず、APIで直接Notionのページやデータベースの本文を作成したり、逆にNotionのページやデータベースから、LLMのトークンを使わず、APIで直接読み出してMarkdownファイルに保存できる機能だけを欲しいです。

MCPサーバーは、ClineやCursorなどのAIコーディングのツールから呼び出すことを想定しています。MCPサーバについては、以下記事などを参考にして理解してください。
https://zenn.dev/mkj/articles/0ed4d02ef3439c

最終的に完成した仕様書はこちらになります(コード作成しながら多少アップデートもしています)。

あとは、仕様書をもとにAIにコードを書いてもらいました。途中多少つまったところもありましたが、AIに助けられながら30分ほど試行錯誤したら動くものを作れました。

まとめ

自作MCPサーバ「NotionMCP Light」を作ってみました。必要に駆られて作ってみましたが、MCPサーバにすることで、他のMCPと組み合わせて、リサーチした結果をレポートにまとめてNotionに保存とか、映像や音声ファイルをテキストに変換してNotionに保存といったようなことが、プロンプトで手軽にできるようになり、わりと便利に使えるのではないかと感じています。こうやって、自分でMCPサーバを作ったり、変更したりできるのがオープンな規格であるMCPのメリットですね。

一方最小限のPython MCPサーバを作ってみるという記事にも書いたのですが、LLMは基本MCPサーバを信頼して実行するため、現状はMCPサーバに悪意あるコードが混じっていてもそのまま実行してしまう可能性があります。MCPサーバは今過渡期で多くのものが出てきていますのでセキュリティも気にすると良いと思います。

具体的には、出どころの怪しいMCPサーバを使わない。コードの重要な部分を(必要に応じて)チェックする。MCPサーバを実行するときは、最初はクライアント側で実行前に確認する設定にしておく等でしょうか。こういった安全性のチェックもMCPでは今後重要になっていきそうですし、いろいろな仕組みも出てきそうですね。そういう意味で「NotionMCP Light」は、出どころは怪しいかもしれません(笑)ただ、機能特化した非常に小さいソフトなので、気になる方は自身でコードを確認してみると安心して使えるかと思います。

みなさんも安全で便利なMCPライフをエンジョイしましょう!本記事で紹介した「NotionMCP Light」は以下URLで公開しています。

https://github.com/karaage0703/notion-mcp-light

宣伝

最後に宣伝です。Findyさんのイベント「MCPでLLMはどう進化する? 〜からあげさんに学ぶ、AI開発の最前線〜」に登壇します。MCPの使い方から、この記事のようなMCPサーバの作り方、注意すべきことなどについて盛りだくさんでお話する予定です。既に1000人以上の方に参加登録いただいています。無料で参加できますので、気になる方は是非お気軽に!

https://findy.connpass.com/event/351644/

参考リンク

松尾研究所テックブログ

Discussion