MCP LLMに翼を与える Web 検索ツールを実装
LLMが Web 検索できるように MCPツールを実装
記事作成日:2026-02-16, 著者: Hi6
LLMが最新の情報やドキュメントなどを取得したい場合、自律的にWebを検索し、必要な情報を取得できるMPC(Multi‑Prompt Controller)を用意しておけば、ユーザーは検索に何時間も費やすことなく済みます。 検索Apiには googleのapiが有名ですがtokenが必要だったりするので、今回は
を利用したいと思います。
from fastmcp import FastMCP
from ddgs import DDGS
from typing import Annotated
mcp = FastMCP(
"Web Context MCP Server", mask_error_details=True
)
# ドックストリングに Args をまとめて書いておくことも可能。
@mcp.tool()
def web_search(
query: Annotated[str, "検索クエリ(例: QEMU カーネルモード 設定)"],
k: Annotated[int, "取得する結果の件数(デフォルト: 5)"] = 5,
region: Annotated[str, "リージョンコード(例: jp-jp, us-en)デフォルト: jp-jp"] = "jp-jp",
backend: Annotated[str, "検索バックエンド(auto, bing, brave, duckduckgo, googleなど)デフォルト: auto"] = "auto"
) -> str:
"""最新のWeb情報を検索します。QEMU、Astroなどの最新ドキュメントを取得できます。
"""
ddgs = DDGS()
results = ddgs.text(query, max_results=k, region=region, backend=backend)
formatted_results = [] # 整形したものをLLMに渡す。
for i, result in enumerate(results, 1):
formatted_results.append(
f"{i}. {result.get('title', 'No title')}\n"
f" URL: {result.get('href', 'No URL')}\n"
f" 概要: {result.get('body', 'No description')}"
)
return "\n\n".join(formatted_results)
if __name__ == "__main__":
# サーバーを起動(HTTP ストリーミング)したい場合は下記を有効化
# mcp.run(transport="http", host="127.0.0.1", port=8083)
# それ以外は stdio で直接実行
mcp.run()
ローカルLLMで使用する場合は、サーバーを立てておくよりもコマンドでその都度実行するほうが使い勝手がよさそうなのでそちらを選択。その場合クライアント側の mcpの設定ファイルを下記のようにする必要がある
{
"mcpServers": {
"get-context-from-web": { // MCP の名前
"type": "stdio", // サーバーを立てる場合は, streamableHttp , Http など
"command": "<仮想環境内のpythonを指定>.venv/Scripts/python.exe",
"args": ["<今回書いたmcpコードへのパス>/get_context_from_web.py"
],
"disabled": false, // サーバーを無効にする場合はtrue
"alwaysAllow": [] // ユーザーへの確認や表示がすべて必要な場合は空
// "alwaysAllow": [web_search] を指定してやると内部的に実行してくれる
}
}
}
このほかにもアドレスで直接サイトを取得できる関数も用意しておくと、LLMが検索結果のアドレスを直接たたいて情報を取得するようなことが可能です。
VScode の Cline で動作を試してみた
input : Astro Adapter API の追加い方を教えて

まずは、検索キーワードを Astro Adapter Api 追加方法 インストール と指定して検索しています。 その結果からリファレンスへのアドレスを見つけ、次にこのアドレスでアクセスをしています。このfetch_web_document はアドレス指定でサイトを取得する tool で def web_searchと同じように追加で実装してあります。

Astro Adapter APIの公式ドキュメントを取得しました。詳細な情報を得ることができました。 ユーザーには日本語で、Astro Adapter APIの追加方法を説明しましょう。(長いので以下省略)
このように、LLMが持っていない知識の取得が可能・・・これはかなり強力。
[!NOTE] 参照サイト