본문으로 건너뛰기

© 2026 Molayo

Dev.to헤드라인2026. 05. 28. 05:16

INDmoney를 위한 MCP 서버 구축 — Claude에게 평범한 영어로 포트폴리오에 대해 물어보세요

요약

Anthropic의 MCP(Model Context Protocol)를 활용하여 INDmoney 포트폴리오 데이터를 Claude와 연결하는 Python 기반 MCP 서버 구축 사례를 소개합니다. Playwright를 사용하여 세션 유지 문제를 해결하고 실시간 자산 데이터를 자연어로 조회할 수 있도록 구현했습니다.

핵심 포인트

  • MCP를 통해 Claude가 외부 데이터 소스에 직접 접근하도록 구현
  • TypeScript 버전의 세션 만료 문제를 Python과 Playwright로 해결
  • AES-256-GCM 암호화를 통한 안전한 세션 및 JWT 관리
  • 자연어 질문만으로 주식, 뮤추얼 펀드 등 실시간 포트폴리오 조회 가능

INDmoney는 훌륭합니다. 문제는 "그냥 뭐 좀 확인하려고" 앱을 열 수가 없다는 점입니다. 앱을 열 때마다 차트를 탭하고, 주식 기사를 읽고, 어제 이후로 무엇이 변했는지 확인하다 보면 어느새 두 시간이 지나 있습니다.

또한 저는 이제 막 본격적으로 투자를 시작했습니다. 그리고 단순히 빨간색/초록색 숫자를 쳐다보는 것만으로는 제가 제대로 하고 있는지 실제로 알 수 없습니다.

그래서 앱을 전혀 열지 않고도 Claude에게 질문하여 제 포트폴리오를 확인할 수 있는 무언가를 만들었습니다.

"내 뮤추얼 펀드(Mutual Funds) 성과는 어때?"
"내가 중형주(Mid-caps)에 과도하게 투자되어 있나?"
"내 Experian 신용 점수를 깎아먹는 요인이 뭐야?"

실제 INDmoney 계정으로부터 가져온 실시간 답변을 Claude 내부에서 바로 확인할 수 있습니다.

MCP란 무엇인가?

**Model Context Protocol (MCP)**는 Claude가 외부 도구 및 데이터 소스에 연결할 수 있도록 해주는 Anthropic의 개방형 표준입니다. AI를 위한 USB-C라고 생각하면 됩니다. 어떤 앱이든 꽂을 수 있는 표준 포트와 같습니다.

MCP 서버가 로컬에서 실행되면, Claude는 내장된 기능을 사용하는 것과 동일한 방식으로 해당 도구를 호출할 수 있습니다. 복사해서 붙여넣거나, 스크린샷을 찍거나, 앱을 전환할 필요가 없습니다.

내가 다시 만든 이유 (TypeScript 버전은 계속 고장 났습니다)

처음에는 TypeScript로 첫 번째 버전을 만들었습니다. 하지만 요청 도중에 계속 끊겼습니다. 데이터를 가져오는 동안 INDmoney의 세션이 만료되거나, 미국 주식 데이터가 타임아웃되기도 했습니다. 절반 정도는 에러가 발생하면 그냥 노트북을 닫고 결국 앱을 열게 되었습니다. 제가 피하려고 했던 바로 그 상황 말이죠.

핵심 문제는 지속적인 세션(Persistent sessions)이 없었다는 점입니다. 서버를 재시작할 때마다 매번 새로운 OTP 로그인을 해야 했습니다.

그래서 Playwright를 사용하여 Python으로 다시 만들었습니다. 이제 세션은 AES-256-GCM으로 암호화되어 디스크에 저장됩니다. 서버를 재시작한 후에도 연결 상태가 유지되므로, 매번 다시 로그인하거나 OTP를 입력할 필요가 없습니다.

기능

indmoney-mcp-python — 모든 INDmoney 자산 클래스를 다루는 14개의 도구:

도구 (Tool)반환 내용
get_holdings인도 주식 — 심볼 (symbol), 수량 (qty), 평균 가격 (avg price), 손익 (P&L)
...

여기에 세션 관리 도구들이 추가됩니다: broker_connect, broker_status, broker_disconnect, discover_endpoints.

내부 작동 원리 (How It Works Under the Hood)

Claude ──STDIO JSON-RPC──► MCP Server (Python)
                                │
                    ┌───────────┴───────────┐
...

로그인 (1회 수행):

  1. Playwright가 Chromium 창을 엽니다.
  2. 브라우저에서 직접 전화번호와 OTP를 입력합니다 — 서버는 이를 절대 볼 수 없습니다.
  3. 서버는 브라우저의 쿠키 저장소(cookie store)에서 JWT를 가져옵니다.
  4. 이를 암호화하여 디스크에 저장합니다.

데이터 가져오기 (Data fetching):

  • 대부분의 엔드포인트 (Endpoints): JWT를 사용하여 브라우저 컨텍스트 내부에서 직접 fetch() 호출을 수행합니다 — CORS를 완전히 우회합니다.
  • 일부 엔드포인트 (금, 폴백/fallbacks): 관련 페이지로 이동하는 동안 네트워크 응답(network response)을 캡처합니다.

2단계 캐시 (Two-level cache):

  • 인메모리 (In-memory, 5분) — 동일 세션 내 반복되는 쿼리에 대해 즉각적인 응답을 제공합니다.
  • 디스크 (Disk, 60분) — 재시작 후에도 유지되며, API가 느릴 경우 폴백(fallback)으로 사용됩니다.

설정 방법 (3단계)

1. 설치 (Install)

pip install indmoney-mcp
python -m playwright install chromium

2. 암호화 키 생성 (Generate an encryption key)

python3 -c "import secrets; print(secrets.token_hex(32))"

이 키를 저장해 두세요. 만약 분실하면 세션이 삭제되어 다시 로그인해야 합니다 — 큰 문제는 아니지만 약간 번거로울 수 있습니다.

3. Claude Desktop 설정에 추가

{
  "mcpServers": {
    "indmoney": {
...

Claude Desktop을 재시작한 후, 다음과 같이 말하세요: "Connect me to INDmoney"

브라우저 창이 열리면 OTP를 입력하세요. 그러면 완료됩니다. 그 시점부터 서버를 재시작하더라도 12시간 동안 연결이 유지됩니다.

실제로 질문하는 내용들

"내 뮤추얼 펀드 중 벤치마크(benchmark)보다 성과가 낮은 것은 무엇인가요?"

"전체 포트폴리오 내역을 알려줘 — 주식, 뮤추얼 펀드(MFs), 미국 자산의 비중이 각각 어떻게 되나요?"

"이번 주에 결제해야 할 신용카드 대금이 있나요?"

"내 금 ETF — 내가 투자한 금액 대비 올랐나요, 내렸나요?"

아직 배우는 단계에 있는 사람으로서, "내가 올바른 방향으로 가고 있나요?"라고 물었을 때 실제 수치를 바탕으로 구조화된 답변을 얻을 수 있다는 점은 진정으로 유용합니다. Claude는 데이터를 단순히 보여주는 것을 넘어, 그 데이터를 바탕으로 추론(Reasoning)할 수 있습니다.

하지 않는 일

이 서버는 주문을 넣거나 돈을 옮기지 않습니다. 언제나 읽기 전용(Read-only)입니다. 솔직히 이는 의도된 설계입니다. 한밤중에 AI와 채팅하면서 원클릭 투자(One-click investing)를 할 만큼 제 자신을 믿지 못하기 때문입니다.

또한 귀하의 데이터는 절대 기기를 떠나지 않습니다. 제3자 서버나 클라우드 동기화도 없습니다.

링크

만약 귀하가 INDmoney 사용자라면 — 특히 투자를 배워가는 과정에 있다면 — 한 번 사용해 보세요. 만약 무언가 작동하지 않는다면 이슈(Issue)를 생성해 주세요. 저도 직접 사용하고 있으므로 바로 확인할 수 있습니다.

AI 자동 생성 콘텐츠

본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0