MCPを使ってNotionとClaude Desktopを連携する手順

suさんの参考サイトをもとにNotionとClaude Desktopの連携を行います。

前提として記載しておきます。
Apple M1 Pro
MCP Notion ServerをClone
MCP Notion Serverのリポジトリをクローンします。
% git clone https://github.com/suekou/mcp-notion-server.git
npm install
を実行します。
% cd mcp-notion-server
% cd notion
% npm install
> notion@0.1.0 prepare
> npm run build
> notion@0.1.0 build
> tsc && node -e "require('fs').chmodSync('build/index.js', '755')"
added 17 packages, and audited 18 packages in 5s
1 package is looking for funding
run `npm fund` for details
found 0 vulnerabilities
npm run build
を実行します。
% npm run build
> notion@0.1.0 build
> tsc && node -e "require('fs').chmodSync('build/index.js', '755')"
% ls build
index.js
notion/build/index.js
が作成されています。
続きを進めます。
% npm link
added 1 package, and audited 3 packages in 1s
found 0 vulnerabilities
問題なさそうなので、次のステップに進みます。
Notion API トークンの準備
MCP serverがNotionにアクセスできるようにNotionでAPIトークンを発行します。
Notionのインテグレーションから

[新しいインテグレーション]を押して、下記の登録画面に遷移します。

- インテグレーション名:※わかりやすく 記入
- 関連ワークスペース:※環境に合わせて
- 種類:内部 を選択
- ロゴ:※環境に合わせて
上記設定後、[保存]ボタンをクリックします。

インテグレーション設定から内部インテグレーションシークレットを入手します。

クリップボードにコピーしておきます。
claude_desktop_config.jsonを編集
/Users/ユーザー名/Library/Application Support/Claude/claude_desktop_config.json
上記の場所にある設定ファイルを開きます。
下記のようにします。新規設定の場合は、{}
という文字列のみ記載されています。
{
"mcpServers": {
"notion": {
"command": "node",
"args": [
"/Users/ユーザー名/XXXXXXX/mcp-notion-server/notion/build/index.js"
],
"env": {
"NOTION_API_TOKEN": "取得したトークン"
}
}
}
}
上記の内容で保存しておきます。
設定ファイルの開き方
この設定ファイルの場所ですが、アプリメニュー「Settings…」から開くことができます。

開いたウィンドウの[ Developer>Edit Config ]をクリックします。

そうするとFinderが開いて、該当ファイルが選ばれた状態になるので、エディタで開いて、編集しましょう。

動作確認
Notionのインテグレーションで設定した関連ワークスペースに動作確認用に適当なページを作成します。

右上の[…](設定)からコネクト>接続先でインテグレーション名で記入した名称を選択します。

[はい]をクリックすると接続状態となるようです。

Claude Desktopアプリを再起動します。
通常この段階でうまく連携できるはずです。

うまく設定ができている場合、トンカチ⚒️マークが表示されているのでクリックするとNotion関連の設定内容を確認することができます。
私の場合については下記のようなエラーでした。「Could not connect to MCP server notion」というメッセージが表示されている。

ここからのdebugは私の環境依存の問題ですので、私の作業記録としてメモしておきます。
debug(私の環境依存の問題)
MCP Server側
MCP Serverが正しく起動しているか確認します。手動でNotionサーバーを起動してみます:
% node notion/build/index.jsのパス
Please set NOTION_API_TOKEN environment variable
スクリプト実行時に NOTION_API_TOKEN
環境変数が設定されていないためにエラーが発生しています。
環境変数を読み込むためにdotenv
ライブラリを追加します。
% npm install dotenv
added 1 package, and audited 19 packages in 4s
2 packages are looking for funding
run `npm fund` for details
found 0 vulnerabilities
src/index.ts
ファイルを修正します。dotenvをimportする2行を追加します。
#!/usr/bin/env node
import dotenv from 'dotenv';
dotenv.config();
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
...
...
.evn
ファイルに環境変数を記載します。
NOTION_API_TOKEN=取得したトークン
再度ビルドします。
% npm run build
> notion@0.1.0 build
> tsc && node -e "require('fs').chmodSync('build/index.js', '755')"
手動実行してみます。
% node notion/build/index.jsのパス
Starting Notion MCP Server...
Connecting server to transport...
Notion MCP Server running on stdio
起動しているようです。動作確認のための手動実行なので停止しておきます。
Claude Desktop側
今度はClaude Desktopアプリを再起動し、動作確認です。
相変わらず「Could not connect to MCP server notion」というメッセージが表示されている。
開発者モードでClaude Desktopアプリを起動します。[Open MCP Log File]をクリックします。

そうするとログファイルが確認できるようになり。エラーが発生しているので内容を確認します。
2024-12-04T13:49:24.551Z [error] Error in MCP connection to server notion: Error: spawn node ENOENT
at ChildProcess._handle.onexit (node:internal/child_process:286:19)
at onErrorNT (node:internal/child_process:484:16)
at process.processTicksAndRejections (node:internal/process/task_queues:82:21) {
errno: -2,
code: 'ENOENT',
syscall: 'spawn node',
path: 'node',
spawnargs: [Array]
}
Claude Desktop が node
コマンドを実行しようとした際に、Node.js が見つからなかった(ENOENT
エラー)ことを示しています。
% node -v
v21.5.0
% which node
/Users/ユーザー名/.nodebrew/current/bin/node
which node
コマンドの結果が /Users/ユーザー名/.nodebrew/current/bin/node
であることから、Node.js は nodebrew
を使って管理されています。
この場合、Claude Desktop が node
コマンドのパスを認識できない可能性がありますので、Claude Desktopの設定ファイルのnode
コマンドのパスを修正します。
{
"mcpServers": {
"sqlite": {
"command": "uvx",
"args": [
"mcp-server-sqlite",
"--db-path",
"/Users/ユーザー名/test.db"
]
},
"notion": {
"command": "/Users/ユーザー名/.nodebrew/current/bin/node",
"args": [
"notion/build/index.jsのパス"
],
"env": {
"NOTION_API_TOKEN": "取得したトークン"
}
}
}
}
設定ファイルを上記内容で保存し、Claude Desktopアプリを再起動します。
うまく連携ができている場合、トンカチ⚒️マークをクリックします。

Notion関連の設定が反映されていることを確認します。

やっと連携できたようです。
連携してみる
Claude Desktopアプリでプロンプトを実行します。
notionの連携対象のページのURLが「https://www.notion.so/MCP-notion-6520987c098767112ff2c21b570c92ee
」だった場合、後ろの32桁をClaudeで指定します。

ClaudeMCPについて記事を書いて,notionの6520987c098767112ff2c21b570c92eeにページを保存したい

ClaudeMCPについて記事を書き、Notionに保存させていただきます。
といった感じで保存してくれました。
今回は連携できたので以上です。
Set project instructionsで、ブロックIDを指定
notionのブロックIDを毎回指定するのは大変なので、プロジェクトをつくり、そのSet project instructionsで、ブロックIDをあらかじめ指定しておく方法が効率的ということをテツメモさんの記事で読みましたので、その方法を追記しておきます。

こうすることで、IDを省略したやりとりが可能となり、さらに検索エンジンのBrave🦁と連携することで、最新情報の取得とnotionへの保存が可能となります。

大谷翔平選手に関する最新ニュース5件をNotionのDBにまとめて

大谷翔平選手に関する最新ニュースを検索し、Notionデータベースにまとめます。
...
データベース形式
最初にClaudeからnotion連携して追加したページが「データベース」形式だった場合には、2回目以降以降も「データベース」形式でのデータの保存しかできないみたい。
次はBrave🦁と連携したいですね。
※追記)あきらパパさんの動画もわかりやすいと思いますので、動画で確認したい場合はどうぞ。

そいえば、Claude Desktopアプリの開発者モードをOFFにするのどうやるんだろ…
