AI の普及とともに、私たちの生活のさまざまな場面で AI が活用されるようになりました。文章の作成や画像生成、相談事など、これまではチャット形式での対話が主な使われ方だった生成AIですが、最近では「AIエージェント」としての活用にも注目が集まっています。
AI エージェントの活用を考えるうえで、もうひとつ注目したいのが「MCP(Model Context Protocol)」です。MCP を利用すると、AI から外部のツールやサービスへアクセスできるようになります。Kai にもMCPサーバーを登録し、利用するための機能が用意されています。
今回は、MCP サーバーの基本的な仕組みを学び、実際に RAD Studio で MCP サーバーを作成して Kai から利用してみます。
「MCPサーバー」と聞くと少し難しそうに感じるかもしれません。しかし、その基本的な構造をひとつずつ見ていくと、意外とシンプルな仕組みであることがわかります。
Table of Contents
AI世界のUSB-C?
MCP はよく「AI 界の USB-C」と表現されます。しかし筆者は、この一見わかりやすそうな説明をしばらく理解することができませんでした。
そもそも AI に USB-C のような外部接続の仕組みがなぜ必要なのか。なぜ Type-C なのか、Type-A ではだめなのか…など、今思えばかなり的外れなことを気にしてしまい、本質的な部分に着目できていませんでした。
もし同じように「USB-C と言われてもピンとこない」と感じるのであれば、少し別の捉え方をしてみましょう。
「MCP は AI に使用してもらうためのプラグインの規格」と考えるとわかりやすくなるかもしれません。
MCP そのものは、あくまでプロトコル、つまり通信のための共通ルールです。その意味では「USB」という例えはかなり的確です。MCP という共通の規格に対応していれば、AI アプリケーションからさまざまなデータやツールを共通の方法で利用できるようになります。
例えば、データベースを検索する、ファイルを操作する、外部サービスから情報を取得するといった機能を MCP サーバーのツールとして用意することで、 AI はチャットによる対話だけでなく、外部の機能を利用しながら処理を行えるようになります。いわば普段私たちが使っている AI 向けにプラグインのようなものをユーザ側が作成し、提供することが可能なのです。
MCP はもともと Anthropic 社によって公開されたオープンなプロトコルですが、現在では Linux Foundation 傘下の Agentic AI Foundation(AAIF) に寄贈され、オープンプロジェクトとして運営されています。
Anthropic 社以外のさまざまな AI 製品やサービスでも採用されているため、MCP に対応した MCP サーバーであれば、特定の AI ベンダーだけに限定せず、対応する MCP の仕様や機能に応じて、さまざまなAI アプリケーションから利用することができます。
MCPサーバー作成の知っておくべき3つのコト
MCP サーバーの仕組みは、それほど複雑なものではありません。
まずは、MCP サーバーを作成するうえで知っておきたい3つのポイントを見ていきましょう。
①AIクライアントとのやり取りにはJSONを使用している
MCP では、クライアントが MCP サーバーに接続し、公開しているツールを利用します。この通信には、JSON-RPC 2.0 の仕様に準拠したメッセージが使用されます。
②トランスポート方式を知ろう
MCP サーバーを作成するうえで、トランスポート方式(クライアントとサーバー間の通信方法)を理解し、決定することは重要です。
トランスポート方式には、おおまかに次の2つがあります。
(1)stdio(標準入出力)方式
stdio 方式では、MCPクライアントと MCP サーバーが標準入力・標準出力を使ってデータをやり取りします。Delphi であれば、コンソールアプリケーションで Readln や Writeln などを使用し、①で説明した JSON-RPC 2.0 仕様に準拠したデータを送受信します。
(2)Streamable HTTP方式
Streamable HTTP 方式では、HTTP(HTTPS) を使用して MCP クライアントと MCP サーバーの間でデータをやり取りします。
③メソッド名の理解
MCP の仕様には、MCP サーバーとクライアント間でやり取りを行うための命令(メソッド)が定められています。MCP サーバーを作成するにあたって、まずは次のメソッドを知っておくとよいでしょう。
(1)initialize
MCP クライアントと MCP サーバーが最初に接続するときに使用するメソッドです。クライアントが使用する MCP のプロトコルバージョンや対応する機能などを MCP サーバーへ伝え、MCPサーバーも自身が対応する情報を返します。
(2)notifications/initialized
initialize による初期化が完了したことを、MCP クライアントから MCP サーバーへ通知するためのメソッドです。
(3)server/discover
クライアントが「このサーバーは何に対応しているか」を確認するためのメソッドです。MCP サーバーは、対応している MCP のプロトコルバージョンや機能などの情報を返します。
※ MCP のバージョンによって初期化の仕組みが異なります。initializeとnotifications/initialized は従来の仕様で使用され、2026-07-28 仕様では server/discover が導入されています。
(4)tools/list
クライアントが「この MCP サーバーでは、どんなツールが用意されているのか」を確認するためのメソッドです。
例えば「DoSomething」というツールを実装した場合、そのツールの名前や説明、必要な引数などを tools/list への応答として公開します。
MCPサーバーに独自の機能を実装する
ここまで紹介したメソッド名は、MCP の仕様によってあらかじめ決められたものです。
一方、実際にAIから利用してもらう機能は、「ツール」としてMCPサーバーに実装します。 ツールの名前は開発者が決めることができます。図は、MCP サーバーと MCP クライアント(AI)とのやり取りのフローです。

例えば「DoSomething」というツールを公開した場合、MCPクライアントは tools/list でその存在を知り、実際に実行するときには tools/call メソッドを使って「DoSomething」を呼び出します。
なお、MCPのメソッドのやり取りは、MCPのバージョンによって手順が異なります。どのバージョンで実装すべきかは、利用を前提とするクライアント(AI)やそのバージョンによって異なります。
RAD Studioでつくる初めてのMCPサーバー
RAD Studio をつかって MCP サーバーを作成していきます。
今回は Kai での使用を想定し、プロンプトが終了したら通知を行う MCP サーバーを作成します。通知には ShowMessage を使用しますが、応用例として、Windows のトースト機能や外部の通知サービスと連携することも考えられます。
ツール名は DoSomething と汎用的な名前にしておきます。その他、実行環境は以下のとおりです。
MCPサーバー名: MyMCPServer
ツール名: DoSomething
プロジェクト名: MyMCPServer
機能概要: Kai での MCPサーバとして使用することを前提とし、作業完了時に AI から DoSomething ツールを呼び出し、ShowMessage を使用してユーザに通知する。
開発言語: Delphi または C++Builder
使用するAIモデル(CLI): OpenAI(Codex) バージョン1.11 ※MCP のバージョンは 2025-06-18版
コーディングについては Kai の環境をつかえるので AI にコーディングしてもらいましょう。
プロンプトは以下のとおりとします。(サンプルコードは記事の最後に掲載します)
|
1 2 3 4 5 6 7 8 |
Kaiで使用するMCPサーバーを作りたい ・ツール名は DoSomething ・プロンプトが終了した場合にAiから呼び出され、作業が完了したことをShowMessageする ・メッセージの文面はAIが作成しそれを受け取る ・デモプログラムなので本来必要とすべきエラーチェックや例外処理は省略 ・プロトコルは 2025-06-18版を使う ・AIからの入力と MCPサーバーからの応答のデータ(JSON)を可視化するためにEXEと同じ階層にログを出力する |
生成されたコードを少し覗いてみましょう。次のコードは、メインルーチンにあたる部分です。極めてシンプルな構造であることがわかります。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
var Line: string; Request: TJSONObject; begin // ①各種初期化処理 Application.Initialize; Application.Title := 'Kai Completion Demo'; SetTextCodePage(Input, CP_UTF8); SetTextCodePage(Output, CP_UTF8); LogFileName := TPath.Combine(ExtractFilePath(ParamStr(0)), 'mcp-json.log'); // ②Eofまでループ while not Eof(Input) do begin Readln(Input, Line); LogJSON('AI -> SERVER', Line); // ②-1ログ出力 Request := TJSONObject.ParseJSONValue(Line) as TJSONObject; // ②-2入力値をJSONに変換 HandleRequest(Request); // ②-3リクエストの内容に基づき各種処理を実行 Request.Free; end; end. |
メインルーチンは極めてシンプルです。①で各種初期化処理を行った後、 Input変数 に関連付けられた標準入力が終端に達するまでループします。
受け取ったデータは②-2で JSON に変換され、②-3で各種処理へと振り分けられます。
MCPサーバーの登録
次に、ビルドした Exe を Kai の MCP サーバーとして登録します。次の例は、その登録例です。

RAD Studio IDE より ツール > オプション > Kai > チャット > MCPサーバー > カスタムを選択します。
サーバーの追加を行う(+)ボタンをクリックしプロパティを以下のように設定します
Name: MyMCPServer (または任意の名称)
タイプ: ローカル
開始コマンド: 作成した MCP サーバーのフルパス(例では “C:\Users\Public\Documents\MyMCPServer\Win64\Debug\MyMCPServer.exe")
以上を入力したら保存をクリックし、RAD Studio を再起動します。
動作テスト
作成した MCP サーバーが期待した動作をするかチェックします。
RAD Studio IDE より [表示 > Kai - チャット]を選択し、チャットウインドウを開いたら新しいセッションを開始します。
新しいセッションが作成されるのと同時に、タスクマネージャーを開くと、作成した MyMCPServer.exe が起動されていることが確認できます。この状態であれば[実行 > プロセスにアタッチ] を行って、RAD Studio でデバッグを行うこともできます。
つぎに、プロンプトを以下のように入力し、作業の終わりに通知が行われるか確かめます。
|
1 |
Hello world コンソールアプリケーションを作成して。作業が終了したら DoSomethingツールを使用してユーザーに通知をして |
図は、プロンプトが実行され、プロジェクトが作成された直後の状態です。ご覧の通り、メッセージボックスが表示されています。なお、メッセージボックスの文面は MCP サーバー側で用意した定型文ではなく、AI 側で作成した文章をそのまま表示しています。

次のテキストは MCP クライアントとサーバーの通信ログです
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
2026-10-01 13:21:31.446 AI -> SERVER {"jsonrpc":"2.0","id":0,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{"experimental":{"codex/auth-change":{}},"elicitation":{"form":{},"url":{}}},"clientInfo":{"name":"codex-mcp-client","title":"Codex","version":"0.156.1"}}} 2026-10-01 13:21:31.446 SERVER -> AI {"jsonrpc":"2.0","id":0,"result":{"protocolVersion":"2025-06-18","capabilities":{"tools":{}},"serverInfo":{"name":"KaiCompletionDemo","version":"1.0.0"},"instructions":"When you have completed the user request, call DoSomething once before your final answer. Compose a short completion message in the user language and pass it as the message argument."}} 2026-10-01 13:21:31.452 AI -> SERVER {"jsonrpc":"2.0","method":"notifications/initialized"} 2026-10-01 13:21:31.457 AI -> SERVER {"jsonrpc":"2.0","id":1,"method":"tools/list","params":{"_meta":{"progressToken":0}}} 2026-10-01 13:21:31.464 SERVER -> AI {"jsonrpc":"2.0","id":1,"result":{"tools":[{"name":"DoSomething","description":"When you have completed the user request, call DoSomething once before your final answer. Compose a short completion message in the user language and pass it as the message argument. Displays the message in a Windows dialog; returns after OK is pressed.","inputSchema":{"type":"object","properties":{"message":{"type":"string","description":"AI-written completion message describing the finished work."}},"required":["message"],"additionalProperties":false}}]}} 2026-10-01 13:22:44.966 AI -> SERVER {"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"_meta":{"callId":"exec-8ae428a5-bd76-4540-a8c5-feafc7877b32","x-codex-turn-metadata":{"session_id":"01a0f5b2-3202-7ba1-8c3a-415f01336e87","thread_id":"01a0f5b2-3202-7ba1-8c3a-415f01336e87","reasoning_effort":"low","turn_id":"01a0f5b2-4b98-7140-85f5-82848c39069b","model":"gpt-6-astra","sandbox":"none","sandbox_mode":"danger-full-access","auto_review_enabled":false,"node_repl_auto_review_required":true,"node_repl_disabled":false,"turn_started_at_unix_ms":1790828497821,"codex_version":"0.156.1"},"threadId":"01a0f5b2-3202-7ba1-8c3a-415f01336e87","sessionId":"01a0f5b2-3202-7ba1-8c3a-415f01336e87","windowId":"01a0f5b2-3202-7ba1-8c3a-415f01336e87:0","itemId":"ctc_006f5ee1e2f384f6016abde01331f887d084f75cd32d4b50d9","progressToken":1},"name":"DoSomething","arguments":{"message":"Hello worldを表示するDelphiコンソールアプリケーションをHelloWorldConsoleフォルダーに作成しました。RAD Studioでビルドに成功し、実行結果「Hello world」と正常終了(終了コード0)を確認しました。"}}} |
ログは2行1組で構成され、1行目は記録時刻と通信の方向(AI→MCPサーバー または MCP→AI)です。2行目は実際の通信内容です。通信の内容は JSON 形式でやり取りされていることがわかります。
冒頭で説明した通り、JSON のフォーマットは MCP の仕様として公式サイトに定義されています。
MCP Connectでさらに簡潔に
RAD Studio 13.2 からは、「MCPConnect」を利用することで、MCPサーバーをより手軽に開発できるようになりました。

MCPConnect には、MCP サーバーの実装に必要となる基本的な機能があらかじめライブラリとして用意されているため、通信処理や各種機能を一から実装する必要がなく、よりシンプルなコードで MCP サーバーを構築できます。
さらに、MCPConnect には MCP サーバー作成用のウィザードも用意されています。用途に合わせたスケルトンも生成してくれるため、初めて MCP サーバーを開発する方でもスムーズに開発を始めることができます。

MCPConnect は、アドオンとして GetItから入手が可能です。
また、Paolo Rossi 氏によって執筆された Building MCP Servers in Delphi with MCPConnect および Luca Minuti氏によって執筆された MCPConnect: How To Secure MCP Servers (いずれも英語) ではMCPの基礎知識とともに、MCPConnect をより詳細に解説しています。ぜひこちらもご覧ください。
まとめ:広がるMCPサーバーの世界
RAD Studio でつくる MCP サーバーは、Kai で利用するツールを作成する場合はもちろん、本格的な AI エージェントとして利用するツールを開発する場合でも、今回ご紹介した仕組みが基本となります。
RAD Studio で MCPサーバーを開発するメリットのひとつとして、既存のプログラム資産を活用できることが挙げられます。例えば、既存の業務アプリケーションに実装されているビジネスロジックを、AI エージェントから利用するケースを考えてみましょう。

これまで UI を通じてユーザーが操作していた処理を、MCP サーバーを介して実行できるようにすることで、既存のワークフローと併用して、AIから利用できるワークフローを追加させることができます。
このように MCP サーバーは、新たなツールを開発するためだけでなく、これまで蓄積してきたプログラム資産と AI をつなぐ橋渡し役としても活用できます。
参考
- RAD Studio 13.2 Florence 提供開始のお知らせ
- Model Context Protocol (最新の仕様等はこちらをご確認ください)
- JSON-RPC 2.0
- MCP Connect
- RAD Studio 向け AI エージェント『Kai』
- Kaiについての14の質問:Delphi / C++Builder / RAD Studio向けの新しいエージェント型AIアドオンを知る
- Building MCP Servers in Delphi with MCPConnect
- MCPConnect: How To Secure MCP Servers
サンプルコード
Delphi
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 |
program MyMCPServer; {$APPTYPE CONSOLE} {$R *.res} uses Winapi.Windows, System.SysUtils, System.Classes, System.JSON, System.IOUtils, Vcl.Forms, Vcl.Dialogs; const ProtocolVersion = '2025-06-18'; CompletionInstruction = 'When you have completed the user request, call DoSomething once before ' + 'your final answer. Compose a short completion message in the user language ' + 'and pass it as the message argument.'; var LogFileName: string; // 通信方向とJSONメッセージを日時付きでログファイルに追記します。 procedure LogJSON(const Direction, JSON: string); begin TFile.AppendAllText(LogFileName, FormatDateTime('yyyy-mm-dd hh:nn:ss.zzz', Now) + ' ' + Direction + sLineBreak + JSON + sLineBreak + sLineBreak, TEncoding.UTF8); end; // JSON-RPCの成功応答をログに記録し、標準出力へ送信します。 procedure SendResult(const ID: TJSONValue; const Value: TJSONObject); var Response: TJSONObject; JSON: string; begin Response := TJSONObject.Create; Response.AddPair('jsonrpc', '2.0'); Response.AddPair('id', ID.Clone as TJSONValue); Response.AddPair('result', Value); JSON := Response.ToJSON; LogJSON('SERVER -> AI', JSON); Writeln(Output, JSON); Flush(Output); Response.Free; end; // プロトコルバージョンやサーバー情報を含む初期化応答を生成します。 function InitializeResult: TJSONObject; begin Result := TJSONObject.Create; Result.AddPair('protocolVersion', ProtocolVersion); Result.AddPair('capabilities', TJSONObject.Create.AddPair('tools', TJSONObject.Create)); Result.AddPair('serverInfo', TJSONObject.Create.AddPair('name', 'KaiCompletionDemo') .AddPair('version', '1.0.0')); Result.AddPair('instructions', CompletionInstruction); end; // 公開ツールの説明と引数スキーマを含むツール一覧を生成します。 function ToolList: TJSONObject; var Tool, Schema, Properties: TJSONObject; begin Properties := TJSONObject.Create.AddPair('message', TJSONObject.Create.AddPair('type', 'string') .AddPair('description', 'AI-written completion message describing the finished work.')); Schema := TJSONObject.Create.AddPair('type', 'object') .AddPair('properties', Properties) .AddPair('required', TJSONArray.Create.Add('message')) .AddPair('additionalProperties', TJSONBool.Create(False)); Tool := TJSONObject.Create.AddPair('name', 'DoSomething') .AddPair('description', CompletionInstruction + ' Displays the message in a Windows dialog; returns after OK is pressed.') .AddPair('inputSchema', Schema); Result := TJSONObject.Create.AddPair('tools', TJSONArray.Create(Tool)); end; // 受信したリクエストに応じて初期化、ツール一覧取得、メッセージ表示などを処理します。 procedure HandleRequest(const Request: TJSONObject); var ID: TJSONValue; MethodName, MessageText: string; Params: TJSONObject; begin // Notifications (including notifications/initialized) have no response. ID := Request.GetValue('id'); if ID = nil then Exit; MethodName := Request.GetValue<string>('method'); if MethodName = 'initialize' then SendResult(ID, InitializeResult) else if MethodName = 'ping' then SendResult(ID, TJSONObject.Create) else if MethodName = 'tools/list' then SendResult(ID, ToolList) else if MethodName = 'tools/call' then begin Params := Request.GetValue<TJSONObject>('params'); // Demo: assumes a valid DoSomething call with a string message. MessageText := Params.GetValue<TJSONObject>('arguments') .GetValue<string>('message'); ShowMessage(MessageText); SendResult(ID, TJSONObject.Create.AddPair('content', TJSONArray.Create(TJSONObject.Create.AddPair('type', 'text') .AddPair('text', 'Completion message displayed: ' + MessageText)))); end; end; var Line: string; Request: TJSONObject; begin Application.Initialize; Application.Title := 'Kai Completion Demo'; SetTextCodePage(Input, CP_UTF8); SetTextCodePage(Output, CP_UTF8); LogFileName := TPath.Combine(ExtractFilePath(ParamStr(0)), 'mcp-json.log'); while not Eof(Input) do begin Readln(Input, Line); LogJSON('AI -> SERVER', Line); Request := TJSONObject.ParseJSONValue(Line) as TJSONObject; HandleRequest(Request); Request.Free; end; end. |
C++Builder
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 |
// ヘッダファイルは省略します #include <vcl.h> #pragma hdrstop #include <System.JSON.hpp> #include <System.IOUtils.hpp> #include <Vcl.Dialogs.hpp> #include <iostream> #include <memory> #include <string> #pragma argsused using namespace System; using namespace System::Json; using namespace System::Sysutils; static const UnicodeString ProtocolVersion = L"2025-06-18"; static const UnicodeString CompletionInstruction = L"When you have completed the user request, call DoSomething once before " L"your final answer. Compose a short completion message in the user language " L"and pass it as the message argument."; static UnicodeString LogFileName; // 通信方向とJSONメッセージを日時付きでログファイルに追記します。 static void LogJSON(const UnicodeString &direction, const UnicodeString &json) { System::Ioutils::TFile::AppendAllText(LogFileName, FormatDateTime(L"yyyy-mm-dd hh:nn:ss.zzz", Now()) + L" " + direction + L"\r\n" + json + L"\r\n\r\n", TEncoding::UTF8); } // JSON-RPC応答を生成してログに記録し、UTF-8で標準出力に送信します。 static void SendResult(TJSONValue *id, TJSONObject *value) { std::unique_ptr<TJSONObject> response(new TJSONObject()); response->AddPair(L"jsonrpc", L"2.0"); response->AddPair(L"id", static_cast<TJSONValue *>(id->Clone())); response->AddPair(L"result", value); UnicodeString json = response->ToJSON(); LogJSON(L"SERVER -> AI", json); UTF8String utf8(json); std::cout.write(utf8.c_str(), utf8.Length()); std::cout << std::endl; } // プロトコルバージョン、サーバー情報、機能と指示を含む初期化応答を生成します。 static TJSONObject *InitializeResult() { TJSONObject *result = new TJSONObject(); result->AddPair(L"protocolVersion", ProtocolVersion); result->AddPair(L"capabilities", (new TJSONObject())->AddPair(L"tools", new TJSONObject())); result->AddPair(L"serverInfo", (new TJSONObject()) ->AddPair(L"name", L"KaiCompletionDemo")->AddPair(L"version", L"1.0.0")); result->AddPair(L"instructions", CompletionInstruction); return result; } // DoSomethingツールの説明と入力スキーマを含むツール一覧を生成します。 static TJSONObject *ToolList() { TJSONObject *properties = (new TJSONObject())->AddPair(L"message", (new TJSONObject())->AddPair(L"type", L"string")->AddPair(L"description", L"AI-written completion message describing the finished work.")); TJSONObject *schema = (new TJSONObject())->AddPair(L"type", L"object") ->AddPair(L"properties", properties) ->AddPair(L"required", (new TJSONArray())->Add(UnicodeString(L"message"))) ->AddPair(L"additionalProperties", new TJSONBool(false)); TJSONObject *tool = (new TJSONObject())->AddPair(L"name", L"DoSomething") ->AddPair(L"description", CompletionInstruction + L" Displays the message in a Windows dialog; returns after OK is pressed.") ->AddPair(L"inputSchema", schema); TJSONArray *tools = new TJSONArray(); tools->AddElement(tool); return (new TJSONObject())->AddPair(L"tools", tools); } // リクエストのメソッドに応じて応答し、ツール呼び出し時にメッセージを表示します。 static void HandleRequest(TJSONObject *request) { TJSONValue *id = request->GetValue(L"id"); if (!id) return; UnicodeString method = request->GetValue(L"method")->Value(); if (method == L"initialize") SendResult(id, InitializeResult()); else if (method == L"ping") SendResult(id, new TJSONObject()); else if (method == L"tools/list") SendResult(id, ToolList()); else if (method == L"tools/call") { TJSONObject *params = static_cast<TJSONObject *>(request->GetValue(L"params")); TJSONObject *arguments = static_cast<TJSONObject *>(params->GetValue(L"arguments")); UnicodeString message = arguments->GetValue(L"message")->Value(); Vcl::Dialogs::ShowMessage(message); TJSONArray *content = new TJSONArray(); content->AddElement((new TJSONObject())->AddPair(L"type", L"text") ->AddPair(L"text", L"Completion message displayed: " + message)); SendResult(id, (new TJSONObject())->AddPair(L"content", content)); } } // アプリケーションとログを初期化し、標準入力のJSON-RPCメッセージを順次処理します。 int main(int argc, char *argv[]) { Application->Initialize(); Application->Title = L"Kai Completion Demo"; LogFileName = System::Ioutils::TPath::Combine( ExtractFilePath(ParamStr(0)), L"mcp-json.log"); // One UTF-8 JSON-RPC message per line. stdout contains JSON only. std::string bytes; while (std::getline(std::cin, bytes)) { if (!bytes.empty() && bytes.back() == '\r') bytes.pop_back(); UnicodeString line = UTF8ToString(UTF8String(bytes.c_str())); LogJSON(L"AI -> SERVER", line); std::unique_ptr<TJSONValue> request(TJSONObject::ParseJSONValue(line)); HandleRequest(static_cast<TJSONObject *>(request.get())); } return 0; } |
Reduce development time and get to market faster with RAD Studio, Delphi, or C++Builder.
Design. Code. Compile. Deploy.
Free Delphi Community Edition Free C++Builder Community Edition






