mcp-search-server
MCP Search Server
MCP-compliant server providing web search (Yandex Search API) and URL fetching capabilities over JSON-RPC 2.0. Includes a built-in monitoring dashboard with live log feed and request statistics.
Quick Start
Online (with internet)
pip install git+https://github.com/in40/mcp-search-server.gitOffline (air-gapped, no internet)
Prerequisites: Python 3.10+, pip.
Download
Two bundles available on the GitHub Releases page:
Bundle | Size | Playwright | Chromium |
| 21 MB | no | no |
| 330 MB | yes | yes |
# Light (no browser automation):
curl -sL https://github.com/in40/mcp-search-server/releases/download/v2.2.0/mcp-search-server-offline.tar.gz -o mcp-search-server-offline.tar.gz
# Full (with Playwright + Chromium for JS-heavy sites):
curl -sL https://github.com/in40/mcp-search-server/releases/download/v2.2.0/mcp-search-server-offline-full.tar.gz -o mcp-search-server-offline-full.tar.gzTo rebuild yourself (e.g. for a different Python version):
git clone https://github.com/in40/mcp-search-server.git
cd mcp-search-server
bash scripts/build-offline.sh # light (21 MB)
bash scripts/build-offline.sh --with-playwright # full (330 MB)Deploy (on the air-gapped machine)
Light bundle:
tar xzf mcp-search-server-offline.tar.gz
cd offline
bash install.sh --venv ./venvFull bundle (Playwright included):
tar xzf mcp-search-server-offline-full.tar.gz
cd offline
bash install.sh --venv ./venv
# install.sh automatically links bundled ChromiumManual install (without the script)
pip install --no-index --find-links=./wheels ./wheels/mcp_search_server-*.whlConfigure & Run
export YANDEX_SEARCH_API_KEY="your-yandex-api-key"
export YANDEX_FOLDER_ID="your-yandex-folder-id"
export YANDEX_SEARCH_TYPE="SEARCH_TYPE_COM" # or SEARCH_TYPE_RU
mcp-search-serverArchitecture
┌─────────────────────────────────────────────────────────────┐
│ mcp-search-server │
│ │
│ Port 8090 │ Port 8091 │
│ MCP JSON-RPC 2.0 │ REST API Dashboard │
│ ┌───────────────────┐ │ ┌──────────────┐ ┌────────────┐ │
│ │ tools/list │ │ │ POST /search │ │ GET / │ │
│ │ tools/call │ │ │ POST /fetch │ │ (HTML UI) │ │
│ │ - internet_search │ │ │ GET /health │ │ │ │
│ │ - fetch_url │ │ │ GET /stats │ │ │ │
│ └───────────────────┘ │ │ GET /logs │ └────────────┘ │
│ │ └──────────────┘ │
│ In-memory log ring buffer (24h retention) │
└─────────────────────────────────────────────────────────────┘Features
Search (Yandex Cloud Search API)
Primary search provider: Yandex Cloud Search API
Fallback: Brave Search API (configurable via
SEARCH_PROVIDER)Results include title, URL, description excerpts
URL Fetch (fetch_url)
Multi-layered fallback system:
requests library with Chrome UA headers (primary)
SSL fallback - retries without cert verification for broken cert chains
curl subprocess - bypasses some WAF/bot challenges (QRATOR, Cloudflare)
Playwright/Chromium - headless browser for JS-heavy sites
Wikipedia API - direct API for QRATOR-protected Wikipedia mirrors
Content extraction via trafilatura (HTML-to-Markdown)
Russian-language error messages for all failure modes
Dashboard (Port 8091)
Real-time stats: total requests, last-hour, errors, search vs fetch breakdown
Live log feed with auto-refresh (5s interval)
Per-request detail modal (full JSON)
Yandex search tab with timing and results
Themes: blue (default), orange (set
DASHBOARD_THEME=orange)
Environment Variables
Variable | Required | Default | Description |
| Yes | (placeholder) | Yandex Cloud API key |
| Yes | (placeholder) | Yandex Cloud folder ID |
| No |
|
|
| No |
|
|
| No | (placeholder) | Required if |
| No |
| MCP JSON-RPC server port |
| No |
| Dashboard + REST API port |
| No |
| Hours to keep request logs in memory |
| No |
| Path to API keys file |
| No | (none) | Set to |
Authentication
Both MCP and Dashboard endpoints require X-API-Key header matching keys in api_keys.json:
{
"keys": {
"your-api-key-here": "read-write"
}
}MCP JSON-RPC API
initialize
{"jsonrpc": "2.0", "method": "initialize", "id": 1}tools/list
Returns two tools: internet_search and fetch_url.
tools/call
internet_search
{
"jsonrpc": "2.0",
"method": "tools/call",
"id": 2,
"params": {
"name": "internet_search",
"arguments": { "query": "MCP protocol", "count": 5 }
}
}fetch_url
{
"jsonrpc": "2.0",
"method": "tools/call",
"id": 3,
"params": {
"name": "fetch_url",
"arguments": { "url": "https://example.com" }
}
}REST API (Dashboard Port)
Method | Path | Auth | Description |
|
| No | Health check |
|
| X-API-Key | Aggregated statistics |
|
| X-API-Key | Request logs |
|
| X-API-Key | Dashboard HTML UI |
|
| X-API-Key | JSON: |
|
| X-API-Key | JSON: |
Docker
Online build
FROM python:3.11-slim
RUN apt-get update && apt-get install -y --no-install-recommends curl && rm -rf /var/lib/apt/lists/*
RUN pip install --no-cache-dir \
"mcp-search-server[playwright] @ git+https://github.com/in40/mcp-search-server.git" \
&& python -m playwright install --with-deps chromium
COPY api_keys.json .
ENV API_KEYS_PATH=/app/api_keys.json
CMD ["mcp-search-server"]Offline build (air-gapped)
Copy mcp-search-server-offline.tar.gz to the build context, then choose your base image:
Debian/Ubuntu-based (standard):
FROM python:3.11-slim
RUN apt-get update && apt-get install -y --no-install-recommends curl && rm -rf /var/lib/apt/lists/*
COPY mcp-search-server-offline.tar.gz /tmp/
RUN cd /tmp && tar xzf mcp-search-server-offline.tar.gz && \
pip install --no-index --find-links=/tmp/wheels /tmp/wheels/mcp_search_server-*.whl && \
rm -rf /tmp/mcp-search-server-offline.tar.gz /tmp/wheels /tmp/install.sh
COPY api_keys.json .
ENV API_KEYS_PATH=/app/api_keys.json
CMD ["mcp-search-server"]Astra Linux (certified Russian OS):
FROM registry.astralinux.ru/library/astra/ubi18:1.8.6
RUN apt-get update && apt-get install -y --no-install-recommends \
curl \
git \
python3 \
python3-pip \
python3.11-venv \
&& rm -rf /var/lib/apt/lists/*
COPY mcp-search-server-offline.tar.gz /tmp/
RUN cd /tmp && tar xzf mcp-search-server-offline.tar.gz && \
python3 -m venv /opt/venv && \
/opt/venv/bin/pip install --no-index --find-links=/tmp/wheels /tmp/wheels/mcp_search_server-*.whl && \
rm -rf /tmp/mcp-search-server-offline.tar.gz /tmp/wheels /tmp/install.sh
COPY api_keys.json .
ENV API_KEYS_PATH=/app/api_keys.json
CMD ["mcp-search-server"]Development
Online
git clone https://github.com/in40/mcp-search-server.git
cd mcp-search-server
python -m venv .venv && source .venv/bin/activate
pip install -e ".[all]"
playwright install --with-deps chromium
mcp-search-serverOffline
tar xzf mcp-search-server-offline.tar.gz
cd offline
bash install.sh --venv ./venv
source ./venv/bin/activate
mcp-search-serverLicense
Apache 2.0
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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/in40/mcp-search-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server