빠른 답변
Claude Code나 Claude Desktop에 웹 검색 MCP 서버를 어떻게 추가하나요?
이 페이지의 짧은 Python 서버를 저장하세요. 이 서버는 LLMWebSearch를 호출하는 search_web와 read_urls 도구를 제공합니다. 그런 다음 claude mcp add로 또는 claude_desktop_config.json에서 등록하고, 키는 env에 둡니다. 그러면 모델이 실시간 웹을 검색하고 상위 페이지를 Markdown으로 읽을 수 있습니다. 검색 한 번에 1 크레딧이며, 2026년 10월 기준 US$1.20/1K 검색부터 시작합니다. KYC 없이; 암호화폐로 결제하세요.
MCP 서버 한눈에 보기
| 언어 | Python 3.10+, mcp 및 httpx 패키지 사용 |
|---|---|
| 전송 | stdio: 클라이언트가 서버를 로컬 프로세스로 시작 |
| 도구 1 | search_web(query, max_results=5, read=3) → URL과 페이지 텍스트가 있는 번호 매긴 소스 |
| 도구 2 | read_urls(urls) → 알려진 페이지 1~20개의 본문 |
| 이름 | web_search 또는 web_fetch 아님: Claude Code와 OpenClaw에는 이미 그 이름의 도구가 포함되어 있음 |
| 키 | 서버 환경의 LLMWEBSEARCH_API_KEY에서 읽기 |
| 과금 | 크레딧 1개로 검색 1회를 이용할 수 있습니다. 최대 20개의 순위 결과를 받고, 상위 3개 페이지의 본문을 읽어 Markdown으로 반환합니다. 4~10개 페이지를 읽으면 크레딧 2개가 됩니다. 오류로 끝난 호출에는 비용이 청구되지 않습니다. 이미 URL을 알고 있는 페이지를 읽는 경우, 콘텐츠와 함께 반환되는 3개 페이지 단위로 크레딧 1개가 청구되며, 호출당 최대 20개 URL까지 가능합니다. 거부되거나 실패한 URL은 집계되지 않습니다 |
도구 이름이 search_web과 read_urls인 이유는 무엇인가요?
이름이 같은 도구 두 개는 클라이언트와 모델을 혼란스럽게 하기 때문입니다. Claude Code와 OpenClaw에는 각각 web_search과 web_fetch이라는 내장 도구가 있습니다. 이름이 다르고 설명이 명확하면 모델이 의도적으로 우리 도구를 선택하고, 로그에서 호출을 구분할 수 있습니다.
두 도구 모두 원시 JSON이 아닌 텍스트를 반환합니다. 각 소스는 번호, 제목, URL로 시작하므로 모델이 [1] 또는 [2]을 인용하고 독자가 페이지를 확인할 수 있습니다.
import os
import httpx
from mcp.server.fastmcp import FastMCP
BASE = "https://llmwebsearch.com/api/v1"
HEADERS = {"Authorization": "Bearer " + os.environ["LLMWEBSEARCH_API_KEY"]}
mcp = FastMCP("llmwebsearch")
def _call(path: str, body: dict) -> dict:
resp = httpx.post(BASE + path, json=body, headers=HEADERS, timeout=90)
data = resp.json()
if resp.status_code != 200:
err = data.get("error", {})
raise RuntimeError(err.get("code", str(resp.status_code)) + ": " + err.get("message", ""))
return data
def _page(n: int, item: dict) -> str:
head = f"[{n}] {item.get('title') or item['url']}\n{item['url']}\n"
if item.get("content_status") == "ok":
return head + item["content"]
return head + "(not read: " + item.get("content_status", "unknown") + ") " + item.get("snippet", "")
@mcp.tool()
def search_web(query: str, max_results: int = 5, read: int = 3) -> str:
"""Search the live web and return numbered sources; the first `read` pages include their text.
Use it for current facts, documentation and news. Cite sources by their number.
"""
body = {"q": query, "max_results": max(1, min(max_results, 20)), "read": max(0, min(read, 10)), "max_chars": 5000}
data = _call("/search", body)
return "\n\n".join(_page(i, r) for i, r in enumerate(data["results"], start=1))
@mcp.tool()
def read_urls(urls: list[str]) -> str:
"""Read 1 to 20 public web pages whose URLs you already have and return their main text."""
data = _call("/extract", {"urls": urls[:20], "max_chars": 12000})
return "\n\n".join(_page(i, r) for i, r in enumerate(data["results"], start=1))
if __name__ == "__main__":
mcp.run()
서버를 어떻게 설치하고 테스트하나요?
가상 환경을 만들고 mcp과 httpx을 설치한 뒤 위 파일을 저장하세요. mcp는 Model Context Protocol의 공식 Python SDK입니다. 이 SDK의 FastMCP 클래스는 타입이 지정된 Python 함수를 도구로 바꾸고 각 docstring을 도구 설명으로 사용합니다.
키를 설정한 상태에서 터미널에서 파일을 한 번 시작하세요. 그러면 표준 입력에서 클라이언트를 조용히 기다리며, 이는 정상 동작입니다. Ctrl+C로 중지하세요. API 오류는 해당 코드와 함께 도구 오류로 발생하므로 모델이 rate_limited 또는 insufficient_credits을 평문으로 봅니다.
python -m venv .venv
. .venv/bin/activate
pip install "mcp[cli]" httpx
LLMWEBSEARCH_API_KEY="your-key" python llmwebsearch_mcp.pyClaude Code에 어떻게 추가하나요?
claude mcp add을 사용하세요. Claude Code 문서는 claude mcp add [options] <name> -- <command> [args...] 형식을 제시합니다. 자체 옵션이 먼저 오고, 그다음 더블 대시, 그다음 서버를 시작하는 명령이 옵니다. 환경 변수는 --env KEY=value에 넣고, --transport stdio 같은 옵션이 최소 하나 이상 --env와 서버 이름 사이에 있어야 합니다.
모든 프로젝트에서 서버를 사용하려면 --scope user를 추가하세요. 기본 스코프인 local은 현재 프로젝트만 포함합니다. 가상 환경의 Python과 서버 파일에는 절대 경로를 사용하세요.
claude mcp add --env LLMWEBSEARCH_API_KEY=your-key --transport stdio --scope user llmwebsearch \
-- /home/you/llmwebsearch/.venv/bin/python /home/you/llmwebsearch/llmwebsearch_mcp.pyClaude Desktop과 다른 클라이언트에는 어떻게 추가하나요?
Claude Desktop은 claude_desktop_config.json의 mcpServers에서 서버를 읽습니다. 서버에 이름, 명령, 인수, 그리고 키를 담은 env 객체를 지정한 뒤 앱을 재시작하면 search_web과 read_urls가 도구 목록에 나타납니다.
Cursor 같은 다른 MCP 클라이언트도 자체 MCP 설정에서 같은 세 가지를 요구합니다. 명령, 인수, 환경 변수입니다. 키는 도구 인수나 대화에 절대 나타나지 않습니다.
{
"mcpServers": {
"llmwebsearch": {
"command": "/home/you/llmwebsearch/.venv/bin/python",
"args": ["/home/you/llmwebsearch/llmwebsearch_mcp.py"],
"env": { "LLMWEBSEARCH_API_KEY": "your-key" }
}
}
}검색을 저렴하고 짧게 유지하려면 어떻게 하나요?
지침에서 모델에게 검색 방법을 알려주세요. 질문당 검색은 한두 번으로 하고, 출처가 서로 다를 때만 더 읽도록 하세요. 서버는 이미 search_web에서 페이지당 5,000자, read_urls에서 12,000자로 제한합니다. 작은 모델에는 이 숫자를 낮추세요.
read이 3 이하인 search_web 호출 한 번이 크레딧 1개입니다. 하루에 40번 검색하는 어시스턴트는 한 달에 약 1,200 크레딧을 쓰므로 검색 5,000회(US$9.25)은 약 4개월간 유지됩니다. 검색 크레딧에는 만료일이 없습니다. 이번 달에 사용하지 않은 크레딧은 내년에도 그대로 남아 있습니다.
페이지를 읽을 수 없을 때 모델은 무엇을 보나요?
출처는 번호, 제목, URL과 함께 여전히 나타나고, 그 뒤에 괄호 안의 이유와 검색 스니펫이 붙습니다. 저희 리더는 robots.txt를 준수합니다. 자신을 LLMWebSearch로 소개하고, 사이트가 리더를 위해 또는 모든 로봇을 위해 작성한 규칙을 따르며, 읽기가 허용되지 않은 페이지의 콘텐츠는 제외합니다. 사이트가 저희 리더를 거부하면, 결과는 콘텐츠 없이 해당 사이트의 상태와 함께 반환됩니다. 저희는 CAPTCHA를 풀거나 계정에 로그인하거나 차단 또는 페이월을 우회하지 않습니다. 그러면 모델은 다른 출처에 의존하거나 해당 페이지를 이용할 수 없었다고 말할 수 있습니다.
MCP 서버: 자주 묻는 질문
공식 LLMWebSearch MCP 패키지나 호스팅 endpoint가 있나요?
아니요. 이 페이지의 파일이 곧 통합입니다. 읽고 수정할 수 있는 약 50줄입니다. 이 파일은 여러분의 머신에서 실행되며, 키는 우리 API로만 전송됩니다.
Claude Code의 내장 웹 검색을 꺼야 하나요?
그럴 필요 없습니다. 둘 다 그대로 둘 수 있고, 설명이 각각 무엇을 하는지 모델에게 알려줍니다. 결과에 페이지 텍스트가 필요하거나, 검색당 고정 가격이 필요하거나, 검색 로그를 한 곳에 모으고 싶을 때 우리 것을 유지하세요.
OpenClaw와 함께 쓸 수 있나요?
네, openclaw mcp add로 등록한 MCP 서버로 쓸 수 있습니다. OpenClaw 페이지에 명령이 있고, OpenClaw의 내장 검색 공급자 옆에서 어떻게 동작하는지 설명합니다.
서버가 내 검색을 보관하나요?
아니요. 호출 사이에 아무것도 보관하지 않습니다. 우리 쪽에서는 저희는 귀하의 검색 쿼리나 API가 반환하는 내용으로 어떤 모델도 학습시키지 않으며, 결과 저장을 금지하는 자체 규칙도 두지 않습니다. 다만 귀하가 읽는 페이지의 사이트 권리는 여전히 적용됩니다.
출처 (1)
- MCP를 통해 Claude Code를 도구에 연결하기 — Claude Code docs (read 2026-10-22)