🚀 Geth MCP Proxy
このプロジェクトは、Geth(Go Ethereum)ノードからのEthereum JSON - RPCクエリをModel Context Protocol(MCP)エコシステムに橋渡しするNode.jsベースのプロキシサーバーです。広範なEthereum RPCメソッドをMCP互換の「ツール」として公開し、MCP対応のアプリケーション(AIモデルやブロックチェーンデータへの制御されたアクセスを必要とする分散システムなど)とのシームレスな統合を可能にします。
プロキシは仲介者として機能し、環境変数で指定されたGethエンドポイントへのリクエストを処理します。一般的なEthereum操作(ブロック番号の照会、残高の取得、トランザクションの照会など)や高度な管理およびデバッグ機能のツールを登録します。応答は、適用可能な場合は16進数と10進数の両方の値でフォーマットされ、消費が容易になります。汎用のパススルーツール(ethCallRaw)を使用すると、サポートされていない任意のRPCメソッドを呼び出すことができます。
🚀 クイックスタート
このサーバーを起動するには、以下の手順に従ってください。
- サーバーを起動します。
node mcpServer.js
サーバーは http://localhost:3000(または指定したポート)で待機し、以下のようにログを出力します。
🚀 MCP server listening at http://localhost:3000/mcp/
- MCPエンドポイント:
- ヘルスチェック:
GET /mcp または GET /mcp/ – サーバーのステータスと登録されたツールを返します。
- 初期化:
POST /mcp でJSON - RPCペイロード { "method": "initialize" } を送信します。
- ツールの一覧表示:
POST /mcp で { "method": "tools/list" } を送信します。利用可能なツールの一覧と説明、スキーマを返します。
- ツールの呼び出し:
POST /mcp で { "method": "tools/call", "params": { "name": "toolName", "arguments": {} } } を送信します。
- MCPトランスポートを介したマルチメッセージセッションのストリーミングをサポートしています。
- シンプルなRESTエンドポイント:
GET /blockNumber:現在のブロック番号を16進数と10進数で返します。
- シャットダウン:SIGINT/SIGTERMを適切に処理し、クリーンなシャットダウンを行います。
- 忘れずに、
.vscode/settings.json または mcp.json に mcp.json のパラメータを追加してください。
✨ 主な機能
- MCP統合:Ethereum RPCメソッドを定義されたスキーマとハンドラーを持つMCPツールとして登録します。
- Ethereum RPCカバレッジ:コアメソッド(
eth_blockNumber、eth_getBalance など)、エイリアス、管理ツール(チェーンのエクスポート/インポート、ピア管理など)、デバッグツール(トレーシング、プロファイリングなど)をサポートします。
- データフォーマット:読みやすさのために16進数の値を自動的に10進数に変換します(ブロック番号、残高、ガス価格など)。
- セキュリティ制御:トランザクションの送信はデフォルトで無効になっています。
ALLOW_SEND_RAW_TX = 1 で有効にできます。
- ヘルスおよびディスカバリーエンドポイント:初期化、ツールの一覧表示、ヘルスチェックのためのMCP互換の
/mcp ルートがあります。
- フォールバックパススルー:明示的に登録されていない任意のJSON - RPCメソッドには
ethCallRaw を使用できます。
- 環境駆動:
.env ファイルを使用してGethのURLとポートを構成します。
📦 インストール
- リポジトリをクローンします。
git clone https://github.com/John0n1/Geth-MCP-Proxy.git
cd Geth-MCP-Proxy
- 依存関係をインストールします。
npm install
必要なパッケージ:
dotenv:環境変数の管理用。
express:Webサーバーフレームワーク。
@modelcontextprotocol/sdk:ツールの登録とトランスポート用のMCP SDK。
zod:入力検証スキーマ。
fs:組み込みのファイルシステムユーティリティ。
📚 ドキュメント
設定
ルートディレクトリに .env ファイルを作成し、以下の変数を設定します。
GETH_URL=http://localhost:8545 # GethノードのJSON-RPCエンドポイントのURL
PORT=3000 # オプション:サーバーのポート(デフォルト:3000)
ALLOW_SEND_RAW_TX=0 # オプション:トランザクションのブロードキャストを有効にするには1に設定(セキュリティ上の理由でデフォルトは無効)
- GETH_URL:必須です。EthereumノードのRPC(ローカルのGethまたはInfuraなど)を指します。
- Gethノードが実行中でアクセス可能であることを確認してください。管理/デバッグメソッドの場合は、必要に応じてGethを
--rpc.allow-unprotected-txs または同等のフラグを付けて起動する必要があります。
利用可能なツール
プロキシは以下のMCPツールをカテゴリ別に登録しています。各ツールには説明、入力スキーマ(Zodベース)、およびGethを照会するハンドラーが含まれています。
コアEthereumツール
| ツール名 |
説明 |
入力スキーマ |
getBlockNumber / eth_getBlockNumber |
現在のブロック番号を取得します(16進数 + 10進数)。 |
{} |
getBalance / eth_getBalance |
アドレスの残高を取得します(16進数 + 10進数)。 |
{ address: string, block?: string } |
eth_chainId / chainId |
現在のチェーンIDを取得します(16進数 + 10進数)。 |
{} |
eth_gasPrice / gasPrice |
現在のガス価格を取得します(16進数 + weiの10進数)。 |
{} |
eth_isSyncing / isSyncing |
ノードが同期中かどうかを確認します。 |
{} |
eth_getBlockByNumber / getBlockByNumber |
番号/タグでブロックを取得します。 |
{ block: string, full?: boolean } |
eth_getTransactionByHash / getTransactionByHash |
ハッシュでトランザクションを取得します。 |
{ hash: string } |
eth_call / call |
トランザクションなしで呼び出しを実行します。 |
{ to: string, data: string, block?: string } |
eth_estimateGas / estimateGas |
トランザクションのガスを推定します。 |
{ to?: string, from?: string, data?: string, value?: string } |
eth_sendRawTransaction / sendRawTransaction |
署名付きの生のトランザクションをブロードキャストします(ALLOW_SEND_RAW_TX = 1 が必要)。 |
{ rawTx: string } |
ethCallRaw |
任意のEthereum JSON - RPCメソッドをパラメータ配列で呼び出します。 |
{ method: string, params?: any[] } |
eth_simulateV1 |
複数のブロックとトランザクションをシミュレートします。 |
{ payload: any, block: any } |
eth_createAccessList |
トランザクションに基づいてEIP2930アクセスリストを作成します。 |
{ transaction: any, blockNumberOrTag?: any } |
eth_getHeaderByNumber |
番号でブロックヘッダーを返します。 |
{ blockNumber: any } |
eth_getHeaderByHash |
ハッシュでブロックヘッダーを返します。 |
{ blockHash: string } |
管理ツール
| ツール名 |
説明 |
入力スキーマ |
admin_exportChain |
ブロックチェーンをファイルにエクスポートします(オプションで範囲指定可能)。 |
{ file: string, first?: number, last?: number } |
admin_importChain |
ファイルからブロックをインポートします。 |
{ file: string } |
admin_nodeInfo |
ノード情報を取得します。 |
{} |
admin_peers |
接続されているピアの情報を取得します。 |
{} |
admin_removePeer |
リモートノードから切断します。 |
{ url: string } |
admin_removeTrustedPeer |
信頼済みピアからリモートノードを削除します。 |
{ url: string } |
admin_startHTTP |
HTTP JSON - RPCサーバーを起動します。 |
{ host?: string, port?: number, cors?: string, apis?: string } |
admin_startWS |
WebSocket JSON - RPCサーバーを起動します。 |
{ host?: string, port?: number, cors?: string, apis?: string } |
admin_stopHTTP |
HTTP RPCエンドポイントを停止します。 |
{} |
admin_stopWS |
WebSocket RPCエンドポイントを停止します。 |
{} |
デバッグツール
| ツール名 |
説明 |
入力スキーマ |
debug_accountRange |
指定されたブロックでアカウント範囲を取得します。 |
{ blockNrOrHash: any, start: string, maxResults: number, nocode: boolean, nostorage: boolean, incompletes: boolean } |
debug_backtraceAt |
ログのバックトレース位置を設定します。 |
{ location: string } |
debug_blockProfile |
ブロックプロファイリングを有効にします。 |
{ file: string, seconds: number } |
debug_chaindbCompact |
キーバリューデータベースを平坦化します。 |
{} |
debug_chaindbProperty |
leveldbのプロパティを返します。 |
{ property: string } |
debug_cpuProfile |
CPUプロファイリングを有効にします。 |
{ file: string, seconds: number } |
debug_dbAncient |
古代のバイナリブロブを取得します。 |
{ kind: string, number: number } |
debug_dbAncients |
古代のアイテムの数を返します。 |
{} |
debug_dbGet |
キーの生の値を返します。 |
{ key: string } |
debug_dumpBlock |
ブロックの状態を取得します。 |
{ number: number } |
debug_freeOSMemory |
ガベージコレクションを強制的に実行します。 |
{} |
debug_freezeClient |
一時的にクライアントを凍結します。 |
{ node: string } |
debug_gcStats |
GC統計を返します。 |
{} |
debug_getAccessibleState |
最初のアクセス可能な状態を返します。 |
{ from: any, to: any } |
debug_getBadBlocks |
最後の不良ブロックを返します。 |
{} |
debug_getRawBlock |
RLPエンコードされたブロックを取得します。 |
{ blockNrOrHash: any } |
debug_getRawHeader |
RLPエンコードされたヘッダーを返します。 |
{ blockNrOrHash: any } |
debug_getRawTransaction |
トランザクションのバイト列を返します。 |
{ hash: string } |
debug_getModifiedAccountsByHash |
ハッシュで変更されたアカウントを返します。 |
{ startHash: string, endHash?: string } |
debug_getModifiedAccountsByNumber |
番号で変更されたアカウントを返します。 |
{ startNum: number, endNum?: number } |
debug_getRawReceipts |
コンセンサスエンコードされたレシートを返します。 |
{ blockNrOrHash: any } |
debug_goTrace |
Goランタイムのトレーシングを有効にします。 |
{ file: string, seconds: number } |
debug_intermediateRoots |
ブロックを実行し、中間ルートを返します。 |
{ blockHash: string, options?: any } |
debug_memStats |
メモリ統計を返します。 |
{} |
debug_mutexProfile |
ミューテックスプロファイリングを有効にします。 |
{ file: string, nsec: number } |
debug_preimage |
sha3ハッシュのプレイメージを返します。 |
{ hash: string } |
debug_printBlock |
ブロックを表示します。 |
{ number: number } |
debug_setBlockProfileRate |
ブロックプロファイルのレートを設定します。 |
{ rate: number } |
debug_setGCPercent |
GCのターゲットパーセントを設定します。 |
{ v: number } |
debug_setHead |
番号でチェーンヘッドを設定します。 |
{ number: number } |
debug_setMutexProfileFraction |
ミューテックスプロファイルのレートを設定します。 |
{ rate: number } |
debug_setTrieFlushInterval |
トライのフラッシュ間隔を設定します。 |
{ interval: string } |
debug_stacks |
ゴルーチンのスタックを返します。 |
{ filter?: string } |
debug_standardTraceBlockToFile |
ブロックをファイルにトレースします(標準JSON)。 |
{ blockHash: string, config?: any } |
debug_standardTraceBadBlockToFile |
不良ブロックをファイルにトレースします。 |
{ blockHash: string, config?: any } |
debug_startCPUProfile |
CPUプロファイリングを開始します。 |
{ file: string } |
debug_startGoTrace |
Goトレースを開始します。 |
{ file: string } |
debug_stopCPUProfile |
CPUプロファイリングを停止します。 |
{} |
debug_stopGoTrace |
Goトレースを停止します。 |
{} |
debug_storageRangeAt |
ブロックの高さとトランザクションインデックスでストレージを返します。 |
{ blockHash: string, txIdx: number, contractAddress: string, keyStart: string, maxResult: number } |
debug_traceBadBlock |
不良ブロックの実行をトレースします。 |
{ blockHash: string, options?: any } |
debug_traceBlock |
RLPでブロックをトレースします。 |
{ blockRlp: string, options?: any } |
debug_traceBlockByNumber |
番号でブロックをトレースします。 |
{ number: any, options?: any } |
debug_traceBlockByHash |
ハッシュでブロックをトレースします。 |
{ hash: string, options?: any } |
debug_traceBlockFromFile |
ファイルからブロックをトレースします。 |
{ fileName: string, options?: any } |
debug_traceCall |
eth_callをトレースします。 |
{ args: any, blockNrOrHash: any, config?: any } |
debug_traceTransaction |
トランザクションをトレースします。 |
{ txHash: string, options?: any } |
debug_verbosity |
ログの詳細度を設定します。 |
{ level: number } |
debug_vmodule |
ログの詳細度パターンを設定します。 |
{ pattern: string } |
debug_writeBlockProfile |
ブロックプロファイルを書き込みます。 |
{ file: string } |
debug_writeMemProfile |
割り当てプロファイルを書き込みます。 |
{ file: string } |
debug_writeMutexProfile |
ミューテックスプロファイルを書き込みます。 |
{ file: string } |
トランザクションプールツール
| ツール名 |
説明 |
入力スキーマ |
txpool_content |
トランザクションプール内のすべてのトランザクションを取得します。 |
{} |
txpool_contentFrom |
アドレスのトランザクションを取得します。 |
{ address: string } |
txpool_inspect |
トランザクションプールのテキスト形式の概要を表示します。 |
{} |
txpool_status |
トランザクションプールのトランザクション数を返します。 |
{} |
🤝 コントリビューション
コントリビューションは大歓迎です!バグ修正、新しいツール、または改善点については、イシューを開くか、プルリクエストを送信してください。
📄 ライセンス
このプロジェクトはMITライセンスの下にライセンスされています。詳細については LICENSE ファイルを参照してください。