Ollama + MCP tool calling 연결 (2026): 로컬 LLM이 파일·Git·DB를 직접 다루는 에이전트 구성
저는 얼마 전 Ollama에서 tool calling을 켜고 MCP 서버에 연결하려다가 꽤 오래 헤맸다. "그냥 Ollama tool calling 쓰면 되는 거 아냐?"라고 생각했다가, Ollama의 tool call 포맷과 MCP 프로토콜이 완전히 별개의 스펙이라는 걸 깨닫는 데 한참이 걸렸다. 그 삽질이 이 글의 출발점이다.
클라우드 API 없이, 내 맥북에서 LLM이 파일을 읽고, Git 저장소를 뒤지고, 데이터베이스에 쿼리를 날린다. 1~2년 전만 해도 이건 '가능은 한데 실용성이 없는' 영역이었는데, 2026년 기준으로 로컬 모델의 도구 호출 정확도가 실용적인 수준까지 올라오면서 상황이 달라졌다. Ollama 위에 MCP를 붙이는 구성이 실제 개발 워크플로에 들어오기 시작한 것이다.
이 글에서는 두 가지에 집중한다. 첫째, 왜 Ollama와 MCP 사이에 브리지가 필요한지, 그 브리지를 어떻게 선택해야 하는지다. 둘째, MCPHost가 유지보수 종료를 선언한 이후 어떤 대안이 있는지다. 다른 Ollama+MCP 글에서 잘 다루지 않는 지점이기도 하다.
핵심 개념
Ollama: LLM을 위한 Docker
Ollama는 Llama 3, Qwen, Gemma, Mistral 같은 오픈소스 LLM을 로컬 머신에서 단일 명령어로 실행할 수 있게 해주는 런타임이다. Docker가 컨테이너 이미지 다운로드부터 실행까지를 하나로 감싸듯, Ollama는 모델 다운로드·서빙·API 노출을 하나의 인터페이스로 추상화한다.
# 모델 받고 바로 실행
ollama run qwen2.5:14b
# 또는 API 서버로 띄우기
ollama serve
# → http://localhost:11434 에서 OpenAI 호환 API 제공OpenAI 호환 엔드포인트를 그대로 제공하기 때문에, 기존 코드에서 api.openai.com만 localhost:11434로 바꾸면 대부분 그냥 동작한다. 이 점 덕분에 로컬 LLM 전환 비용이 생각보다 낮다.
MCP: AI를 위한 USB-C
**MCP(Model Context Protocol)**는 Anthropic이 2024년 말 오픈소스로 공개한 표준 프로토콜이다. AI 모델이 외부 도구·데이터 소스와 상호작용하는 방식을 통일한 규격이다.
"AI를 위한 USB-C" — 어떤 MCP 호환 클라이언트에서도 동일한 MCP 서버를 재사용할 수 있다는 게 핵심이다. 한 번 만든 MCP 서버는 Claude Desktop, Cline, Open WebUI, 그리고 직접 만든 에이전트 어디서나 꽂아서 쓸 수 있다.
프로토콜은 세 가지 원시(Primitive)로 구성된다.
| Primitive | 역할 | 예시 |
|---|---|---|
| Tools | 모델이 직접 호출하는 함수 | 파일 읽기, DB 쿼리, API 호출 |
| Resources | 컨텍스트로 제공되는 데이터 | 문서, 설정 파일, DB 레코드 |
| Prompts | 재사용 가능한 프롬프트 템플릿 | 코드 리뷰 템플릿, 요약 형식 |
왜 브리지가 필요한가
솔직히 이게 이 스택에서 가장 많이 헷갈리는 부분이다. Ollama도 tool calling을 지원하는데, 왜 MCP 서버를 쓰려면 별도 브리지가 필요한 걸까?
이유는 간단하다. Ollama의 tool call 포맷과 MCP 프로토콜은 완전히 별개의 스펙이기 때문이다. Ollama는 자체적인 JSON 포맷으로 함수 호출을 처리하고, MCP는 JSON-RPC 2.0 기반의 별도 프로토콜을 사용한다. 이 둘 사이를 이어주는 번역기가 브리지 레이어다.
실제 에이전트 루프는 단방향 1회성이 아니라 반복적인 사이클이다. LLM이 여러 번 도구를 호출하고 결과를 반영하면서 최종 응답에 도달하는 구조다.
[에이전트 루프 — 목표 달성까지 반복]
사용자 입력
→ Ollama LLM (어떤 도구를 호출할지 결정)
→ 브리지 (Ollama tool_call 포맷 → MCP 요청으로 변환)
→ MCP 서버 (실제 도구 실행)
→ 결과를 LLM에 주입
→ LLM (다음 액션 결정)
↑_____________________________↓
충분한 정보가 모일 때까지 반복
→ 최종 응답 생성LLM이 직접 도구를 실행하는 게 아니라, 브리지가 LLM의 의도를 해석해서 MCP 서버에 전달하고, 결과를 다시 LLM에 넘겨주면서 목표에 도달할 때까지 반복한다.
현재 브리지 생태계
브리지 선택이 중요한 이유가 있다. MCPHost라는 Go 기반의 유명한 브리지가 최근 공식적으로 유지보수 종료를 선언하고, 후속 프로젝트인 Kit으로 전환을 권고했다. 브리지 레이어가 아직 빠르게 변화하는 영역이라는 신호다.
| 도구 | 특징 | 현재 상태 |
|---|---|---|
| Kit | MCPHost 공식 후속, Go 기반 | 활발한 개발 |
| ollmcp | TUI 인터페이스, thinking mode, human-in-the-loop | 활성 |
| ollama-mcp-bridge | FastAPI 기반, OpenAPI 호환, 모듈형 | 활성 |
| MCPO | MCP 서버 → OpenAPI 변환, Open WebUI 연동 | 활성 |
| MCPHost | 한때 가장 많이 쓰였던 Go 바이너리 | 유지보수 종료 |
MCPHost를 아직 쓰고 있다면 Kit으로 마이그레이션을 검토해볼 시점이다.
권장 모델 선택
로컬 모델의 최대 약점이었던 도구 호출 정확도가 2026년 들어 크게 개선됐다. Gemma 4는 이전 버전 대비 tool calling 정확도가 대폭 향상됐고(구글 공식 벤치마크 기준), Qwen 3 시리즈는 많은 독립 테스트에서 frontier 모델과 대등한 tool calling 성능을 보인다.
| 사용 목적 | 권장 모델 | 필요 VRAM |
|---|---|---|
| 빠른 시작 / 가벼운 작업 | gemma4:4b, qwen3:8b |
~8 GB |
| 워크스테이션 최적 | qwen2.5:14b |
~9.6 GB |
| 고복잡 다단계 추론 | Qwen 3 / Llama 3.3 70B | 24 GB+ |
팁: 모델 태그는 자주 바뀐다.
ollama search qwen3으로 현재 허브에 등록된 실제 태그를 확인한 뒤 pull하는 것을 권장한다. 태그를 그대로 복붙했다가ollama pull이 실패하는 경험을 해봤다면 공감할 것이다.
실전 적용
예시 1: ollama-mcp-bridge로 첫 번째 에이전트 연결
ollama-mcp-bridge는 FastAPI 기반으로, MCP 서버를 OpenAPI 호환 엔드포인트로 노출해준다. 처음 연결을 시도할 때 설정이 직관적이라 진입점으로 적합하다.
# 1. 브리지 설치
pip install ollama-mcp-bridge
# 2. 설정 파일 작성
cat > config.json << 'EOF'
{
"mcpServers": {
"filesystem": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-filesystem", "/tmp"]
},
"git": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-git", "--repository", "."]
}
},
"ollama": {
"model": "qwen2.5:14b",
"baseUrl": "http://localhost:11434"
}
}
EOF
# 3. 브리지 실행
ollama-mcp-bridge --config config.json# 4. 에이전트 루프 호출
import requests
def ask_agent(question: str) -> str:
response = requests.post(
"http://localhost:8000/chat",
json={"message": question}
)
response.raise_for_status()
return response.json()["response"]
print(ask_agent("현재 디렉토리에서 최근 3개 커밋 내용 요약해줘"))
print(ask_agent("/tmp 폴더에 있는 .log 파일 목록 보여줘"))처음 이 코드를 짤 때 response.json()["response"] 키 이름이 맞는지 확신이 없어서 raw response를 먼저 print해서 확인했다. 브리지 버전마다 응답 구조가 다를 수 있으니, 처음 연결할 때는 print(response.json())으로 전체 구조를 먼저 확인해보는 것을 권장한다.
| 코드 포인트 | 설명 |
|---|---|
mcpServers |
연결할 MCP 서버 목록. command로 stdio 기반 서버를 직접 실행 |
npx -y |
MCP 서버를 npm 패키지로 직접 실행. 별도 설치 불필요 |
ollama.model |
추론에 사용할 Ollama 모델. 14B 이상 권장 |
raise_for_status() |
HTTP 오류 시 명시적으로 예외를 발생시켜 디버깅을 쉽게 |
예시 2: RAG + MCP 복합 에이전트
대상 독자: llama-index를 이미 쓰고 있거나 ML 파이프라인에 관심 있는 독자를 위한 예시다. 백엔드나 DevOps 엔지니어라면 예시 3을 먼저 보는 것을 권장한다.
실무에서 자주 맞닥뜨리는 패턴 중 하나가 사내 문서 기반 Q&A(RAG)와 외부 API 호출(MCP)을 동시에 처리해야 하는 경우다. 이 두 가지를 하나의 Ollama 에이전트로 묶을 수 있다.
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
from llama_index.core.agent import ReActAgent
from llama_index.llms.ollama import Ollama
# Ollama LLM 설정
llm = Ollama(model="qwen2.5:14b", request_timeout=120.0)
# RAG 인덱스 구성 (로컬 문서)
documents = SimpleDirectoryReader("./docs").load_data()
index = VectorStoreIndex.from_documents(documents)
query_tool = index.as_query_engine().as_tool(
name="search_docs",
description="사내 문서에서 정보를 검색합니다"
)
# MCP 도구 추가
# llama-index MCP 통합은 버전마다 API가 다를 수 있다.
# 실행 전 llama-index-tools-mcp 패키지의 최신 README를 확인하는 것을 권장한다.
from llama_index.tools.mcp import MCPToolSpec
mcp_tools = MCPToolSpec(
server_command="npx",
server_args=["-y", "@modelcontextprotocol/server-filesystem", "./"]
).to_tool_list()
# 에이전트 조합
agent = ReActAgent.from_tools(
tools=[query_tool] + mcp_tools,
llm=llm,
verbose=True
)
response = agent.chat("우리 프로젝트 README 파일 읽고, 문서 폴더에서 관련 내용 찾아서 요약해줘")
print(response)실무 인사이트: "생성 품질보다 검색 품질이 더 중요하다." 좋은 컨텍스트를 받은 작은 모델이 컨텍스트 없는 큰 모델을 이긴다. RAG 파이프라인에서 청킹 전략과 임베딩 모델 선택에 먼저 투자하는 게 더 큰 모델로 교체하는 것보다 효과적인 경우가 많다.
예시 3: DevOps 코드 어시스턴트 (git-mcp + docker-mcp)
git-mcp, docker-mcp, filesystem 세 가지 MCP 서버를 조합하면 코드베이스를 읽고, 컨테이너 상태를 확인하고, 배포 스크립트를 생성하는 에이전트를 구성할 수 있다.
{
"mcpServers": {
"filesystem": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-filesystem", "/workspace"]
},
"git": {
"command": "uvx",
"args": ["mcp-server-git", "--repository", "/workspace"]
},
"docker": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-docker"]
}
}
}# ollmcp TUI로 대화형 세션 시작
ollmcp --model qwen2.5:14b --config mcp-config.json
# 이제 자연어로 DevOps 작업이 가능하다.
# "main 브랜치와 diff 보여줘"
# "실행 중인 컨테이너 목록이랑 리소스 사용량 알려줘"
# "src/api 폴더 코드 읽고 개선점 3가지 제안해줘"ollmcp는 TUI 인터페이스를 제공해서 터미널에서 대화형으로 사용하기 편하다. human-in-the-loop 기능도 있어서 에이전트가 파괴적인 작업(파일 삭제, 컨테이너 중지 등)을 실행하기 전에 확인을 받을 수 있다. 처음 구성할 때 이 옵션을 켜두면 예상치 못한 작업이 자동 실행되는 상황을 방지할 수 있다.
장단점 분석
장점
| 항목 | 내용 |
|---|---|
| 완전한 프라이버시 | 데이터가 외부 서버로 전송되지 않음. 모델 다운로드 이후 네트워크 트래픽 없음. GDPR, HIPAA 등 데이터 외부 전송 규제를 구조적으로 회피 가능 |
| 비용 절감 | API 사용료·월정액 없음. 하드웨어 초기 비용 이후 무제한 사용 |
| 낮은 레이턴시 | 네트워크 왕복 없음. 반복적인 에이전트 루프에서 특히 유리 |
| MCP 재사용성 | 한 번 만든 MCP 서버는 Claude Desktop, Cline 등 모든 MCP 호환 클라이언트에서 재사용 가능 |
단점 및 주의사항
| 항목 | 내용 | 대응 방안 |
|---|---|---|
| 성능 격차 | 7B~14B 모델은 복잡한 다단계 추론에서 GPT-4o 대비 눈에 띄는 차이 | 복잡한 작업은 Cloud API와 하이브리드 운용 |
| 하드웨어 요구사항 | 에이전트 루프는 LLM을 여러 번 호출. CPU 추론은 속도가 느림 | 최소 14B 모델 + GPU 권장. 없다면 8B 모델로 단순 작업 한정 |
| 브리지 불안정성 | MCPHost → Kit 전환처럼 설정이 릴리스 간 깨지는 경우 발생 | 프로덕션에서는 버전 고정, 변경 로그 모니터링 필수 |
| 보안 노출 | Ollama 서버를 0.0.0.0에 바인딩 시 인터넷에 무방비 노출 위험 |
반드시 127.0.0.1 바인딩 + 방화벽 설정 |
| 확장성 한계 | Ollama는 단일 사용자·개발 환경에 최적화 | 동시 사용자 5명 이상이거나 프로덕션 서비스라면 vLLM 전환 검토 |
보안 경고: Trend Micro의 2025년 H1 보고서에 따르면 수천 개의 Ollama 서버가 인터넷에 무방비로 노출되어 있었다.
OLLAMA_HOST=127.0.0.1환경변수 설정 하나로 막을 수 있는 문제다.
vLLM 전환 기준: 팀 내 공유 서버이거나 동시 사용자가 5명을 넘어가기 시작하면 vLLM을 고려할 시점이다. 단일 개발자 워크스테이션이라면 Ollama로 충분하다.
실무에서 가장 흔한 실수
- Ollama tool calling과 MCP를 혼동하는 것 — Ollama의 자체 tool call 기능과 MCP 프로토콜은 별개다. MCP 서버를 연결하려면 반드시 브리지가 필요하다.
- 모델 크기를 무조건 키우는 것 — RAG 에이전트에서는 더 큰 모델보다 더 좋은 검색 컨텍스트가 실제 품질에 더 큰 영향을 미친다. 청킹 전략과 임베딩 모델부터 점검해보는 것이 효과적이다.
- 브리지 버전 관리를 소홀히 하는 것 — 브리지 생태계가 빠르게 변하고 있어서, 버전을 고정하지 않으면 어느 날 갑자기 작동이 멈출 수 있다.
package.json이나requirements.txt에 정확한 버전을 명시해두는 것을 권장한다.
마치며
Ollama + MCP 조합에서 진짜 허들은 설치가 아니라 브리지 선택이다. Ollama의 tool call 포맷과 MCP 프로토콜이 별개라는 점, 그리고 MCPHost 종료 이후 Kit·ollmcp·ollama-mcp-bridge 중 하나를 선택해야 한다는 점을 이해하고 나면, 이 스택을 실제 워크플로에 어디까지 밀어넣을 수 있는지 판단이 서기 시작한다.
아래 순서로 시작해볼 수 있다.
ollama pull qwen2.5:14b로 모델을 받고ollama serve로 로컬 API 서버를 띄운다. VRAM이 8GB 미만이라면qwen3:8b으로 시작해도 된다.ollmcp나ollama-mcp-bridge중 편한 것을 골라@modelcontextprotocol/server-filesystem에 연결한다. 에이전트가 로컬 파일을 읽고 응답하는 첫 경험이 이 스택의 가능성을 직관적으로 보여준다.git-mcp,sqlite,mcp-obsidian같은 서버를 config에 추가한다. MCP의 재사용성 덕분에 서버 하나 추가가 곧 에이전트 능력 확장으로 이어진다.
참고 자료
- Ollama MCP: How to Connect Local LLMs to Any MCP Server (2026)
- Ollama + MCP: Connect Local AI to Your Tools (Complete 2026 Guide)
- Using MCP with Local LLMs: Ollama, LM Studio, and Open Source Models
- Building Your First Agentic AI: Complete Guide to MCP + Ollama Tool Calling
- Creating AI Agents with MCP and Ollama local: A Hands-On Tutorial
- Building a Practical AI Agent with RAG, MCP, and Ollama
- MCP Architecture with Ollama — Production System Design Guide [2026]
- GitHub: jonigl/mcp-client-for-ollama (ollmcp TUI)
- GitHub: patruff/ollama-mcp-bridge
- Ollama Tool Calling 공식 문서
- Run Qwen 3 Locally: Power Agentic Tasks with Ollama & MCP
- Ollama + MCP servers on M1 Max: MCPHost deprecation and tool calling limits