티스토리 뷰
MCP 서버 구축 방법을 처음 배우는 개발자라면 핵심은 단순합니다. MCP 서버는 AI 클라이언트가 외부 도구, 데이터, 프롬프트를 표준 방식으로 호출하게 해주는 작은 어댑터 서버입니다. 2026년 기준으로 입문자는 먼저 로컬 개발용 stdio 서버를 만들고, 운영 환경에서는 인증과 권한 제어가 가능한 Streamable HTTP 구성을 검토하는 흐름이 가장 현실적입니다. 이 글은 TypeScript 기준의 최소 구현, 도구 설계, 보안 체크리스트까지 한 번에 정리합니다.
MCP 서버 구축 방법: 먼저 이해해야 할 구조
MCP는 Model Context Protocol의 약자로, LLM 애플리케이션과 외부 시스템 사이의 연결 방식을 표준화하는 프로토콜입니다. 검색 의도상 이 글을 찾는 분들은 정보형 의도가 가장 강합니다. 즉 “MCP가 무엇인지”보다 직접 MCP 서버를 어떻게 만들고 어디에 붙이는지가 더 중요합니다.
MCP 서버는 보통 세 가지 기능을 노출합니다.
| 구성 요소 | 역할 | 예시 |
|---|---|---|
| Tools | AI가 실행할 수 있는 함수 | GitHub 이슈 생성, DB 조회, 날씨 조회 |
| Resources | AI가 읽을 수 있는 데이터 | 파일 내용, API 응답, 문서 목록 |
| Prompts | 재사용 가능한 프롬프트 템플릿 | 코드 리뷰 프롬프트, 보고서 작성 프롬프트 |
개발자가 만드는 MCP 서버는 대개 기존 API나 내부 시스템을 감싸는 얇은 계층입니다. 예를 들어 사내 위키 검색 API가 있다면, AI 클라이언트가 직접 API 형식을 알 필요 없이 search_docs 같은 MCP 도구만 호출하면 됩니다. 이 점 때문에 MCP는 “AI 통합용 공통 어댑터”에 가깝습니다.
2026년 현재 실무에서는 로컬 자동화, 개발 도구 연결, 문서 검색, 데이터베이스 조회, 사내 업무 시스템 연동에서 MCP 서버 수요가 빠르게 늘고 있습니다. 단, MCP 서버는 AI에게 실행 권한을 열어주는 구조이므로 기능 구현보다 권한 범위 설계와 입력 검증이 더 중요합니다.
MCP 서버 구축 준비물: Node.js, SDK, 실행 방식
입문자에게 가장 쉬운 선택지는 TypeScript와 공식 MCP SDK 조합입니다. Python도 많이 쓰이지만, Node.js 생태계는 CLI 배포와 npx 실행이 편해 로컬 도구형 MCP 서버를 만들기 좋습니다.
기본 준비물은 다음과 같습니다.
- Node.js 최신 LTS 버전
- TypeScript 기본 지식
@modelcontextprotocol/sdk- MCP 클라이언트 또는 Inspector 도구
- 연동할 외부 API 또는 로컬 데이터
서버 실행 방식은 크게 두 가지로 나뉩니다. 첫째, stdio 방식은 클라이언트가 서버 프로세스를 직접 실행하고 표준 입출력으로 JSON-RPC 메시지를 주고받습니다. 로컬 개발과 데스크톱 클라이언트 연결에 적합합니다. 둘째, Streamable HTTP 방식은 원격 서버 배포와 인증 구성이 필요한 경우에 적합합니다. 과거 SSE 기반 예제가 많이 보이지만, 2026년 기준 신규 구현에서는 Streamable HTTP 중심으로 검토하는 것이 안전합니다.
초기 학습 순서는 다음이 좋습니다.
- 로컬
stdioMCP 서버 만들기 - 단일 tool 추가하기
- Inspector로 호출 테스트하기
- 입력 스키마와 에러 처리 보강하기
- 인증이 필요한 경우 HTTP 배포 검토하기
중요한 주의점도 있습니다. stdio 서버에서는 JSON-RPC 메시지가 표준 출력으로 오가기 때문에, 일반 로그를 stdout에 찍으면 통신이 깨질 수 있습니다. 디버깅 로그는 stderr 또는 파일 로깅으로 분리해야 합니다.
MCP 서버 구축 예제: TypeScript 최소 서버 만들기
가장 단순한 예제로 “두 숫자를 더하는 도구”를 제공하는 MCP 서버를 생각해 보겠습니다. 실제 프로젝트에서는 이 자리에 데이터베이스 조회, REST API 호출, 파일 검색 같은 로직이 들어갑니다.
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
import { z } from 'zod';
const server = new McpServer({
name: 'starter-mcp-server',
version: '1.0.0'
});
server.tool(
'add_numbers',
{
a: z.number(),
b: z.number()
},
async ({ a, b }) => ({
content: [{ type: 'text', text: String(a + b) }]
})
);
const transport = new StdioServerTransport();
await server.connect(transport);
이 예제에서 중요한 부분은 도구 이름, 입력 스키마, 반환 형식입니다. 도구 이름은 AI 클라이언트가 기능을 이해하는 단서가 되므로 run, call, do_task처럼 모호하게 짓기보다 search_docs, create_issue, get_customer_summary처럼 구체적으로 작성하는 편이 좋습니다.
입력 스키마는 보안과 품질을 동시에 좌우합니다. z.string() 하나로 모든 요청을 받으면 구현은 편하지만, AI가 잘못된 형식의 값을 보내거나 위험한 명령을 전달할 가능성이 커집니다. 가능하면 enum, 숫자 범위, 문자열 길이 제한, 필수 필드 구분을 명확히 두어야 합니다.
반환값은 클라이언트가 읽기 쉬운 텍스트 중심으로 시작하면 충분합니다. 이후에는 구조화된 JSON, 링크, 리소스 URI 등으로 확장할 수 있습니다. 처음부터 모든 기능을 넣기보다 “작고 검증 가능한 tool 하나”를 먼저 완성하는 것이 MCP 서버 구축의 가장 빠른 학습 경로입니다.
MCP 서버 도구 설계: 좋은 tool과 나쁜 tool의 차이
MCP 서버 구축에서 초보자가 가장 많이 실수하는 지점은 도구를 너무 크게 만드는 것입니다. 예를 들어 manage_project라는 하나의 도구에 이슈 조회, 생성, 수정, 삭제를 모두 넣으면 AI 클라이언트가 언제 어떤 파라미터를 써야 하는지 판단하기 어려워집니다.
좋은 MCP tool은 다음 조건을 만족합니다.
- 이름만 봐도 동작이 분명합니다.
- 입력 필드가 적고 타입이 명확합니다.
- 실패했을 때 사용자에게 설명 가능한 에러를 반환합니다.
- 읽기 작업과 쓰기 작업이 분리되어 있습니다.
- 삭제, 결제, 권한 변경 같은 위험 작업은 확인 단계를 둡니다.
예를 들어 GitHub 연동 MCP 서버라면 다음처럼 나누는 편이 낫습니다.
| 나쁜 설계 | 좋은 설계 |
|---|---|
github_action |
list_issues |
manage_repo |
create_issue |
update_everything |
add_issue_comment |
execute_command |
run_readonly_query |
도구 설명도 중요합니다. AI 클라이언트는 tool 이름과 description을 참고해 호출 여부를 판단합니다. 따라서 description에는 “무엇을 하는지”, “언제 쓰면 되는지”, “무엇은 하지 않는지”를 짧게 적는 것이 좋습니다.
예시로 delete_file 같은 도구는 입문 단계에서 만들지 않는 편이 안전합니다. 대신 read_file, search_files, summarize_file처럼 읽기 중심 기능부터 시작하면 MCP 구조를 이해하면서도 사고 가능성을 낮출 수 있습니다. 실무에서도 처음에는 read-only 서버로 운영하고, 로그와 사용 패턴을 확인한 뒤 쓰기 권한을 제한적으로 추가하는 방식을 추천합니다.
MCP 서버 배포 방법: 로컬 stdio와 원격 HTTP 비교
MCP 서버 배포 방식은 사용 시나리오에 따라 달라집니다. 개인 개발 도구나 데스크톱 클라이언트에 붙이는 서버라면 stdio가 단순하고 안정적입니다. 반대로 여러 사용자가 같은 서버를 쓰거나, SaaS API처럼 중앙에서 권한을 관리해야 한다면 HTTP 기반 배포가 필요합니다.
| 기준 | stdio | Streamable HTTP |
|---|---|---|
| 적합한 환경 | 로컬 개발, 개인 도구 | 팀, 조직, SaaS 연동 |
| 인증 | 클라이언트 설정에 의존 | OAuth, API Key 등 구성 가능 |
| 배포 난이도 | 낮음 | 중간 이상 |
| 운영 모니터링 | 제한적 | 로그, 추적, 정책 적용 용이 |
| 보안 범위 | 로컬 권한 관리 중요 | 네트워크·사용자 권한 관리 중요 |
입문자는 먼저 stdio로 개발하고, 실제 사용자가 늘어나면 HTTP 전환을 검토하면 됩니다. 이때 단순히 transport만 바꾸는 것이 아니라 인증, rate limit, 감사 로그, 도구별 권한 정책을 함께 설계해야 합니다.
예를 들어 사내 문서 검색 MCP 서버를 HTTP로 배포한다면 사용자의 부서, 직급, 프로젝트 권한에 따라 검색 가능한 문서 범위가 달라져야 합니다. AI가 호출한다고 해서 기존 접근 제어를 우회해서는 안 됩니다. MCP 서버는 편의 계층이지 권한 우회 계층이 아닙니다.
운영 환경 체크리스트는 다음과 같습니다.
- 민감 정보가 응답에 포함되는지 점검
- tool별 호출 로그 저장
- 사용자별 권한 검증
- 외부 API 키의 서버 측 보관
- 요청 크기와 호출 빈도 제한
- 에러 메시지에 내부 경로나 토큰이 노출되지 않도록 처리
MCP 서버 보안 체크리스트: 2026년 입문자가 놓치기 쉬운 부분
MCP 서버는 AI와 외부 시스템을 연결하므로 일반 API 서버보다 공격면이 넓게 느껴질 수 있습니다. 특히 prompt injection, tool poisoning, 과도한 권한 부여, 로그 내 민감 정보 노출은 실제로 자주 논의되는 위험입니다.
가장 먼저 적용할 원칙은 최소 권한입니다. MCP 서버가 파일 시스템에 접근한다면 전체 홈 디렉터리가 아니라 특정 작업 폴더만 허용해야 합니다. 데이터베이스에 접근한다면 쓰기 계정이 아니라 읽기 전용 계정으로 시작하는 것이 좋습니다. 외부 SaaS API도 관리자 토큰 대신 필요한 scope만 가진 토큰을 사용해야 합니다.
두 번째는 입력 검증입니다. AI가 생성한 입력은 사용자가 직접 입력한 값만큼 신뢰하면 안 됩니다. SQL 쿼리, 셸 명령, 파일 경로, URL을 받는 도구는 특히 조심해야 합니다. 가능하면 자유 문자열 대신 enum과 구조화된 파라미터를 쓰고, 서버 내부에서 허용 목록을 기준으로 실행 대상을 제한해야 합니다.
세 번째는 확인이 필요한 작업을 분리하는 것입니다. 예를 들어 “이슈 생성”은 비교적 낮은 위험이지만 “고객 데이터 삭제”, “결제 실행”, “프로덕션 배포”는 단일 tool 호출로 실행되면 안 됩니다. 이런 작업은 preview tool과 confirm tool을 나누거나, 사람이 승인하는 워크플로를 둬야 합니다.
마지막으로 관측 가능성을 갖춰야 합니다. 누가 어떤 tool을 어떤 입력으로 호출했고 어떤 결과가 나왔는지 추적할 수 있어야 장애와 보안 사고에 대응할 수 있습니다. 단, 로그에는 액세스 토큰, 주민등록번호, 결제 정보 같은 민감 데이터를 남기지 않아야 합니다.
MCP 서버 구축 후 테스트와 디버깅 방법
MCP 서버를 만들었다면 바로 클라이언트에 연결하기보다 Inspector나 테스트 클라이언트로 tool 목록, 입력 스키마, 응답 형식을 먼저 확인해야 합니다. 이 단계에서 서버가 시작되지 않거나 tool이 보이지 않는 문제의 상당수가 드러납니다.
자주 발생하는 문제는 다음과 같습니다.
stdout로그 때문에 JSON-RPC 메시지가 깨짐- package type이 module로 설정되지 않아 import 오류 발생
- tool 입력 스키마와 실제 처리 함수의 타입이 다름
- 외부 API 키가 환경 변수에 없어서 런타임 오류 발생
- 클라이언트 설정의 command, args 경로가 잘못됨
테스트는 세 단계로 나누면 좋습니다. 첫째, 서버 프로세스가 정상 실행되는지 확인합니다. 둘째, tool 목록이 클라이언트에 노출되는지 확인합니다. 셋째, 정상 입력과 비정상 입력을 모두 호출해 에러 메시지가 안전하고 이해 가능한지 확인합니다.
실무에서는 간단한 회귀 테스트도 유용합니다. MCP 서버의 핵심 로직을 transport와 분리해 일반 함수로 만들면 단위 테스트가 쉬워집니다. 예를 들어 searchDocs(query) 함수는 MCP tool 내부가 아니라 별도 모듈로 두고, tool 핸들러는 입력 검증과 결과 포맷팅만 담당하게 만드는 방식입니다.
참고로 공식 문서에서는 MCP가 JSON-RPC 기반으로 동작하며, 서버가 tools, resources, prompts 같은 capability를 노출하는 구조를 설명합니다. 최신 세부 규격은 Model Context Protocol 공식 문서와 Registry 문서를 확인하는 것이 안전합니다.
핵심 요약
- MCP 서버 구축 방법의 핵심은 AI 클라이언트가 호출할 tool, resource, prompt를 표준 방식으로 노출하는 것입니다.
- 입문자는 TypeScript SDK와
stdiotransport로 로컬 서버를 먼저 만드는 것이 가장 쉽습니다. - 2026년 신규 원격 배포는 Streamable HTTP, 인증, 권한 제어, 감사 로그를 함께 검토해야 합니다.
- 좋은 MCP tool은 작고 명확하며, 읽기 작업과 쓰기 작업이 분리되어야 합니다.
- 입력 스키마는 보안 장치입니다. 자유 문자열보다 enum, 범위 제한, 구조화된 파라미터를 우선 사용하세요.
- 민감한 작업은 한 번의 tool 호출로 실행하지 말고 preview, confirm, human approval 흐름을 둬야 합니다.
- 테스트 시
stdout로그, 환경 변수, 클라이언트 command 경로, tool 스키마 불일치를 먼저 확인하면 디버깅 시간이 줄어듭니다. - 더 깊게 학습하려면 공식 MCP Quickstart, Specification, Registry 문서를 기준으로 예제를 확장하는 것이 좋습니다.
결론적으로 MCP 서버 구축은 거창한 AI 인프라 프로젝트라기보다, 기존 시스템을 AI 클라이언트가 안전하게 호출할 수 있도록 정리하는 개발 작업에 가깝습니다. 먼저 읽기 전용 tool 하나를 만들고, 스키마와 권한을 검증한 뒤, 필요한 기능만 단계적으로 늘려 보세요. 다음 단계로는 사내 문서 검색, GitHub 이슈 관리, 데이터베이스 읽기 전용 조회 같은 작은 MCP 서버를 직접 구현해 보는 것을 추천합니다.

'DEV' 카테고리의 다른 글
| 그라파나 대시보드 완벽 가이드 2026 (0) | 2026.05.24 |
|---|---|
| Docker Compose Watch 사용법 완벽 가이드 (0) | 2026.05.23 |
| AI 코딩 도구 비교 2026 완벽 가이드 (0) | 2026.05.23 |
| Next.js 15 App Router, 이것만 잡으면 된다 (0) | 2026.05.23 |
| 개발 핵심 개념: 배포, 릴리즈, 브런치, 실전 완벽 가이드 (0) | 2026.01.29 |
- Total
- Today
- Yesterday
- 프론트엔드개발
- DevOps
- 데이터베이스
- 백엔드개발
- ai 코딩 도구
- LLM
- 클라우드컴퓨팅
- 개발자가이드
- 생성형AI
- AI기술
- 웹보안
- 로드밸런싱
- 미래ai
- 개발가이드
- 웹개발
- 프롬프트엔지니어링
- 인공지능
- Java
- AI
- 자바개발
- 개발자성장
- n8n
- 클린코드
- 마이크로서비스
- 개발생산성
- springai
- AI반도체
- 성능최적화
- 배민
- SEO최적화
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | |||||
| 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| 10 | 11 | 12 | 13 | 14 | 15 | 16 |
| 17 | 18 | 19 | 20 | 21 | 22 | 23 |
| 24 | 25 | 26 | 27 | 28 | 29 | 30 |
| 31 |
