저번 포스팅에서 MCP 서버를 구축하고 Stable Diffusion 이미지 생성을 연동했다.
이번엔 MCP 서버에 웹 검색 툴을 추가했다.
기존 서버엔 generate_image 툴만 있었다. 여기에 "웹 검색" 기능을 툴로 추가하면,
MCP 클라이언트(Claude 등)가 필요할 때 웹 검색을 직접 호출할 수 있다.
클라이언트: "QUIC P2P 최신 동향 알려줘"
↓
web_search 툴 호출
↓
Tavily API → 웹 검색
↓
결과 반환
웹 검색 API다.
Brave Search API가 원래 무료 플랜이 있었는데 2026년 2월에 없어졌다.
Tavily는 월 1,000건 무료에 카드 등록도 필요 없어서 선택했다.
pip install tavily-python python-dotenv
.env 에 API 키 추가:
TAVILY_API_KEY=발급받은_키
기존 코드에 web_search 툴을 추가했다.
@mcp.tool()
def web_search(query: str) -> str:
"""웹에서 최신 정보를 검색합니다"""
print(f"웹 검색 중: {query}")
client = TavilyClient(api_key=os.getenv("TAVILY_API_KEY"))
response = client.search(query, max_results=5)
results = response.get("results", [])
if not results:
return "검색 결과가 없습니다."
output = []
for i, r in enumerate(results, 1):
output.append(f"{i}. {r['title']}\n {r['url']}\n {r.get('content', '')[:200]}")
return "\n\n".join(output)
저번 글에서 만든 generate_image랑 구조가 똑같다. @mcp.tool() 데코레이터만 붙이면 툴로 등록된다.

SD 모델 하나가 5GB 가까이 된다.
C 드라이브가 꽉 차서 모델 로딩 중에 서버가 죽었다.
.env에 캐시 경로를 D 드라이브로 변경했다.
HF_HOME=D:\huggingface_cache
HF_HOME 설정은 반드시 diffusers import 전에 해야 한다.
import 시점에 캐시 경로를 읽기 때문
from dotenv import load_dotenv
load_dotenv()
import os
os.environ["HF_HOME"] = os.getenv("HF_HOME", "D:\\huggingface_cache")
# 이 아래에 diffusers import
from diffusers import StableDiffusionPipeline