keyless-web-search-mcp
keyless-web-search-mcp
독립형 MCP stdio 서버: 키 없이 사용 가능한 두 가지 도구 — 자체 운영 엔진 풀(Bing, 360, Baidu, Google, Naver, Yandex, DuckDuckGo)을 통한 web_search와 web_fetch(익명 HTTP(S) 페이지 리더). 각 검색은 최대 두 개의 사용 가능한 엔진을 유지하며, 쿼리 언어에 따라 기본 우선순위를 라우팅하고, 제한된 시도 예산 내에서 실패하거나 관련성 없는 엔진을 백필하며, 관련성 순위를 매기고 결과를 병합한 뒤 표준 URL 기준으로 중복을 제거합니다. 자체 포함 디렉터리, 빌드 단계 없음, 하네스 패키지 시스템에 속하지 않음 — 어디로든 이동 가능합니다.
존재 이유
하네스의 내장 web_search(DeepSeek 제공자)는 DEEPSEEK_API_KEY가 필요하며 모든 쿼리를 DeepSeek 클라우드로 전송합니다. 이 서버는 로컬 모델 친화적인 대안입니다: 키 없음, 벤더 검색 API 없음, 중국 본토 및 홍콩 네트워크에서 작동(중국 본토 회선에서는 Bing/360/Baidu, 테스트된 홍콩 회선에서는 Bing/360/Naver/Yandex; DuckDuckGo는 어느 회선에서도 접근 불가).
web_fetch는 읽기 측면에서 같은 이유로 존재합니다: 웹 프로필은 검색 제공자를 마운트하지만 fetch 제공자는 마운트하지 않으므로, 내장 web_fetch 도구(프리셋이 활성화하더라도)는 모든 호출에서 WEB_PROVIDER_UNAVAILABLE로 실패합니다. 이 도구는 동일한 키 없는 서버를 통해 전체 페이지 콘텐츠를 읽습니다.
Related MCP server: Heventure Search MCP
실행
npm install --cache ./.npm-cache # deps: @modelcontextprotocol/sdk, zod
node index.js # speaks MCP over stdio
npm test # run deterministic ranking/fallback tests클라이언트 없이 빠른 프로브:
printf '%s\n' \
'{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"probe","version":"0.0.1"}}}' \
'{"jsonrpc":"2.0","method":"notifications/initialized"}' \
'{"jsonrpc":"2.0","id":2,"method":"tools/list"}' \
| node index.jsClaude Code에 설치
현재 사용자용으로 설치하여 모든 Claude Code 프로젝트에서 사용할 수 있게 합니다. 서버 등록 시 두 경로를 모두 확인합니다. 이렇게 하면 나중에 셸의 작업 디렉터리나 PATH에 의존하지 않습니다:
claude mcp add --transport stdio --scope user web-search-self -- "$(command -v node)" "/absolute/path/to/keyless-web-search-mcp/index.js"
claude mcp get web-search-self현재 프로젝트에만 비공개로 유지하려면 --scope local을, 공유 가능한 .mcp.json을 작성하려면 --scope project를 사용하세요. Claude Code는 사용자/로컬 등록을 ~/.claude.json에 저장합니다. MCP 서버 정의는 settings.json에 속하지 않습니다.
등록 후 claude mcp list는 web-search-self가 연결된 것으로 보고해야 합니다. 도구는 mcp__web-search-self__web_search 및 mcp__web-search-self__web_fetch로 나타납니다.
도구
web_search
web_search({ query, count?, maxSources?, engines? })
매개변수 | 기본값 | 의미 |
| — | 모든 언어의 검색 쿼리 |
|
| 최대 병합 결과 수 (1–20) |
|
| 검색당 최대 사용 가능 엔진 수 (하드 상한 2; 폴백 시도는 제한됨) |
| 쿼리 언어에 따라 다름 | 선택적 명시적 풀, 우선순위 순서; 생략 시 중국어/한국어/일본어/러시아어 쿼리는 지역에 적합한 우선순위 사용 |
두 소스 정책. engines가 생략되면 풀은 쿼리 언어로 라우팅됩니다: 중국어는 360/Baidu/Bing으로 시작; 영어는 Bing/Google/Naver/360으로 시작하여 테스트된 본토/홍콩 네트워크에서 4회 시도 예산이 작동 가능한 폴백을 유지합니다. 명시적 engines 목록은 여전히 우선합니다. 후보는 제한된 병렬 라운드로 실행됩니다. 엔진은 보수적인 어휘 관련성 필터를 통과하는 파싱 가능한 결과를 반환한 후에만 소스 슬롯을 소비합니다. 실패, 차단, 빈 결과, 또는 관련성 없는 엔진은 시도 및 수집 예산까지 백필되며 진단은 "Engine note" 줄에 표시됩니다. 결과는 쿼리 중복도와 소규모 소스 품질 조정으로 순위가 매겨집니다: 명백한 리포스트/콘텐츠 팜 신호는 페널티를 받고, 공식/문서/교육/GitHub 신호는 일반 사이트를 하드 차단하지 않으면서 우대됩니다. 병합은 라운드로빈 인터리브(엔진 A의 1번째, 엔진 B의 1번째, A의 2번째, …)를 유지하며, 표준 URL 중복 제거는 프래그먼트, 일반적인 추적 매개변수, 안전한 www. 차이를 제거합니다.
결과: 번호가 매겨진 title [engine] / 실제 대상 URL / 스니펫 목록. 엔진별 링크 정리: Bing 클릭 추적 링크는 로컬에서 디코딩(base64 u 매개변수); 360은 data-mdurl 속성 읽기; Baidu는 블록의 mu 속성 읽기(직접 URL, 레거시 link?url= 래퍼에만 최선의 리다이렉트 GET 1회); Naver와 Yandex 제목은 앵커에 직접 URL 포함; Google /url?q= 래퍼는 언랩; DuckDuckGo /l/?uddg= 추적기는 언랩. 엔진별 프로브 예산: 10초(Bing, Baidu), 8초(360, Naver, Yandex), 5초(Google, DuckDuckGo) — 모두 병렬 실행되므로 라운드는 가장 느린 구성원만큼만 느립니다.
web_fetch
web_fetch({ url, maxChars? })
매개변수 | 기본값 | 의미 |
| — | 절대 |
|
| 반환되는 최대 콘텐츠 문자 수 (1000–100000) |
익명 공개 웹 읽기, 자격 증명 없음: 브라우저 User-Agent, 최대 5회 리다이렉트, 헤더와 본문을 포함한 20초 벽시계, 응답 본문은 정확히 5MB에서 절단. 모든 초기 및 리다이렉트 대상은 DNS 확인 후 검사됩니다. 루프백, 사설, 링크-로컬, 통신사급 NAT, 예약, 멀티캐스트, 로컬 호스트 이름은 머신이나 클라우드 메타데이터 서비스로의 SSRF를 방지하기 위해 거부됩니다. HTML은 표시 텍스트로 축소됩니다(script/style/noscript/svg/head/iframe/canvas/form 제거, 블록 경계는 줄바꿈이 되고, <title>은 헤더에 포함). 텍스트, JSON, XML 미디어 유형은 선언된 문자셋을 사용하여 엔티티 디코딩되어 통과하며, 바이너리 미디어 유형은 거부됩니다. 출력은 상태 헤더 — status, 최종 url(리다이렉트 후), content-type, 절단 여부 — 다음에 콘텐츠가 옵니다. 2xx가 아닌 응답은 본문 앞부분과 메모(403/429는 봇 체크 또는 페이월로 읽음)를 반환하며, 조작된 페이지는 절대 반환하지 않습니다.
엔진 및 상태
2026-07에 세 회선(이전 중국 본토 회선, 상하이 텔레콤 회선, 홍콩 Zenlayer 데이터센터 회선)에서 검증됨:
엔진 | 엔드포인트 | 이러한 네트워크에서의 상태 |
|
| ✅ 양쪽 라인에서 ~10개의 유기적 블록. 라인에 따라 |
|
| ✅ 깨끗한 200; 유기적 블록은 |
|
| 도달 가능(200)하지만 이 클라이언트/IP는 일반 HTML SERP에 대해 신뢰되지 않음: 본문은 유기적 결과가 전혀 없는 no-JS |
|
| ✅ 상하이 및 홍콩 라인에서: 리스크 컨트롤이 스크립트 형태의 요청을 차단함(쿠키와 무관하게 UA만 있는 302로 |
|
| ✅ 홍콩 라인에서 (200, ~10개의 |
의도적으로 풀에 포함하지 않음: Sogou — sogou.com/antispider/로 302 리다이렉트되며, Baidu가 다루는 것과 동일한 IP 벽 클래스. 또한 홍콩 라인에서 스캔 후 제외됨: Mojeek(캡차 페이지 제공), Ecosia(403 "Ecosia Firewall"), MetaGer(비결과 페이지로 리다이렉트), 그리고 Yahoo/Brave/Qwant/goo.ne.jp(본토 및 홍콩 라인 모두에서 TCP 연결 불가).
Google 벽: 시도된 것들
이 IP에 대한 200 응답은 차단이 아니라 JS 챌린지 인터스티셜(약 90KB의 난독화/암호화된 JavaScript; no-JS 경로는 메타 리프레시로 막다른 길로 이어짐)입니다. 이 벽은 두 개의 레이어로 구성됩니다:
JS 챌린지(계산적) — 페이지 스크립트를 일반 Node.js에서
navigator,Image,document등의 경량 DOM 스텁과 함께 실행하여 풀 수 있음. 계산된 증명 값이SG_SS쿠키를 설정하고 다시 로드함. 이 레이어는 Node.js로 해결 가능하며, 결과SG_SS쿠키가 유효함이 입증됨.행동/패턴 레이어 —
NID/AEC쿠키가 설정된 이후에도, 이 IP의 후속 일반 HTTP 요청은/sorry/429 이상 징후 벽으로 리다이렉트됨. 이 레이어는 TLS 핑거프린트, HTTP/2 우선순위, 요청 간격, 쿠키 병합 순서 등 브라우저와 일치하지 않는 신호를 평가함. 경량 DOM 셰임으로 이 레이어를 통과하는 것은 시도되지 않았음(헤드리스 브라우저 수준의 핑거프린트가 필요하며, 이는 인프라 범위를 벗어남).
시도했지만 레이어 1의 응답을 바꾸지 못한 클라이언트 측 레버: gbv=1 매개변수, 쿠키 워밍업, 전체 브라우저 지문 헤더, enablejs 재시도 흐름, /m 진입점, 텍스트 브라우저/피처폰/IE6/구형 Android UA, 스푸핑된 Googlebot UA(Google이 검증함), CONSENT 쿠키, POST 제출(405), 대체 TLD, 그리고 쿠키 없는 emsg=SG_REL "여기를 클릭" 링크. Google 프록시 대안도 이 네트워크에서 연결 불가능하거나 차단됨: Startpage와 Qwant는 타임아웃, Mojeek은 캡차 페이지 제공, Ecosia는 403.
결론: 레이어 1은 Node로 해결 가능(입증됨); 레이어 2는 비브라우저 네트워크 스택에서는 해결 불가. 이 머신에서 Google에 도달하는 유일한 신뢰할 수 있는 경로는 깨끗한 IP 프록시 또는 실제 브라우저 컨텍스트(헤드리스 Chromium)뿐입니다; 둘 다 스크래퍼가 정직하게 우회할 수 없는 동일한 IP/트래픽 패턴 레이어에 있으며, 반복적인 프로빙은 IP의 이상 징후 창을 연장할 위험이 있습니다 — 따라서 이 서버는 이를 시도하지 않습니다. Google은 일반 HTML SERP를 제공할 네트워크에서 활성화되는 백필 엔진으로 유지됩니다.
하네스에 마운트
cordis.yml에 추가하세요(MCP 브리지가 이 항목을 핫 리로드함):
- id: mcp-search
name: '@deepseek-ai/dsh-mcp-client'
config:
serverName: search
transport: stdio
command: node
args: ['/absolute/path/to/keyless-web-search-mcp/index.js']그러면 모델은 도구를 mcp__search__web_search 및 mcp__search__web_fetch로 볼 수 있습니다.
제한 사항
검색 품질은 휴리스틱입니다: 어휘 일치가 명백한 오프 토픽 결과와 중국어 n-그램을 처리합니다. 내부 검색 엔진 페이지는 제외됩니다. 콘텐츠 팜/재게시 신호는 조정에만 사용되며 보편적 신뢰 판단은 아닙니다. 관련 결과가 해당 주장의 정확성을 증명하지는 않습니다 — 중요한 사실은 가져와서 교차 확인하세요.
스크래핑이지 API가 아님: 레이아웃 변경으로 파서가 깨질 수 있습니다. 실패는 명시적이며("유기적 결과 없음"), 절대 조작되지 않습니다. Google 및 DuckDuckGo 파서는 문서화된 SERP 구조를 기반으로 작성되었으며 실제 환경에서 검증되지 않았습니다 — 해당 엔진이 실제로 응답하기 시작하면 처음으로 튜닝하세요.
쿼리가 Mu닌을 떠남: 검색어는 상담되는 엔진으로 전송됩니다(키 없는 검색의 대가). 두 소스 상한 덕분에 검색당 최대 두 개의 엔진만 쿼리를 받습니다.
Fetch는 키 없는 공개 페이지 클라이언트이지 브라우저나 인트라넷 클라이언트가 아님: JS 렌더링 콘텐츠는 보이지 않습니다(검색 파서와 동일한 한계 클래스); 익명 클라이언트를 403 처리하는 페이지는 보고되며 우회되지 않습니다. 리다이렉트 대상 포함 로컬/사설/예약 주소는 의도적으로 차단됩니다.
하네스에 통합
cordis.yml에 추가 (플러그인은 이 항목을 핫 리로드함):
- id: mcp-search
name: '@deepseek-ai/dsh-mcp-client'
config:
serverName: search
transport: stdio
command: node
args: ['/absolute/path/to/keyless-web-search-mcp/index.js']한계
Google은 이 시스템에서 벽 뒤에 있습니다. 결과는 병합되지 않으며, 모든 쿼리는 일반 목록에 Google 자리 표시자를 표시합니다. (유일한 신뢰할 수 있는 우회는 깨끗한 IP 프록시 또는 브라우저 컨텍스트이며, 앞서 논의된 대로 반복적인 확장 문제가 있습니다 — 동작을 변경하려면
SEARXNG_BASE_URL을 프로비저닝된 SearXNG 인스턴스로 설정하십시오.)Baidu는 유기적 결과에만 사용되며 추천/관련 블록은 건너뜁니다(광고 슬롯과 동일한 컨테이너 클래스를 공유하기 때문).
대부분의 엔진에서 컬렉션 트리거(예: Baidu의
Tieba/Zhidao통합)는 포함되지 않습니다.wwwBing의 SERP는cn.bing.com으로 302되므로 탐색이 더 느립니다;bing엔진은 해당 리다이렉트를 따르지만 위의 오류율은 지역 전용 엔드포인트를 사용하여 수집되었습니다.각 공개 엔진의 전송 매개변수는 사전 조정되었으며 엔진별로 하드코딩되어 있습니다.
DeepSeek 하니스에 통합
cordis.yml에 추가하세요 (MCP 브리지가 이 항목을 핫 리로드함):
- id: mcp-search
name: '@deepseek-ai/dsh-mcp-client'
config:
serverName: search
transport: stdio
command: node
args: ['/absolute/path/to/keyless-web-search-mcp/index.js']그러면 모델은 도구를 mcp__search__web_search 및 mcp__search__web_fetch로 볼 수 있습니다.
제한 사항
검색 품질은 휴리스틱입니다: 관련성은 오프토픽 결과와 중국어 n-그램을 필터링합니다. 콘텐츠 팜/리포스트 신호는 순위에만 반영되며 절대적인 신뢰 판단은 아닙니다. 스니펫은 신뢰할 수 없습니다 — 중요한 사실은 가져와서 교차 검증하십시오.
API가 아닌 스크래핑: 레이아웃 변경으로 파서가 깨질 수 있습니다. 실패는 명시적입니다("파싱 가능한 유기적 결과 없음"). 사전에 정의된 엔진 설정만 사용하세요. DuckDuckGo 파서는 라이브 네트워크에서 검증되지 않았습니다.
쿼리는 Murad을 떠납니다 — 키 없는 검색은 공개 엔진 인스턴스의 재량에 따라 타사 서버로 전송됩니다. 두 엔진 모두 특별한 키가 필요하지 않습니다. 검색당 하나의 엔진만 사용되므로 결과가 단일 공급자에 따라 달라질 수 있습니다.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Tools
Related MCP Servers
- FlicenseNot gradedqualityCmaintenanceEnables web search across multiple search engines (DuckDuckGo, Bing, Startpage) with parallel execution and result deduplication. Also provides web page content extraction capabilities.2
- AlicenseAqualityCmaintenanceEnables web search without API keys using DuckDuckGo and Bing search engines, and retrieves webpage content. Supports multiple search engines simultaneously with privacy protection and asynchronous processing.27MIT
- AlicenseAqualityAmaintenanceWeb search (embedded SearXNG), content extraction, and library docs indexing with hybrid search. No API keys required.616Apache 2.0
- FlicenseNot gradedqualityCmaintenanceProvides free web search, content fetching, image search, and deep research via SearXNG, no API keys required.
Related MCP Connectors
LLM-ready web search + instant answers + URL-to-clean-text fetch for agents and RAG.
Web search for AI agents — one tool across 6 engines, routed to the cheapest + cached.
Multi-engine search for AI agents. Trust scoring, local corpus, MCP-native. Self-hostable, BYOK.
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/dollarser/keyless-web-search-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server