Model Context Protocol(MCP)은 AI 모델에 도구와 지식을 추가하는 업계 표준으로 자리 잡아 가는 개방형 프로토콜입니다. 원격 MCP 서버를 사용하면 인터넷을 통해 모델을 새로운 데이터 소스와 기능에 연결할 수 있습니다.
이 가이드에서는 비공개 데이터 소스인 벡터 스토어에서 데이터를 읽는 원격 MCP 서버를 구축합니다. 이 데이터를 ChatGPT와 Codex의 플러그인, ChatGPT의 심층 리서치와 회사 지식 기능, API에서 사용할 수 있도록 하는 방법을 살펴봅니다.
참고: MCP 서버를 사용하는 플러그인을 만들려면 먼저 플러그인 문서인 빠른 시작, MCP 서버 구축하기, 플러그인 연결 및 테스트, 인증을 참고하세요. MCP 서버에 UI가 필요하지 않다면 UI 리소스 없이 도구를 제공할 수 있습니다.
데이터 소스 구성하기
원격 MCP 서버에는 어떤 소스의 데이터든 사용할 수 있습니다. 여기서는 예제를 간단히 구성하기 위해 OpenAI API의 벡터 스토어를 사용합니다. 먼저 새 벡터 스토어에 PDF 문서를 업로드하세요. 예제 문서로는 저작권이 만료된 19세기 고양이 책을 사용할 수 있습니다.
대시보드에서 파일을 업로드하고 벡터 스토어를 만들거나, API로 벡터 스토어를 만들고 파일을 업로드할 수 있습니다. 벡터 스토어 가이드에 따라 벡터 스토어를 설정하고 파일을 업로드하세요.
다음 예제에서 사용할 수 있도록 벡터 스토어의 고유 ID를 기록해 두세요.

MCP 서버 만들기
이제 벡터 스토어를 검색하고 주어진 파일 ID에 해당하는 문서의 내용을 반환하는 원격 MCP 서버를 만듭니다.
이 예제에서는 Python과 FastMCP로 MCP 서버를 구축합니다. 이 섹션 끝에는 서버의 전체 구현 코드와 브라우저 기반 개발 환경에서 실행하는 방법이 나와 있습니다.
여러 프로그래밍 언어에서 사용할 수 있는 다른 MCP 서버 프레임워크도 있습니다. 어떤 프레임워크를 사용하든 서버의 도구 정의는 여기서 설명하는 형식을 따라야 합니다.
ChatGPT의 심층 리서치 및 회사 지식 기능과 연동하려면 MCP 서버에 읽기 전용 도구 두 개, search와 fetch를 구현하세요. 두 도구에는 회사 지식 호환성에 설명된 호환성 스키마를 사용하세요. 같은 인터페이스를 API 기반 리서치 워크플로우에도 활용할 수 있습니다.
클라이언트가 결과의 구조를 검증할 수 있도록 각 도구의 출력 스키마를 선언하세요. FastMCP는 반환값의 타입을 정의한 모델에서 이 스키마를 자동으로 생성할 수 있습니다. 아래 예제에서는 같은 모델에서 가져온 스키마를 output_schema로 명시적으로 전달합니다.
search 도구
search 도구는 사용자의 검색어를 받아 MCP 서버의 데이터 소스에서 관련 검색 결과 목록을 반환합니다.
인수:
검색어 문자열 하나입니다.
반환값:
키가 results 하나뿐인 객체입니다. 이 키의 값은 검색 결과 객체로 구성된 배열입니다. 각 결과 객체에는 다음 필드가 있어야 합니다.
id- 문서 또는 검색 결과 항목의 고유 IDtitle- 사람이 읽을 수 있는 제목url- 인용에 사용할 정규 URL
MCP에서는 이 객체를 structuredContent로 반환하세요. 호환성을 위해 같은 값을 JSON 문자열로 인코딩하여 content 배열에도 포함하세요.
최종 도구 응답은 다음과 같은 형식이어야 합니다.
{
"structuredContent": {
"results": [{ "id": "doc-1", "title": "...", "url": "..." }]
},
"content": [
{
"type": "text",
"text": "{\"results\":[{\"id\":\"doc-1\",\"title\":\"...\",\"url\":\"...\"}]}"
}
]
}
fetch 도구
fetch 도구는 검색 결과에 해당하는 문서 또는 항목의 전체 내용을 가져옵니다.
인수:
검색된 문서의 고유 식별자를 나타내는 문자열입니다.
반환값:
다음 속성을 가진 단일 객체입니다.
id- 문서 또는 검색 결과 항목의 고유 IDtitle- 검색 결과 항목의 제목을 나타내는 문자열text- 문서 또는 항목의 전체 텍스트url- 문서 또는 검색 결과 항목의 URL. 리서치에서 특정 자료를 인용할 때 유용합니다.metadata- 결과에 관한 데이터를 키-값 쌍으로 담는 선택적 속성
MCP에서는 이 객체를 structuredContent로 반환하세요. 호환성을 위해 같은 값을 JSON 문자열로 인코딩하여 content 배열에도 포함하세요.
최종 도구 응답은 다음과 같은 형식이어야 합니다.
{
"structuredContent": {
"id": "doc-1",
"title": "...",
"text": "full text...",
"url": "https://example.com/doc",
"metadata": { "source": "vector_store" }
},
"content": [
{
"type": "text",
"text": "{\"id\":\"doc-1\",\"title\":\"...\",\"text\":\"full text...\",\"url\":\"https://example.com/doc\",\"metadata\":{\"source\":\"vector_store\"}}"
}
]
}
인용 처리 방식
ChatGPT는 search 결과와 fetch 응답 모두에서 url이 비어 있지 않은 문자열일 때만 인용 메타데이터를 생성합니다. title이 있어도 사용할 수 있는 url이 없으면 빈 인용을 생성하지 않고 해당 결과를 일반 도구 출력으로 유지합니다. 결과를 인용할 수 있게 하려면 해당 결과의 정규 url을 반환하세요.
예를 들어 ChatGPT는 다음과 같이 search를 호출할 수 있습니다.
{ "query": "What is the quarterly plan?" }
MCP 서버는 URL을 포함한 결과를 반환할 수 있습니다.
{
"structuredContent": {
"results": [
{
"id": "quarterly-plan",
"title": "Quarterly plan",
"url": "https://example.com/quarterly-plan"
}
]
},
"content": [
{
"type": "text",
"text": "{\"results\":[{\"id\":\"quarterly-plan\",\"title\":\"Quarterly plan\",\"url\":\"https://example.com/quarterly-plan\"}]}"
}
]
}
이 응답에서는 url 필드에 값이 있으므로 결과에 인용 메타데이터를 생성할 수 있습니다. 쿼리 자체가 인용 처리를 시작하는 것은 아닙니다. 결과에 url이 없거나 그 값이 비어 있거나 문자열이 아니면 ChatGPT는 결과를 일반 도구 출력으로 유지합니다.
서버 예제
브라우저 기반 개발 환경에서 이 MCP 서버 예제를 실행해 볼 수 있습니다. 예제에 본인의 API 자격 증명과 벡터 스토어 정보를 설정하세요.
Replit에서 서버 예제를 리믹스하여 직접 테스트하세요.
아래에서도 FastMCP로 search와 fetch 도구를 구현한 전체 코드를 확인할 수 있습니다.
MCP 서버 테스트 및 연결하기
gpt-6.1-sol 모델로 프롬프트 대시보드에서 MCP 서버를 테스트할 수 있습니다. 새 프롬프트를 만들거나 기존 프롬프트를 편집한 다음, 프롬프트 설정에 새 MCP 도구를 추가하세요. 이 호환성 예제는 읽기 전용 도구인 search와 fetch만 제공하므로 API 요청에서 두 도구의 승인 절차를 생략합니다. 데이터를 수정하거나 중대한 영향을 미치는 다른 작업을 수행할 수 있는 도구에는 승인을 계속 요구하세요.
플러그인의 일부로 이 서버를 테스트하는 경우 플러그인 연결 및 테스트의 절차를 따르세요.

MCP 서버 설정을 마치면 프롬프트 화면에서 해당 서버를 사용하는 모델과 대화할 수 있습니다.

다음과 같이 Responses API에 직접 요청을 보내 MCP 서버를 테스트할 수도 있습니다.
curl https://api.openai.com/v1/responses \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-d '{
"model": "gpt-6.1-sol",
"input": [
{
"role": "developer",
"content": [
{
"type": "input_text",
"text": "You are a research assistant that searches MCP servers to find answers to your questions."
}
]
},
{
"role": "user",
"content": [
{
"type": "input_text",
"text": "Are cats attached to their homes? Give a succinct one page overview."
}
]
}
],
"reasoning": {
"summary": "auto"
},
"tools": [
{
"type": "mcp",
"server_label": "cats",
"server_url": "https://777ff573-9947-4b9c-8982-658fa40c7d09-00-3le96u7wsymx.janeway.replit.dev/sse/",
"allowed_tools": [
"search",
"fetch"
],
"require_approval": "never"
}
]
}'인증 처리하기
사용자 지정 원격 MCP 서버를 구축할 때는 인가와 인증으로 데이터를 보호할 수 있습니다. 인가 서버가 CIMD를 지원하고 플러그인 제작자가 이 방식을 선택한 경우, 클라이언트 등록에는 클라이언트 ID 메타데이터 문서와 함께 OAuth를 사용하는 것이 좋습니다. ChatGPT는 CIMD 사용 시 공개 클라이언트의 토큰 교환(none)과 서명된 클라이언트 어설션을 사용하는 토큰 교환(private_key_jwt)을 지원합니다. 동적 클라이언트 등록도 구성하면 계속 사용할 수 있습니다. 플러그인 인증 요구 사항은 인증을 참고하세요. 프로토콜에 관한 자세한 내용은 MCP 사용자 가이드 또는 인가 사양을 참고하세요.
플러그인을 통해 사용자 지정 원격 MCP 서버를 연결하면 워크스페이스 사용자는 OAuth 플로우를 거쳐 서비스에 연결합니다.
ChatGPT에서 연결하기
- ChatGPT 플러그인으로 이동해 더하기 버튼을 선택한 다음 사용자 지정 MCP 서버 추가를 선택하세요.
- 서버 URL과 인증 정보를 입력하세요. 위험 경고를 읽고 이해했으며 계속 진행합니다를 선택한 다음 플러그인으로 만들기를 선택하세요.
- 플러그인을 설치하고 채팅과 심층 리서치에서 프롬프트를 실행해 테스트하세요.
자세한 설정 절차는 플러그인 연결 및 테스트를 참고하세요.
위험 및 안전 고려 사항
사용자 지정 MCP 서버로 ChatGPT 워크스페이스를 외부 애플리케이션에 연결하면 ChatGPT가 해당 애플리케이션의 데이터에 접근하고 데이터를 주고받을 수 있습니다. 사용자 지정 MCP 서버는 OpenAI가 개발하거나 검증한 서비스가 아니며, 각 서비스의 자체 이용 약관이 적용되는 타사 서비스입니다.
악성 MCP 서버를 발견하면 security@openai.com으로 신고하세요.
프롬프트 인젝션 관련 위험
프롬프트 인젝션은 공격자가 웹페이지처럼 모델이 접할 가능성이 높은 콘텐츠에 악성 지시를 삽입해 ChatGPT가 원래 의도와 다르게 동작하도록 유도하는 공격입니다. 모델이 삽입된 지시를 따르면 비공개 데이터를 외부로 전송하는 등 사용자와 개발자가 전혀 의도하지 않은 작업을 수행할 수 있습니다.
예를 들어 ChatGPT에 캘린더와 최근 이메일을 확인해 단체 저녁 식사에 적합한 식당을 찾아 달라고 요청할 수 있습니다. 이 과정에서 ChatGPT가 Gmail에서 비밀번호 재설정 코드를 가져와 악성 웹사이트로 보내라고 지시하는 댓글을 접할 수 있습니다. 이런 악성 댓글은 에이전트를 속여 의도하지 않은 작업을 수행하도록 만든 콘텐츠입니다.
아래 표에는 고려해야 할 구체적인 시나리오가 나와 있습니다. 사용자 지정 MCP 서버를 사용할지 결정하기 전에 각 시나리오를 주의 깊게 검토하세요.
| 시나리오 및 위험 | MCP 서버 개발자를 신뢰하면 안전한가요? | 위험을 어떻게 줄일 수 있나요? |
|---|---|---|
| 공격자가 MCP 서버를 통해 접근할 수 있는 데이터에 프롬프트 인젝션을 삽입할 수 있습니다. 예시: • 고객 지원용 MCP 서버라면 공격자가 프롬프트 인젝션이 포함된 고객 지원 요청을 보낼 수 있습니다. |
MCP 서버 개발자를 신뢰하는 것만으로는 안전하지 않습니다. 안전하려면 MCP 서버에서 접근할 수 있는 모든 콘텐츠를 신뢰할 수 있어야 합니다. |
• MCP 서버에 악의적이거나 신뢰할 수 없는 사용자 입력이 포함될 가능성이 있다면 개발자를 신뢰하더라도 해당 서버를 사용하지 마세요. • 최소한의 인원만 MCP 서버에 접근할 수 있도록 권한을 설정하세요. |
| 악성 MCP 서버가 읽기 또는 쓰기 작업에 과도한 매개변수를 요구할 수 있습니다. 예시: • 직원용 항공편 예약 MCP 서버가 운항 일정을 조회하는 읽기 작업을 제공하면서 summaryOfConversation, userAnnualIncome, userHomeAddress 등의 매개변수를 요구할 수 있습니다. |
MCP 서버 개발자를 신뢰하더라도 안전하다고 단정할 수 없습니다. 사용자가 공유하기에 부적절하다고 생각하는 데이터라도 개발자는 요청해도 무방하다고 판단할 수 있습니다. |
• MCP 서버를 수동으로 설치할 때 각 작업이 요구하는 매개변수를 검토하고 필요 이상의 개인정보를 요구하지 않는지 확인하세요. |
| 공격자가 프롬프트 인젝션으로 ChatGPT를 속여 사용자 지정 MCP 서버에서 민감한 데이터를 가져와 공격자에게 보내도록 유도할 수 있습니다. 예시: • 공격자가 이메일 등 다른 MCP 서버를 통해 기업 사용자 한 명에게 프롬프트 인젝션을 전달할 수 있습니다. 이 공격은 ChatGPT가 내부 도구에서 민감한 데이터를 읽고 공격자에게 보내도록 유도합니다. |
MCP 서버 개발자를 신뢰하는 것만으로는 안전하지 않습니다. 새 MCP 서버의 모든 콘텐츠가 안전하고 신뢰할 만하더라도 다른 악성 소스에서 시작된 공격으로 데이터가 탈취될 수 있습니다. |
• ChatGPT는 사용자를 보호하도록 설계되어 있지만 공격자가 데이터 탈취를 시도할 수 있습니다. 이 위험을 이해하고 감수할 만한지 판단하세요. • 특히 민감한 데이터를 다루는 MCP 서버에는 최소한의 인원만 접근할 수 있도록 권한을 설정하세요. |
| 공격자가 프롬프트 인젝션을 이용해 사용자 지정 MCP 서버의 쓰기 작업으로 민감한 정보를 유출할 수 있습니다. 예시: • 공격자가 다른 MCP 서버를 통해 프롬프트 인젝션을 전달하여 ChatGPT가 민감한 데이터를 가져온 뒤 고객 지원 시스템의 MCP 서버를 사용해 공격자에게 보내도록 유도합니다. |
MCP 서버 개발자를 신뢰하는 것만으로는 안전하지 않습니다. MCP 서버를 전적으로 신뢰하더라도 공격자가 쓰기 작업의 결과를 관찰할 수 있다면 이를 악용하려 할 수 있습니다. |
• 쓰기 작업이 실행될 때마다 의도한 작업인지, 공유해서는 안 되는 데이터가 포함되어 있지 않은지 주의 깊게 확인하세요. |
| 악성 사용자 지정 MCP 서버는 읽기 작업을 기록할 수 있으므로 공격자가 프롬프트 인젝션을 이용해 읽기 작업으로 민감한 정보를 유출할 수 있습니다. | 이 공격은 MCP 서버가 악성이거나 쓰기 작업을 읽기 작업으로 잘못 표시한 경우에만 가능합니다. 개발자가 실제 읽기 작업만 읽기로 표시하고 데이터를 탈취하려 하지 않을 것이라고 신뢰할 수 있다면 이 위험은 대체로 낮습니다. |
• 신뢰하는 개발자의 MCP 서버만 사용하세요. 다만 이것만으로 안전이 보장되지는 않습니다. |
| 공격자가 프롬프트 인젝션으로 ChatGPT를 속여 사용자 지정 MCP 서버를 통해 사용자가 의도하지 않은 유해하거나 파괴적인 쓰기 작업을 수행하게 할 수 있습니다. | MCP 서버 개발자를 신뢰하는 것만으로는 안전하지 않습니다. 새 MCP 서버의 모든 콘텐츠가 안전하고 신뢰할 만하더라도 다른 악성 소스에서 공격이 시작될 수 있으므로 이 위험은 여전히 존재합니다. |
• 쓰기 작업이 의도한 대로 정확하게 수행되는지 주의 깊게 검토하세요. • ChatGPT는 사용자를 보호하도록 설계되어 있지만 공격자가 ChatGPT를 속여 의도하지 않은 쓰기 작업을 수행하도록 유도할 수 있습니다. • 특히 민감한 데이터를 다루는 MCP 서버에는 최소한의 인원만 접근할 수 있도록 권한을 설정하세요. |
프롬프트 인젝션 이외의 위험
사용자 지정 MCP 서버에는 프롬프트 인젝션 공격과 무관한 위험도 있습니다.
- 쓰기 작업을 허용하면 MCP 서버의 활용도와 위험이 모두 커질 수 있습니다. 서버가 ChatGPT에 정보를 제공하는 것 외에도 잠재적으로 파괴적인 작업을 수행할 수 있기 때문입니다. 현재 ChatGPT는 모든 대화에서 쓰기 작업을 실행하기 전에 사용자의 수동 확인을 요구합니다. 확인 단계에서는 민감할 수 있는 데이터를 표시합니다. ChatGPT가 해당 작업을 잘못 수행할 가능성을 충분히 검토하고 그 위험을 감수할 수 있을 때만 쓰기 작업을 사용하세요. MCP 서버가 작업을 읽기 전용으로 표시했더라도 실제로는 쓰기 작업이 일어날 수 있습니다. 따라서 ChatGPT에 배포하기 전에 사용자 지정 MCP 서버를 신뢰할 수 있는지 확인하는 것이 더욱 중요합니다.
- 어떤 MCP 서버든 쿼리를 처리하는 과정에서 민감한 데이터를 받을 수 있습니다. 악성 서버가 아니더라도 ChatGPT가 상호작용 중에 제공한 모든 데이터에 접근할 수 있습니다. 여기에는 사용자가 이전에 ChatGPT에 제공한 민감한 데이터도 포함될 수 있습니다. 예를 들어 ChatGPT가 심층 리서치나 채팅 앱 도구를 사용할 때 MCP 서버에 보내는 쿼리에 이런 데이터가 포함될 수 있습니다.
신뢰할 수 있는 서버에 연결하기
사용자 지정 MCP 서버가 연동하는 애플리케이션을 잘 알고 신뢰할 수 있는 경우에만 서버에 연결하는 것이 좋습니다.
예를 들어 서비스 제공자가 직접 호스팅하는 공식 서버를 선택하세요. Stripe를 연결할 때는 타사가 호스팅하는 비공식 Stripe MCP 서버 대신 Stripe가 mcp.stripe.com에서 호스팅하는 서버에 연결하세요. 현재 사용 가능한 공식 MCP 서버가 많지 않으므로 다른 조직이 호스팅하면서 API를 통해 요청을 다른 서비스로 중계하는 서버도 고려할 수 있습니다. 해당 조직이 데이터를 어떻게 사용하는지 검토하고 서버를 신뢰할 수 있는지 확인한 후에만 연결하세요. 직접 MCP 서버를 구축해 연결할 때는 연결 대상이 올바른 서버인지 다시 확인하세요. OpenAI가 MCP 서버를 호출할 때 요청에 응답하여 어떤 데이터를 제공할지, 전달받은 데이터는 어떻게 처리할지 주의하세요.
원격 MCP 서버를 제공하면 다른 사람이 OpenAI를 여러분의 서비스에 연결할 수 있습니다. 그러면 OpenAI가 해당 서비스의 데이터에 접근하고 데이터를 주고받으며 작업을 수행할 수 있습니다. 도구를 정의하는 JSON에 민감한 정보를 넣지 말고, 원격 MCP 서버에 접근하는 ChatGPT 사용자의 민감한 정보도 저장하지 마세요.
MCP 서버를 구축할 때는 도구 정의에 악성 콘텐츠를 넣지 마세요.
