WindowsでClaudeのMCPを試してみる

MCP(Model Context Protocol)を触ってみたので備忘録です。

# MCPざっくり説明
一言で言うと、ファイルサーバやsqliteなどを制御するFunction Callingの塊を作って、簡単に自然言語でいろんなものを制御できるようにする仕組み、だと思っています。
リソースとの制御部分を一連のFunction Callingで実現するあたりが、プロトコルというところなのでしょう。
データソースを制御とあるけど、データソース以外でも定義すればなんでも制御できそうなのが面白い気がします。
今ここに書いた説明、数か月後には変わっていそうです。いろんな使い方が発明されるんじゃないかな。ロボット制御とか。

今回は、クイックスタートのSQLiteの例をWindowsでやってみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106215/1e30ad41-617b-bbdd-69bb-0706f73a329c.png)

# 参考資料
AnthropicのMCPサイト
https://www.anthropic.com/news/model-context-protocol

Anthropicのgit-hub。
https://github.com/modelcontextprotocol

クイックスタート
https://modelcontextprotocol.io/quickstart

# 環境
Windows 10 Pro
python 3.
Claude Desktop（無料版でOK)
uv 0.4.18 以上
Git 2.28.0.windows.1
SQLite3

## Claude Desktopのインストール
以下から環境にあうものをダウンロードして、インストール。
https://claude.ai/download

## uvのインストール
https://docs.astral.sh/uv/getting-started/installation/#standalone-installer

以下実行。
```
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
```

## gitのインストール
以下から適切なものを選びインストール。
https://git-scm.com/

## sqliteのインストール
以下サイトからsqlite-tools-win-x64-3470100.zipをダウンロードし、解凍してみえるところにおいておきます。
https://www.sqlite.org/download.html


# sqliteのDBのセットアップ
ターミナルでsql変数にsql構文をぶちこむ。どうやら、電化製品とその価格のデータのようです。
```bash
$sql = @'
CREATE TABLE products (
  id INTEGER PRIMARY KEY,
  name TEXT,
  price REAL
);

INSERT INTO products (name, price) VALUES
  ('Widget', 19.99),
  ('Gadget', 29.99),
  ('Gizmo', 39.99),
  ('Smart Watch', 199.99),
  ('Wireless Earbuds', 89.99),
  ('Portable Charger', 24.99),
  ('Bluetooth Speaker', 79.99),
  ('Phone Stand', 15.99),
  ('Laptop Sleeve', 34.99),
  ('Mini Drone', 299.99),
  ('LED Desk Lamp', 45.99),
  ('Keyboard', 129.99),
  ('Mouse Pad', 12.99),
  ('USB Hub', 49.99),
  ('Webcam', 69.99),
  ('Screen Protector', 9.99),
  ('Travel Adapter', 27.99),
  ('Gaming Headset', 159.99),
  ('Fitness Tracker', 119.99),
  ('Portable SSD', 179.99);
'@

```

echo ${sql}とかやると、CREATE以下が代入されていることがわかります。
この設定で、test.dbという名前のデータベースを作成。
```bash
./sqlite3 test.db ${sql}
```

# Claude Desktop側の設定
テキスト エディターでClaude Desktop アプリの構成を開きます。
VSCのターミナルで以下。
```
code $env:AppData\Claude\claude_desktop_config.json
```

開いたファイルに、以下を記述。test.dbは、さきほど作成したtest.dbの格納場所を記載。
```json
{
  "mcpServers": {
    "sqlite": {
      "command": "uvx",
      "args": [
        "mcp-server-sqlite",
        "--db-path",
        "C:\\Users\\YOUR_USERNAME\\test.db"
      ]
    }
  }
}

```

claude Desktopを再起動。アプリを消すだけではだめで、デスクトップの右下に隠れているウニみたいなやつをquitする必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106215/2c1bfa98-5e63-b1b3-8626-c312ed42723c.png)


再度起動すると、見事に「Could not connect to MCP server sqlite」というエラーがでました。Claudeデスクトップを管理者権限で実行していなかったのが原因の模様。管理者権限で起動しなおすとエラー消えました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106215/08047722-b022-789a-d542-44e82838566d.png)


 # Claude DesktopからMCPを使う
 「SQLiteのデータベースに接続して利用可能な製品とその値段をリスト化して」とお願いしてみます。

 データベースに接続する前にちゃんと確認画面がでます。[Allow for This Chat]をクリック。この画面、三回くらいでて毎回、ぽちぽち押しました。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106215/0823d9ca-b03f-3d14-b315-c7eb3de41e34.png)

こちら結果です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106215/90ea4720-e0eb-a05e-b269-c2fd059aebbc.png)

冒頭に3回ほど、sqlite関連のコマンドを実行しているようです。この回数分[Allow for This Chat]を押していた模様。
sqlite部分をひらいてみます。
どうやら、内部でlist-tables,describe-table,read-queryという３つのFunction-callingを読んでいる模様。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106215/34501e36-7b3c-2abe-a890-814f24ea3794.png)


全部買った場合の金額もだしてくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106215/a6fffa77-3881-9599-a7b7-a6bc257bdbf2.png)

この金額合計も、SQL使って計算してるようですね。
View Result from list-tables from sqlite(local)をクリックすると、どんなSQL構文で計算したか見ることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106215/a37cadd5-fcc7-9d62-8a11-f0fdc411df3f.png)

簡単な設定で自然言語でsqlデータベースいじれるのは便利です。

# もう少しくわしく。
今回のsqlite用のMCPのソースコードは以下にあるようです。
https://github.com/modelcontextprotocol/servers/tree/main/src/sqlite

どうやら、このサーバーには6つの主要なツールが含まれようです。以下一覧表。
#### 1. **クエリツール**
| ツール名         | 機能                                                                                      | 入力                                                                                     | 出力                               |
|------------------|-------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------|------------------------------------|
| `read-query`     | SELECTクエリを実行してデータを読み取る                                                    | `query`（SQLクエリ文字列）                                                               | 結果をオブジェクトの配列として返す |
| `write-query`    | INSERT、UPDATE、DELETEクエリを実行してデータを変更                                         | `query`（SQLクエリ文字列）                                                               | `{ affected_rows: 変更された行数 }` |
| `create-table`   | 新しいテーブルを作成                                                                      | `query`（CREATE TABLEステートメント）                                                    | テーブル作成の確認メッセージ        |

---

#### 2. **スキーマツール**
| ツール名          | 機能                                                                                      | 入力                          | 出力                                |
|-------------------|-------------------------------------------------------------------------------------------|-------------------------------|-------------------------------------|
| `list-tables`     | データベース内の全てのテーブル名を取得                                                    | なし                          | テーブル名の配列                    |
| `describe-table`  | 特定のテーブルのスキーマ情報を表示                                                        | `table_name`（テーブル名）    | 列の定義（名前とデータ型）の配列     |

---

#### 3. **分析ツール**
| ツール名          | 機能                                                                                      | 入力                          | 出力                                |
|-------------------|-------------------------------------------------------------------------------------------|-------------------------------|-------------------------------------|
| `append-insight`  | ビジネスインサイトをメモリソース（`memo://insights`）に追加                               | `insight`（発見したインサイト）| インサイト追加の確認メッセージ      |



### サーバーの動作フロー

1. **データベース操作**:
   - テーブルの作成（`create-table`）
   - データの追加・変更・削除（`write-query`）
   - データの読み取り（`read-query`）

2. **スキーマ確認**:
   - テーブル一覧の取得（`list-tables`）
   - テーブルの構造を確認（`describe-table`）

3. **ビジネス分析とインサイト生成**:
   - データを分析し、新しいインサイトを発見
   - 発見したインサイトをメモリソースに追加（`append-insight`）
   - `memo://insights`が更新され、最新のインサイトが集約される

---

この６個のツールをうまく組み合わせて、データベースの中身を取得していたようです。
最初にデータベースの中身を一覧表にしたときには、スキーマツールのlist-tables,describe-tableと、クエリツールのread-queryの３つを順に使っていたということのようです。

他にも、新しいテーブルを作成したり、データを追加、削除したり、分析結果を格納したりといったことができるようです。
ためしに、保存機能を使ってみます。この会話の前に、コスパのよい商品を３つ挙げさせるという会話をしていました。コスパの良い３つの商品をビジネスインサイトとして保存してもらいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106215/8c828485-4744-7bd2-a751-a2a3a4e3f259.png)

おや、エラーでましたね。再起動しても以下のようなエラーがでます。特に課金しているわけでもないので、これ以上は難しいようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106215/0264944a-e44f-3130-5191-0f820eb66a02.png)

ちなみに、このsqlite MCP Serverのソースコードは、以下にあります。
https://github.com/modelcontextprotocol/servers/blob/main/src/sqlite/src/mcp_server_sqlite/server.py

読んでみると、どうやらかなりデモ用としてつくられたもののようです。
デモ用のテンプレートであるmcp-demoが用意されています。
これを使えば、もう少し複雑なことができそうです。

たとえば、こんな感じ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106215/ed843936-be22-f017-0110-d6137efb07f6.png)

それっぽい出力はでてきますが、タイムアウトのオンパレードなので、実際はまともに動いていないですね。これが無課金の限界か。

# まとめと所感
 - Anthropic claudeのsplite用MCPサーバーを設定して使ってみました
 - ６つのツールを組み合わせ、指示された内容を実現可能
 - 課金していないとタイムアウトが続発して動かない。
 - Server周りのFunction callingまわりやプロンプトの設定など、設計が大変そう。
 - 評価やテストはどうやるのか気になります

以上