LLM과 외부 세계를 연결하는 새로운 기술: OpenAI Function Calling, MCP

August 12, 2025 이종수 조회수 4,003

생성형 AI 기술이 고도화되면서 LLM과 외부 시스템 간의 실시간 상호작용이 필수 요소가 되었습니다. 이러한 상호작용을 가능하게 하는 핵심 기술을 개발자의 입장에서 간단하고 실용적으로 소개합니다.

들어가며

오늘날 생성형 AI 기술이 급속히 발전하면서 다양한 AI 모델과 서비스가 등장하고 있지만 이들 대부분은 여전히 고립된 ‘섬’처럼 따로따로 작동하고 있습니다. 예를 들어 ChatGPT 같은 언어 모델은 구글 드라이브에 저장된 문서를 직접 읽지 못하고 Slack의 대화내용을 가져오지 못합니다. Anthropic의 Claude 모델도 마찬가지로 기업 내부 데이터베이스에 접근하기 어렵습니다. 또한 복잡한 작업을 여러 전문 AI가 협력해서 처리하려 해도 그동안 서로 정보를 주고받을 수 있는 표준화된 방법이 없었습니다.

이러한 한계를 극복하고자 AI 업계에서는 LLM이 외부 세계와 상호작용할 수 있도록 지원하는 새로운 기술과 표준을 마련했습니다. OpenAI는 자사 LLM에 외부 시스템을 호출할 수 있는 함수 호출(Function Calling) 기능을 도입했고, Anthropic은 MCP(Model Context Protocol)라는 개방형 프로토콜로 AI 모델에 통일된 컨텍스트를 제공하는 방법을 제시했습니다. 

이제 이러한 기술이 각각 무엇이며 개발자에게 어떤 의미가 있는지 살펴보려고 합니다.

OpenAI 함수 호출이란?

OpenAI의 함수 호출(Function Calling) 기능부터 알아보겠습니다. Function Calling은 GPT-4와 GPT-3.5 모델에 새롭게 추가된 기능으로, LLM이 필요에 따라 외부 함수를 호출할 수 있도록 합니다. 쉽게 말하면, 개발자가 미리 정의해준 ‘도구’들을 AI 모델이 스스로 사용할 수 있게 하는 방법이죠. 


예를 들어, 개발자가 먼저 LLM에 get_weather 함수를 사용할 수 있다는 정보를 제공합니다. 그 후 사용자가 “파리 날씨는 어때?” 혹은 “파리에 소풍가려고 하는데 어때?”라고 묻는 경우, 모델이 내부적으로 get_weather("Paris") 같은 함수를 호출해야 한다고 판단해서 JSON 형식으로 함수를 호출하는 응답을 생성합니다. 그러면 애플리케이션이 실제 날씨 API를 통해 정보를 가져와 모델에 전달하고, 모델은 최신 날씨 정보를 참고하여 사용자에게 답을 해줄 수 있습니다.

OpenAI에서 제공한 전체 흐름을 살펴보겠습니다.




• 함수 정의 : 먼저, 개발자가 사용 가능한 함수를 정의합니다. 예를 들어 get_weather 함수는 특정 위치의 날씨 정보를 반환하도록 설계됩니다. 이 함수의 이름, 설명, 입력 매개변수(예: location)를 JSON 스키마로 모델에 제공합니다.

• 사용자 입력 : 사용자가 “파리 날씨는 어때?”와 같은 질문을 하면 모델은 이 입력을 분석하여 필요한 경우 적절한 함수를 선택합니다.

• 함수 호출 결정 : 모델은 제공된 함수 목록 중에서 get_weather 함수가 적합하다는 판단을 하고 필요한 인자(location: "Paris")를 생성하여 반환합니다.

• 함수 실행 : 모델은 직접 함수를 실행하지 않습니다. 대신, 개발자가 모델이 반환한 인자를 사용하여 실제 get_weather("Paris") 함수를 호출합니다. 이 함수는 외부 API(OpenWeatherMap 등)를 통해 파리의 현재 날씨 정보를 가져옵니다.

• 결과 전달 및 응답 생성 : 함수의 실행 결과(예: {"temperature": 18})를 모델에 다시 전달하면 모델은 이를 바탕으로 자연스러운 응답을 생성합니다. 예를 들어 “현재 파리의 기온은 18도입니다.”와 같은 문장을 반환합니다.

AI계를 위한 USB-C: MCP의 개념

이제 MCP(Model Context Protocol)를 살펴보겠습니다. MCP는 Anthropic이 2024년 말에 공개한 개방형 프로토콜로, AI 모델에 컨텍스트를 제공하는 방식을 표준화한 기술입니다. 한마디로 다양한 외부 데이터 소스나 도구를 AI에 연결해주는 범용 USB-C 포트에 비유되곤 합니다.

이러한 MCP의 역할은 앞서 소개한 OpenAI 함수 호출(Function Calling)이 지향하는 바와 일맥상통합니다. 두 방법 모두 AI 모델이 외부 세계의 정보를 활용할 수 있게 해준다는 공통 목표를 가지고 있죠. 다만 OpenAI의 함수 호출이 특정 벤더(OpenAI) 환경에 특화된 기능인 반면, MCP는 누구나 구현하고 참여할 수 있는 개방형 표준이라는 점에서 범용성이 더 높습니다.


실제로 MCP가 등장하기 전까지는 AI 서비스마다 플러그인이나 API 방식이 제각각이어서 새로운 도구를 연동할 때마다 별도의 통합 작업이 필요했습니다. Anthropic의 MCP 발표 이후 OpenAI를 비롯한 여러 회사들이 지원을 선언하면서 MCP는 사실상의 업계 표준으로 빠르게 자리 잡고 있습니다.


 


예를 들어 GPT가 AWS S3 object 정보를 사용하는 서비스를 개발하려면 AWS S3와 관련된 Function calling을 선언해야 하며 GPT의 요청을 처리하는 Application이 필요합니다. 이러한 Application은 AWS S3에 접근하기 위해 Python용 SDK(예: Boto3)를 사용해야 합니다. 

만약 모델이 GPT에서 Gemini로 변경되면 Application의 logic이 functions에서 tools 방식으로 전환되고 처리 logic도 변경됩니다. 또한 backend DB의 구현체가 python에서 java로 변경되면 driver 및 client의 코드도 바뀌게 됩니다.




기존에는 서로 다른 AI 모델 M개와 도구 N개를 연동하려면 각 조합마다 별도의 통합 코드를 작성해야 하는 이른바 ‘M×N 문제’가 있었습니다. 그런데 MCP를 도입할 경우 하나의 공통 프로토콜만 구현하면 되므로 이러한 비효율을 해소할 수 있습니다.

MCP 서버 개발: 어떻게 구현할까?

MCP는 기본적으로 클라이언트-서버 아키텍처로 동작합니다. 여기서 MCP 서버란 파일 시스템, 데이터베이스, 외부 API 같은 특정 데이터 소스나 서비스를 연결하기 위해 만든 일종의 경량 커넥터 프로그램이고, MCP 클라이언트는 AI 모델측 호스트 애플리케이션에 내장되어 이러한 서버들과 통신하는 컴포넌트입니다. 가장 대표적인 MCP 클라이언트는 Cursor, Claude Desktop과 같은 AI IDE입니다.


Smithery(https://smithery.ai/)는 MCP 기반 서버 레지스트리로, 이미 4,000개 이상의 MCP 서버가 등록되어 있습니다. 사용자는 이들 서버를 자유롭게 선택하여 자신의 에이전트에 연동할 수 있습니다. 마치 API 마켓플레이스처럼 필요한 기능을 손쉽게 가져다 쓸 수 있는 환경이 제공됩니다.

 



예시로, Smithery에서 Desktop Commander(MCP 서버)를 다운로드하여 Cursor AI(MCP 클라이언트)를 실행해보겠습니다. 

Cursor AI(MCP 클라이언트)는 LLM 모델이기 때문에 사용자의 컴퓨터 정보를 알 수 없지만 Desktop Commander(MCP 서버)를 이용해서 정보를 얻고 대답을 생성할 수 있습니다. (설정하는 방법은 인터넷에 잘 나와있기 때문에 생략하겠습니다.)

 



이번에는 저희 그룹에서 자체 개발한 AWS S3 호환 Gage MCP 서버를 실행해보겠습니다. Gage MCP 서버는 버킷 리스트를 불러올 수 있는 기능과 해당 버킷의 오브젝트 리스트를 불러 올 수 있는 기능을 포함하고 있습니다. 이 MCP 서버는 Cursor AI 등의 LLM 기반 에이전트 플랫폼(MCP 클라이언트)에서 사용할 수 있는 함수와 리소스를 외부에 노출하고, 설명하며, 실행 요청을 처리할 수 있도록 합니다.


MCP 서버를 개발할 때 가장 기본적으로 알아야 할 3가지 핵심 개념이 있습니다.

• Tool : LLM이 외부 시스템에 명령을 내려 행동(Write, Action 등)을 수행하도록 할 때 사용됩니다.

• Resource : 외부 시스템의 데이터 조회(Read-only)를 위한 표준 인터페이스입니다.

• Prompts : 모델이 Gage MCP 서버를 사용할 때어떤 형태로 질문을 만들고 결과를 어떻게 활용해야 하는지 안내하는 샘플 지침 템플릿 역할을 합니다.

 



Gage MCP는 Tools로 gage_bucket_list와 gage_object_list 함수를 노출하고 있습니다. 여기에 Prompts로 각 tool의 설명을 추가했습니다. 예를 들어, list_bucket 함수는 AWS 계정 내에 존재하는 모든 버킷 정보를 조회한다는 내용과 인자 정보를 입력으로 받지 않는다는 내용을 포함했습니다.


실제로 동작하는 모습은 다음과 같습니다. LLM이 사용자의 query 요청을 보고 필요한 경우 MCP gage에 요청을 보내 AWS S3 버킷 정보를 읽어서 대답을 해줍니다.

 



위의 예시처럼 MCP는 똑똑한 뇌만 존재하는 AI에 팔과 다리를 붙여줄 수 있습니다. 즉, 추론만 가능하던 LLM이 MCP를 통해 외부 도구나 기능을 손쉽게 활용함으로써 단순한 대화형 도우미를 넘어 실제 문제를 해결할 수 있는 도구로 확장됩니다.

앞으로 AI가 더 복잡하고 실용적인 역할을 수행하는 시대에 대비하기 위해 개발자들이 MCP와 같은 새로운 프로토콜의 활용과 도입을 적극적으로 고민해야 할 시점입니다.





저자

이종수

Cloud인프라개발그룹(MX)

이메일 문의하기