概要
mcpサーバーにはローカルで動作するstdio型とネットワークごしにアクセスできるstreamable HTTP型がありますが
stdio型は標準入出力において改行で区切られたjsonメッセージのやり取りができれば実装可能です。
今回はHot Soup Processor 3.7 RC1で、Win11のローカルPCで動作するmcpサーバーを実装してみました。
たまねちゃんの挨拶を回答する機能を提供します。
引数に時刻の時を指定して時刻によって内容を変更できるようにします。
なお、ちゃんとしたデータチェックや親切なエラー情報、UTF-8入力対応などは今回は実装していません。
mcpホストとして Windows 11 Home の Visual Studio Code 1.100.3 を使用して動作したことがあります。
準備
HSP3のコード2ファイルとstart.axファイル
今回は .exe ファイルは作成せずにstart.ax
ファイル作成からセッティングします。
C:/path/to
フォルダにjson.hsp
とmcpsrv.hsp
を作成し
HSP3エディタで下記のコードを入力し保存します。
mcpsrv.hsp
のタブでHSPエディタのGUIメニューから「HSP」→「START.AXファイル作成」を実行します。
これでC:/path/to/start.ax
ファイルが作成されます。
vscode への設定
vscodeで適当なプロジェクトフォルダに.vscode
フォルダを作成し
その中にmcp.json
ファイルを作成します。
{
"servers": {
"tamane-server": {
"type": "stdio",
"command": "C:/hsp37/hsp3cl.exe",
"args": ["C:/path/to/start.ax"]
}
}
}
args の第一引数にはC:/path/to/start.ax
を指定します。
vscode上では"tamene-server"
上にボタンが追加されます。
tamane-server開始前 |
---|
![]() |
※1回実行済みだとキャッシュの表示が追加されます |
開始 Start をクリックしてください。
mcpサーバーが正しく実装されていると以下のような状態になります。
tamane-server開始後 |
---|
![]() |
Runningに状態が変化したら成功です |
vscodeのchatでの問い合わせ
vscodeの「Open Chat」でチャットを開きます。
Ask または Edit を エージェント Agent モードへ変更します。
ここで「たまねちゃんの昼の挨拶を教えて」と入力します。
実行確認が出ますので 続行 または Continue をクリックします。
さらに「たまねちゃんの深夜の挨拶」と入力すると
別な挨拶が返ってきます。
実行例1 |
---|
![]() |
Copilotが昼を適切に12時と読み替えてmcpサーバーに問い合わせをしようとします |
実行例2 |
---|
![]() |
Ranの部分を展開するとmcpサーバーからの応答が Output または 出力 に表示されます |
実行例3 |
---|
![]() |
深夜は2時 |
実行例4 |
---|
![]() |
12時とは異なる挨拶を返します |
Running であっても mcpサーバーに問い合わせにいかない場合は
+ ボタンから New Chat として始めると
問い合わせにいくことがあります。
今回は挨拶だけ応答する tools を実装しましたが
目的に応じてローカルPCで実行する tools も実装できると思います。
start.ax
ではなく .exe の実行形式を作成する場合は
command
に作成後の .exe ファイルのパスを指定します。
その場合には .exe ファイルと同一フォルダにhspinet.dll
を配置する必要があります。
コードの解説
json.hsp
はHSP3でのjsonアクセスのヘルパー関数実装です。
hspinet
から提供されている関数のままでは下へオブジェクトを潜っていくのが面倒だったのでドット表記で書けるようにしてあります。
mcpsrv.hsp
が実際の標準入出力とパース、応答作文などになります。
HSP3で標準入出力を扱うコンソールモードにするにはhsp3cl.as
を使用します。
hsp3cl.as
をインクルードするとinput
が標準入力の取得として、mes
が標準出力への書き出しとして動作するようになります。
stdio型mcpサーバーではメッセージが改行区切りなので
入力は改行ごとになるようにinput
のオプションを指定し、
出力文はjsonを文字列に変換した後、改行を削除し、メッセージの最後にだけ改行を追加しています。
UTF-8出力したいのでWin32APIでのコードページの変更と
書き出し時にmes
ではなくWin32APIのWriteFile
で
UTF-8エンコードされたバイナリとして標準出力に書き出しています。
※hsp3utf.as
を使用したらinput
もmes
もそのままでUTF-8入出力対応になるかもしれませんが今回は試していないです。
挨拶の内容を応答する箇所は以下になります。
hours
パラメータの範囲によって返す文字列を変更しています。