
Stateless MCP가 다시 나의 관심을 끌었습니다 (그리고 mcp-explorer와 datasette-mcp의 영감이 되었습니다)
요약
MCP 2.0의 핵심인 Stateless MCP 명세 출시와 그에 따른 개발 편의성 향상을 다룹니다. 기존의 세션 기반 방식에서 단일 HTTP 요청 방식으로 변화하며 서버 확장성과 구현 복잡도가 크게 개선되었습니다.
핵심 포인트
- Stateless MCP 도입으로 세션 ID 관리 및 서버 상태 유지 필요성 제거
- 단일 HTTP 요청을 통한 클라이언트 및 서버 구현의 단순화
- 확장 가능한 웹 애플리케이션 구축에 최적화된 프로토콜 구조
- MCP 서버 탐색을 위한 새로운 CLI 도구 mcp-explorer 소개
Stateless MCP가 다시 나의 관심을 끌었습니다 (그리고 mcp-explorer와 datasette-mcp의 영감이 되었습니다)
2026년 7월 31일
화요일은 Stateless MCP의 날이었습니다. 즉, MCP 2.0의 출시, 혹은 더 공식적이지만 기억하기는 어려운 명칭인 2026-07-28 Model Context Protocol 명세의 출시일입니다. 이는 MCP 명세가 처음 출시된 이후 가장 중요한 변화이며, 프로토콜에 대한 저 개인적인 관심을 다시 불러일으키는 계기가 되었습니다.
배경을 설명하자면: MCP는 Model Context Protocol의 약자로, LLM 기반 에이전트 프레임워크(agent frameworks)에 새로운 도구(tools)를 노출하는 표준화된 방법을 설명합니다. 이는 2024년 11월 Anthropic에 의해 도입되었으며, 2025년 내내 엄청난 관심의 급증을 경험했습니다. 그 후, 터미널과 curl에 접근할 수 있는 에이전트 하네스(agent harness)가 MCP가 수행하던 대부분의 일을 더 유연한 방식으로 수행할 수 있다는 점이 분명해지면서, (Anthropic의 또 다른 발명품인) Skills에 의해 다소 가려지게 되었습니다. 저는 2025년 리뷰에서 이 내용을 다룬 바 있습니다.
저는 이제 다시 MCP로 돌아오고 있습니다. 에이전트에게 인터넷에 접근할 수 있는 셸 환경(shell environment)을 부여하는 것은 위험이 따르며, 그러한 환경을 효과적으로 제어할 수 있는 강력한 모델이 필요합니다. MCP 도구들은 감사(audit)와 제어가 더 용이하며, 노트북에서 실행되는 더 작은 모델들도 이를 상당히 잘 다룰 수 있을 만큼 충분히 단순합니다.
새로운 stateless MCP 명세는 또한 이 프로토콜을 위한 클라이언트(clients)와 서버(servers)를 구현하는 복잡성을 크게 줄여줍니다. 저는 이번 주에 그중 세 개를 직접 만들었습니다!
Stateless MCP로 무엇이 더 쉬워졌는가
상태 유지(stateful) MCP와 stateless MCP의 차이를 가장 잘 보여주는 사례는 새 명세의 RC(Release Candidate)를 소개했던 지난 5월 21일 블로그 포스트에 있습니다. 그 포스트에는 명확한 전후(before-and-after) 예시가 포함되어 있었습니다.
이전의 stateful MCP(저는 이를 "legacy MCP"라고 부르겠습니다)는 두 번의 HTTP 요청이 필요했습니다. 첫 번째는 세션을 초기화하고 Mcp-Session-Id를 얻기 위한 것이고, 두 번째는 실제로 도구를 호출하기 위한 것이었습니다:
POST /mcp HTTP/1.1
Content-Type: application/json
{
...
새로운 무상태 (stateless) 방식은 다음과 같은 단일 HTTP 요청을 사용합니다:
POST /mcp HTTP/1.1
MCP-Protocol-Version: 2026-07-28
Mcp-Method: tools/call
...
이는 클라이언트와 서버 측 구현 관점 모두에서 훨씬 더 깔끔합니다. 또한, 이제 세션 ID (session IDs)를 추적하기 위해 서버 측 상태 (server-side state)를 유지할 필요가 없고, 동일한 세션을 동일한 백엔드 머신으로 라우팅(routing)해야 한다는 걱정도 할 필요가 없기 때문에 확장 가능한 웹 애플리케이션을 구축하는 데 더 적합합니다.
mcp-explorer
MCP 서버를 대화형으로 탐색할 수 있는 훌륭한 CLI 도구를 찾을 수 없어서, Codex의 도움을 받아 직접 만들었습니다.
그 결과물이 바로 mcp-explorer입니다. 이것은 무상태 (stateless) Python CLI 도구이므로, 설치할 필요도 없이 바로 시도해 볼 수 있습니다. 다음과 같이 uvx를 통해 작동합니다:
uvx mcp-explorer list https://agentic-mermaid.dev/mcp
이 명령은 Ade Oshineye의 agentic-mermaid.dev 데모 MCP에 쿼리합니다. 위 명령은 다음과 같은 도구 목록을 반환합니다:
execute(code: string, timeoutMs?: integer) - Execute Mermaid SDK code
Run JavaScript in an isolated sandbox; return a value.
describe_sdk(family: string, detail?: string) - Describe Mermaid SDK operations
...
그다음 도구를 검사하려면:
uvx mcp-explorer inspect render_svg
이 명령은 입력 및 출력의 JSON 스키마 (JSON schema)를 포함한 방대한 정보를 출력합니다.
해당 도구를 호출하고 인자 (arguments)를 전달하려면:
uvx mcp-explorer call \
https://agentic-mermaid.dev/mcp \
render_svg \
...
결과는 다음과 같이 반환됩니다:
{"ok":true,"svg":"<svg xmlns=\"http://www.w3.org/2000/svg\" width=...
순수 SVG만 얻으려면 해당 명령 뒤에 | jq .svg -r를 추가해 보세요.
저는 이 이미지를 얻었습니다:
README에는 몇 가지 명령어가 더 있지만, 대략적인 개념은 이해하셨을 것입니다. 에이전트 (agent)가 실제 코드의 대부분을 작성하더라도, 이와 같은 CLI 도구를 만드는 것은 명세 (specification)에 익숙해지는 매우 생산적인 방법이라고 생각합니다.
datasette-mcp
두 번째 프로젝트는 datasette-mcp로, 모든 Datasette 인스턴스에 /-/mcp 엔드포인트 (endpoint)를 추가하는 Datasette 플러그인입니다.
아마도 이 플러그인을 만들려고 시도한 것이 벌써 네 번째일 것입니다. 하지만 새로운 Stateless MCP 명세 (specification) 덕분에 마침내 출시하기에 괜찮다고 느껴지는 버전을 드디어 갖게 되었습니다.
이 플러그인은 딱 세 가지 도구(tools)를 제공합니다: list_databases(), get_database_schema(database_name), 그리고 execute_sql(database_name, sql)입니다. 이 도구들은 예상하는 대로 정확히 작동합니다. 다만, execute_sql()은 현재로서는 읽기 전용 (read-only)입니다.
이 도구들을 에이전트 (agent)나 ChatGPT 또는 Claude와 같은 채팅 도구에 연결하면, 호스팅된 Datasette 인스턴스에 대해 SQL 쿼리를 실행할 수 있는 능력을 갖게 됩니다.
현재 저는 제 블로그의 Datasette 미러(mirror)인 datasette.simonwillison.net/-/mcp에서 이를 실행하고 있습니다. 이를 ChatGPT와 Claude에 어떻게 연결할지 알아내는 데 약간의 시행착오가 있었지만, 결국 해냈습니다. 그 방법을 정확히 보여주는 새로운 TIL (Today I Learned) 포스트가 여기 있습니다.
다음은 제가 Claude에게 다음과 같이 질문한 공유 세션입니다:
list tables in simonwillison.net
그다음:
what has Simon said recently about MCP?
Claude는 답변을 찾아내기 위해 7개의 별도 SQL 쿼리를 실행했습니다.
llm-mcp-client
제 LLM 도구인 llm은 공식적인 MCP 통합이 매우 시급한 상태였습니다. 새로운 알파 버전인 llm-mcp-client 플러그인은 바로 그 작업을 위한 저의 시도입니다:
llm install llm-mcp-client
llm -T 'MCP("https://datasette.simonwillison.net/-/mcp")' 'count the notes'
다음은 출력 결과입니다 (추론 과정(reasoning trace) 포함, 저는 LLM 0.32rc2를 사용 중입니다):
노트 개수 고려 중
"count the notes"라는 질문은 아마도 블로그 노트의 개수를 세어달라는 뜻인 것 같습니다. 게시된 노트일 수도 있고 초안(drafts)일 수도 있어서 약간의 모호함이 있습니다. 명확한 답변을 얻기 위해 게시된 노트와 초안의 개수를 모두 쿼리하여 전체 노트 수를 파악해야겠습니다. 개수 확인을 실행하겠습니다!
151개의 노트가 있습니다.
그리고 해당 프롬프트에 대한 llm logs의 출력 결과입니다.
이 기능이 완전히 완성되면, LLM 코어(core)에 직접 포함시키는 것을 고려하고 있습니다. 또한 Datasette Agent와 llm-coding-agent에서도 MCP를 실험해보고 싶어 기대가 큽니다.
MCP는 에이전트로 빌드하기 위한 더 안전한 방법입니다
MCP가 처음 출시된 지 몇 달 후, 저는 "Model Context Protocol has prompt injection security problems"라는 글을 썼습니다. 그 글에서 저는 최종 사용자가 도구(tools)를 임의로 조합하여 사용하는 패턴이 데이터 유출 공격(data exfiltration attacks)을 방지해야 하는 책임을 사용자 자신에게 전가한다는 점을 지적했습니다. 당시에는 아직 "치명적인 삼중주 (Lethal Trifecta)"라는 용어를 만들지는 않았지만, 그것이 제가 정확히 염두에 두었던 바였습니다.
그 후 임의의 쉘(shell) 및 curl 접근 권한을 가진 범용 에이전트(general agents)들이 등장했는데, 이는 보안을 유지하기가 훨씬 더 어렵습니다!
MCP에 대해 제가 깨닫게 된 점 중 하나는, 오늘날 대부분의 범용 및 코딩 에이전트 도구의 기본 방식인 개방형 네트워크 환경에서의 임의 명령 실행(arbitrary command execution)보다 에이전트의 능력과 무엇이 잘못될 수 있는지에 대해 추론하기가 훨씬 더 쉽다는 것입니다.
저는 LLM 기반의 민감한 애플리케이션을 구축할 때 MCP를 훨씬 더 많이 활용할 계획입니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Simon Willison Blog의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기