😊

AIエージェントフレームワーク Solana Agent Kit v2 解説(4): MCPサーバーを立ててみる

に公開

はじめに

こんにちは!今回は4月18日に公開されたSolana Agent Kit v2に関してv1からの変更点を中心に私自身のキャッチアップも兼ねて調査したので解説していきます。
今回はMCP Serverを立ててClaude Desktopで動作確認してみようと思います。v2になり、@solana-agent-kit/adapter-mcpが追加されたことにより、Solana Agent Kitを利用してMCPサーバーが立てられるようになったようです。

AIエージェントフレームワーク Solana Agent Kit v2 解説記事

AIエージェントフレームワーク Solana Agent Kit v2 解説(1): 新アーキテクチャでNFT作成
https://zenn.dev/yukiki01/articles/481f075c90fbc2

AIエージェントフレームワーク Solana Agent Kit v2 解説(2): 組み込みウォレット
https://zenn.dev/yukiki01/articles/0b1bafe9beeb2b

AIエージェントフレームワーク Solana Agent Kit v2 解説(3): モバイル対応とプロンプトパフォーマンス向上
https://zenn.dev/yukiki01/articles/d8ae09e8b16b3c

MCPサーバーを立ててみる

公式ドキュメントに立て方が記載されていたので、ドキュメント通りに実施してみようと思います。
https://docs.sendai.fun/docs/v2/adapters/mcp/mcp-adapter-intro#claude-desktop-configuration

実装

nodeバージョン

node -v
v23.11.1

ディレクトリ・プロジェクト作成

mkdir solana-agent-mcp
cd solana-agent-mcp
npm init -y

ライブラリインストール

今回はsolana-agent-kitに加えて、MCPサーバーを構築するフレームワークである@solana-agent-kit/adapter-mcpもインストールします。また、SOLのウォレット残高をClaude Desktopで確認するため、Tokenプラグイン@solana-agent-kit/plugin-tokenをインストールします。

npm install solana-agent-kit @solana-agent-kit/adapter-mcp @solana-agent-kit/plugin-token dotenv

.envファイル作成

利用するSolanaウォレットの秘密鍵(テスト目的の場合は必ず資産の入っていないテスト用ウォレットを利用してください)、DevnetのRPC URL、OpenAIのAPIキーを記載します。

.env
SOLANA_PRIVATE_KEY=your_private_key_here
RPC_URL="https://api.devnet.solana.com"
OPENAI_API_KEY=your_openai_api_key_here

index.jsファイル作成

MCPサーバーを立てる時もSolanaAgentKitをインスタンス化して、ウォレット、RPC URL、OpenAIのAPIキーを定義し、利用するプラグインをuseメソッドで組み込む流れは変わらないようです。今回MCPサーバーを立てるときは組み込みウォレットではなく、サーバーに定義した秘密鍵からウォレットを作成します。

index.js
import { SolanaAgentKit, KeypairWallet } from "solana-agent-kit";
import { startMcpServer } from "@solana-agent-kit/adapter-mcp";
import TokenPlugin from "@solana-agent-kit/plugin-token";
import * as dotenv from "dotenv";

// 環境変数の読み込み
dotenv.config();

// プライベートキーからウォレットを作成
const wallet = new KeypairWallet(process.env.SOLANA_PRIVATE_KEY);

// SolanaAgentKitのインスタンスを作成。利用するプラグインも設定
const agent = new SolanaAgentKit(wallet, process.env.RPC_URL, {
  OPENAI_API_KEY: process.env.OPENAI_API_KEY,
}).use(TokenPlugin);

// どのアクションをMCPサーバーに公開するかを選択する
const finalActions = {
  // TokenPluginのアクション
  BALANCE_ACTION: agent.actions.find(
    (action) => action.name === "BALANCE_ACTION"
  ),
  TOKEN_BALANCE_ACTION: agent.actions.find(
    (action) => action.name === "TOKEN_BALANCE_ACTION"
  ),
  // 現在のsolana-agent-kitリポジトリには存在せず、そのままだとエラーになる。
  // GET_WALLET_ADDRESS_ACTION: agent.actions.find(
  //   (action) => action.name === "GET_WALLET_ADDRESS_ACTION"
  // ),
};

// MCPサーバーを起動
startMcpServer(finalActions, agent, {
  name: "solana-agent-mcp",
  version: "0.0.1",
});

どのアクションをMCPサーバーに公開するかを選択する部分ではアクション名をsolana-agent-kitリポジトリから取得します。
solana-agent-kitリポジトリのpackagesディレクトリには各プラグインのソースコードがあり、使いたいプラグインのディレクトリ内のsrcフォルダに、対応するプロトコルごとのコードが整理されています。
Token pluginの例

各プロトコルのディレクトリには大方actionsディレクトリとtoolsディレクトリが存在しており、actionsディレクトリにAIエージェントにツールを認識させるためのアクションの定義(システムプロンプトに渡る部分)が、toolsディレクトリには実際の各ツールの処理の関数が実装されています。toolsディレクトリの関数をactionsディレクトリ内の定義で呼び出す流れです。

- actions/
- tools/

Solana Agent KitでMCPサーバーを立てる時に定義が必要なactionの名前はactionsディレクトリ内の各ファイルのnameフィールドに記載されています。
今回定義するBALANCE_ACTIONTOKEN_BALANCE_ACTIONはそれぞれ下記に定義されています。
BALANCE_ACTION
https://github.com/sendaifun/solana-agent-kit/blob/dee808df2a1b84c3559a1a2332945f2d74be4b97/packages/plugin-token/src/solana/actions/balance.ts#L7
TOKEN_BALANCE_ACTION
https://github.com/sendaifun/solana-agent-kit/blob/dee808df2a1b84c3559a1a2332945f2d74be4b97/packages/plugin-token/src/solana/actions/tokenBalances.ts#L7
また、公式ドキュメントに記載されていたGET_WALLET_ADDRESS_ACTIONアクションは現在のsolana-agent-kitリポジトリには存在しておらず、そのままだとエラーが出たためコメントアウトしました。

package.jsonファイル編集

package.jsonファイルに"type": "module"フィールドを追加します。

package.json
{
  "name": "solana-agent-mcp",
  "version": "1.0.0",
  "type": "module",
  "main": "index.js",
  "scripts": {
    "start": "node index.js"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "description": "",
  "dependencies": {
    "@solana-agent-kit/adapter-mcp": "^2.0.4",
    "@solana-agent-kit/plugin-token": "^2.0.4",
    "dotenv": "^16.5.0",
    "solana-agent-kit": "^2.0.4"
  }
}

Claude Descktop設定

Claude Desktopの設定をします。下記リンクからダウンロードできます。
https://claude.ai/download

設定ファイルを開く

私はMacOSで動作確認しましたが、それぞれ下記パスにMCPサーバーの設定をするファイルが存在します。
MacOS

code ~/Library/Application\ Support/Claude/claude_desktop_config.json

Windows

code $env:AppData\Claude\claude_desktop_config.json

設定記載

ファイルを開いたら下記のように記載します。公式ドキュメントにはcommandフィールドにnodeと記載されていましたが、私はnvmを使っていたからかそのままでは動作せず、which nodeコマンドで出力された絶対パスを記載しました。
また、envフィールドには.envファイルを作成した時の値をそれぞれ記載します。argsフィールドにも作成したindex.jsファイルの絶対パスを記載します。

{
    "mcpServers": {
        "agent-kit": {
            "command": "<nodeコマンドの絶対パス>",
            "env": {
                "RPC_URL": "<.envファイルに記載したRPC_URL>",
                "SOLANA_PRIVATE_KEY": "<.envファイルに記載したSOLANA_PRIVATE_KEY>",
                "OPENAI_API_KEY": "<.envファイルに記載したOPENAI_API_KEY>"
            },
            "args": [
                "/<作成したindex.jsの絶対パス>/solana-agent-mcp/index.js"
            ]
        }
    }
}

Claude Desktop再起動

ファイルの定義が完了したらClaude Desktopを再起動します。

動作確認

What’s my SOL balance? My wallet address is nHSjCbSd3XD3UwGy5uAAUqEfDf4kBDYaJZ4eF82nCDZ.というプロンプトを入力して、Devnetのテスト用ウォレットの残高を聞いてみました。

すると下記のように実際のDevnetのSOLの残高を返してくれました!また、SOLのみではなく、テスト用に作っていた独自トークンまで回答してくれました。

まとめ

Solana Agent Kitを使ってMCPサーバーを立ててClaude Desktopで動作確認まで実施できました。今回はClaude Desktopで実施しましたが、OpenAIのPlaygroundを利用しても動作させることができるようです。

手順通りに実装してTokenの残高は確認できたのですが、NFTの発行を試みたところうまく動作させられなかったので、引き続き調査していこうと思いました。

Discussion