https://codekunst.tistory.com/176
Lang Chain 공부 용어 정리 (1)
https://wikidocs.net/book/14314https://docs.langchain.com/oss/python/langchain/overview LangChain overview - Docs by LangChainLangChain is an open source framework with a pre-built agent architecture and integrations for any model or tool — so you can bu
codekunst.tistory.com
이전글에 이어서 계속
어제 MCP 얘기 하다가 잘 모르는 것 같아서 이것에 대해 정리를 하고자 한다.
MCP (Model Context Protocol)
구글에 검색해보면 뭐 이런 이야기가 나온다.
MCP는 모델 컨텍스트 프로토콜(Model Context Protocol)의 약자로, AI 모델(LLM)이 학습 데이터를 넘어 외부 세계의 데이터, 도구, 시스템과 안전하고 표준화된 방식으로 연결되고 통신할 수 있도록 하는 개방형 오픈소스 표준입니다. 이는 USB-C 포트처럼 다양한 기기와 서비스가 AI와 쉽게 연동되도록 돕는 '통역사' 또는 '연결 규약' 역할을 하며, AI가 더 현실 세계의 정보를 읽고, 쓰고, 실행하는 에이전트 역할을 할 수 있게 합니다.
USB같은 것이다라고 하는데 솔직히 처음 보면 뭔 말인지는 잘 모르겠다.
프로토콜은 일단 알 것이다. 규약? 규칙? 그런 느낌이고
이런 방식으로 우리는 통신을 할거야 하면서 사전에 정의된 규격인데
AI 모델들이 서로 통신을 할 수 있게 사전에 정의해둔 규칙이라고 정리를 했다.
일단 MCP 클라이언트가 있고 MCP 서버가 있다.
우리가 자주 쓰는 Cursor IDE는 MCP 클라이언트이다.
이제 서버-클라이언트 구조는 우리도 잘 알고 있듯 클라이언트가 서버한테 요청을 보내서 응답을 받는 구조이다. ( HTTP, HTTPS 등 )
그것과 비슷하게 MCP 클라이언트가 있고 ( Cursor ) 애가 MCP 서버 (Notion, Figma, Jira, Github 등) 로 요청을 보내고 응답을 받는 것이다.
서버-클라이언트 구조인데 우리는 모델들( LLM, IDE 등 )끼리 컨텍스트 ( resources, tools, prompts ) 등을 사전에 정의한 대로 주고 받겠다 이정도로 이해할 수 있다.
이러면 또 context에 대해 짚고 넘어가야하는데 resources, tools, prompts 이 3개가 있다고 했다.
cursor가 notion에서 데이터 가져와서 CRUD 하고 하는 과정을 떠올려보자
resources는 notion database에 있는 정보이다. 데이터, 뭐 내용 이런게 있을 것이다.
tools는 CRUD이다. 어떤 작업을 수행할 수 있는지에 대한 내용이 있다. 글 읽기, 블록 추가 뭐 이런게 있을 것이다.
prompts는 cursorrules처럼 AI가 일관되게 일을 하게끔 하는것이다. 프론트 하다가 보면 얘가 가끔 css를 tailwind로 바꿔버리는데 이런거 못바꾸게 강제하는 용도로 종종 쓰인다.
컨텍스트는 이렇게 정의가 된다고 한다.
그러면 실제로 한번 예제를 구현해보면 더 이해가 잘 갈 것이다.
https://docs.langchain.com/oss/python/langchain/mcp
Model Context Protocol (MCP) - Docs by LangChain
Using MCP ClientSession for stateful tool usage
docs.langchain.com
MCP 클라이언트는 이렇게 정의를 한다고 한다.
로컬에서는 standard I O <- 이거 C언어할때 #include stdio.h 였나 그거할때 그거 맞다.
그래서 로컬에서 프로그램 띄우고 파이프로 통신을 한다는 뜻이다.
http는 잘 알거고
이렇게 전송 계층을 설정해준다.
from langchain_mcp_adapters.client import MultiServerMCPClient
from langchain.agents import create_agent
client = MultiServerMCPClient(
{
"math": {
"transport": "stdio", # Local subprocess communication
"command": "python",
# Absolute path to your math_server.py file
"args": ["/path/to/math_server.py"],
},
"weather": {
"transport": "http", # HTTP-based remote server
# Ensure you start your weather server on port 8000
"url": "http://localhost:8000/mcp",
}
}
)
tools = await client.get_tools()
agent = create_agent(
"claude-sonnet-4-5-20250929",
tools
)
math_response = await agent.ainvoke(
{"messages": [{"role": "user", "content": "what's (3 + 5) x 12?"}]}
)
weather_response = await agent.ainvoke(
{"messages": [{"role": "user", "content": "what is the weather in nyc?"}]}
)
agent를 선언하고 invoke (실행) 시키면 응답을 반환한다.
invoke 앞에 붙어 있는 a는 보통 async 비동기 이런거 의미할것이다.
클라이언트를 위에서 선언했으니 서버도 실행을 해야겠지?
파이썬에는 FastAPI라는게 있는데 거기서 FastMCP 이런거 또 만들어놨다. 이상한거 잘 끓여온다 ㅋㅋ
아래 2개 이제 실행해 놓으면 수학 문제 풀어주는 MCP 서버는 더하기랑 곱하기 tool을 제공해주고
날씨 알려주는 MCP 서버는 날씨 알려주는 tool을 제공한다.
여기서도 마찬가지로 전송 계층을 정해줘야 한다. ( stdio, http )
from fastmcp import FastMCP
mcp = FastMCP("Math")
@mcp.tool()
def add(a: int, b: int) -> int:
"""Add two numbers"""
return a + b
@mcp.tool()
def multiply(a: int, b: int) -> int:
"""Multiply two numbers"""
return a * b
if __name__ == "__main__":
mcp.run(transport="stdio")
from fastmcp import FastMCP
mcp = FastMCP("Weather")
@mcp.tool()
async def get_weather(location: str) -> str:
"""Get weather for location."""
return "It's always sunny in New York"
if __name__ == "__main__":
mcp.run(transport="streamable-http")
참고로 http는 웹 개발할 때처럼 헤더에 파라미터 붙여서 인증 인가 이런거 가능하다.
위의 코드를 다시한번 정리를 해보면
사용자 입장에서는 MCP 서버 등록하고 ( Cursor에다가 Notion, Figma MCP 쓸거다 하고 등록하는 과정 )
client = MultiServerMCPClient(
{
"math": {
"transport": "stdio", # Local subprocess communication
"command": "python",
# Absolute path to your math_server.py file
"args": ["/path/to/math_server.py"],
},
"weather": {
"transport": "http", # HTTP-based remote server
# Ensure you start your weather server on port 8000
"url": "http://localhost:8000/mcp",
}
}
)
외부 MCP 서버에는 어떤 도구를 쓸 수 있는지 get_tools()로 가져오고
어떤 AI Agent로 쓸건지 설정한 다음에 걍 실행하면 된다.
tools = await client.get_tools()
agent = create_agent(
"claude-sonnet-4-5-20250929",
tools
)
math_response = await agent.ainvoke(
{"messages": [{"role": "user", "content": "what's (3 + 5) x 12?"}]}
)
weather_response = await agent.ainvoke(
{"messages": [{"role": "user", "content": "what is the weather in nyc?"}]}
)
MCP 서버에서 어떤 도구가 구현되어 있는지 몰라도 그냥 AI가 가져다가 쓸 수 있도록 하는 것.
그것이 MCP이다.
공식문서 아래에 더 보면 여러가지 스킬들이 있는데 이는 필요하면 찾아보도록 하고 오늘은 여기까지 이해하는 것으로 만족하자.
처음에는 외부에서 제공해주는 API랑 MCP랑 뭐가 다른거지? 했었는데
둘은 크게 서로 다르지 않다.
MCP 서버가 내부적으로 기존의 Rest API/SDK 등을 쓰는 경우가 많다고 한다.
이것도 예시를 들자면
배포가 성공하면 발생하면 슬랙 메시지로 알려주는 기능이 있다고 생각해보면
이건 슬랙의 API이다.
여기서 MCP가 적용이 된다고 하면 슬랙 API를 -> @tool로 만들어주고
Supervisor Agent( LLM )가 그런 tool을 가지고 배포 결과를 바탕으로 LLM이
장애 분류, 원인 요약, 담당자 멘션 결정, 채널 라우팅, 템플릿 선택 같은 판단/오케스트레이션을 해야 할 때 쓰인다.
결국에는 정리하면 더 쉽게 다양한 기능을 쓰기 위해서 사용한다고 생각하면 된다.
실습 사진

클로드 코드로 내 로컬 MCP 서버를 띄워놓고 연동하기

'AI공부' 카테고리의 다른 글
| Termin AI ( feat. 개발자들의 집단 지성 ) (1) | 2026.01.16 |
|---|---|
| OpenCode 알아보기 (2) | 2026.01.11 |
| 클로드 코드 창시자의 클로드 코드 꿀팁 13가지 (0) | 2026.01.08 |
| Lang Chain 공부 용어 정리 (1) (1) | 2025.12.26 |