프로젝트 개요
내가 담당한 범위
구체적이지 않은 고객 요청을 실제 납품 가능한 제품으로 전환하는 전 과정을 단독으로 담당했습니다.
고객의 최초 요청
“투자자를 위한 MCP 서버를 만들어주세요.”
고객 요청 전문
요청에는 기술 이름은 있었지만 제품은 정의되어 있지 않았습니다. 세 가지 질문에 답해야 했습니다.
- 투자자는 LLM으로 어떤 업무를 처리하려 하는가?
- 그중 고객 플랫폼이 보유한 데이터로 지원할 수 있는 업무는 무엇인가?
- LLM 클라이언트가 고객의 보안 체계를 유지하면서 올바른 회사 데이터에 어떻게 접근할 것인가?
플랫폼 API를 그대로 감싼 범용 MCP 서버를 만들 수도 있었습니다. 하지만 그렇게 만든 도구가 실제 업무를 해결한다는 보장은 없었습니다.
사용자 업무에서 제품 범위 찾기
API보다 사용자 업무를 먼저 조사했습니다. VC 투자자 3명을 대상으로 다음을 인터뷰했습니다.
- 반복적으로 수행하는 투자 업무
- 업무에서 LLM을 사용하는 방식
- 플랫폼, 문서, LLM 사이에서 정보를 복사하거나 전달하는 지점
- 포트폴리오, 보고, 펀드, 알림 데이터를 함께 검색해야 하는 질문
이후 각 후보 업무를 고객 플랫폼이 실제로 보유한 데이터와 대조했습니다. 유용해 보이지만 안정적으로 지원할 수 없는 아이디어는 제외하고, 사용자 요구를 구체적인 제품 명세로 전환했습니다.
| 기능 | 지원하는 업무 | 개발 순서 |
|---|---|---|
| 보고 자료 수집 현황 | 기업별 보고 자료 수집 여부 확인 | 1 · 사용자 사전 테스트 |
| 검토 현황 브리핑 | 포트폴리오 검토 진행 상태 요약 | 2 · 사용자 사전 테스트 |
| 펀드 성과 및 자본금 | 펀드 성과와 자본 관련 정보 조회 | 3 · 사용자 사전 테스트 |
| 포트폴리오 검색 | 자연어 요청으로 기업과 포트폴리오 정보 탐색 | 구현 완료 |
| 리스크 등급 변동 | 기업 리스크 등급 변동 확인 및 설명 | 구현 완료 |
| 알림 분류 | 확인이 필요한 플랫폼 알림 탐색 및 우선순위화 | 구현 완료 |
개발 순서는 API 구현 편의성이 아니라 관찰된 사용자 가치로 결정했습니다. 이후 6개 기능을 모두 완성했습니다.
시스템을 결정한 제약조건
- Claude나 GPT에서 MCP 서버를 연결해 사용할 때도 고객 로그인과 회사 컨텍스트가 유지되어야 했습니다. 조사에서 확인한 CLI 업무 방식도 포함됩니다.
- MCP 도구 호출에는 일반적인 브라우저 세션이 유지되지 않았습니다.
- 고객의 기존 인증 시스템이 계속 사용자 신원의 기준이 되어야 했습니다.
- 한 명의 투자자가 여러 회사에 소속될 수 있었습니다.
- 모든 도구 호출은 올바른 회사 컨텍스트를 사용하고 회사별 데이터 격리를 유지해야 했습니다.
- 고객 플랫폼에 필요한 데이터가 존재하는 기능만 제품으로 정의할 수 있었습니다.
- 별도 시스템에 포트폴리오 데이터를 복제하지 않고 기존 API와 연동해야 했습니다.
핵심 의사결정
01사용자가 실제로 연결하는 MCP 클라이언트를 기준으로 설계한다
초기 논의에서는 데스크톱 중심의 LLM 환경을 가정했습니다. 하지만 실제 시스템은 사용자가 Claude나 GPT에서 MCP를 연결하는 흐름에서 작동해야 했고, 사용자 조사에서 확인한 CLI 업무 방식도 지원해야 했습니다. 최초 가정을 유지하지 않고 실제 연결 환경을 중심으로 설계했습니다.
이 결정으로 상호작용 방식, 인증 경로, 도구 결과를 반환하는 방식이 함께 달라졌습니다.
02API가 아니라 사용자 업무를 기준으로 도구를 정의한다
고객 플랫폼에는 115개의 API가 있었지만 모든 엔드포인트를 제공하는 것이 목표는 아니었습니다. 투자자가 완료하려는 업무를 중심으로 데이터와 기능을 묶고, 이를 6개 기능으로 정의했습니다.
MCP 서버가 기존 API를 그대로 복제한, 사용하기 어려운 도구 모음이 되지 않도록 한 결정입니다.
03고객의 기존 인증 시스템을 재사용한다
MCP 서버에 별도의 인증정보 저장소를 만들지 않기로 했습니다. 별도 저장소는 신원 데이터를 중복시키고 새로운 보안 경계를 만들며, 계정 변경을 일관되게 유지하기 어렵게 합니다.
대신 Claude나 GPT에서 MCP 서버를 연결하면 고객의 자체 로그인으로 이어지도록 했습니다. 이후 서버는 별도 계정을 만들지 않고 고객이 검증한 신원과 소속 회사 정보를 사용합니다.
기존 인증 체계를 재사용해도 위험이 사라지지는 않고 토큰으로 옮겨갈 뿐입니다. 고객 서비스 흐름의 접근 제어 취약점을 진단하고, 인가 코드 교환에 PKCE를 적용한 뒤 발급된 토큰을 Fernet으로 암호화한 DiskStore에 저장했습니다. 디스크가 탈취되거나 세션이 유출되어도 그대로 사용 가능한 자격 증명이 되지 않도록 했습니다.
04모든 요청에서 회사 컨텍스트를 명시적으로 관리한다
한 명의 투자자가 여러 회사에 소속될 수 있어 인증만으로는 데이터 범위를 결정할 수 없었습니다. 서버는 사용자가 어느 회사의 데이터로 작업하려는지도 알아야 했습니다.
두 가지 방식으로 설계했습니다. 요청에 명시적인 회사 키워드가 있으면 해당 회사를 추출하고, 사용자가 변경하거나 확인할 수 있는 명시적 회사 전환 기능을 제공합니다. 선택된 컨텍스트는 이후 도구 핸들러와 고객 API까지 전달됩니다.
05전체 기능을 완성하기 전에 사용자와 개발 순서를 검증한다
6개 기능을 동일한 우선순위로 보지 않았습니다. 사용자 사전 테스트로 보고 자료 수집 현황을 첫 구현 대상으로 정하고, 검토 현황 브리핑과 펀드 성과·자본금을 다음 순서로 배치했습니다.
개발 순서를 사용자 가치로 설명할 수 있게 되었고, 실제 가치를 더 일찍 검증할 경로를 만들었습니다.
서비스 아키텍처
인증과 회사 전환
이 과정이 프로젝트에서 가장 어려운 통합 문제였습니다. 6개 기능이 유용하더라도 인증이나 회사 컨텍스트가 신뢰할 수 없다면 제품 전체가 작동하지 않습니다.
사용자가 MCP 서버를 연결합니다
Claude 또는 GPT에서 연결하며, 조사에서 확인한 CLI 업무 방식도 포함합니다.
MCP 클라이언트가 서버에 접속합니다
도구 호출에는 일반적인 브라우저 세션이 없기 때문에 쿠키로 신원을 가정할 수 없습니다.
고객의 기존 로그인으로 연결됩니다
별도 인증정보 저장소를 만들지 않습니다. 이 사람이 누구인지는 고객 시스템이 계속 판단합니다.
서버가 검증된 신원을 전달받습니다
제가 발급한 신원이 아니라 고객이 검증한 신원입니다.
해당 사용자가 접근할 수 있는 회사 목록을 조회합니다
한 투자자가 여러 회사에 소속될 수 있으므로, 신원만으로는 아직 데이터 범위가 아닙니다.
회사를 선택합니다
요청에 포함된 명시적 회사 키워드로 추출하거나, 회사 전환 기능으로 설정합니다.
도구 핸들러가 해당 회사 범위로 API를 호출합니다
핸들러마다 다시 계산하지 않고, 컨텍스트가 요청을 따라 이동합니다.
다른 회사의 데이터를 노출하지 않고 결과를 반환합니다
회사 격리는 마지막에 걸러내는 필터가 아니라 요청 경로 자체의 속성입니다.
실제 도구 호출 한 건
사용자가 가장 먼저 필요하다고 답한 보고 자료 수집 현황 기능의 예시입니다. 값은 모두 대체 데이터이며 고객 데이터는 포함되어 있지 않습니다.
같은 요청이라도 회사 컨텍스트가 다르면 다른 결과가 반환되며, 두 회사가 함께 반환되는 경우는 없습니다. 회사 격리는 응답을 잘라내는 방식이 아니라 API로 가는 경로에서 적용됩니다.
구현
제품 범위 정의와 서버 구현을 함께 진행했습니다.
- VC 투자자 3명의 업무와 LLM 사용 방식을 인터뷰했습니다.
- 후보 업무를 115개 플랫폼 API 및 보유 데이터와 대조했습니다.
- 6개 기능을 정의하고 사용자 사전 테스트로 우선순위를 정했습니다.
- Claude / GPT MCP 상호작용 방식과 도구 구성을 명세했습니다.
- 서버 아키텍처와 고객 인증 연동 구조를 설계했습니다.
- 사용자 소속 회사 조회와 회사 컨텍스트 전환을 구현했습니다.
- MCP 서버와 6개 업무별 도구 핸들러를 모두 직접 작성했습니다.
- 고객 자체 로그인과 다중 회사 컨텍스트 연동을 완성했습니다.
- 전체 시스템을 테스트하고 2개월 안에 납품했습니다.
결과 — 그리고 주장하지 않는 것
납품한 것
- 구체적이지 않았던 MCP 요청을 실제 작동하는 6개 투자 업무로 구현했습니다.
- 플랫폼 API 115개를 사용자 요구와 사용 가능한 데이터에 맞춰 분석했습니다.
- VC 투자자 3명과의 사전 테스트로 개발 순서를 결정했습니다.
- Claude·GPT에서 MCP를 연결할 때 고객 자체 로그인을 사용하도록 구현했습니다.
- 인증, 회사 전환, 회사별 데이터 격리를 핵심 시스템 동작으로 완성했습니다.
- 2개월 단독 프로젝트 전체를 유료 고객 프로젝트로 납품했습니다.
납품 상태
- 제품 정의, MCP 서버, 6개 업무 기능, 고객 로그인, 다중 회사 컨텍스트까지 모두 완료했습니다.
- 고객 프로젝트는 개발과 납품이 종료된 상태입니다.
주장하지 않는 것
- 납품 이후 사용량 지표는 프로젝트 범위가 아니었고 여기서 주장하지 않습니다.
- 고객 만족도는 이번 프로젝트에서 측정하지 않았습니다.
배운 점
고객이 특정 기술을 요청하더라도 제품은 별도로 발견하고 정의해야 합니다. 실제 명세는 사용자의 업무, 플랫폼이 보유한 데이터, 고객이 운영하는 보안 체계가 만나는 지점에서 만들어졌습니다.
기능 목록은 시스템의 일부에 불과했습니다. 인증과 회사 컨텍스트는 모든 업무 결과를 신뢰할 수 있는지를 결정하기 때문에, 처음부터 제품 동작의 일부로 설계해야 했습니다.
모든 다이어그램은 실제 구조를 바탕으로 다시 그렸으며, 고객사명·데이터·식별자는 제거했습니다.