Claude DesktopでMCPサーバーを使ってjupyter labを動かす

# 目的

Claude Desktop上で、MCPサーバーを使ってjupyter labを操作できたので、その報告です。
# 手段
Jupyter lab用MCPサーバーは下記サイトで提案されています。今回はこれを利用します。環境はWindowsです。

https://github.com/datalayer/jupyter-mcp-server?tab=readme-ov-file


# 手順
## ・必要なライブラリのインストール

```
pip install jupyterlab jupyter-collaboration ipykernel
pip install datalayer_pycrdt
```
また、uvを使用しますので、uvのインストールしていなければ必要です。

## ・MCPサーバーの構築
ローカル環境の好きな場所に、上記サイトのserver.pyを置きます。

(https://github.com/datalayer/jupyter-mcp-server/blob/main/jupyter_mcp_server/server.py)


## ・Jupyter Labの起動

Jupyter Labを立ち上げます。今回はブラウザではなく、Claude Desktopから操作するので。CROS対策のオプションを設定をします。またtokenを指定します。（後述の`claude_desktop_config.json`のtokenと合わせる）
ブラウザでJupyter Labにアクセスしたら、notebookという名称のノートブックを作成しておきます。（後述の`claude_desktop_config.json`のNOTEBOOK_PATHと合わせる）

```
jupyter lab --ServerApp.allow_origin='*' --ServerApp.allow_credentials=True --ServerApp.token='好きなトークン'
```

## ・Claude DesktopのMCP構成の変更と起動
Claude Desktopの、`claude_desktop_config.json`ファイルのを下記のように編集します。

```json:claude_desktop_config.json
{
  "mcpServers": {
    "jupyter": {
      "command": "uv",
      "args": [
        "--directory",
        "server.pyを置いたパス",
        "run",
        "server.py"
      ],
      "env": {
        "SERVER_URL": "http://127.0.0.1:8888/",
        "TOKEN": "Jupyter　Lab起動時に指定したtoken",
        "NOTEBOOK_PATH": "notebook.ipynb"
      }

    }
  }
}

```

Claude Desktopを管理者モードで起動します。無事成功すれば、MCPツールマークが表示されます。

# 使用例
まず1+1を計算してもらいます。
Claude Desktopとのやりとり
~~~md:Cluadeへの指示
jupyterで1+1を計算してください
~~~

~~~md:Cluadeへの回答
JupyterノートブックでPythonを使って1+1を計算してみましょう。
以下のコードセルを実行します。add_execute_code_cellリクエスト{
  `cell_content`: `1+1`
}
レスポンス2計算結果は2となりました。このように、Jupyterノートブックでは
式を入力するだけで簡単に計算結果を得ることができます。
もし他の計算や処理も試してみたい場合は、お気軽にお申し付けください。
~~~

下記のように、ブラウザ上のJupyter Labに出力されました。

![1+1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4066269/97094751-86a4-448d-baa5-ee89ef131fd1.png)

つぎの例は、タイトルをマークダウンで表示して、次にnumpyを使用するであろうサンプルを入力した例

Claude Desktopとのやりとり
~~~md:Cluadeへの指示
jupterに"固有値と固有ベクトル"と表示してください
~~~

~~~md:Cluadeへの回答
Jupyterノートブックに「固有値と固有ベクトル」というタイトルを表示しましょう。
マークダウンセルを使用します。add_markdown_cellリクエスト{
  `cell_content`: `# 固有値と固有ベクトル`
}
レスポンスJupyter Markdown cell added.マークダウンセルに「固有値と固有ベクトル」というタイトルが表示されました。
何か具体的な固有値と固有ベクトルの計算や説明を追加しましょうか？
~~~

~~~md:Cluadeへの指示
固有値と固有ベクトルの計算例を一つだけ示してください
~~~

~~~md:Cluadeへの回答
それでは固有値と固有ベクトルの計算例をJupyterノートブックで示します。add_markdown_cellリクエスト{
  `cell_content`: `## 固有値と固有ベクトルの計算例`
}レスポンスJupyter Markdown cell added.add_execute_code_cellリクエスト{
  `cell_content`: `import numpy as np

# 2x2行列の作成
A = np.array([[4, 2],
              [1, 3]])

print(\"行列A:\")
print(A)

# 固有値と固有ベクトルを計算
eigenvalues, eigenvectors = np.linalg.eig(A)

print(\"\
固有値:\")
print(eigenvalues)

print(\"\
対応する固有ベクトル (列として表示):\")
print(eigenvectors)

# 検証: Av = λv
for i in range(len(eigenvalues)):
    eigen_val = eigenvalues[i]
    eigen_vec = eigenvectors[:, i]
    
    print(f\"\
検証 (固有値 λ = {eigen_val:.2f}):\")
    print(f\"A・v =\
{np.dot(A, eigen_vec)}\")
    print(f\"λ・v =\
{eigen_val * eigen_vec}\")
    print(f\"差 =\
{np.dot(A, eigen_vec) - eigen_val * eigen_vec}\")`
}レスポンス行列A:
[[4 2]
 [1 3]]

固有値:
[5. 2.]

対応する固有ベクトル (列として表示):
[[ 0.89442719 -0.70710678]
 [ 0.4472136   0.70710678]]

検証 (固有値 λ = 5.00):
A・v =
[4.47213595 2.23606798]
λ・v =
[4.47213595 2.23606798]
差 =
[0. 0.]

検証 (固有値 λ = 2.00):
A・v =
[-1.41421356  1.41421356]
λ・v =
[-1.41421356  1.41421356]
差 =
[2.22044605e-16 2.22044605e-16]
上記の計算例では、2×2行列A = [[4, 2], [1, 3]]の固有値と固有ベクトルを計算しました。結果として、2つの固有値(5と2)と、それぞれに対応する固有ベクトルが得られました。
検証部分では、固有値と固有ベクトルの関係式 Av = λv が成り立っていることを確認しています。小さな差があるのは浮動小数点演算の丸め誤差によるものです。再試行Claudeは間違えることがあります。回答内容を必ずご確認ください。
~~~
１セル目は、add_markdown_cellを使用して、２セル目は、add_execute_code_cellを使用しています。
そして、下記のように、ブラウザ上のJupyter Labに出力されました。

![matrix.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4066269/bd9a4448-ffa9-4240-a67c-6a88c0aca128.png)

# まとめ
Claude Desktop上で、MCPサーバーを使ってjupyter labを操作できました。