MCP 서버 만들기: Python 주문 조회부터 인증·배포까지
Python으로 MCP 서버를 직접 만들고 주문 조회 툴을 구현합니다. Inspector 검증부터 Claude Code·Cursor 연결, 로컬 stdio와 원격 HTTP 선택, OAuth 인증, Render·Cloudflare Workers 배포 및 운영 비용까지 살펴봅니다.
게시일

MCP 서버를 만들면 회사 데이터를 채팅에 복사하지 않고도 Claude Code나 Cursor에서 주문 상태를 확인할 수 있습니다. 먼저 읽기 전용 MCP 툴을 하나 만들고 Inspector에서 동작을 검증합니다. 그다음 로컬 프로세스로 사용할지, 팀이 함께 쓸 수 있는 인증된 HTTP 서비스로 운영할지 결정합니다.
첫 서버의 역할은 작게 잡는 편이 좋습니다. 주문 ID를 받아 상태를 반환하는 기능부터 시작합니다. 범용 데이터베이스 툴을 만들면 모델이 판단해야 할 일이 너무 많아지고, 이 업무에 필요한 범위보다 넓은 접근 권한을 주게 됩니다.
이 가이드는 현재 공식 서버 개발 튜토리얼을 따릅니다. 2026년 10월 7일 기준 문서에서는 MCP 명세 2026-07-28과 공식 Python SDK의 MCPServer API를 사용합니다. SDK는 MCP 메시지를 처리하는 라이브러리입니다. 예제는 SDK 2.3.0으로 버전을 고정하므로, 예전 튜토리얼의 임포트 구문을 따라 하다가 다른 버전을 설치하는 일을 막을 수 있습니다.
MCP 서버는 어떤 기능을 제공하나요?
MCP 서버는 AI 애플리케이션과 사내 시스템 사이에 놓인, 기능 범위가 정해진 서비스 창구입니다. 애플리케이션은 이용 가능한 기능을 확인하고 요청을 보내 결과를 받습니다. 창구에서 처리할 수 있는 일은 서버 코드로 정합니다.
MCP는 Model Context Protocol의 약자로, 이 대화에 공통 형식을 제공합니다. 호스트는 Claude Code나 Cursor처럼 사용자가 직접 쓰는 애플리케이션입니다. 호스트의 클라이언트가 서버와 프로토콜 메시지를 주고받습니다. 호스트·클라이언트·서버는 역할을 구분하는 용어이며, 애플리케이션 세 개를 추가로 설치해야 한다는 뜻은 아닙니다.
툴도 읽기 전용으로 만들 수 있습니다. 리소스라는 이름을 붙인다고 접근 권한 확인이 필요 없어지는 것은 아닙니다. 프롬프트는 지시를 제공할 뿐, 권한을 부여하지 않습니다. 클라이언트마다 지원 기능과 표시 방식이 다르므로 실제로 제공할 기능을 확인해야 합니다. 위 항목이 서버의 세 가지 기본 기능이며, 아래 서버에는 툴 하나만 필요합니다.

개발에 앞서, 유지 관리되는 기존 커넥터가 이 업무를 지원하는지 확인합니다. 2026년 추천 MCP 서버에서 시작할 수 있습니다. 사내 데이터, 권한 규칙, 업무 절차가 기존 커넥터의 범위와 다를 때 직접 만든 서버의 가치가 생깁니다.
MCP 서버 만들기: Python으로 읽기 전용 주문 조회 구현하기
프로토콜 처리는 공식 SDK에 맡기고, 코드는 주문 조회에 집중합니다. Python 3.10 이상, 공식 튜토리얼에서 사용하는 Python 프로젝트 관리 도구인 uv, 그리고 Inspector 실행에 필요한 Node.js를 준비합니다. 현재 Inspector에는 Node 22.19.0 이상이 필요합니다.
터미널에서 다음 명령을 순서대로 실행합니다.
uv init orders-mcpcd orders-mcpuv venvuv add "mcp[cli]==2.3.0"
해당 폴더에 orders.py를 만들고 아래 서버 코드를 그대로 붙여 넣습니다. 레코드는 학습용 가상 데이터이며, 고객 이름이나 결제 정보, API 인증 정보는 포함하지 않습니다.
import json
from mcp.server import MCPServer
mcp = MCPServer("orders")
# Fictional training data. No customer records or credentials.
ORDERS = {
"A100": {"status": "shipped", "carrier": "Demo Courier"},
"A101": {"status": "packing", "carrier": "not assigned"},
}
@mcp.tool()
def lookup_order(order_id: str) -> str:
"""Look up a fictional order by ID, such as A100. Read-only.
Args:
order_id: Exact order ID, for example A100 or A101.
"""
key = order_id.strip().upper()
order = ORDERS.get(key)
if order is None:
return json.dumps({"found": False, "order_id": key})
return json.dumps({"found": True, "order_id": key, **order})
if __name__ == "__main__":
mcp.run(transport="stdio")공식 튜토리얼에 나온 MCPServer, @mcp.tool(), mcp.run(transport="stdio") 구성을 그대로 쓰되, 날씨 툴 대신 주문 조회를 구현했습니다. 문자열 타입 힌트는 order_id가 필수 텍스트 입력임을 SDK에 알려 줍니다. 독스트링은 클라이언트에 툴의 용도를 설명합니다. SDK가 툴 정의를 생성하고 프로토콜 메시지를 처리합니다.
uv run orders.py를 실행합니다. 출력 없이 입력을 기다리는 상태가 정상입니다. stdio는 표준 입력과 표준 출력을 뜻하며, 클라이언트가 이 프로세스와 통신하는 파이프입니다. 클라이언트가 서버를 직접 실행하도록 연결하기 전에, 수동으로 실행한 프로세스를 종료합니다.
애플리케이션 로그를 표준 출력에 쓰지 않습니다. 기본적으로 표준 오류에 출력하는 Python의 logging 모듈을 사용합니다. 의도치 않은 print() 하나가 프로토콜 스트림을 깨뜨릴 수 있습니다. 이는 로그 스타일의 문제가 아니라 문서에 명시된 stdio 제약입니다.
딕셔너리를 데이터베이스로 바꿀 때도 인터페이스의 범위를 작게 유지합니다. 매개변수화된 조회를 사용하고, 필요한 필드만 읽을 수 있는 데이터베이스 계정을 둡니다. 레코드를 반환하기 전에 호출자별 권한도 확인합니다. 이 작업을 위해 모델이 임의의 SQL 문을 넘기도록 허용해서는 안 됩니다.
MCP Inspector에서 먼저 동작을 검증합니다
모델에 툴을 사용하게 하기 전에 툴 자체가 동작하는지 확인합니다. 프로젝트 폴더에서 uv run mcp dev orders.py를 실행합니다. 이 SDK 개발 명령은 MCP Inspector를 시작합니다. 명령이 출력한 브라우저 URL을 열고, 아직 연결되지 않았다면 서버를 연결합니다.
Tools에서 lookup_order를 선택합니다. 입력 폼에는 필수 필드인 order_id가 표시되어야 합니다. A100으로 호출하면 결과에 found: true, status: shipped, carrier: Demo Courier가 있어야 합니다. A101을 넣으면 packing이 반환됩니다. DOES-NOT-EXIST로 호출하면 found: false가 나와야 합니다.
order_id를 빼고 요청하는 경우도 확인합니다. 조회가 실행되는 대신 입력 검증에 실패해야 합니다. Inspector의 Protocol 및 Console 화면을 보면 잘못된 요청과 서버 프로세스 오류를 구분하는 데 도움이 됩니다.
터미널에서 반복해 확인하려면 npx @modelcontextprotocol/inspector --cli uv run orders.py --method tools/list를 사용합니다. 툴 호출은 npx @modelcontextprotocol/inspector --cli uv run orders.py --method tools/call --tool-name lookup_order --tool-arg order_id=A100으로 실행합니다. 두 명령 모두 Inspector CLI 문서에 나온 방식을 따릅니다.
통과 기준은 명확합니다. 툴 하나가 목록에 표시되고, 존재하는 주문에서 예상한 상태가 반환되며, 없는 주문에는 레코드가 없다는 응답이 나와야 합니다. 모델이 그럴듯한 문장을 생성했다는 사실만으로는 조회가 실행되었다고 볼 수 없습니다.
같은 서버를 Claude Code와 Cursor에 연결하기
각 로컬 클라이언트는 서버 프로세스를 따로 실행합니다. Inspector를 계속 켜 둘 필요는 없습니다. 클라이언트가 어떤 폴더를 열었는지에 따라 실행이 달라지지 않도록 절대 경로를 사용합니다.
Claude Code: claude mcp add --transport stdio --scope local orders -- /ABSOLUTE/PATH/orders-mcp/.venv/bin/python /ABSOLUTE/PATH/orders-mcp/orders.py를 실행합니다. Windows의 인터프리터 경로는 .venv\Scripts\python.exe입니다. 실행 명령 앞의 -- 구분자까지 포함해 Claude Code의 로컬 서버 등록 구문을 따른 명령입니다.
claude mcp get orders로 연결 상태를 확인합니다. Claude Code 세션에서 /mcp를 연 다음, “lookup_order로 A100을 조회하고, 반환된 상태와 배송사만 알려 주세요.”라고 요청합니다. 실제 툴 호출과 전달된 인자를 확인합니다.
Cursor: 프로젝트에 .cursor/mcp.json을 만듭니다. 아래 JSON의 절대 경로 두 곳을 바꿔 입력합니다. {"mcpServers":{"orders":{"type":"stdio","command":"/ABSOLUTE/PATH/orders-mcp/.venv/bin/python","args":["/ABSOLUTE/PATH/orders-mcp/orders.py"]}}}.
Customize에서 서버를 활성화하고 Agent에 같은 질문을 합니다. 승인 설정에 따라 툴 호출을 검토합니다. 파일 위치, 실행 필드, 조작 방법은 Cursor의 MCP 설정 문서를 따릅니다. 연결이 실패하면 툴을 수정하기 전에 실행 파일 경로와 서버의 stderr를 확인합니다.
로컬 stdio와 원격 HTTP, 무엇을 선택할까요?
개인 업무에는 로컬로 시작합니다. 여러 사람이나 호스팅 환경의 클라이언트가 중앙에서 관리하는 서비스 하나를 써야 한다면 원격 HTTP를 선택합니다.
원격 서비스에서도 회사 데이터에 접근할 네트워크 경로가 필요합니다. 엔드포인트를 공개한다고 비공개 데이터베이스에 연결되거나 권한 설정이 올바르게 갖춰지는 것은 아닙니다.
2026-07-28 HTTP 프로토콜은 각 요청에 필요한 정보를 자체적으로 담는 방식을 사용합니다. 현재 Python SDK는 구형 클라이언트도 지원할 수 있습니다. 구형 클라이언트의 세션은 복제본을 늘릴 때 같은 인스턴스로 라우팅하는 스티키 라우팅이 필요할 수 있습니다. 확장하기 전에 문서에 나온 레거시 설정을 의도에 맞게 적용합니다. 연결된 모든 클라이언트가 최신 명세를 사용한다고 가정해서는 안 됩니다.

인증을 갖춘 HTTP 주문 조회 서비스로 전환하기
HTTP 접근은 이 서비스용으로 발급한 토큰으로 보호합니다. OAuth 2.1은 MCP 명세에서 사용하는 인가 프레임워크입니다. ID 제공자가 사용자를 로그인시키고 토큰을 발급하면 MCP 서버가 이를 검증합니다. 스코프는 orders:read처럼 이름을 붙인 권한입니다. **대상(audience)**은 어떤 서비스가 해당 토큰을 받아들일 수 있는지 나타냅니다.
SDK는 리소스 서버 연동 기능을 제공하며, 회사의 로그인 시스템은 별도로 필요합니다. 이 예제에서는 ID 제공자에 OAuth 디스커버리, 사용할 클라이언트의 등록, 사용자 로그인용 PKCE, 토큰 인트로스펙션 엔드포인트를 설정합니다. PKCE는 로그인을 완료하는 앱이 로그인을 시작한 앱과 같다는 것을 증명합니다. 인트로스펙션은 토큰이 활성 상태인지, 어떤 권한이 있는지 발급자에게 확인하는 절차입니다.
이 어댑터는 HTTP Basic 클라이언트 인증을 사용하는 HTTPS 인트로스펙션을 전제로 합니다. 응답에는 active, aud, exp, client_id, scope가 있어야 합니다. 발급자가 aud에 이 엔드포인트의 정확한 공개 URL을 포함하고 orders:read 권한을 발급하도록 설정합니다. 제공자가 다른 인트로스펙션 인증 방식을 사용한다면 해당 문서에 맞게 요청을 수정합니다. 대신 서명된 토큰인 JWT를 제공한다면, 같은 TokenVerifier 인터페이스에서 서명·발급자·만료·대상을 검증하도록 구현합니다.
uv add uvicorn으로 uvicorn을 추가하고, orders.py 옆에 remote.py를 만듭니다. 이 코드는 SDK의 공식 인트로스펙션 예제와 문서에 나온 HTTP 및 인증 인터페이스를 따릅니다. 앞에서 검증한 조회 함수를 재사용합니다.
import os
import time
from urllib.parse import urlsplit
import httpx2
from pydantic import AnyHttpUrl
from mcp.server import MCPServer
from mcp.server.auth.provider import AccessToken, TokenVerifier
from mcp.server.auth.settings import AuthSettings
from mcp.server.transport_security import TransportSecuritySettings
from orders import lookup_order as local_lookup
RESOURCE = os.environ["MCP_RESOURCE_URL"]
ISSUER = os.environ["MCP_ISSUER_URL"]
INTROSPECT = os.environ["MCP_INTROSPECTION_URL"]
if any(urlsplit(url).scheme != "https" for url in (RESOURCE, ISSUER, INTROSPECT)):
raise ValueError("Public auth and resource URLs must use HTTPS")
class OrderTokenVerifier(TokenVerifier):
async def verify_token(self, token: str) -> AccessToken | None:
try:
async with httpx2.AsyncClient(timeout=5.0) as client:
response = await client.post(
INTROSPECT,
data={"token": token},
auth=(os.environ["MCP_INTROSPECTION_CLIENT_ID"],
os.environ["MCP_INTROSPECTION_CLIENT_SECRET"]),
)
response.raise_for_status()
data = response.json()
audiences = data.get("aud", [])
if isinstance(audiences, str):
audiences = [audiences]
expiry = data.get("exp")
if (data.get("active") is not True or RESOURCE not in audiences
or not isinstance(expiry, int) or expiry <= time.time()):
return None
if data.get("iss", ISSUER) != ISSUER:
return None
return AccessToken(
token=token, client_id=data["client_id"],
scopes=data.get("scope", "").split(), expires_at=expiry,
resource=RESOURCE, subject=data.get("sub"),
)
except Exception:
return None
mcp = MCPServer(
"orders",
token_verifier=OrderTokenVerifier(),
auth=AuthSettings(
issuer_url=AnyHttpUrl(ISSUER),
resource_server_url=AnyHttpUrl(RESOURCE),
required_scopes=["orders:read"], validate_token_resource=True,
),
)
@mcp.tool()
def lookup_order(order_id: str) -> str:
"""Look up a fictional order by ID, such as A100. Read-only."""
return local_lookup(order_id)
hostname = urlsplit(RESOURCE).hostname
security = TransportSecuritySettings(
allowed_hosts=[hostname, f"{hostname}:*"],
allowed_origins=[os.environ["MCP_ALLOWED_ORIGIN"]],
)
app = mcp.streamable_http_app(transport_security=security)배포 환경의 환경 변수 또는 시크릿 저장소에 다음 값을 설정합니다.
호스트 허용 목록을 명시하는 이유는 SDK가 기본적으로 localhost를 허용하고, 공개 호스트 이름에는 421 Misdirected Request를 반환하기 때문입니다. 브라우저 오리진은 별도로 확인하므로 실제 사용하는 오리진만 등록합니다. 반환된 앱에는 시작과 종료 처리도 이미 포함되어 있습니다. 이 동작은 SDK 배포 문서와 ASGI 앱 문서를 따릅니다. ASGI는 Python 웹 서버가 이 애플리케이션을 실행할 때 사용하는 인터페이스입니다.
호스팅 환경의 HTTPS 프록시 뒤에서 uv run uvicorn remote:app --host 0.0.0.0 --port 8000으로 실행합니다. 프록시가 프로세스와 HTTP로 통신하더라도 공개 리소스 URL은 HTTPS를 유지합니다. 전달된 헤더는 해당 호스트의 실제 프록시 경계에 맞게 신뢰하도록 설정합니다.
실제 레코드를 사용하기 전에 HTTP 경로에서 다음을 확인합니다.
- 토큰이 없거나 만료되었거나, 다른 대상을 위한 토큰이면 접근이 거부됩니다.
- 유효한 토큰이어도
orders:read가 없으면 접근이 거부됩니다. - 대상과 스코프가 올바른 유효한 토큰이면
lookup_order가 데모 주문 상태를 반환합니다. /.well-known/oauth-protected-resource/mcp의 메타데이터가 올바른 리소스와 발급자를 가리킵니다.
npx @modelcontextprotocol/inspector --server-url https://orders.example.com/mcp --transport http로 배포한 엔드포인트를 점검하고 인증 절차를 완료합니다. 메모리 내 툴 테스트는 HTTP 인가 과정을 거치지 않으므로, 이 접근 경계가 동작한다는 증거가 될 수 없습니다.
Claude Code에서는 claude mcp add --transport http orders-remote https://orders.example.com/mcp로 별도의 연결을 추가한 뒤 /mcp에서 인증합니다. Cursor에서는 mcpServers 아래에 "url":"https://orders.example.com/mcp"가 있는 원격 항목을 추가하고 OAuth를 완료합니다. Cursor 문서에는 미리 등록한 클라이언트용으로 CLIENT_ID와 scopes를 담는 auth 객체도 설명되어 있습니다. 발급자에 각 클라이언트의 적절한 콜백을 등록합니다. 자세한 설정은 Claude Code 인증 문서와 Cursor의 원격 OAuth 설정 문서를 참고합니다.
이 코드는 인증 기능을 갖춘 소규모 어댑터입니다. 전체 운영 시스템을 구성하려면 더 작업해야 합니다. 데모 딕셔너리를 교체하기 전에 검증된 신원으로 테넌트 및 레코드 권한을 적용하고, 호출에 대한 감사 이벤트를 남기며, HTTP 연결을 재사용하고 요청 수를 제한합니다. 스코프는 작업 수행을 허용할 뿐, 모든 주문에 대한 소유 권한을 보장하지 않습니다.
MCP 서버 구축 후 Render 또는 Cloudflare Workers에 배포하기
위 Python 서버라면 저는 Render부터 시작하겠습니다. Python 웹 서비스를 선택하면 이미 만든 앱을 그대로 유지할 수 있습니다. 같은 범위의 툴을 문서에 나온 Worker 핸들러로 구현하려면 Cloudflare Workers도 좋은 선택입니다.
아래는 2026년 10월 7일에 확인한 제공 업체의 공개 요금입니다.
출처: Cloudflare Workers 요금, Render 요금. 팀 기능을 위해 Render의 Pro 워크스페이스를 선택하면 컴퓨팅 요금 외에 월 $25가 추가됩니다. 스토리지, ID 서비스, 모델 사용량 등은 별도로 예산을 잡아야 합니다. 표의 금액은 호스팅 요금이며, AI 업무 흐름 전체의 비용은 아닙니다.
Render 배포: 저장소에 orders.py, remote.py, requirements.txt를 넣습니다. requirements 파일에는 mcp[cli]==2.3.0과 uvicorn을 각각 한 줄씩 적습니다. Python Web Service를 만들고 빌드 명령에 pip install -r requirements.txt, 시작 명령에 uvicorn remote:app --host 0.0.0.0 --port $PORT를 지정합니다. 위 환경 변수를 추가한 뒤, 할당된 호스트 이름이나 사용자 지정 도메인을 MCP_RESOURCE_URL에 사용합니다. Render의 Python 웹 서비스 배포 문서를 SDK의 ASGI 앱에 맞게 적용한 방식입니다.
Render 무료 서비스는 데모에 유용하지만, 15분 동안 사용이 없으면 절전 상태로 들어가며 다시 시작하는 데 약 한 분이 걸립니다. 여러 사람이 대화형 툴로 사용할 때는 유료 컴퓨팅을 선택하겠습니다.
Cloudflare 배포: 현재 MCP 핸들러 문서와 원격 서버 가이드를 사용합니다. 현재 TypeScript 방식은 @modelcontextprotocol/server와 함께 agents/mcp/server의 createMcpHandler를 사용합니다. 같은 주문 조회 기능을 구현하고, URL을 공유하기 전에 인증을 설정합니다. Python의 uvicorn 실행 명령은 Python 호스팅용이며, Worker 배포에 사용하는 방식은 아닙니다.
보안 경계는 작게 유지합니다
서버에는 툴에 필요한 접근 권한만 부여합니다. 주문 상태 조회라면 읽기 전용 백엔드 인증 정보, 필요한 필드, 레코드별 권한 확인이 필요합니다. 환불, 취소, 주소 변경은 별도의 툴과 권한으로 분리합니다. 모델이 인자를 선택했다는 사실은 작업을 허가하는 근거가 될 수 없습니다.
HTTP 토큰은 발급자, 만료, 대상, 스코프를 검증합니다. HTTPS를 사용하고, 서버가 하위 API를 호출할 때는 별도의 인증 정보를 사용합니다. MCP 보안 지침은 토큰 패스스루를 금지합니다. MCP 엔드포인트에 제출한 토큰이 주문 시스템의 인증 정보로 자동 인정되는 것은 아닙니다. 로컬 stdio에서는 서버를 실행하는 프로세스와 그 환경, 파일 시스템 접근을 제한합니다.
로그에는 검증된 호출자, 툴 이름, 필요한 부분을 가린 레코드 참조, 결과, 지연 시간, 요청 ID를 남깁니다. 토큰과 전체 고객 레코드는 기록하지 않습니다. stdio 로그는 stderr에, HTTP 로그는 호스팅 환경의 로그 시스템에 남깁니다. 레코드에서 가져온 텍스트는 데이터로 취급합니다. 주문에 적힌 메모가 다른 작업을 수행할 권한을 부여해서는 안 됩니다.
여러 서버나 팀이 공통 신원 정책, 요청 제한, 감사 로그 수집, 권한 취소를 필요로 한다면 앞단에 게이트웨이를 둡니다. 게이트웨이는 이런 제어를 중앙에서 관리할 수 있게 하지만, 각 백엔드의 레코드 권한은 여전히 올바르게 적용되어야 합니다. MCP 게이트웨이 가이드에서 이 선택을 자세히 설명합니다.

바로 효과를 볼 수 있는 활용법 여섯 가지
다음은 같은 패턴을 확장할 수 있는 업무입니다. 사람이 범위가 정해진 사실을 반복해서 조회하고, 답이 맞는지 알아볼 수 있는 업무부터 시작합니다.
사업성을 계산할 때는 자신의 업무에서 출발해야 합니다. 설명을 위한 예시입니다: 하루 80번의 조회에 건당 2분이 걸리면 총 160분이 소요됩니다. 이후 측정에서 연결된 업무 흐름이 조회당 1분을 줄여 준다고 확인되면 하루 80분을 절약하는 셈입니다. 이는 단순 계산이며 성능 벤치마크가 아닙니다. 호스팅 지출에 대한 수익을 주장하기 전에 답변의 정확도와 절약한 시간을 측정합니다.
만들어 볼 만한 서비스 두 가지
가장 유망한 기회는 고객 지원 팀을 위한 주문 컨텍스트 어댑터입니다. 팀은 이미 사용하는 어시스턴트 안에서 정확한 배송 정보를 가져오는 좁은 범위의 연동 기능을 구매할 수 있습니다. 2026년 10월 7일에 확인한 DataForSEO 추정치에 따르면, “customer support automation”의 미국 Google 검색량은 월 260회입니다. 이는 해당 업무에 대한 넓은 관심을 보여 주며, MCP 구매자의 수를 뜻하지는 않습니다. Intercom은 Fin 요금을 처리 결과당 $0.99로 공개하고 있습니다. 고객 지원 자동화에 이미 예산이 쓰이고 있음을 보여 주는 가격입니다. 이 작은 어댑터는 해당 제품을 대체하기보다는 컨텍스트를 제공하는 역할입니다.
판매 가능한 최소 버전은 주문 백엔드 하나, lookup_order, 스코프가 적용된 로그인, 감사 추적, 반환된 필드를 인용하는 답변 초안으로 구성할 수 있습니다. 특정 회사의 데이터와 접근 규칙에 맞춘다는 점이 강점입니다. 다만 기존 업체에 이미 해당 커넥터가 있을 수 있고, 팀의 모델 사용자 라이선스, 데이터 정리, 지원에도 비용이 듭니다. 툴을 늘리기 전에 고객 지원 책임자와 함께 실제로 이런 공백이 있는지 확인합니다.
두 번째 기회는 권한을 반영한 정책 조회입니다. 운영 담당자는 리소스나 좁은 범위의 검색 툴로 한 회사의 승인된 정책 모음에 접근하는 기능을 만들 수 있습니다. 같은 날짜에 확인한 DataForSEO 추정치에서 “enterprise search”의 미국 월간 검색량은 390회입니다. MVP에는 정책 모음 하나, 출처 인용, 최신 상태 확인, 로그인한 사람의 권한에 따른 필터링을 포함할 수 있습니다. 여기서는 검색 품질과 접근 제어 자체가 제품의 핵심입니다. 폴더를 MCP로 연결하는 기능만으로는 쉽게 복제됩니다. 검색량은 더 넓은 업무 수요의 신호이며, 사용자가 이 구현에 돈을 낼 것이라는 증거는 아닙니다.
MCP로 해결되지 않는 문제도 있습니다
MCP는 접근 방식을 표준화합니다. 데이터 품질, 권한 부여, 백엔드 안정성, 툴이 할 수 있는 일의 범위는 여전히 직접 책임져야 합니다. 모델은 올바른 결과를 잘못 해석할 수 있으며, 연결된 클라이언트마다 지원 기능이나 승인 정책도 다를 수 있습니다.
공통 툴 인터페이스가 측정 가능한 업무를 개선할 때 개발합니다. 어시스턴트가 툴을 선택할 필요가 없는 고정 배치 작업이라면 일반 API 호출이나 스크립트가 더 적절할 수 있습니다.
월요일에 시작할 일은 간단합니다. 고객 지원 담당자와 반복 조회 업무 하나를 고르고, 가상 레코드로 두 클라이언트의 연결을 완료합니다. 그다음 읽기 전용 계정 뒤의 데이터셋을 실제 데이터로 교체하고 레코드 권한을 검증합니다. 첫 도입에서는 쓰기 작업을 제외합니다. 업무 흐름과 신원 확인 경계가 준비되면 함께 쓰는 HTTP 서비스로 전환합니다.
MCP 서버 개발은 어렵나요?
공식 SDK를 쓰면 작은 읽기 전용 서버는 비교적 간단하게 만들 수 있습니다. 함수를 정의하고, 입력을 설명하고, 전송 방식을 선택하면 됩니다. 회사 데이터를 안전하게 제공하려면 권한 적용, 인증 정보 관리, 서비스 운영까지 필요하므로 더 많은 작업이 들어갑니다.
테스트에 쓸 수 있는 무료 MCP 서버가 있나요?
이 튜토리얼의 가상 주문 서버는 호스팅 비용 없이 로컬에서 실행할 수 있습니다. MCP Inspector로 모델 구독 없이 호출할 수 있습니다. 클라우드 호스팅과 이후에 선택할 AI 클라이언트에는 각각 별도의 요금이 적용됩니다.
MCP 서버 운영 비용은 얼마인가요?
로컬 프로세스에는 별도의 호스팅 요금제가 필요하지 않습니다. Cloudflare Workers는 무료 티어와 최소 월 $5의 유료 요금제를 공개하고 있습니다. Render의 소형 유료 웹 서비스 컴퓨팅 요금은 월 $7입니다. 이 금액에는 모델 사용량, ID 서비스, 스토리지, 개발 비용이 포함되지 않습니다.
MCP 서버를 직접 설치해야 하나요?
stdio에서는 서버가 클라이언트 컴퓨터에서 실행되므로 그 컴퓨터에 코드와 런타임이 있어야 합니다. 원격 HTTP에서는 엔드포인트를 설정하고 인증하면 됩니다. 서버는 호스팅 환경에서 실행됩니다. 선택한 클라이언트가 지원하는 배포 방식을 사용합니다.
팀을 위한 회사 데이터 MCP 서비스의 구축과 운영이 필요하다면, AI 운영 시스템 구축 서비스에서 연동과 접근 제어를 제공합니다.
- 게시일
- 카테고리
- Build
- 언어







