自作MCPサーバーでDesktop Extensions (DXT)を試してみた(Mac / Node)
はじめに
2025年6月26日にAnthropicがDesktop Extensions (DXT) を発表しました。
ざっくり言えば、MCPサーバーを.dxt
にパッケージングして配れば、ユーザーはClaude Desktopにそれをドラッグ&ドロップすればMCPサーバーをインストールできるという触れ込み。
上記の記事のAddressing the MCP installation problem
の項目にも挙げられていますが、
- NodeやPython/uvのインストール
claude_desktop_config.json
といった工程は、非開発者にMCPサーバーを導入する際の無視できないハードルで、ターミナル(黒い画面)を開いた瞬間、一気に「うわっ」という空気が流れるのを、筆者は再三経験しています。
MCPサーバーをよりアクセシブルにするアプローチとして、リモートMCPサーバーの代案になり、実務的で面白そうなので、シンプルな自前MCPサーバーでさっそく試してみました。
環境
- MacBook Air M3
- MacOS: 15.5
- node: v22.14.0
- voltaを使ってインストール
扱うMCPサーバー
最新のニュースをfetchして表示するシンプルなサーバー。認証なし。
- stdio
- node
やってみる
書いてある通りに進める。
$git clone https://github.com/PTNA/mcp-ptna-news
$cd mcp-ptna-news
@anthropic-ai/dxt init
$npx @anthropic-ai/dxt init
すると始まる質問責め。
動作させるのが目標なので、とりあえず最低限で進む。(「めんどくせっ」、というイエスマンのために--yes
が用意されています。)
- ツール名
- entry_point
は実際の実装に合わせて設定が必要です。
manifest.json
ができました。
{
"dxt_version": "0.1",
"name": "mcp-ptna-news",
"version": "0.0.2",
"description": "ピティナ(全日本ピアノ指導者協会)のニュースを取得するMCPサーバー",
"author": {
"name": "PTNA"
},
"server": {
"type": "node",
"entry_point": "dist/index.js",
"mcp_config": {
"command": "node",
"args": [
"${__dirname}/dist/index.js"
],
"env": {}
}
},
"tools": [
{
"name": "get_ptna_news",
"description": "全日本ピアノ指導者協会(ピティナ)の最新ニュースを取得します"
}
],
"license": "MIT"
}
authなどがある場合は、user_config
の設定を追加。
依存のinstall
node_modules
もパッケージ化するので先にinstallしておきます。
$npm install --production
npx @anthropic-ai/dxt pack
$npx @anthropic-ai/dxt pack
これで.dxt
ファイルが作成されます。
Claude Desktopへのインストール
1. Claude Desktopのアップデート
最新版にしておかないとタブに項目が出てきません。
2. Settings > Extensionsを開く
MacOSなので、上部メニューから進みます。
「Extensions」を選択。
ここに作成した.dxt
ファイルをドラッグ&ドロップします。
これで完了です。
以下のように登録されます。
動かしてみる
nodeのパスの問題が出ましたが、下記に記載の回避策で動作しました。
トラブルシューティング
つまづきポイント。
SettingsにExtensionsタブがない
Claude Desktopのバージョンが古かった。自動更新されなかったので、https://claude.ai/download から再ダウンロード。Claude 0.11.3
で動作。
[error] spawn node ENOENT: nodeコマンドが失敗する
当初、以下のエラーが出ました。
2025-06-27T03:27:14.462Z [mcp-ptna-news] [info] Initializing server... { metadata: undefined }
2025-06-27T03:27:14.530Z [mcp-ptna-news] [error] spawn node ENOENT {
metadata: {
context: 'connection',
stack: 'Error: spawn node ENOENT\n' +
' at ChildProcess._handle.onexit (node:internal/child_process:285:19)\n' +
' at onErrorNT (node:internal/child_process:483:16)\n' +
' at process.processTicksAndRejections (node:internal/process/task_queues:90:21)'
}
}
原因はnode
のpathの問題。これまでも~/Library/Application Support/Claude/claude_desktop_config.json
にフルパスを書いて凌いできましたが、配布するとなると、そうもいきません。
以下のIssueのコメントにあるシンボリックリンクで解消しました。
$sudo ln -sf "$(which node)" /usr/local/bin/node && sudo ln -sf "$(which npx)" /usr/local/bin/npx
ただし、nodeのアップデートで剥がれるとの指摘[1]があり、一時的な解決策のようです。
おわりに
Desktop Extensionsの入門として「シンプルなMCPをシンプルに動かす」ことができました。
やはりNode環境等を作らなくて良いのは、非エンジニア[2]へのMCPサーバーの展開の上で便利に感じました。また、リモートMCPと比較するとローカルに閉じているので、Claude Codeで気軽にstdio
ツールを作って社内で配る、といった動きもできそうです。
懸念点としてはClaude Desktop以外にも広まっていくか、でしょうか。MCPの提唱者の新しいアイデアなので、今後の広まりに期待したいです。
Discussion