📦

自作MCPサーバーでDesktop Extensions (DXT)を試してみた(Mac / Node)

に公開

はじめに

2025年6月26日にAnthropicDesktop Extensions (DXT) を発表しました。

https://www.anthropic.com/engineering/desktop-extensions

ざっくり言えば、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して表示するシンプルなサーバー。認証なし。

https://github.com/PTNA/mcp-ptna-news

  • 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のパスの問題が出ましたが、下記に記載の回避策で動作しました。

トラブルシューティング

つまづきポイント。

SettingsExtensionsタブがない

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

https://github.com/modelcontextprotocol/servers/issues/64#issuecomment-2878569805

ただし、nodeのアップデートで剥がれるとの指摘[1]があり、一時的な解決策のようです。

おわりに

Desktop Extensionsの入門として「シンプルなMCPをシンプルに動かす」ことができました。
やはりNode環境等を作らなくて良いのは、非エンジニア[2]へのMCPサーバーの展開の上で便利に感じました。また、リモートMCPと比較するとローカルに閉じているので、Claude Codeで気軽にstdioツールを作って社内で配る、といった動きもできそうです。

懸念点としてはClaude Desktop以外にも広まっていくか、でしょうか。MCPの提唱者の新しいアイデアなので、今後の広まりに期待したいです。

脚注
  1. https://github.com/modelcontextprotocol/servers/issues/64#issuecomment-2879874656 ↩︎

  2. この言葉、そろそろ死語になりそう。 ↩︎

Discussion