MCP 프로토콜을 통한 금융 시세 데이터 연동 기술 실무
요약
MCP(Model Context Protocol)를 활용하여 LLM이 실시간 금융 시세 데이터를 직접 조회하고 분석할 수 있도록 연동하는 기술 실무를 다룹니다. 기존의 복잡한 Glue Code 방식 대신 표준화된 프로토콜을 통해 데이터 접근성을 높이는 방법을 설명합니다.
핵심 포인트
- MCP를 통한 외부 데이터 획득 프로세스의 표준화 및 추상화
- Function Calling의 유지보수 문제를 해결하는 MCP의 이점
- iTick MCP 서버를 활용한 실시간 금융 데이터 연동 실습
- stdio 통신 방식을 이용한 로컬 MCP 서버 실행 환경 구축
사정은 이렇습니다. 저는 평소에 시장을 모니터링하는 데 시간을 좀 쓰는데, 아시다시피 차트를 계속 들여다보는 일은 너무 고됩니다. 오래 보고 있으면 눈도 침침해지죠. 그래서 AI가 이 일을 도와줄 수 없을까 고민하게 되었습니다. AI가 저 대신 거래를 해주길 바라는 건 아닙니다. 적어도 제가 "오늘 애플 주가는 어때?"라고 물었을 때, 주가를 지어내서 나를 속이는 게 아니라, 성실하게 실제 시세를 조회해 오기를 바랄 뿐입니다.
처음 제 생각은 아주 간단했습니다. 직접 Python 스크립트를 짜서 무료 시세 API를 호출하고, 데이터를 Prompt로 조합해 GPT에게 먹이는 것이었죠. 꽤 고생하며 반나절 넘게 코드를 짰고 기능은 돌아갔지만, 모델을 바꿀 때마다 Function Calling (함수 호출) 형식을 매번 새로 맞춰줘야 했습니다. 게다가 이런 "글루 코드 (Glue Code)"는 쓰면 쓸수록 지저분해져서 나중에는 저조차 유지보수하기 싫어지더군요. 그러다 퀀트(Quant)를 하는 친구가 말했습니다. "MCP를 써봐. iTick에 이미 만들어져 있어서 바로 쓸 수 있어. 직접 바퀴를 발명하려고 하지 마."
이전에 MCP (Model Context Protocol)에 대해 들어본 적은 있었습니다. Anthropic이 대규모 언어 모델 (LLM)이 외부 도구를 호출할 수 있도록 만든 프로토콜이라는 건 알고 있었지만, 실제로 다뤄본 적은 없었습니다. 이번 주말을 틈타 제대로 프로세스를 밟아보기로 했고, 동시에 그 과정을 기록하여 저와 같은 니즈를 가진 분들에게 참고가 되도록 해보려 합니다.
1. 내가 직면한 핵심 문제
솔직히 말해서 제가 원하는 건 아주 간단합니다. 대규모 언어 모델이 실제 시세 데이터를 "볼 수 있게" 만드는 것입니다. 데이터를 수동으로 복사해서 주는 것도 아니고, 수많은 글루 코드를 작성하는 것도 아닙니다. 사람과 대화하듯 "테슬라 지금 얼마야?", "최근 20일간의 볼린저 밴드 (Bollinger Bands) 좀 봐줘"라고 물으면, 모델이 스스로 데이터를 가져오고 지표를 계산한 뒤, 그 결과를 일반적인 사람의 언어로 알려주는 것이죠.
이 일은 두 단계로 나뉩니다. 첫 번째 단계는 모델이 나의 의도를 이해하는 것이고, 두 번째 단계는 모델이 데이터에 접근할 수 있는 것입니다. 첫 번째 단계는 현재의 대규모 언어 모델들이 충분히 해낼 수 있지만, 두 번째 단계는 외부 도구에 의존해야 합니다. MCP는 바로 이 두 번째 문제를 해결해 줍니다. MCP는 "데이터 획득"을 표준화된 도구로 추상화하여, 모델이 필요한 것을 MCP라는 파이프라인을 통해 직접 호출할 수 있게 합니다.
iTick이 한 일은 자신들의 시세 데이터와 기술적 지표를 MCP 서비스로 캡슐화하여 로컬에서 실행되도록 만든 것입니다. 덕분에 포트를 노출할 필요도 없고, 데이터 형식을 제가 신경 쓸 필요도 없습니다.
2. 시작 과정, 생각보다 복잡하지 않다
먼저 제 환경을 말씀드리자면, M1 MacBook을 사용 중이고 Node.js 18과 Python 3.11이 설치되어 있습니다. 그 외에 특별한 것은 없습니다. iTick의 MCP 서버는 npm 패키지이며, 실행은 명령어 한 줄이면 끝납니다.
설정 파일
itick-mcp.json 파일을 생성했고, 내용은 다음과 같습니다:
{
"apiKey": "방금 받은 KEY를 입력하세요",
"defaultMarket": "US"
...
이 파일은 프로젝트 루트 디렉토리에 두었으며, 복잡한 설정은 없습니다.
서비스 시작
터미널에 입력합니다:
npx @itick/mcp-server --config itick-mcp.json
엔터를 치면 별도의 인터페이스 없이 실행 성공 로그 한 줄이 뜨고 조용히 대기 상태가 됩니다. 솔직히 처음에는 반응이 없어서 멈춘 줄 알고 당황했는데, 나중에 알고 보니 stdio 통신 방식을 사용하고 있어서 클라이언트가 연결되기를 기다리고 있는 것이었습니다.
3. Python 클라이언트로 테스트해 보기
처음부터 Claude에 바로 연결하고 싶지는 않았습니다. 설정이 잘못되어 빨간색 에러 메시지가 잔뜩 뜨면 기분이 상할 것 같았거든요. 그래서 먼저 가장 단순한 형태의 Python 스크립트를 작성하여 데이터를 제대로 가져올 수 있는지 확인했습니다.
MCP Python SDK 설치:
pip install mcp
그다음 test.py를 작성합니다:
import asyncio
from mcp import Client
from mcp.client.stdio import stdio_client
...
실행 결과는 대략 다음과 같습니다:
사용 가능한 도구 목록: ['get_realtime_quote', 'get_historical_bars', 'get_technical_indicator', 'search_instrument', 'get_financials']
=== AAPL 실시간 시세 ===
{
...
그 순간 정말 약간의 흥분을 느꼈습니다. API 문서를 찾아보지도 않았고, 파라미터 이름도 거의 추측에 의존했는데 (symbol, interval, indicators 같은 것들 말이죠), 한 번에 성공했기 때문입니다. 볼린저 밴드의 상단, 중단, 하단 값과 위치 설명까지 직접 반환해 주어서, 제가 직접 pandas로 계산할 필요가 없었습니다.
4. 진짜 쾌감은 Claude Desktop에 연결했을 때
커맨드 라인에서 성공한 것은 예열에 불과합니다. MCP를 가장 제대로 활용하는 방법은 대규모 언어 모델이 스스로 이 도구들을 호출하게 만드는 것입니다. 저는 평소 Claude Desktop을 많이 사용하는데, 마침 MCP를 네이티브로 지원합니다.
설정 방법은 복잡하지 않습니다. Claude Desktop의 설정 파일(Mac의 경우 ~/Library/Application Support/Claude/claude_desktop_config.json)을 찾아 다음 내용을 추가하면 됩니다:
{
"mcpServers": {
"itick": {
...
저장한 후 Claude Desktop을 재시작하고, 대화창에 다음과 같이 질문해 보았습니다:
테슬라의 현재 주가가 얼마인지, 일봉 기준 볼린저 밴드(Bollinger Bands) 위치는 어떤지 확인해 줘.
Claude는 약 2초간 침묵하더니(get_realtime_quote와 get_technical_indicator를 호출하러 간 것이라 추측됩니다), 다음과 같이 답변했습니다. 현재 가격이 얼마인지, 볼린저 밴드의 상단, 중단, 하단 밴드가 각각 어디에 있는지 알려주었으며, 가격이 볼린저 밴드의 상단 영역에 위치하여 상단 밴드에 근접해 있으므로 단기적으로 저항에 직면할 수 있다고 말해주었습니다. 저는 이어서 다시 질문했습니다:
그럼 엔비디아는? 동일한 지표로 비교해 줘.
Claude는 다시 각각 데이터를 불러와 두 회사의 가격과 볼린저 밴드 위치를 비교한 표를 만들어 보여주었습니다. 저는 대화창을 떠나지도 않았고, 어떤 시세 숫자도 복사하지 않았습니다.
솔직히 말해서, 이런 경험은 제가 이상적으로 생각하던 "실제로 일을 할 줄 아는 AI 어시스턴트"에 매우 가깝습니다. 주가를 허위로 지어내지 않았는데, 그럴 기회조차 없었기 때문입니다. 모든 데이터 단계는 iTick의 인터페이스로부터 실시간으로 가져온 것이며, 출처를 추적할 수 있습니다.
5. 제가 겪은 시행착오와 주의사항
저녁에 여러 차례의 대화를 테스트하기 위한 스크립트를 작성하여, 하나의 대화 세션 내에서 여러 종목을 연속해서 질문하도록 시도해 보았습니다. 그런데 두 번째 도구 호출 시 "session expired" 오류가 발생했습니다. 한참을 조사한 끝에 제 코드 로직의 문제임을 발견했습니다. async with의 스코프(scope)를 너무 좁게 설정하여, 첫 번째 호출이 끝난 후 연결이 바로 닫혀버린 것이었습니다.
해결 방법은 간단합니다. 여러 번의 도구 호출을 모두 동일한 async with 블록 안에 넣어 연결 재사용(connection reuse)을 유지하면 됩니다. iTick 문서에도 이 점이 언급되어 있었지만, 제가 처음에 자세히 읽지 않아 30분 동안 고생했습니다. 만약 지속적인 상호작용을 수행하는 애플리케이션을 만든다면, 클라이언트(client)의 생명 주기(lifecycle)를 잘 관리해야 한다는 점을 기억하세요.
6. 이 도구는 과연 누구에게 적합한가?
일주일간 사용해 본 제 느낌은 이렇습니다. iTick MCP는 블랙박스 형태의 제품을 파는 것이 아니라, 매우 깔끔한 "데이터 접속 표준 부품"을 제공하는 것입니다. 장점은 다음과 같습니다:
- 배포 비용이 매우 낮음: 명령어 하나로 실행할 수 있으며, 별도의 서비스를 띄울 필요가 없습니다.
- 정제된 구조화된 JSON 반환: 데이터를 2차 가공하거나 데이터베이스에 저장하기 매우 편리합니다.
- 내장된 기술적 지표 활용: 계산 로직을 직접 작성할 필요가 없습니다(특히 볼린저 밴드의 경우, 저는 이전에 직접 구현할 때 경계 조건(boundary condition)에서 자주 실수를 하곤 했습니다).
- 준수한 권한 격리: API Key를 설정 파일에 작성하므로, 클라이언트 코드에는 전혀 나타나지 않습니다.
하지만 솔직하게 한계점도 말씀드려야겠습니다:
- 초저지연(low latency) 고빈도 매매(HFT) 시나리오에는 부적합: 이 도구는 로컬 stdio 통신을 사용하므로, 태생적으로 그런 용도로 설계되지 않았습니다.
- 매우 희귀한 지표 사용 시: 내장된 지표가 모든 것을 커버하지 못할 수 있으므로, 직접 계산해야 할 수도 있습니다.
- 잦은 서버 업데이트: 이번 주에도 버전 업그레이드를 한 번 경험했습니다. 다행히 기존 인터페이스가 깨지지는 않았습니다.
그렇다면 이 도구는 누구에게 가장 적합할까요? 제가 정리해 보았습니다:
- 개인 투자자 또는 트레이딩 애호가: 자연어로 빠르게 시세를 확인하고 기술적 분석을 하고 싶은 분들.
- 평소 퀀트(quant) 스크립트를 작성하는 개발자: 데이터 수집 작업을 외주(outsourcing)로 넘기고, 본인은 전략 로직에만 집중하고 싶은 분들.
- 저처럼 AI 어시스턴트를 "무장"시키고 싶은 분들: AI가 단순히 채팅만 하는 장난감이 아닌, 실질적인 도구가 되길 원하는 분들.
마치며
이 시스템을 구축하며 느낀 가장 큰 소회는 이것입니다. 과거에 우리는 대규모 언어 모델(LLM)이 "금융을 모른다"고 불평하곤 했지만, 사실 모델이 똑똑하지 않은 것이 아니라 모델이 실제 시장 데이터를 볼 수 없었던 것입니다. MCP가 하는 일은 바로 그 창문을 열어주는 것입니다. iTick은 마침 그 창문을 아주 능숙하게 열어주는 도구였습니다. 저는 창틀을 어떻게 설치할지 고민할 필요 없이, 그저 다가가서 밀기만 하면 됩니다.
만약 여러분도 "글루 코드(glue code)\
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기