Search MCP
AI Assistant OpenSearch Integration
웹에이전시 거인소프트가 제작한 한화로보틱스 홈페이지 프로젝트입니다.
"한화로보틱스"의 기업 브랜드 아이덴티티를 반영한 반응형 웹사이트로 제작되었으며
제품 정보 전달과 글로벌 기업 이미지를 강화하는 UI 구조로 설계되었습니다.
Search MCP Server (자체개발)
Agent가 OpenSearch를 도구로 사용할 수 있게 하는 MCP 표준 서버
- Python 3.10+
- FastMCP
- OpenSearch
- MCP Protocol
- stdio / Streamable HTTP
- Tools / Resources / Prompts
-
ProjectSearch MCP Server
-
Release Date2026.03
-
TypeMCP Server / Developer Tool
-
RoleBackend Development
- 분류
- MCP Server / Developer Tool
- 기술스택
- Python 3.10+, FastMCP, OpenSearch, MCP Protocol, stdio, Streamable HTTP
- GitHub
- https://github.com/joodb
- 담당업무
- MCP Server 설계/개발, Transport 구현, OpenSearch 연동, 테스트
- 주요기능
- MCP Tools/Resources/Prompts, OpenSearch 검색 연동, Dual Transport (stdio + Streamable HTTP)
- 컨셉
- AI Assistant OpenSearch Integration via MCP
- 특징
- MCP Primitives (Tools, Resources, Prompts), Dual Transport, Context Window 관리
- 제작기간
- 약 2주
Problem
& Why MCP
AI 어시스턴트(Claude, Cursor 등)는 코드 작성에는 뛰어나지만, OpenSearch에 쌓인 사내 업무 데이터를 직접 검색할 수 없었습니다. 개발자가 매번 수동으로 쿼리를 작성하고 결과를 복사·붙여넣기해야 했습니다.
자체 REST API를 만들 수도 있었지만, MCP(Model Context Protocol)를 선택했습니다. MCP는 Anthropic이 제안한 개방형 표준으로, 한 번 구현하면 Claude Desktop·Cursor 등 다양한 AI 클라이언트가 별도 연동 없이 바로 사용할 수 있기 때문입니다.
Solution Design
& 3 Primitives
FastMCP 프레임워크로 OpenSearch 전용 MCP 서버를 구현하되, 3가지 Primitive를 역할별로 설계했습니다.
• Tools — AI가 직접 호출하는 검색 함수. "지난주 에러 로그 찾아줘" 같은 자연어 요청을 실제 OpenSearch 쿼리로 변환합니다.
• Resources — 클러스터 상태·인덱스 매핑 등 컨텍스트를 AI에게 노출. AI가 어떤 인덱스에 어떤 필드가 있는지 파악한 뒤 정확한 검색을 수행합니다.
• Prompts — 검색 쿼리 작성 가이드 템플릿. AI가 복잡한 집계·필터링도 일관된 품질로 수행하도록 유도합니다.
Challenge 1 | AI와 사내 데이터의 단절
상황: con03에서 설명한 대로, AI 어시스턴트가 사내 OpenSearch 데이터에 직접 접근할 수 없는 단절 문제가 있었습니다.
판단: 자체 API를 만들 수도 있었지만, MCP 표준을 따르면 Claude Desktop, Cursor 등 다양한 AI 클라이언트가 별도 연동 코드 없이 바로 사용할 수 있다고 판단했습니다.
액션: FastMCP로 OpenSearch 전용 MCP 서버를 구현했습니다. Tools로 검색 함수, Resources로 인덱스 구조 노출, Prompts로 쿼리 가이드를 등록하여, AI가 "어떤 데이터가 있는지 파악 → 적절한 쿼리 생성 → 검색 실행"까지 자율적으로 수행할 수 있게 설계했습니다.
결과: AI 어시스턴트가 자연어 요청을 받으면 MCP 서버를 통해 OpenSearch를 직접 조회합니다. 수동 쿼리 작성이 불필요해졌습니다.
Challenge 2 | 듀얼 트랜스포트 설계
상황: MCP 서버를 로컬 개발 환경(Claude Desktop, Cursor)과 원격 서비스(팀 공용 서버) 양쪽에서 사용해야 했습니다. 로컬은 프로세스 간 stdin/stdout 통신이 자연스럽고, 원격은 HTTP 기반 통신이 필수였습니다. 두 환경을 별도 서버로 만들면 유지보수가 이중으로 발생하는 문제가 있었습니다.
판단: 하나의 서버 코드베이스에서 stdio와 Streamable HTTP 두 가지 트랜스포트를 모두 지원하도록 설계하기로 했습니다. FastMCP가 듀얼 트랜스포트를 지원하므로, 실행 시 환경변수로 모드를 전환하는 방식을 채택했습니다.
액션: stdio 모드에서는 Claude Desktop·Cursor가 MCP 서버를 자식 프로세스로 실행하여 JSON-RPC 메시지를 교환하도록 구현했습니다. Streamable HTTP 모드에서는 단일 엔드포인트(/mcp)에서 POST 요청을 받고 SSE로 스트리밍 응답을 반환하도록 구현했습니다.
결과: 로컬 개발자는 Claude Desktop 설정에 경로만 추가하면 바로 사용 가능하고, 원격 팀원은 HTTP URL만 등록하면 동일한 검색 기능을 사용할 수 있습니다. 코드 중복 없이 두 환경을 하나의 서버로 커버합니다.
What I Learned | 프로젝트를 통해 배운 것
AI 도구 설계는 "AI가 어떻게 생각하는가"를 이해하는 일이었습니다. 단순히 검색 API를 노출하는 것과, AI가 스스로 판단하여 올바른 검색을 수행하도록 설계하는 것은 완전히 다른 문제였습니다. Tools만 등록하면 AI가 알아서 잘 쓸 것이라 생각했지만, 실제로는 Resources로 인덱스 구조를 알려주고, Prompts로 검색 패턴을 안내해야 비로소 정확한 결과가 나왔습니다.
MCP 표준의 힘을 체감했습니다. 자체 API를 만들었다면 각 AI 클라이언트마다 연동 코드를 작성해야 했을 것입니다. MCP 표준을 따른 덕분에 Claude Desktop, Cursor 등에서 설정 한 줄로 연결이 완료되었고, 새로운 MCP 호환 클라이언트가 등장하면 추가 작업 없이 바로 사용할 수 있습니다.
프로토콜 설계 역량이 성장했습니다. stdio와 Streamable HTTP라는 서로 다른 통신 방식을 하나의 서버에서 지원하면서, 전송 계층 추상화와 프로토콜 설계에 대한 실무 감각을 쌓을 수 있었습니다.











