멍청한 질문일 수 있지만 MCP에 대해 알아보게 된 시작이 저 질문이었다. 여기저기서 AI, LLM 같은 용어들이 쏟아지고 있고 자세히는 모르지만 프론트보다는 백엔드와 밀접해보였다.
"MCP가 요즘 왜 이렇게 인기가 많을까?"
"프론트 개발자에게 어떤 의미가 있을까?"
다른 기술 블로그처럼 깊이있게 정리하지 못하더라도 MCP 개념과 React로 구현한 MCP 구조 기반 예시도 정리해보았다.
MCP는 최근 Claude(Anthropic)를 통해 알려진 Model Context Protocol을 의미한다. MCP는 대규모 언어 모델(LLM)이 외부 도구(API, 파일, 데이터베이스 등)와 연결되어 작동할 수 있게 도와주는 표준화된 통신 프로토콜이다.
"모델과 외부 시스템을 연결하는 다리" 라고 할 수 있다.
하지만 MCP는 단순히 기술 명세를 넘어서, Model-Chain Programming이라는 개념으로 이어져 사용된다.
📷 MCP는 일종의 'AI 파이프라인 설계도'와 같다.
🔗 참고한 블로그
지피티 같은 생성형 AI만 봐도 알 수 있듯이 "사용자 요청 → 키워드 추출 → 검색 → 요약 → 결과 전달" 같은 복합 로직이 필요한 시대이다.
MCP는 이러한 복잡한 AI 워크플로우를 모듈화 + 체인화하는 데 최적화된 방식이기에 인기를 얻게 되었다.
프론트엔드 개발자는 특히 LLM API와 연결된 UX를 구현할 일이 많아지고 있다. 따라서 MCP 개념은 다음과 같은 장점을 가져올 수 있다.
코드로 보면 이해가 쉬울 것 같아서 지피티 도움을 받아 코드를 작성해보았다.
사용자 입력 : React에서 상태 관리 어떻게 하나요?
↓
Step 1 키워드 추출 결과
React, 상태 관리
↓
Step 2 요약
React에서는 useState, useReducer, Context API 등을 통해 상태 관리를 할 수 있으며...
매우 단순하지만, 체이닝의 기본을 이해하기 쉬운 구조라고 생각했다.
즉, 이전 단계의 결과가 다음 단계의 입력이 되는 흐름이 체인처럼 연결되어 있으며, 이것이 바로 MCP의 기본 형태이다.
💡 이러한 흐름을 UI와 연결하여 사용자의 입력 흐름에 따라 AI 응답을 단계적으로 조정할 수 있다.
"use client";
import { useState } from "react";
export default function MCPExample() {
const [input, setInput] = useState("");
const [result, setResult] = useState("");
const [loading, setLoading] = useState(false);
const callOpenAI = async (prompt: string) => {
const res = await fetch("/api/gpt", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ prompt }),
});
const data = await res.json();
return data.result;
};
const handleMCP = async () => {
setLoading(true);
setResult("Step 1: 키워드 분석 중...");
const keywords = await callOpenAI(
`다음 문장에서 핵심 키워드를 뽑아줘: ${input}`
);
setResult(`Step 2: 요약 생성 중...\n(키워드: ${keywords})`);
const summary = await callOpenAI(
`다음 키워드를 기반으로 간단히 설명해줘: ${keywords}`
);
setResult(summary);
setLoading(false);
};
return (
<div>
<h1>MCP 기반 요약 도우미</h1>
<textarea
rows={3}
placeholder="궁금한 내용을 입력하세요"
value={input}
onChange={(e) => setInput(e.target.value)}
/>
<button
disabled={loading}
onClick={handleMCP}
>
{loading ? "처리 중..." : "요약하기"}
</button>
<pre>
{result}
</pre>
</div>
);
}
// app/api/gpt/route.ts
import { OpenAI } from "openai";
import { NextResponse } from "next/server";
const openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY });
export async function POST(req: Request) {
const { prompt } = await req.json();
const completion = await openai.chat.completions.create({
messages: [{ role: "user", content: prompt }],
model: "gpt-3.5-turbo",
});
return NextResponse.json({
result: completion.choices[0].message.content,
});
}
MCP는 이제 AI 개발의 표준이 될 수 있는 구조이므로 틈날 때마다 관련 글을 찾아보고 단일 호출보다는 체이닝 구조 흐름 설계를 고려하는게 필요해보였다.
('음식 추천 → 성분 분석 → 영양 요약' 흐름도 MCP 구조로 만들기?)
리펙토링 경험을 물어볼 때도 이제 MCP 기반으로 리펙토링을 해본 경험이 있는지 질문할 것 같다.