Skip to main content
Glama

search-mcp

Playwright経由で検索エンジンを叩くstdio MCP。Google / Bing / DuckDuckGo / Yahoo! JAPAN / Brave Search対応。

詳しい背景・設計・検証の経緯は SPEC.md を参照。

セットアップ

git clone https://github.com/antigravity-press/search-mcp.git
cd search-mcp
uv sync
uv run playwright install chromium

仮想ディスプレイの用意(headless=Falseを使う場合、オプション)

Google/DuckDuckGo/Brave等をheadlessで使う場合、bot判定回避のためheadless=False での起動を求められることがある(下記の表を参照)。この用途では人間が画面を見る 必要は無いので、OS側に人間の接続に依存しない仮想ディスプレイさえ用意しておけば、 誰の接続にも依存せず常時headful検索が可能になる(SPEC.md 3節参照)。

用意しなくても動く(その場合はheadless専用になるだけ)。用意する場合、手段は環境 依存。Linuxサーバーの一例として、Xvfbが使えないディストロ(近年のRHEL系はWayland 移行でXvfbが標準から外れていることがある)では、weston(Waylandコンポジタ)の headless backendでも同等のことができる:

sudo dnf install weston xorg-x11-server-Xwayland  # ディストロにより異なる
mkdir -p /tmp/.X11-unix   # 通常はX11パッケージが作るが無い場合は要作成
weston --backend=headless --xwayland &

これで:0にX11ディスプレイが立つ。search()ツールはheadless=False指定時、 環境変数SEARCH_MCP_HEADFUL_DISPLAY(既定値:0)で指定したディスプレイを自動的に 使う。永続化したい場合はsystemdサービス化する(このリポジトリのスコープ外、 OS側の環境セットアップとして各自で行う)。

Related MCP server: Web Search MCP

How To Use(全体の流れ)

MCPセットアップ → 利用可能(空プロファイル)
  ├─ 検索でheadful使いたい・Google/DuckDuckGo/Brave等をheadlessで安全に使いたい
  │    → OS側に人間の接続に依存しない仮想ディスプレイを用意する
  │       (このMCPの機能範囲外、一回きりの環境セットアップ。手段は環境依存)
  │       用意済みなら誰の接続にも依存せず常時headful検索が可能
  │
  └─ ログイン済みプロファイルで動かしたい
       ├─ 既存の育ったプロファイルが手元にある → import_profileで取り込むだけ(Display不要)
       └─ 無い・新規にログインしたい → bake_profileで焼き込み
            (ここでのheadfulは人間が操作できる本物のDisplayが必要、SSH X11フォワーディング/CDP等)
  • 「検索フェーズのheadful」(bot判定回避目的、人間が見る必要なし)と「焼き付けフェーズのheadful」(人間が実際に操作する)は、要求がまったく別物。前者は仮想ディスプレイで完結し、後者は本物の(人間から見える)ディスプレイが要る

  • プロファイルはdefaultのみでも運用できる(空のまま使い始めて、必要に応じて育てる/インポートする)。複数プロファイルの使い分けは任意

使い方(ツール)

  • search(query, engine="google", profile="default", num_results=10, headless=True) — 検索を実行

  • fetch_page(url, profile="default", headless=True) — 検索結果の深掘り用に本文を取得

  • list_profiles() — 保持しているプロファイルの一覧

  • import_profile(source_dir, name, overwrite=False) — 既存のログイン済みプロファイルを取り込む

  • bake_profile(profile, method="auto", start_url=None, ...) — プロファイルへのログイン等を焼き付ける(SPEC.md 4節)

エンジンごとのheadless/headfulブロック状況(2026-09-05実地検証)

profileの育ち具合(ログイン等で使い込まれているか、作成直後で無履歴か)によって、 headlessで安全に使えるかどうかが変わる。詳細はSPEC.md 8節参照。

エンジン

育ったprofile, headless

育ったprofile, headful

新規profile, headless

新規profile, headful

Google

✅ OK

✅ OK

❌ ブロック

✅ OK

Bing

✅ OK

未検証

✅ OK

✅ OK

Yahoo! JAPAN

✅ OK

未検証

✅ OK

✅ OK

DuckDuckGo

❌ ブロック

✅ OK

❌ ブロック

✅ OK

Brave

❌ ブロック

✅ OK

❌ ブロック

✅ OK

運用の指針:

  • Bing/Yahoo! JAPANはどちらの状態でもheadlessで問題ない

  • Google/DuckDuckGo/Braveをheadlessで使うには、ログイン等で育ったprofileが実質必須。新規profileはまずheadfulで使い始めるか、import_profileで既存の育ったprofileを取り込むこと

  • DuckDuckGo/Braveは育ったprofileでもheadlessだと即ブロックされる。常にheadful推奨(人間の接続に依存しない仮想ディスプレイがOS側にあれば、人間の接続なしに常時利用可能)

Claude Codeへの登録

claude mcp add search-mcp --scope user -- /path/to/search-mcp/.venv/bin/search-mcp

Available Tools

5 tools
bake_profileBake ProfileA

プロファイルに新しい状態(ログイン等)を焼き付ける。headfulでブラウザを起動し、

ユーザーがウィンドウを閉じるまで待機する(SPEC.md 4節)。

method: "auto"(既定、$DISPLAYの有無で自動判定)/ "display"(ディスプレイに直接表示。 SSHのssh -X経由でも可) / "cdp"(ディスプレイが無い環境向け。Remote Debugging ポートを開き、手元のブラウザからリモート操作する) start_url: 最初に開くURL(例: ログインページ)。省略時は白紙タブ cdp_host/cdp_port: method="cdp"時のbind先。閉域網内のアドレスを明示的に指定すること timeout_seconds: この時間ブラウザが閉じられなければタイムアウトして強制終了する

ParametersJSON Schema
NameRequiredDescriptionDefault
methodNoauto
profileNodefault
cdp_hostNo127.0.0.1
cdp_portNo
start_urlNo
timeout_secondsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It discloses blocking behavior (waits until user closes window), timeout with force termination, headful execution, and remote debugging bind requirements. It doesn't state whether existing profile state is overwritten or how persistent the bake is, but the mutating meaning is clear.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded, followed by workflow behavior, then a compact semicolon-separated parameter list. Every sentence conveys actionable information; no fluff or repetition. The SPEC.md reference is brief and doesn't bloat the description.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 6 optional params, no annotations, and an output schema, the description covers the core workflow and most parameter semantics well. The main gape are that 'profile' is not explained and the behavior depends on an external SPEC.md section that may not be accessible to the agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It adds meaningful semantics for method, start_url, cdp_host/cdp_port, and timeout_seconds, including defaults, ssh -X behavior, and the closed-network bind warning. However, the 'profile' parameter is not described at all, leaving part of the schema under-explained.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description states a concrete action: baking a new state (e.g. login) into a profile, and explains the interactive headful workflow. This clearly differentiates it from read-only siblings like search and fetch_page, and from import_profile, because it explicitly covers browser launch and waiting for user action.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit method selection rules: auto based on $DISPLAY, display for direct display (including ssh -X), and cdp for display-less environments. It also gives timeout and start_url context. It doesn't explicitly state when to prefere bake_profile over import_profile or fetch_page, so it stops short of a full 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

fetch_pageFetch PageA

searchの結果など、指定URLの本文をブラウザ経由(永続プロファイル使用)で取得する。

素のHTTP取得と異なり、ログイン状態やJSレンダリングが必要なページにも対応できる。 スニペットだけでは判断できない結果を、必要な数件だけ選んで深掘りする用途を想定。

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYes
profileNodefault
headlessNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral disclosure burden. It explicitly states that fetching happens through a browser using a persistent profile, which implies cookie/login state and JS rendering support—useful behavioral context beyond the schema. It does not mention potential side effects on the profile or operational costs like slower fetches, but the core behavioral characteristic is well disclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, with two focused sentences. The first sentence states the mechanism and main action, while the second adds the intended use case. No redundant wording or repetition of schema details.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the main purpose, the intended workflow relative to search, and the key behavioral difference (browser, persistent profile). An output schema exists, so return values need not be described. The main completeness gap is the unaddressed headless/profile parameter semantics, but overall the description gives an agent enough context to select and invoke the tool effectively.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It clarifies that URL is the target page and mentions the persistent profile concept, but it does not explain the 'profile' parameter's selectable values or what 'headless' means. The headless parameter is entirely unexplained, leaving an agent with an incomplete understanding of the available knobs.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: it retrieves the body of a given URL via a browser with a persistent profile. It also distinguishes itself from plain HTTP fetching and positions itself as a deep-dive companion to search snippets, clearly separating it from sibling tools like search.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context for when to use this tool: for pages requiring login state or JS rendering, and for investigating a few search results not fully judgeable from snippets. It implies when not to use it by contrasting with plain HTTP fetching, though it does not explicitly name alternatives or exclusion conditions. This is strong contextual guidance, missing only an explicit 'when-not-to-use' statement.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

import_profileImport ProfileB

既存の(すでにログイン状態を持つ)ブラウザプロファイルフォルダをコピーして取り込む。

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNodefault
overwriteNo
source_dirYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

There are no annotations, so the description carries the full burden of behavioral disclosure. 'コピーして取り込む' usefully implies the source folder is copied rather than moved, but the description does not explain overwrite semantics, name-collision behavior, or what happens to an existing destination profile. This is a significant gap for a tool with an overwrite parameter.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is one concise, front-loaded sentence with no redundant wording. It states the core operation directly and is easy to scan.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given three parameters, no annotations, and an output schema, the single-sentence description is not enough. It omits overwrite/destination-name behavior and does not position the tool relative to bake_profile, so an agent may not confidently choose and invoke it correctly in all cases.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It indirectly identifies source_dir as the existing profile folder, but it never explains name or overwrite or how they affect the import. The description only partially maps to the parameters and leaves most of their semantics undocumented.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description states a clear action: copy and import an existing browser profile folder that already has login state. It identifies both verb and resource well, distinguishing the tool's domain from siblings, though it does not explicitly contrast it with bake_profile or the read-only siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase '既存の(すでにログイン状態を持つ)' implies the intended use case: importing an existing, logged-in profile folder. However, it gives no explicit guidance about when to prefer this tool over siblings like bake_profile, and no when-not-to-use conditions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_profilesList ProfilesA

保持しているプロファイルの一覧(名前・サイズ)を返す。

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must carry the behavioral burden. It communicates a read-only list operation by saying it 'returns' profile data, which is transparent for a simple list tool. However, it does not mention potential limitations like pagination, ordering, or access scope beyond 'held' profiles.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is one concise sentence in Japanese, directly stating the operation and output contents. Every word earns its place, and there is no redundant or vague filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given that the tool takes no parameters and has an output schema, the description is almost complete: it identifies the operation, the resource, and the returned fields. It could be slightly stronger by clarifying relationship to sibling search, but for such a simple tool this is adequate.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the description carries no parameter burden. The baseline of 4 for a no-parameter tool is appropriate, and the description adds useful information about what is returned: names and sizes.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action and resource: it returns a list of held profiles with their names and sizes. This is specific and distinguishable from sibling tools like search, import_profile, fetch_page, and bake_profile, which suggest different operations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies that the tool should be used when an agent needs an overview of existing profiles, but it does not explicitly say when to prefer this over sibling tools such as search. There is no exclusion or alternative guidance, only an implied use case.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 5 tool updatesv0.1.0
    • First observedbake_profile
    • First observedfetch_page
    • First observedimport_profile
    • First observedlist_profiles
    • First observedsearch

TDQS

A3.8/5.0
Disambiguation4/5

The tools are generally distinct: search returns SERP listings, fetch_page retrieves a specific page body, and the profile tools manage browser profiles. The only mild ambiguity is between import_profile and bake_profile, since both modify the profile set, but their descriptions clearly separate copying an existing profile from creating a new state interactively.

Naming Consistency4/5

Most tools follow a clear verb_noun pattern: list_profiles, import_profile, fetch_page, bake_profile. The lone search tool is a bare verb rather than search_web or similar, but the overall naming style is consistent and predictable.

Tool Count5/5

Five tools is well-scoped for a search-oriented MCP server. Each tool covers a distinct part of the workflow: querying search engines, inspecting profiles, importing profiles, fetching pages, and baking profile state.

Completeness4/5

The core search-and-fetch workflow is well covered, and profile management includes listing, importing, and baking. A minor gap is the lack of a profile deletion or removal tool, but this does not block the main search/fetch use case.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    F
    maintenance
    Enables web search across Bing, DuckDuckGo, and Google using Playwright automation, with tools for retrieving search results and extracting page text content.
    25
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables web searching through Google, DuckDuckGo, and Bing using a headless Chrome browser, returning structured results with titles, URLs, and snippets. Also supports fetching and extracting text content from any webpage.
    13
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables comprehensive web searching and content extraction using multiple search engines (Bing, Brave, DuckDuckGo) without API keys. Provides tools for full web searches with content extraction, quick search summaries, and single webpage content retrieval.
    1,119
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Provides web search and page fetch capabilities using a browser-based approach, enabling LLMs to search DuckDuckGo, Google, or Yandex and retrieve rendered HTML from URLs.
    3
    MIT

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/antigravity-press/search-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server