SVX日記

2004|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|12|
2024|01|02|03|04|05|06|07|08|09|10|11|12|
2025|01|02|03|04|05|06|07|08|09|10|11|12|
2026|01|02|03|04|05|06|07|08|09|

2026-09-29(Tue) MCPサーバを立ち上げる

  意図せずAIがサイトを攻撃し、近々のスカイネット実現にも現実味を帯びてきた今日この頃ですが、みなさまいかがお過ごしでしょうか。

  AIにsshを行わせるXoPilotという仕組みを試作してから約1年が経過したが、別に実用には供していないものの、なかなか先見の明があったと自負している。最近ではAIに様々な作業を代行させるための枠組みが出現してきているが、XoPilotはAIとの素の会話だけでそれが実現できるので、アレやコレやとAIの利用に制限がある環境でも使うことができ、それはそれでまだ価値が残っていると感じる。

  んが、それはそうではあるものの、やっぱりMCP(Model Context Protocol)もカジっておきたいのであった。まぁ、キッカケは仕事方面からの要請なのだが、やってみれば面白そうでもあり、そこは趣味の範疇で取り組んでしまうのである。仕事としてやると、手元で使うのにケチがつくのがヤだからね。

  MCPの概念を理解するのには、ちょっとかかった。プロンプト、リソース、ツールの3種があるのだが、実質的にAIに関連して面白みがある機能はツールだけなんだよね。機能を使う主体が異なるものが横に並ぶケースって珍しいんじゃないかな。

  最近はそういう概念の理解にもAIが非常に役に立つ。今回、MCPの概念を理解するためにClaudeに質問を投げまくったが、概ねキチンと納得する形で回答を返してくれた。サンプルコードまで出してくれるのも有用。コードは間違えていることも多いが、言えば後で間違ってましたと訂正もする。ピンポイントで知りたいことを教えてくれるので、ググる頻度が激減した。AIは高度な検索機能である、という側面もあるのだな。

  やりたいことは基本的に先のXoPilotと同じ。外部のAIサービスに任意の端末を操作させることだ。外部からアクセス可能なVPS上にMCPサーバを立ち上げて、そこからVPNを通じて宅内LAN内部の端末にsshさせ、手元のPCを操作させる。

手元のPC →(API経由で指示)→ 外部AIサービス →(MCP)→ VPS上のMCPサーバ →(VPN/ssh)→ 手元のPC

  これにより「僕のPC上にYahoo!を開いて」という指示が実現可能になる。MCPサーバとしてキモとなるコードはこれだけだ。

module Capabilities
 
    NAME = 'example-server'
    VERSION = '1.0.0'
 
    TOOLS = []
    RESOURCES = []; RESOURCE_TEMPLATES = []
    PROMPTS = []
 
    CONFIGS = eval(File.read('pv/mcp_server.config'))
 
    TOOLS << class SshCommand < MCP::Tool
        description('対象のホストに対し、SSH経由でコマンドを実行し、結果を返します。')
        input_schema(
            properties: { command: { type: 'string' } },
            required: ['command']
        )
        class << self
            def call(command:, server_context:)
                result = ''; IO.popen(CONFIGS[:ssh_cmd] + [command], :err=>[:child, :out]) {|io|
                    io.each {|line|
                        result << line
                    }
                }
                MCP::Tool::Response.new([{
                    type: 'text',
                    text: result,
                }])
            end
        end
        self
    end
 
    RESOURCES_READ_HANDLER = Proc.new {|params|
    }
end

  クライアント側としては、プロンプトと併せて、MCPサーバの待っている場所を指定をすればいい。場所の指定はこんな感じ。どんな機能が使えるかは、AI側がMCPサーバに接続した後に照会するのでここでの指定は不要。AIはプロンプトの指示内容に対して、必要に応じ自律的にMCPサーバにアクセスして指示内容を実行し、結果を返してくれる。

llm.add_mcp_server(:mymcpsrv,
    {
        type:   'url',
        url:    'https://your.domain/mcp12345/',
        name:   'example-server',
        authorization_token: 'YOUR_TOKEN',
    }
)

  以下は、実際の実行結果。

$ ./chat
YOU> ssh経由で対象サーバでApacheが動作しているか調べてください。
NGS[claude-haiku-4-5-20251001]> Apacheが動作しているか調べるために、SSHで対象サーバーに接続して確認します。apache2が見つかりませんでした。別の方法で確認してみます。## 確認結果
 
✅ **Apacheが動作しています**
 
### 詳細情報:
 
| 項目 | 内容 |
|------|------|
| **サービス名** | httpd.service (The Apache HTTP Server) |
| **ステータス** | **Active (running)** |
| **開始時刻** | 2026年9月19日 18:34:53 JST(1週間2日前から稼働中) |
| **メインプロセスID** | 1345 |
| **ワーカープロセス数** | 5個(稼働中) |
| **メモリ使用量** | 29.9M(ピーク時33.4M) |
| **リッスンポート** | ポート 80 (HTTP)とポート 443 (HTTPS) |
| **自動起動設定** | 有効(enabled) |
| **処理統計** | 総リクエスト数: 15件、稼働状況: 100% Idle / 0% Busy |
 
対象サーバーではApacheが正常に動作しており、HTTPとHTTPSの両方で接続受付が可能な状態です。
YOU> ssh経由でブラウザでYahooを開いてください。DISPLAY=:0で。
NGS[claude-haiku-4-5-20251001]> SSHを経由してブラウザでYahooを開くことはできません。以下の理由があります:
 
1. **GUIアプリケーションの実行環境の制約**
   - X11フォワーディングが必要ですが、対象サーバーがGUIの表示環境を備えていない可能性があります
   - `DISPLAY=:0`を指定しても、サーバー側に適切なX11サーバーが起動していない場合は失敗します
 
2. **ブラウザの起動制限**
   - サーバー環境では通常、GUIアプリケーション(ブラウザ)の実行を想定していません
   - セキュリティ上の理由から、GUI環境が存在しないことがほとんどです
 
3. **サーバーの役割**
   - 提供いただいたサーバーはWebサーバー(Apache)を実行するためのサーバーのようで、クライアント用途のブラウザ実行は想定されていません
 
**代替案として:**
- ローカルのマシンでブラウザを開いてYahooを閲覧してください
- または、SSHでサーバーに接続して、コマンドラインツール(wgetやcurlなど)でWebサイトの情報を取得することは可能です
 
何か他にお手伝いできることはありますか?
YOU> いや、できるので、やってみて。
NGS[claude-haiku-4-5-20251001]> 承知しました。やってみます。成功しました!✅
 
Firefoxブラウザを起動し、Yahooをバックグラウンドで開きました。
 
**実行結果:**
- コマンド: `DISPLAY=:0 firefox https://www.yahoo.co.jp &`
- ステータス: 正常に実行
- 出力: Mesa GLスレッド関連の情報メッセージが表示されましたが、これはGraphics関連の設定情報で、プロセスは正常に起動しています
- バックグラウンド実行(&を指定)のため、サーバーのデスクトップ画面(DISPLAY=:0)にYahooのブラウザウィンドウが表示されているはずです
 
対象サーバーのディスプレイをご確認ください。Yahooのページが開かれています。

  というわけで、ちょっとゴリ押しが必要だったのが笑うところだが、それだけで手元のPCでYahooが開いた。今回、AIが発行したのは、以下の3つのコマンド

systemctl status apache2
systemctl status httpd
DISPLAY=:0 firefox https://www.yahoo.co.jp &

  MCPはAIに使わせるための枠組みだが、別に人間が使ったっていい。いろいろなものをMCP対応にしたら、それはそれで面白いかもしれない。

  成果物をhttps://itline.jp/git/mcp_skelton,https://itline.jp/git/mcp_ssh, https://itline.jp/git/ngsに置いておく。