Gemini CLIから利用するMCPサーバを自作してSolr全文検索と文献取得するRAGを試してみた
先日、ベクトル検索でなくたっていいじゃない ‐ Solrの全文検索とGemini CLIを使ったなんちゃってRAG ‐の記事で、Solrで全文検索してヒットした文献をGemini CLIなどに読み込んでこれらを参考情報としてLLMと対話する形のいわゆるRAGについて試してみました。半手動のなんちゃってRAGですが。
そこで今回、もう一歩進めてMCPサーバーの仕組みを使ってGemini CLIから対話形式で検索する手法を試してみましたので、その経緯をメモしておきます。
試すにあたり、事前にMCPについてWebで調査しましたところ、たくさんの記事を参考にさせていただきました。特に参考にしたのはこのあたり。
MCPサーバーの最小構成を作ってみる(Node.js版)
オリジナルのちょっと便利な MCP サーバー を作ってみた
簡易な自作MCPサーバーをお試しで実装する方法
ありがとうございます。
MCPサーバの作成方法は、先程のWebサイトを始めWeb上に情報がたくさんあります。gemini-cliがインストール済みであることを前提としますと、Node.jpはインストール済みのはずなので、後は、@modelcontextprotocol/sdk, zod, child_processあたりをnpmを使ってインストールします。
以下が今回作成したMCPサーバーのコードです。Apache Solrを使っていて、mkprompt2.shという自作のファイル表示スクリプトがある前提のコードになっていますので、あくまでご参考です。
localSolrSearch.mjs
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { z } from "zod";
import { exec } from "child_process";
const url = 'http://[URL]:8983/solr/scrapbook/select?';
const opt1 = 'start=0&rows=';
const opt2 = '&fl=id,title,score&start=0&rows=25&q=search:';
const script = '[Path to script]/mkprompt2.sh';
const server = new McpServer ({
name: "Local Solr Search MCP",
version: "0.0.1",
});
server.tool (
"localSolrSearch",
"Solrを使ってローカルファイルを検索してヒットした文献のIDを取得する",
{ query: z.string().describe("query"),
rows: z.number().describe("rows")},
async ({ query, rows }) => {
const content = await getID(query, rows);
return {content: [{ type: "text", text: content }]};
}
);
server.tool (
"getLocalContent",
"idを指定してローカルで保持しているコンテンツを取得する",
{ id: z.string().describe("id") },
async ({ id }) => {
const content = await getContent(id);
return {content: [{ type: "text", text: content }]};
}
);
const getID = async (query, rows) => {
let arg = url;
if (rows > 0) {
arg += opt1 + String(rows);
} else {
rows = 10;
arg += opt1 + String(rows);
}
arg += opt2 + encodeURIComponent(query);
let data;
let content = "";
try {
await fetch(arg)
.then((response) => {
if(!response.ok) {
throw new Error(`Response status: ${response.status}`);
}
return response.json();
}).then((json) => {
json.response.docs.forEach(
(value, index, array) => {
content += 'id: ' + value.id +
', title: ' + value.title +
', score: ' + value.score + '; ';
});
})
.catch((error) => console.error(error));
} catch (error) {
console.error(error.message);
}
return content;
}
const getContent = async (id) => {
return new Promise((resolve, reject) => {
let cmd = 'echo ' + id + ' | ' + script;
try {
exec(cmd, (error, stdout, stderr) => {
if (error) {
throw new Error('Executing command error:', error);
}
resolve(stdout);
});
} catch (error) {
console.error(error.message);
}
});
};
const main = async () => {
const transport = new StdioServerTransport();
await server.connect(transport);
console.error("MCP Server running on stdio");
};
main().catch((error) => {
console.error("Fatal error in main():", error);
process.exit(1);
});
fetch関数とexec関数を使ったコードになっていますので、外部サービスの利用や自己ローカル環境におけるコマンド実行を伴う処理をGemini CLに実行させるIシーンに応用が利くと思います。
npx -y @modelcontextprotocol/inspector を実行することにより、プラウザが起動してinspectorを使用することができます。テストにとても便利です。
inspectorを使ってMCPサーバーのコードをテストしてデバッグしました。
~/.gemini/settings.jsonに"mcpServers"以降の設定を追加します。
{
"theme": "Default",
"selectedAuthType": "oauth-personal",
"mcpServers": {
"localSolrSearch": {
"command": "node",
"args": [
"[Path to tools]/localSolrSearch.mjs"
]
}
}
}
MCPサーバーのtools実行の際には実行許可を求められるので、許可すると処理を実行して以下のとおり結果を表示します。
上位2件について記事の取得を依頼します。

実は同じ指示を2回繰り返したのですが、2回目では一度返したと回答し、再度表示を指示すると再度要約を表示してくれました。
| 固定リンク
« ベクトル検索でなくたっていいじゃない ‐ Solrの全文検索とGemini CLIを使ったなんちゃってRAG ‐ | トップページ | AlexaからChatGPTモデルのAIアシスタントと会話するスキルをつくってみた(2025年9月) »
「パソコン・インターネット」カテゴリの記事
- Amazon Echo Show と Amazon Basic Smart Plug を組み合わせた見守り(2026.01.03)
- フレッツADSL最終終了(2025.12.31)
- AlexaからChatGPTモデルのAIアシスタントと会話するスキルをつくってみた(2025年9月)(2025.09.16)
- Gemini CLIから利用するMCPサーバを自作してSolr全文検索と文献取得するRAGを試してみた(2025.09.06)
- ベクトル検索でなくたっていいじゃない ‐ Solrの全文検索とGemini CLIを使ったなんちゃってRAG ‐(2025.08.21)






コメント