C.W.K.
Stream
Lesson 05 of 05 · published

Production Shipping Checklist

~24 min · production, checklist, launch

Level 0호기심 많은 독자
0 XP0/48 lessons0/14 achievements
0/100 XP to next level100 XP to go0% complete

개인이 모르는 사람한테 MCP server ship 이 자기 위해 돌리기 와 다른 카테고리 작업. 아래 checklist 가 — 진짜 production 사고 막아준 — 가장 짧은 list. 어느 한 항목 skip 이 — 어느 시점에 — 누군가의 나쁜 한 주.

  1. Protocol revision pin 과 문서화. README + manifest + initialize 시 assertion. Spec 움직이면 명시적 업그레이드; latest 조용히 따라 X.
  2. Stdio server: 모든 diagnostic 을 stderr 로. Codebase audit 해 print(, library 디폴트, debugger 출력, tqdm bar. Stdout 이 wire.
  3. HTTP server: 로컬이면 127.0.0.1 에 bind, 항상 Origin/Host 검증, TLS 뒤에서. Track 7 의 로컬 함정 optional 아님.
  4. OAuth scope 가 tight. 요청하는 scope 마다 미래 보안 사고 (breach 시). 동작하는 가장 작은 set 디폴트.
  5. Tool annotation 정직. destructiveHint, openWorldHint, idempotentHint 가 host 에 중요; 거짓말은 delisting.
  6. Write tool 에 append-only audit log. Observability log 와 구별. 경계에서 redact.
  7. 모든 외부 write 에 idempotency key. Stripe-식 (conversation/session/proposal) keyed. 네트워크 hiccup 'production 에 드물지' 않음.
  8. README 에 compatibility 매트릭스. Revision 셋 × top client 셋 × 두 transport. 안 테스트 셀 마크.
  9. 매 commit 에 CI smoke test. Server 띄우기, tool list, tool 하나 호출, shutdown. 더 정교한 거 보너스; 이 최소가 regression 90% 잡음.
  10. Public changelog 와 deprecation note. Spec 같은 어휘 — "1.5.0 부터 deprecated, 1.7.0 에 제거" 와 병렬 가용성.

두 번 읽어. List 길어지지 않음; 따르는 server 가 여러 해 산다. 스킵하는 server 가 — 이 quest 같은 — 전쟁 이야기 들어감.

Code

Smoke-test pytest fixture·python
import pytest, asyncio
from mcp.client.stdio import StdioServerParameters, stdio_client
from mcp.client.session import ClientSession

@pytest.mark.asyncio
async def test_smoke():
    params = StdioServerParameters(command="uvx", args=["my-mcp-server"])
    async with stdio_client(params) as (read, write):
        async with ClientSession(read, write) as s:
            init = await s.initialize()
            assert init.protocolVersion in {"2025-06-18","2025-11-25"}
            tools = await s.list_tools()
            assert any(t.name == "get_stock_price" for t in tools.tools)
            res = await s.call_tool("get_stock_price", {"symbol": "AAPL"})
            assert "AAPL" in res.content[0].text

External links

Exercise

짠 server 들고 위 10 항목 체크. Uncheck 항목 each 가 남은 shipping 작업. List 깨끗할 때만 release 날짜 마크.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.