free-search-mcp
π License
π Python
π MCP
λ‘컬 μ°μ , API ν€κ° νμ μλ Model Context Protocol μλ²μ λλ€. λͺ¨λ LLM(Claude, GPT, λ‘컬 Ollama λ±)μ΄ μΉμ κ²μνκ³ , νμ΄μ§λ₯Ό κ°μ Έμ μ 리νλ©°, λ¬Έμλ₯Ό μ½μ μ μλ κΈ°λ₯μ μ 곡ν©λλ€. κ²μ APIλ₯Ό μν΄ λ³λλ‘ κ°μ ν νμκ° μμ΅λλ€.
μ΄ μλ²λ μ¬λ¬ μ€ν μμ€ MCPμ ν΅μ¬ μμ΄λμ΄λ₯Ό νλμ Python ν¨ν€μ§λ‘ ν΅ν©νκ³ , κ° νλ‘μ νΈμμ λΆμ‘±νλ LLM μ¬μ© νΈμμ±κ³Ό μ λ’°μ±μ 보μνμ΅λλ€.
research("how does reciprocal rank fusion work", depth=3)
β
# Research brief: how does reciprocal rank fusion work
_engines: duckduckgo, mojeek, startpage Β· sources: 3 Β· ~3,400 tokens_
## Sources
- [1] Reciprocal rank fusion | Elasticsearch Reference β <https://β¦>
- [2] Hybrid Search Scoring (RRF) | Microsoft Learn β <https://β¦>
- [3] RRF explained in 4 mins β Medium β <https://β¦>
## Documents
β¦full Markdown bodies of each page, ready for the LLM to readβ¦λ¨ ν λ²μ λꡬ νΈμΆ. μΈ κ°μ§ μμ€. API ν€ λΆνμ. κ²μμ μν OPENAI_API_KEYμ κ°μ λ²κ±°λ‘μ΄ μ μ°¨λ μμ΅λλ€.
μ μ΄ νλ‘μ νΈκ° νμνκ°μ?
κΈ°μ‘΄μ κ²μ MCPλ€μ κ°κ° ν κ°μ§ κΈ°λ₯μ μ μννμ§λ§, 보ν΅μ κ·Έ λͺ¨λ κΈ°λ₯μ΄ νμν©λλ€:
λ€μ€ μμ§ | API ν€ λΆνμ | μ€λ§νΈ ν΄λ°± | PDF/DOCX | FTS5 μΊμ | νν° | Trafilatura | LLM νλ | |
| β | β | β | β | β | β | β | ~ |
| β | β | β | β | β | β | β | ~ |
| β | β | ~ | β | β | β | β | ~ |
| β | β | β | β | β | β | β | ~ |
free-search-mcp | β | β | β | β | β | β | β | β |
μ¬κΈ°μ "LLM νλ"μ΄λ λ€μμ μλ―Έν©λλ€: λ§ν¬λ€μ΄ μ°μ μΆλ ₯, ν ν° μΆμ , λ¨λ½ κ²½κ³μμμ μ€λ§νΈν μλ¦Ό, λͺ¨λΈμ΄ μ¬λ°λ₯Έ λꡬλ₯Ό μ ννλλ‘ λλ "Best for / Not for / Returns / Common mistakes" λ
μ€νΈλ§, μ€ν κ°λ₯ν μ€λ₯ ννΈ, MCP ν둬ννΈ λ° λ¦¬μμ€ ν
νλ¦Ώ, κ·Έλ¦¬κ³ κ²μβκ°μ Έμ€κΈ°βκ°μ Έμ€κΈ°βκ°μ Έμ€κΈ°λ₯Ό λ¨μΌ ν΄μΌλ‘ μμΆνλ μμ· research() κΈ°λ₯.
"Trafilatura"λ trafilaturaλ₯Ό μ¬μ©νμ¬ μ£Όμ μ½ν
μΈ λ₯Ό μΆμΆν¨μ μλ―Έν©λλ€. μ΄λ Bevendorff 2023 ROUGE λ²€μΉλ§ν¬μμ μ°μΉν λꡬμ
λλ€(λ¨μ 보μΌλ¬νλ μ΄νΈ μ κ±° μ ~0.55 λλΉ ~0.85). κ°μ Έμ¨ κ° νμ΄μ§λ author, published_date, sitenameμ 무λ£λ‘ λ°νν©λλ€.
"νν°"λ κ²μ/μ‘°μ¬ μ freshness, include_domains, exclude_domains, category (news/pdf/github/paper/forum/blog), include_text, exclude_textλ₯Ό μ§μν¨μ μλ―Έν©λλ€.
Related MCP server: TOOL4LM
λꡬ
λꡬ | μ€λͺ |
| Reciprocal Rank Fusionμ ν΅ν΄ λ³ν©λ λ€μ€ μμ§ κ²μ |
| μμ·: κ²μ + μμ Nκ° κ°μ Έμ€κΈ° + λ§ν¬λ€μ΄ μμ½ λ°ν |
| νμ΄μ§λ₯Ό κ°μ Έμ 리λ λͺ¨λ λ§ν¬λ€μ΄μΌλ‘ λ°ν (trafilaturaλ‘ μΆμΆ, μμ±μ/λ μ§/μ¬μ΄νΈλͺ ν¬ν¨) |
| λμ λ€μ€ URL κ°μ Έμ€κΈ° |
| νμ΄μ§ λ§€κΉμ μ§μνλ PDF / DOCX / HTML / TXT / MD νμ± |
| μ΄μ μ κ°μ Έμ¨ νμ΄μ§λ€μ λν FTS5 κ²μ |
|
|
λν 2κ°μ MCP ν둬ννΈ (Research thoroughly, Fact-check claim)μ μΊμλ νμ΄μ§λ₯Ό λ€μ κ°μ Έμ€μ§ μκ³ μ»¨ν
μ€νΈλ‘ λΆλ¬μ¬ μ μλ 리μμ€ ν
νλ¦Ώ (cache://page/{url})μ΄ ν¬ν¨λμ΄ μμ΅λλ€.
νν° (search / research)
λ§€κ°λ³μ | κ° | ν¨κ³Ό |
|
| μ΅κ·Ό N κΈ°κ° λ΄μ κ²°κ³Όλ§ νμ |
|
| ν΄λΉ λλ©μΈμΌλ‘ μ ν |
|
| ν΄λΉ λλ©μΈ μ μΈ |
|
| μ½ν μΈ μ ν λ°λ‘κ°κΈ° (paper = arxiv/acm/ieee/β¦, forum = reddit/HN/SE λ±) |
|
| μ λͺ©/μ€λν«μ νμ ν¬ν¨λ λ¬Έμμ΄ |
|
| κΈμ§ν λ¬Έμμ΄ |
|
| μ΄ νΈμΆμ λν΄ 7μΌ κΈ°λ³Έ μΊμ TTL μ¬μ μ |
λͺ¨λ λꡬλ κΈ°λ³Έμ μΌλ‘ format="markdown"μ μ¬μ©ν©λλ€. μ΄λ JSONλ³΄λ€ μ½κΈ° μ½κ³ ν ν°μ μ½ 40% μ κ² μ¬μ©νλ©°, μΆμ²μ ν ν° μμ° ν€λλ₯Ό ν¬ν¨ν©λλ€. ꡬ쑰νλ λ°μ΄ν°κ° νμνλ©΄ format="json"μ μ λ¬νμΈμ.
λꡬ μ£Όμ
λͺ¨λ λꡬλ μ¬λ°λ₯Έ readOnlyHint, idempotentHint, openWorldHint μ£Όμμ μ 곡νμ¬ MCP ν΄λΌμ΄μΈνΈκ° μ΄λ₯Ό λ μ΄λΈλ§νκ³ κΆνμ΄ νμν μμ
μ μ μ΄ν μ μλλ‘ ν©λλ€.
μμ§
κΈ°λ³Έ μΈνΈ (λͺ¨λ μ λ’°ν μ μμΌλ©° λ°λ³΅ νΈμΆ μ μΊ‘μ°¨ μμ):
duckduckgo, mojeek, startpage.
μ΅νΈμΈ (ν€λλ¦¬μ€ ν΄λΌμ΄μΈνΈμ κ°νμ μΈ μ±λ¦°μ§ λ°μ):
brave, bing, baidu.
Brave/Bing/Baiduλ λͺ λ²μ νΈμΆ ν ν€λλ¦¬μ€ λΈλΌμ°μ λ₯Ό μ°¨λ¨ν©λλ€(PoW μΊ‘μ°¨, "something went wrong" νμ΄μ§, 리λ€μ΄λ νΈ λνΌ λ±). κΈ°λ³Έ μμ§μΌλ‘ μνλ κ²°κ³Όλ₯Ό μ°Ύμ μ μμ λλ§
engines=["brave"]λ±μ μ λ¬νμΈμ.
μ€μΉ
git clone https://github.com/ymylive/free-search-mcp.git
cd free-search-mcp
uv sync
uv run playwright install chromiumλ 립ν μλ²λ‘ μ€ν (stdio μ μ‘):
uv run search-mcpλΌμ΄λΈ ν μ€νΈ μ€ν (μ€μ μΉμ μ μ β νκ²½ λ³μ μ€μ νμ):
SEARCH_MCP_TEST_NETWORK=1 uv run pytest -vμ€νλΌμΈ ν μ€νΈλ κΈ°λ³Έμ μΌλ‘ μ€νλλ©° λ€νΈμν¬μ μ μνμ§ μμ΅λλ€.
Claude Desktopμ μ°κ²°
~/Library/Application Support/Claude/claude_desktop_config.json(macOS) λλ ν΄λΉ νλ«νΌμ λμΌν κ²½λ‘μ λ€μμ μΆκ°νμΈμ:
{
"mcpServers": {
"search": {
"command": "uv",
"args": ["--directory", "/absolute/path/to/free-search-mcp", "run", "search-mcp"]
}
}
}Claude Desktopμ μ¬μμνμΈμ. μμ 7κ°μ§ λκ΅¬κ° λꡬ μλμ λνλ©λλ€.
λ€λ₯Έ ν΄λΌμ΄μΈνΈμ μ°κ²°
μ΄ μλ²λ stdioλ₯Ό ν΅ν΄ νμ€ MCPλ₯Ό μ¬μ©ν©λλ€. MCPλ₯Ό μ§μνλ λͺ¨λ ν΄λΌμ΄μΈνΈμμ μλν©λλ€:
Claude Code (
claude mcp add search uv --directory /β¦/free-search-mcp run search-mcp)Cursor / Continue / Cline (μμ JSON μ€λν« μ¬μ©)
곡μ MCP SDKλ₯Ό μ¬μ©νλ 컀μ€ν Python / TypeScript ν΄λΌμ΄μΈνΈ
μ€μ
λͺ¨λ μ€μ μ SEARCH_MCP_ μ λμ¬κ° λΆμ νκ²½ λ³μλ‘ μ¬μ μν μ μμ΅λλ€:
λ³μ | κΈ°λ³Έκ° | μλ―Έ |
|
| JSON λͺ©λ‘ |
|
| |
|
| μμ§λΉ |
|
| 곡μ |
|
| |
|
| 7μΌ |
|
|
|
|
| |
|
| λμ νμ΄μ§ |
|
| κ²°κ³ΌλΉ μλ¦Ό |
μν€ν μ²
βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β FastMCP server (stdio) β
β tools: search / research / fetch / fetch_batch / β
β read_doc / cache_search / engines β
ββββββββββββββ¬βββββββββββββββββββββββββββββββββββββββββ
β
ββββββββββββββΌβββββββββββββ ββββββββββββββββββββββββββ
β aggregator β β fetcher β
β - parallel engines β β - httpx fast path β
β - reciprocal rank β β - playwright fallback β
β fusion β β - markdownify β
β - search cache (FTS5) β β - page cache (FTS5) β
ββββββ¬βββββββββββββββββββββ ββββββββββββββ¬ββββββββββββ
β β
ββββββΌββββββββββββββββββ ββββββββββββββββΌββββββββββββββ
β engines/ β β browser pool β
β duckduckgo.py β β - persistent context β
β mojeek.py β β - stealth init script β
β startpage.py β β - shared cookies β
β brave.py (opt) β β - semaphore-bounded pagesβ
β bing.py (opt) β ββββββββββββββββββββββββββββββ
β baidu.py (opt) β
ββββββββββββββββββββββββ
ββββββββββββββββββββββββββββββ ββββββββββββββββββββ
β documents/ β β ratelimit β
β pypdf, python-docx, β β token bucket β
β markdownify β β per engine β
ββββββββββββββββββββββββββββββ ββββββββββββββββββββ
ββββββββββββββββββββββββββββββ ββββββββββββββββββββ
β formatting β β research β
β token estimate β β composed β
β smart truncation β β workflow β
β markdown renderers β β β
ββββββββββββββββββββββββββββββ ββββββββββββββββββββμμ§ μ΄λν° ν¨ν΄
src/search_mcp/engines/μ κ° μμ§μ λ€μμ ꡬνν©λλ€:
class Engine:
name: str
needs_browser: bool # Force Playwright?
wait_selector: str | None # CSS to wait for in browser mode
def build_url(self, query: str, max_results: int) -> str: ...
def parse(self, html: str) -> list[SearchResult]: ...κΈ°λ³Έ ν΄λμ€λ μ μ‘(httpx β Playwright ν΄λ°±), μλ μ ν, κ·Έλ¦¬κ³ HTTPκ° κ²°κ³Ό λμ μΊ‘μ°¨ μ Έμ λ°ννλ κ²½μ°(λΈλΌμ°μ λ₯Ό ν΅ν μλ μ¬μλ)λ₯Ό μ²λ¦¬ν©λλ€.
ν¬λ λ§
μ΄ νλ‘μ νΈλ λ€μ νλ‘μ νΈλ€μ λμμ λ°μμ΅λλ€:
mrkrsl/web-search-mcpβ μ€λ§νΈν httpx-then-Playwright κ°μ Έμ€κΈ° μ λ΅, λ€μ€ μμ§ ν΄λ°± 체μΈAas-ee/open-webSearchβ λ€μ€ μμ§ λ²μ(Bing/DDG/Baidu/Brave/Startpage)VincentKaufmann/noapi-google-search-mcpβ νμ§ λ°©μ§ ν¨ν΄(navigator.webdriver, UA, μΏ ν€), SQLite FTS5 μΊμ μμ΄λμ΄, λ€μ€ νμread_documentnickclyde/duckduckgo-mcp-serverβ μμ§λ³ μλ μ ν, LLM μΉνμ μΈ μ½ν μΈ μ 리Mojeek β User-Agentλ₯Ό μ°¨λ¨νμ§ μλ λ 립μ μΈ κ²μ μΈλ±μ€
λΌμ΄μ μ€
MIT β LICENSEλ₯Ό μ°Έμ‘°νμΈμ.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Appeared in Searches
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/sweetcornna/free-search-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server
