Claude Desktop for Linux をインストールして、MCPのQuick Startを行ったときのメモ

Claude for Desktop は、2025/04/03現在、Linuxバージョンがありません。
しかし、有志の方が、Windows 版をLinux 互換の実装に書き換えるためのリポジトリを公開してくれているので、それを使って私の Mint Linux へインストールしてみました。
aaddrick/claude-desktop-debian: Claude Desktop for Debian-based Linux distributions

git clone https://github.com/aaddrick/claude-desktop-debian.git
cd claude-desktop-debian
sudo ./build.sh
対話形式で聞かれるので、選択していく
====== Select Build Format ======
[1] Debian Package (.deb)
[2] AppImage (.AppImage)
=================================
Enter choice (1 or 2, any other key to cancel): 1
✔ You selected Debian Package (.deb)
-------------------------------------
--- Cleanup Selection ---
====== Cleanup Build Files ======
This refers to the intermediate files created in the '/tmp/hoge/claude-desktop-debian/build' directory.
[1] Yes, remove intermediate build files after completion
[2] No, keep intermediate build files
=================================
Enter choice (1 or 2, any other key defaults to "No".): 1
.....
✅ Build process finished.
====== Next Steps ======
📦 To install the Debian package, run:
sudo apt install ./claude-desktop_0.9.1_amd64.deb
(or `sudo dpkg -i ./claude-desktop_0.9.1_amd64.deb`)
======================
ビルドが完了したのでインストール
sudo apt install ./claude-desktop_0.9.1_amd64.deb

スタートから、Claudeを選べるようになるので起動
さっくり起動した。ありがたい。

前準備
- uv 0.4.18以上(uv --versionで確認)
- Git(git --versionで確認)
- SQLite(sqlite3 --versionで確認)
uv は入っていなかったので、Installation | uv を参照してインストールした。
curl -LsSf https://astral.sh/uv/install.sh | sh
# インストール後、ターミナル再起動

SQLITEを用意
mkdir tutorial
cd tutorial
sample.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);
insert
sqlite3 test.db < sample.sql
確認
sqlite3 test.db
SQLite version 3.45.3 2024-04-15 13:34:05
Enter ".help" for usage hints.
sqlite> select * from products;
1|Widget|19.99
2|Gadget|29.99
3|Gizmo|39.99
4|Smart Watch|199.99
5|Wireless Earbuds|89.99
6|Portable Charger|24.99
7|Bluetooth Speaker|79.99
8|Phone Stand|15.99
9|Laptop Sleeve|34.99
10|Mini Drone|299.99
11|LED Desk Lamp|45.99
12|Keyboard|129.99
13|Mouse Pad|12.99
14|USB Hub|49.99
15|Webcam|69.99
16|Screen Protector|9.99
17|Travel Adapter|27.99
18|Gaming Headset|159.99
19|Fitness Tracker|119.99
20|Portable SSD|179.99
sqlite>

Claude Desktopの設定ファイルに設定追加
- Claude Desktop > ファイル > 設定
- 開発者 > 構成を編集
-
claude_desktop_config.json
があるディレクトリが開くと思うので、claude_desktop_config.json
をエディタで開く - 以下の設定を追加する。
"/Users/YOUR_USERNAME/test.db"
は自身のディレクトリパスへ変更してください。claude_desktop_config.json{ "mcpServers": { "sqlite": { "command": "uvx", "args": ["mcp-server-sqlite", "--db-path", "/Users/YOUR_USERNAME/test.db"] } } }

claude_desktop_config.json
に設定の解説
-
sqlite
という名前のMCPサーバを定義 -
uvx
コマンドを使ってサーバを起動 -
args
にMCPサーバと実際のDBパスを指定

- Claude Desktopアプリケーションを再起動
- 開いたら色々叱られる⇐一旦無視する(これが出ない人もいると思うので、とりあえずあとで解決します)
- ☰ > ヘルプ > 開発者モードを有効にする
- 有効にしますか?と聞かれるので有効化
- トンカチマークみたいなものが出たらOK

エラーの解決
- エラーに出てきた【MCP設定を開く】を押す
- Failしたものはなにかを教えてくれる画面が出るのでログフォルダを開く
- ログの内容をClaudeさんなどに相談する
- 今回の場合は
uvx
がどこにあるかわからないから起きた問題だったようなので、一時的にclaude_desktop_config.json
の設定を
から、"command": "uvx",
へフルパスを渡すという形に変えたら解決しました。"command": "/home/taro/.local/bin/uvx",
- 今回の場合は
Claudeさんは、フルパス指定でうまく動作している現状では、その設定を維持するのが最も実用的な解決策でしょう。 というので、このままフルパスを渡すことにします。

SQLITE MCP サーバテスト
- トンカチマークを押す
- 利用可能なMCPツールというメッセージが出る
- クエリしたり新規データ作ったり更新したり、色々できますね。
- desktop に戻って、プロンプトを書いてみます
- プロンプトを読み取って、
list_tables
を実行すると判断したようです。
ローカルのDBへ許可を求めて来ていますので、このチャットでは許可することにします。 -
describe_table
も実行したいと言ってきたので、許可します
-
read_query
も実行したいときましたので、許可します
- 回答してくれました

なるほどー
こりゃまずいぞ。(いい意味で)

mcp-server-sqlite はどこにあるの?
- Claude Desktop に組み込みMCPサーバがあって、mcp-server-sqliteはその一つ
- その他はここにリストがある:servers/src at main · modelcontextprotocol/servers

全体の流れはドキュメントに書いてあるとおり:MCP Documentation - Quick Start

続いて filesystem
MCP サーバを通して、ファイルシステムへのアクセスしてみよう

何ができるかはレポジトリのREADMEに書いてある
servers/src/filesystem at main · modelcontextprotocol/servers

- SQLITEの時と同じ様に
claude_desktop_config.json
を編集
- ☰ > ファイル > 設定 > 開発者 > 構成を編集
-
claude_desktop_config.json
開く - filesystem サーバ設定を追加。
{
"mcpServers": {
"sqlite": {
"command": "uvx",
"args": [
"mcp-server-sqlite",
"--db-path",
"/tmp/sqlite-mcp-server/test.db"
]
},
"filesystem": {
"command": "npx",
"args": [
"-y",
"@modelcontextprotocol/server-filesystem",
"/tmp/sqlite-mcp-server"
]
}
}
}

- Claude Desktop再起動
- トンカチマーク(数が増えてるハズ)を押す
- ソースサーバが filesystem というのが追加されているハズ

- Claude Desktopにプロンプトを書く
-
list_allowed_directories
を実行するから許可くれって言ってきた。
-
list_directory
もいるから許可くれと言ってきた
- 自然言語でお返事くれた。はい。そのとおりです。

よし、次は、MCPサーバを作ってみよう

- これまでは Claude Desktop に buildin されていたMCPサーバを使った
- ここからは自分でのMCPサーバを実装をTutorialに従って実装する
OpenWeather API MCP サーバを実装
- OpenWeatherは、さまざまな気象APIを提供
- これを外部リソースとするMCPサーバを作る

前準備
- OpenWeather
- OpenWeatherに登録:https://home.openweathermap.org/users/sign_up
- 登録後、ここで無料API Key 取得:https://home.openweathermap.org/api_keys
- もしくは アカウント名> My Api Keys
-
Node.js と npmをインストール
- node : v18 or higher

MCP サーバのひながたを作成
npx @modelcontextprotocol/create-server weather-server
Need to install the following packages:
@modelcontextprotocol/create-server@0.3.1
Ok to proceed? (y) y
## ここからはエンター押せばいい
? What is the name of your MCP server? weather-server
? What is the description of your server? A Model Context Protocol server
✔ MCP server created successfully!
Next steps:
cd weather-server
npm install
npm run build # or: npm run watch
npm link # optional, to make available globally
Next steps に従ってインストールとビルド
cd weather-server
npm install
npm run build
依存関係をインストール
npm install --save axios dotenv
.env ファイルを新規作成
touch .env
OpenWeather で取得したAPIキーを書き込んで保存
OPENWEATHER_API_KEY=your-api-key-here
.gitignore に .env を追加(デフォルトですでに追加されていることもある)
node_modules/
build/
*.log
.env*

現在の構成
.
├── .env
├── .gitignore
├── README.md
├── build
├── node_modules
├── package-lock.json
├── package.json
├── src
└── tsconfig.json

note system

src/index.ts
を読む
(注意: 私は javascript を全然知りませんので、言葉の使い方が間違っていることがあると思います。)
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import {
CallToolRequestSchema,
ListResourcesRequestSchema,
ListToolsRequestSchema,
ReadResourceRequestSchema,
ListPromptsRequestSchema,
GetPromptRequestSchema,
} from "@modelcontextprotocol/sdk/types.js";
-
Server
: MCP サーバオブジェクトを作るクラス -
CallToolRequestSchema
からGetPromptRequestSchema
まで: MCP で定義された request schema と呼ばれるリクエストタイプ

MCPサーバオブジェクトを作る
const server = new Server(
{
name: "weather-server",
version: "0.1.0",
},
{
capabilities: {
resources: {},
tools: {},
prompts: {},
},
}
);

作ったサーバにハンドラを登録
-
server
オブジェクトが持つsetRequestHandler
メソッドを使ってハンドラを登録 - これは利用可能な note の一覧を表示するハンドラを登録している
server.setRequestHandler(ListResourcesRequestSchema, async () => {
return {
resources: Object.entries(notes).map(([id, note]) => ({
uri: `note:///${id}`,
mimeType: "text/plain",
name: note.title,
description: `A text note: ${note.title}`
}))
};
});
- これにより
server
がListResourcesRequestSchema
リクエストを受け取ると、return の内容が返される-
note://
URI scheme - Plain text MIME type
- 人が読める note の名前とタイトル
-

MCPのコンセプトにおいてResourceとは
return されている resources
とは
- 外部リソース( test.db / 自分のファイル / OpenWeatherAPI など)の読み取りや操作ができるオブジェクトのこと
- MCPサーバを通じて、外部リソースのコンテンツを公開できるようになるし、
- LLMは、ツールを通じて外部リソースを操作できるようになる

実際に resource をコントロールするのは、Host側の clients
- resource は application (Host ) によって制御されるように設計されている
- つまり Host が 初期化時に作成した Client がリソースの使用方法やタイミングを決定している
- よって MCP Host によって resource の扱い方が異なることがある
例
- Claude Desktop は、ユーザが resource を明示的に選択する必要がある(2025/04/04現在)
- resource を自動的に選択するクライアントアプリケーションもある
- AIモデルが resource を決定することもできる
これは何を意味するか?
- サーバ開発者は、上記いずれのパターンにも対応できるように準備しておかなくては行けない(たぶんこの3つだけじゃないよね?)

resource の データタイプ
resource は MCP サーバを通じて client に渡したいデータタイプを表し、以下を含むことができます。resource は 一意の URI
で識別され、テキストまたはバイナリデータを含むことができます。
- ファイルの内容
- データベースレコード
- API応答
- リアルタイムシステムデータ
- スクリーンショットや画像
- ログファイル
- その他

何か全然わからなくなってきた。TS読めないのがネックになってきたぞ。

こっちのドキュメントのほうが良かった

Clojure で書かれた MCP client / server アプリケーション動かしてみる