MCP 서버 만들기: Python 주문 조회부터 인증·배포까지

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

게시일

작성자
MCP 서버 만들기: Python 주문 조회부터 인증·배포까지

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처럼 사용자가 직접 쓰는 애플리케이션입니다. 호스트의 클라이언트가 서버와 프로토콜 메시지를 주고받습니다. 호스트·클라이언트·서버는 역할을 구분하는 용어이며, 애플리케이션 세 개를 추가로 설치해야 한다는 뜻은 아닙니다.

기능의미주문 업무에 적용한 예
툴(Tools)클라이언트가 정해진 인자를 전달해 호출하는 함수lookup_order(order_id)가 주문 상태를 반환합니다
리소스(Resources)정보의 주소인 URI로 식별되는, 읽을 수 있는 컨텍스트클라이언트가 읽을 수 있는 반품 정책 문서
프롬프트(Prompts)호스트가 사용자에게 제시할 수 있는 재사용 메시지 템플릿배송 지연에 관한 답변을 작성하는 템플릿

툴도 읽기 전용으로 만들 수 있습니다. 리소스라는 이름을 붙인다고 접근 권한 확인이 필요 없어지는 것은 아닙니다. 프롬프트는 지시를 제공할 뿐, 권한을 부여하지 않습니다. 클라이언트마다 지원 기능과 표시 방식이 다르므로 실제로 제공할 기능을 확인해야 합니다. 위 항목이 서버의 세 가지 기본 기능이며, 아래 서버에는 툴 하나만 필요합니다.

클라이언트와 연결된 MCP 서비스 창구를 건축물로 표현한 모습. 툴, 리소스, 프롬프트 공간이 각각 나뉘어 있습니다
서버는 세 가지 기능을 제공할 수 있습니다. 첫 구현에서는 주문 조회 툴만 제공합니다.

개발에 앞서, 유지 관리되는 기존 커넥터가 이 업무를 지원하는지 확인합니다. 2026년 추천 MCP 서버에서 시작할 수 있습니다. 사내 데이터, 권한 규칙, 업무 절차가 기존 커넥터의 범위와 다를 때 직접 만든 서버의 가치가 생깁니다.

MCP 서버 만들기: Python으로 읽기 전용 주문 조회 구현하기

프로토콜 처리는 공식 SDK에 맡기고, 코드는 주문 조회에 집중합니다. Python 3.10 이상, 공식 튜토리얼에서 사용하는 Python 프로젝트 관리 도구인 uv, 그리고 Inspector 실행에 필요한 Node.js를 준비합니다. 현재 Inspector에는 Node 22.19.0 이상이 필요합니다.

터미널에서 다음 명령을 순서대로 실행합니다.

  1. uv init orders-mcp
  2. cd orders-mcp
  3. uv venv
  4. uv add "mcp[cli]==2.3.0"

해당 폴더에 orders.py를 만들고 아래 서버 코드를 그대로 붙여 넣습니다. 레코드는 학습용 가상 데이터이며, 고객 이름이나 결제 정보, API 인증 정보는 포함하지 않습니다.

Python
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를 선택합니다.

선택 기준로컬 stdio원격 Streamable HTTP
실행 위치클라이언트 컴퓨터에서 시작하는 프로세스HTTPS 엔드포인트의 웹 서비스
클라이언트의 연결 방식명령과 인자https://orders.example.com/mcp 같은 URL
접근 권한의 경계OS 권한, 프로세스 환경, 하위 시스템 인증 정보검증된 호출자 신원, 스코프, 레코드별 접근 권한
업데이트설치된 각 복사본을 업데이트서비스 하나를 배포
처음 적용하기 좋은 경우개발자 한 명이 범위가 정해진 업무를 검증할 때중앙에서 운영하며 함께 접근해야 할 때

원격 서비스에서도 회사 데이터에 접근할 네트워크 경로가 필요합니다. 엔드포인트를 공개한다고 비공개 데이터베이스에 연결되거나 권한 설정이 올바르게 갖춰지는 것은 아닙니다.

2026-07-28 HTTP 프로토콜은 각 요청에 필요한 정보를 자체적으로 담는 방식을 사용합니다. 현재 Python SDK는 구형 클라이언트도 지원할 수 있습니다. 구형 클라이언트의 세션은 복제본을 늘릴 때 같은 인스턴스로 라우팅하는 스티키 라우팅이 필요할 수 있습니다. 확장하기 전에 문서에 나온 레거시 설정을 의도에 맞게 적용합니다. 연결된 모든 클라이언트가 최신 명세를 사용한다고 가정해서는 안 됩니다.

한 컴퓨터의 로컬 stdio 프로세스와 인증 관문을 거치는 원격 HTTP 접근을 비교한 두 개의 건축 경로
배포 경계를 선택합니다. 개인 업무에는 로컬 프로세스를, 공동 사용에는 인증된 HTTP 서비스를 적용합니다.

인증을 갖춘 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 및 인증 인터페이스를 따릅니다. 앞에서 검증한 조회 함수를 재사용합니다.

Python
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)

배포 환경의 환경 변수 또는 시크릿 저장소에 다음 값을 설정합니다.

변수설정할 값
MCP_RESOURCE_URL정확한 공개 엔드포인트. 예: https://orders.example.com/mcp
MCP_ISSUER_URLID 제공자의 메타데이터와 일치하는 발급자 URL
MCP_INTROSPECTION_URL제공자 문서에 명시된 HTTPS 토큰 인트로스펙션 엔드포인트
MCP_INTROSPECTION_CLIENT_ID토큰 인트로스펙션 권한을 가진 기밀 클라이언트
MCP_INTROSPECTION_CLIENT_SECRET해당 클라이언트의 시크릿
MCP_ALLOWED_ORIGIN허용할 정확한 브라우저 오리진. 예: 사내 앱의 오리진

호스트 허용 목록을 명시하는 이유는 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 Free요금제 비용 없음일 요청 100,000건, 호출당 CPU 시간 10 ms해당 한도에 맞는 Worker 프로토타입
Cloudflare Workers Paid최소 월 $5월 요청 10백만 건과 CPU 시간 30백만 CPU-ms 포함함께 사용하는 Worker 배포. 추가 요청은 백만 건당 $0.30, CPU 시간은 백만 CPU-ms당 $0.02
Render 유료 웹 서비스0.5c-512mb 컴퓨팅 월 $7RAM 512 MB. Hobby 워크스페이스 비용은 $0이며 컴퓨팅 요금 별도이 Python ASGI 앱 실행

출처: 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 게이트웨이 가이드에서 이 선택을 자세히 설명합니다.

검증된 신원에서 토큰 확인을 거쳐 읽기 전용 주문 조회와 감사 로그로 이어지는 보안 흐름을 건축 구조로 표현한 모습
신원과 스코프로 요청을 허용하고, 레코드 권한으로 결과를 제한합니다. 감사 이벤트를 남기면 호출을 검토할 수 있습니다.

바로 효과를 볼 수 있는 활용법 여섯 가지

다음은 같은 패턴을 확장할 수 있는 업무입니다. 사람이 범위가 정해진 사실을 반복해서 조회하고, 답이 맞는지 알아볼 수 있는 업무부터 시작합니다.

순위사용할 수 있는 담당자구체적인 업무기대할 수 있는 효과
1배송 문의에 답하는 고객 지원 팀접근이 허용된 주문 상태와 배송사를 조회한 뒤 기존 어시스턴트에서 답변 초안 작성문의함과 주문 시스템을 오가는 횟수 감소
2고객 장애를 처리하는 기술 운영 담당자계정 ID로 활성화된 기능과 최근 서비스 이벤트 조회조사 전 상황을 파악하는 시간 감소
3갱신을 준비하는 고객 담당자권한이 있는 고객의 요금제, 갱신일, 미해결 문제 조회회의 준비에 오래된 정보를 사용할 가능성 감소
4청구서 문의를 처리하는 재무 담당자접근이 허용된 청구서 상태와 관련 주문 참조 조회결제 권한을 부여하지 않고 대사 작업 속도 개선
5사내 연동을 디버깅하는 엔지니어작업 ID로 민감한 부분을 가린 작업 결과와 승인된 진단 필드 조회수동 로그 검색과 인증 정보 공유 감소
6정책 질문에 답하는 직원접근이 허용된 정책 리소스를 출처 및 업데이트 날짜와 함께 읽기기억에 의존한 표현 대신 실제 정책을 근거로 답변

사업성을 계산할 때는 자신의 업무에서 출발해야 합니다. 설명을 위한 예시입니다: 하루 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
AI 에이전트 툴 Gumloop vs n8n: 가격·구축·운영 비교 (2026년 10월 검증)

AI 에이전트 툴 Gumloop vs n8n: 가격·구축·운영 비교 (2026년 10월 검증)

AI 에이전트 툴 Gumloop와 n8n을 가격, 과금 단위, 구축 담당자, 호스팅 방식으로 비교합니다. 같은 리드 업무의 비용 교차점과 Community 협업 제약, 트리거 동작까지 살펴보고 팀에 맞는 자동화 툴을 고르세요. 2026년 10월 검증한 가격과 요금제 정보를 담았습니다.2026년 10월 7일Build
LangGraph부터 CrewAI까지: 2026년 AI 에이전트 프레임워크 8종 비교

LangGraph부터 CrewAI까지: 2026년 AI 에이전트 프레임워크 8종 비교

LangGraph와 CrewAI 등 AI 에이전트 프레임워크 8종의 언어, 상태 저장, MCP, 승인·복구 방식과 호스팅 요금을 비교합니다. Python·TypeScript 실서비스에 맞는 런타임을 고르고 무료 라이브러리와 운영 비용의 차이를 확인하십시오.2026년 10월 7일Build
Codex CLI와 Codex Cloud 사용법: 재사용 환경과 모바일 작업 관리

Codex CLI와 Codex Cloud 사용법: 재사용 환경과 모바일 작업 관리

Codex CLI와 Codex Cloud, 어떤 작업에 무엇을 써야 할까요? 재사용할 클라우드 환경을 준비하고 노트북을 꺼도 작업을 이어가는 방법을 설명합니다. 요금제별 이용 자격과 USD 가격, 사용량 차감, 휴대폰 작업 관리, 테스트 수정·마이그레이션·PR 리뷰까지 확인하세요.2026년 10월 7일Build
GitHub Copilot 가격 2026: 월 구독료보다 중요한 AI 크레딧 비용

GitHub Copilot 가격 2026: 월 구독료보다 중요한 AI 크레딧 비용

GitHub Copilot 가격을 구독료와 AI 크레딧 사용료로 나눠 살펴봅니다. Free부터 Pro, Pro+, Max, Business, Enterprise까지 요금제를 비교하고, 개인과 팀의 월 청구액 계산 예시로 업그레이드 기준과 초과 사용 예산 설정 방법을 안내합니다.2026년 10월 6일Build
Copilot CLI 사용법: 설치부터 테스트 수정·PR까지

Copilot CLI 사용법: 설치부터 테스트 수정·PR까지

GitHub Copilot CLI 설치와 로그인부터 저장소 파악, 테스트 수정, PR 생성까지 안내합니다. 요금제별 USD 가격과 공유 AI 크레딧, 지원 모델을 확인하고 툴 승인, 프로젝트 지침, MCP 설정까지 살펴보며 터미널 작업에 맞는지 판단할 수 있습니다.2026년 10월 6일Build
웹 크롤링 툴 8종 비교: 용도별 추천과 과금 구조 (2026)

웹 크롤링 툴 8종 비교: 용도별 추천과 과금 구조 (2026)

웹 크롤링 툴 8종의 요금과 과금 구조를 비교합니다. Firecrawl, Browse AI, Bright Data, Context.dev 등의 무료 제공량과 운영 한계를 확인하세요. AI 에이전트용 문서 수집, 노코드 모니터링, 대규모 수집 중 필요한 작업에 맞춰 선택할 수 있습니다.2026년 10월 6일Build
에이전트 메모리(agent memory) 설계: 상태 저장부터 비용 계산까지

에이전트 메모리(agent memory) 설계: 상태 저장부터 비용 계산까지

에이전트 메모리(agent memory)는 무엇을 저장해야 할까요? 컨텍스트, 세션 상태, 장기 저장소, 파일·스킬을 구분하고 Claude·OpenAI·Google의 기능과 비용을 비교합니다. 월간 비용 계산과 오래된 사실 수정, 사용자 간 정보 유출과 메모리 오염의 해법을 설명합니다.2026년 10월 5일Build
Pinecone 가격 가이드: 요금제별 한도와 검색 범위에 따른 비용

Pinecone 가격 가이드: 요금제별 한도와 검색 범위에 따른 비용

Pinecone 가격을 Starter·Builder·Standard·Enterprise 요금제별로 정리합니다. 1M부터 100M 벡터의 저장·검색 비용과 네임스페이스 분리에 따른 차이, 무료 한도, 초기 적재와 추가 과금까지 살펴보고 실제 워크로드에 맞는 월 예산을 계산하세요.2026년 10월 5일Build
뉴스레터

매주 일요일, 한 통의 편지.뜨거운 의견이 아닌, 돌아가는 시스템.

주간 발행. 스팸 없음. 언제든 해지 가능합니다.