MCP
우리에게는 도구, 스킬, 커넥터가 있습니다. 그렇다면 MCP는 왜 존재할까요? 언뜻 보면 API 위에 또 다른 API를 쌓아 올린 것처럼 보입니다. 타당한 질문이며 — 그 답은 누가 통합 코드를 유지 관리하느냐에 달려 있습니다.
유지 관리 문제
에이전트가 Asana에서 작업을 가져오고, Google Calendar를 확인하고, Slack을 검색해야 한다고 가정해 봅시다 — 이 모든 것을 한 번에 처리해야 합니다. 커스텀 도구를 사용하면 세 개의 통합을 직접 작성해야 합니다. 여기까지는 할 만합니다. 진짜 고통스러운 부분은 그 이후입니다: 이러한 서비스 중 하나가 API를 변경할 때마다 — 이는 자주 일어나는 일입니다 — 해당 통합을 유지 관리해야 합니다. 축하합니다, 이제 여러분은 서드파티 API 래퍼 더미를 유지 관리하는 사람이 되었습니다.
MCP는 그 유지 관리 부담을 서비스 제공자에게 넘깁니다. Asana는 MCP 서버를 공개합니다. Slack도 하나를 공개합니다. Google도 하나를 공개합니다. 각 서버는 표준 프로토콜을 통해 설명, 스키마, 인증과 함께 자체 도구를 노출합니다. 그들의 API가 변경되면, 그들이 자신의 서버를 업데이트합니다. 여러분은 아무것도 바꿀 필요가 없습니다.
도구 vs. 스킬 vs. MCP
이 세 가지 기능은 서로 다른 역할을 합니다:
- 도구는 Claude를 여러분의 내부 시스템 — 데이터베이스, 프로젝트 트래커, 독자적인 API — 에 연결합니다. 코드를 소유하고 있으므로 유지 관리도 여러분의 몫입니다.
- 스킬은 Claude에게 절차를 가르칩니다 — 보고서 템플릿, 검토 체크리스트 같은 것들입니다. 스킬은 지침이지, 반드시 통합을 의미하지는 않습니다.
- MCP는 Claude를 서드파티 서비스에 연결하며, 이때 서비스 제공자가 통합을 유지 관리합니다. 여러분이 Asana 래퍼를 작성하는 것이 아니라 — Asana가 작성했습니다.
짧게 요약하면: 도구는 여러분의 것을 위한 것이고, 스킬은 여러분의 프로세스를 위한 것이며, MCP는 다른 모든 사람의 것을 위한 것입니다.

MCP 서버에 연결하기
MCP를 체감하는 가장 깔끔한 방법은 Claude를 임의의 MCP 서버에 연결해 두고 그곳에 무엇이 있는지 스스로 발견하게 하는 것입니다. 이 예제에서는 Linear MCP 서버를 사용하며, 연결 세부 정보와 인증 토큰은 .env 파일에 저장합니다.
요청에서는 두 가지 요소가 함께 작동합니다. mcp_servers 키는 연결을 선언합니다 — 유형, URL, 참조할 이름, 그리고 선택적으로 인증 토큰입니다. 그런 다음 유형이 mcp_toolset인 도구가 해당 서버에서 Claude가 사용할 수 있는 도구를 구성합니다. 기본값은 모든 도구이지만, 범위를 좁히고 싶다면 여기서 설정하면 됩니다.
import os
import anthropic
client = anthropic.Anthropic()
response = client.beta.messages.create(
model="claude-opus-5",
max_tokens=1024,
messages=[
{"role": "user", "content": "What tools do you have available?"}
],
mcp_servers=[
{
"type": "url",
"url": "https://mcp.linear.app/mcp",
"name": "linear",
"authorization_token": os.environ["LINEAR_MCP_TOKEN"],
}
],
tools=[
{
"type": "mcp_toolset",
"mcp_server_name": "linear",
}
],
betas=["mcp-client-2025-11-20"],
)
print(response)도구 스키마를 단 하나도 작성하지 않았다는 점에 주목하세요. Claude는 서버를 인트로스펙트하여 도구 목록과 그 스키마를 받아오고, 프롬프트에 맞는 것을 선택합니다. 이 레슨 작성 시점 기준으로 MCP 커넥터는 베타 버전입니다 — 요청에 포함된 베타 헤더를 확인하세요.
실행해 보면, MCP URL이 Linear의 MCP 엔드포인트를 가리키고 있을 경우 Claude는 Linear의 도구 목록을 나열한 다음 그중 하나를 호출합니다. 이는 기본적으로 규격을 준수하는 모든 서버에서 동일하게 작동합니다. 우리는 도구를 단 하나도 정의하지 않았습니다. Linear 클라이언트도 작성하지 않았습니다. Linear가 그것을 유지 관리하고 있습니다.

Claude가 사용할 수 있는 도구 필터링하기
MCP 서버는 종종 매우 많은 도구를 노출하는데 — Claude가 그 모든 것을 사용하기를 항상 원하는 것은 아닙니다. 쓰기 권한을 주고 싶지 않을 수도 있고, 단순히 그 많은 도구 정의가 컨텍스트를 차지하는 것을 원하지 않을 수도 있습니다.
해결책: 기본적으로 모든 것을 비활성화한 다음, 원하는 특정 도구만 활성화하는 것입니다. Slack MCP 서버를 예로 든 패턴은 다음과 같습니다:
tools=[
{
"type": "mcp_toolset",
"mcp_server_name": "slack",
"default_config": {
"enabled": False,
},
"configs": {
"search_messages": {"enabled": True},
"list_channels": {"enabled": True},
},
}
]이제 Claude는 Slack을 검색하고 채널을 나열할 수 있지만, 게시하거나 삭제할 수는 없습니다. 이는 읽기 작업에 대해서는 서비스를 신뢰하지만 Claude가 실수로 여러분을 대신해 쓰기 작업을 하는 것은 원하지 않을 때 유용합니다.
요약
- MCP는 이미 다른 누군가가 만들어 놓은 통합을 여러분이 유지 관리하지 않아도 되도록 존재합니다. 서비스 제공자가 MCP 서버를 공개하고 최신 상태로 유지합니다 — 그들의 API가 변경되어도 여러분은 아무것도 바꿀 필요가 없습니다.
- 작업에 맞는 올바른 기능을 선택하세요: 여러분의 데이터에는 도구, 여러분의 프로세스에는 스킬, 서드파티 서비스에는 MCP입니다.
mcp_servers에서 연결(유형, URL, 이름, 선택적 인증 토큰)을 선언하고,tools에mcp_toolset항목을 추가하여 접근 권한을 부여하세요. Claude는 서버를 인트로스펙트하여 스스로 도구를 발견합니다 — 작성해야 할 스키마가 없습니다.default_config: {"enabled": False}를 설정하고configs에서 특정 도구만 활성화하여 접근 범위를 좁힐 수 있습니다 — 서버를 읽기 전용으로 유지하는 데 유용합니다.- MCP 커넥터는 현재 베타 버전이므로, 요청에 베타 헤더를 포함하세요.
- 사용 가능한 서버 목록을 확인하고 프로토콜에 대해 더 알아보려면 modelcontextprotocol.io를 방문하세요.