방법 1: MCP 서버로 만들기 (Claude Code용)

내가 만든 검색 서버를 MCP(Model Context Protocol, 클로드가 외부 도구/데이터에 접근할 때 쓰는 표준 프로토콜) 서버로 래핑하면, Claude Code가 직접 검색 요청을 보낼 수 있다.

# FastAPI로 MCP 서버 만들기
from fastapi import FastAPI
 
app = FastAPI()
 
@app.post("/search")
async def search(query: str):
    # 벡터 검색 실행: pgvector에서
    vector_results = await vector_db.search(query)
    # 그래프 탐색 실행: Neo4j에서
    graph_results = await neo4j.cypher(query)
    # 두 결과 합쳐서 반환
    return {"results": vector_results + graph_results}

Claude Code한테는 이렇게 지시하면 된다.

"http://my-server.com/search 에서 검색해서 답해라"

예외: Claude.ai MCP 연결

Claude.ai 한정으로, MCP 서버를 등록하면 웹에서도 쓸 수 있다.

Claude.ai 설정 → Integrations → MCP 서버 주소 등록
→ 이후 대화에서 Claude가 자동으로 서버 호출 가능

즉 Claude Code(로컬 CLI)뿐 아니라 Claude.ai(웹)에서도 같은 서버를 재활용할 수 있다.


방법 2: LLM API (GPT, Claude API 등)

Tool Use / Function Calling 방식

LLM한테 툴을 등록해두면 알아서 검색 요청을 보낸다. OpenAI는 Function Calling, Anthropic은 Tool Use로 부른다. 이름만 다르고 동작은 같다.

tools = [
    {
        "name": "search_knowledge_base",
        "description": "그래프DB와 벡터DB에서 검색한다",
        "parameters": {
            "query": {"type": "string"}
        },
        # 이 엔드포인트로 호출
        "url": "http://my-server.com/search"
    }
]

흐름: LLM이 질문을 받으면 → 툴 호출이 필요한지 판단 → 서버에 검색 요청 → 결과를 받아서 → 최종 답변 생성.


현실적인 구조

사용자 질문
    ↓
SaaS LLM (Claude/GPT)
    ↓ tool call
내 검색 서버 (FastAPI)
    ↓         ↓
Neo4j      pgvector
(그래프)    (벡터)
    ↓         ↓
    결과 합쳐서 LLM에 반환
    ↓
최종 답변

이게 사실상 직접 만든 RAG 서버를 LLM의 외부 툴로 붙이는 패턴이고, 제일 범용적인 방법이다.

환경자연스러운 연결 방식
Claude CodeMCP 서버
Claude.ai 웹MCP Integration
GPT API / Claude APIFunction Calling / Tool Use

한마디 요약

RAG DB를 외부 LLM에 붙이는 방법은 두 갈래: Claude 계열은 MCP, 범용 API는 Function Calling. 둘 다 내부적으로는 “HTTP로 검색 엔드포인트 호출”이라는 같은 구조다.