프로토콜 era
MCP의 2026-07-28 버전 업데이트로 인해 프로토콜에 상당한 변화가 있었습니다. 따라서 Inspector는 프로토콜 era(레거시 또는 현대, 즉 해당 업데이트 이전 또는 그 시점의 상태)를 트랜스포트와는 무관한, 서버별로 설정되는 일등급 설정으로 간주합니다. 동일한 HTTP URL이라도 레거시 서버로도, 현대 서버로도 검사될 수 있습니다. 현재 적용 중인 era에 따라 여러 탭에서 표시되는 UI와 트래픽이 상당히 다르게 나타납니다.
Protocol Era 설정
각 서버는 protocolEra 형태로 legacy, auto, 또는 modern 중 하나를 가지고 있습니다. 웹 클라이언트에서는 Server Settings에 저장되며, 카탈로그나 설정 파일에서는 protocolEra 필드로 표시되고, CLI 및 TUI에서도 동일한 파일에서 해당 값이 가져옵니다.
| Era | 연결 시 Inspector가 수행하는 동작 |
|---|---|
legacy | 기본값입니다. 일반적인 initialize 방식을 사용하며, 어떠한 탐색도 수행하지 않습니다. |
auto | 먼저 server/discover를 탐색한 후, 비현대적인 결과가 나올 경우 initialize 방식으로 전환합니다. |
modern | 정확히 2026-07-28를 고정합니다. 별도의 대체 방식이 없어 비현대적인 서버의 경우 명확하게 오류가 발생합니다. |
세 가지 클라이언트 모두에서 에라 선택 기능은 동일한 방식으로 작동합니다.
연결이 완료되면 협상된 에라 정보는 연결 헤더와 Connection Info에 표시됩니다. 최신 형태의 연결에서는 server/discover을 통해 capabilities( extensions를 포함함), instructions, 그리고 supportedVersions 목록도 제공됩니다. 서버의 이름과 버전은 결과 _meta 내의 io.modelcontextprotocol/serverInfo 항목에 포함되어 전달됩니다.

각 시대를 로컬에서 재현하기
아래의 각 섹션은 Inspector 리포지토리에 포함된 컴포저블 테스트 서버 중 하나에 해당하는 JSON 설정 파일을 가리키는 Reproduce with ... 링크로 마무리됩니다. 먼저 해당 리포지토리를 클론하여 테스트 서버를 빌드한 다음, 섹션 제목에 명시된 설정 파일을 Inspector가 참조하도록 설정해야 합니다.
git clone https://github.com/modelcontextprotocol/inspector
cd inspector && npm install && npm run build
cd clients/web && npm run test-servers:build
로깅
로깅은 세션 범위로 처리됩니다. 클라이언트는 한 번 logging/setLevel을 전송하고, 서버는 해당 세션의 남은 기간 동안 그 수준 이상에서 notifications/message을 출력합니다.
Logs 탭에는 Set Active Level 선택기와 Set 버튼이 표시됩니다. 원하는 로그 수준을 선택한 후 Set을 클릭하면 이후 발생하는 서버 로그들이 해당 패널에 실시간으로 표시됩니다.
test-servers/configs/logging-legacy-http.json를 사용하여 재현하기.
logging/setLevel은 더 이상 사용되지 않습니다. 대신 클라이언트는 각 요청에 _meta["io.modelcontextprotocol/logLevel"]을 넣어 요청별로 로그 수신을 선택합니다. 서버는 로그 수신을 선택하지 않은 요청에 notifications/message를 전송해서는 안 됩니다.
따라서 Logs 탭에는 요청별 로그 수준 제어 기능이 표시됩니다. 원하는 수준을 선택하면 그 이후의 모든 요청에 해당 표시가 적용되어 Network 탭의 요청 본문에서 확인할 수 있으며, 요청 처리 중에 생성된 로그는 해당 요청의 SSE 응답 스트림에 포함됩니다.
이 제어 기능을 Off로 설정하면 logLevel 키가 완전히 생략되어 동일한 도구 호출로 인해 전혀 로그가 생성되지 않습니다. 이러한 정적인 상태는 버그가 아닌 올바른 동작입니다.
서버별 기본값은 debug입니다. Inspector는 디버깅 도구이므로 기본적으로 가장 상세한 수준의 로그를 받습니다. 로그 수신을 기본적으로 비활성화하려면 서버에서 modernLogLevel: "off"를 설정하세요.
test-servers/configs/logging-modern-http.json를 사용하여 동일한 현상을 재현해 보십시오.


리소스 구독
리소스의 Subscribe 버튼을 클릭하면 resources/subscribe이 전송됩니다. 구독 목록에는 스트림 관련 정보가 표시되지 않은 URI가 나열됩니다. 리소스에 변경 사항이 생기면 서버는 notifications/resources/updated을 전송하고, 구독된 항목의 마지막 업데이트 시간이 기록됩니다.
test-servers/configs/subscriptions-legacy-http.json를 사용하여 해당 동작을 직접 확인해 볼 수 있으며, 이 도구는 update_resource도 제공하여 사용자가 직접 알림의 전송 및 수신 과정을 테스트할 수 있도록 합니다.
동일한 Subscribe 버튼을 사용해도 이제는 **subscriptions/listen**가 전송되며, 여기에는 resourceSubscriptions와 resourcesListChanged 옵션을 포함한 필터가 함께 적용됩니다. 서버가 notifications/subscriptions/acknowledged을 전송하면 구독이 정상적으로 완료됩니다.
이제 구독이 세션 플래그가 아닌 장기간 지속되는 스트림 형태가 되었기 때문에, 구독 목록의 헤더에는 Connecting...에서 Listening로 변경되는 stream-status badge가 표시됩니다. 스트림 연결이 끊어지면 인스펙터는 subscriptions/listen을 다시 전송하여 재연결을 시도합니다.
test-servers/configs/subscriptions-modern-http.json를 사용하여 해당 동작을 직접 확인해 볼 수 있습니다.

작업
프로토콜의 버전이 변경될 때마다 작업 관련 사항들이 가장 많이 변화하며, 여기에는 _Inspector UI 탭의 표시 여부_도 포함됩니다.
서버가 capabilities.tasks를 공지할 경우 작업 탭이 나타납니다. 작업으로 실행 기능이 활성화된 도구를 실행하면 tasks/list에 의해 데이터가 채워지고 tasks/get를 통해 정보가 수집되어 해당 탭에 표시됩니다. 완료된 작업 결과는 **블로킹 tasks/result**를 통해 가져오며, 취소 버튼을 누르면 tasks/cancel이 전송됩니다.
test-servers/configs/tasks-legacy-http.json을 사용하여 동일한 상황을 재현해 보십시오.
작업은 확장 기능(io.modelcontextprotocol/tasks, SEP-2663)이므로, 탭의 표시 여부는 capabilities.tasks가 아닌 _협상된 확장 기능_에 따라 결정됩니다.
작업으로 도구를 실행하면 tools/call이 CreateTaskResult을 반환합니다 (resultType: "task", 이 정보는 Protocol 및 Network 탭에서 확인할 수 있습니다). Inspector는 **tasks/get**만을 주기적으로 확인하며, tasks/list와 같은 메커니즘은 존재하지 않아 Refresh 버튼을 누르면 클라이언트가 이미 알고 있는 핸들들을 다시 확인하게 됩니다. 완료된 작업의 경우 블로킹되는 tasks/result 호출 없이 그 결과가 인라인으로 표시됩니다.
더 많은 정보가 필요한 작업은 input_required으로 이동하며, 대기 중인 요청 모달창(웹 클라이언트가 요청이 처리되기를 기다릴 때 표시되는 대화상자)에 내장된 elicitation이 표시됩니다. 이 질문에 답변하면 inputResponses을 포함한 **tasks/update**이 전송되고, 그 다음 주기적 확인을 통해 작업이 완료됩니다.
test-servers/configs/tasks-modern-http.json를 사용하여 재현해 보십시오 (도구 modern_task 및 modern_input_task).


다라운드 도구 결과(MRTR)
현대적인 환경에서는 도구가 최종 결과 대신 input_required를 반환할 수 있으며, 여기에는 사용자 입력 요청, 샘플링 요청, 또는 roots/list 요청이 포함될 수 있습니다. 클라이언트는 이러한 내장된 요청에 응답한 후, 호출이 complete에 도달할 때까지 새로운 JSON-RPC 식별자를 사용하여 tools/call를 반복적으로 시도합니다.
인스펙터는 MRTR을 수동으로 실행하므로, 각 반복 단계에서는 응답을 기다리는 동안 input_required으로 표시된 pending-request modal에 일시 중단되어 사용자가 답변할 수 있도록 합니다. 프로토콜 뷰는 서로 관련이 없는 여러 호출이 아닌 전체 교환 내용을 하나의 MRTR 대화로 그룹화합니다.
test-servers/configs/mrtr-showcase-http.json는 하나의 최신 서버 내에 모든 형태의 기능을 통합합니다.
| 도구 | 해당 도구가 수행하는 작업 |
|---|---|
mrtr_confirm | 단일 번의 사용자 입력 요청 라운드입니다. |
mrtr_two_step | requestState을 통해 연결된 두 번의 사용자 입력 요청 라운드입니다. |
mrtr_sample | 샘플링 패널로 전달되는 내장형 샘플링 요청입니다. |
mrtr_roots | 구성된 루트에서 음성 없이 조용히 응답되는 내장형 roots/list입니다. |
mrtr_edge | 먼저 inputRequests 전용 라운드가 진행된 후, requestState 전용 라운드가 진행됩니다. |
mrtr_loop | 결코 완료되지 않으므로 클라이언트는 MRTR_MAX_ROUNDS에 정의된 한도에 도달하여 작동을 중단합니다. |

도구: 미러링된 헤더 및 제외된 도구
SEP-2243을 통해 특정 도구는 x-mcp-header로 인자에 주석을 달 수 있으며, 이를 통해 Streamable HTTP 클라이언트에게 해당 인자의 값을 Mcp-Param-* 요청 헤더에 그대로 반영하도록 요청할 수 있습니다.
인스펙터는 도구 탭에 해당 계약의 양쪽 내용을 모두 표시합니다:
- 유효한 주석이 있는 도구의 경우, 상세 패널에 "미러링된 요청 헤더(SEP-2243)" 섹션이 표시되며,
city -> Mcp-Param-City이 그 예입니다. - 무효한 주석이 있는 도구의 경우(예: 공백으로 인해 RFC 9110 토큰으로 인정되지 않는
"Bad Header"와 같은 헤더 이름), 사이드바의 "제외됨(SEP-2243)" 구분선 아래에 줄이 그어진 형태로 표시되며 마우스를 올리면 그 이유가 표시됩니다. 규격을 준수하는 클라이언트는 반드시tools/list에서 그러한 도구를 제거해야 하며, 인스펙터는 도구를 조용히 숨기는 대신 제거된 이유를 명확하게 보여줍니다.
test-servers/configs/xmcpheader-modern-http.json을 사용하여 동일한 상황을 재현할 수 있습니다.

-32602 오류 패널
현대 환경에서는 -32602 방식으로 거부하는 tools/call가 별도의 오류 패널 형태로 표시됩니다.
- 알 수 없는 도구: 메시지에 서버가 나열하지 않은 도구 이름이 포함된 경우입니다. 서버의
tools/list에 없는 이름을 호출하여 재현할 수 있습니다. - 잘못된 매개변수: 그 밖의 모든
-32602경우입니다. 위 구성의trigger_invalid_params도구로 재현할 수 있습니다.
두 환경 모두 -32602 방식으로 거부를 처리하지만, 인스펙터의 표시 방식만 다릅니다. 구버전 연결에서는 일반적인 JSON-RPC 오류가 발생하므로 어떤 경우인지 파악하려면 메시지 내용을 직접 확인해야 합니다.
네트워크 및 프로토콜: 헤더와 오류 분류 체계
현대 환경에서는 일련의 Mcp-* HTTP 헤더를 표준화하였으며, 보다 상세한 JSON-RPC 오류 분류 체계(SEP-2243 / SEP-2575)를 도입했습니다. 두 모니터링 탭은 각각 다른 역할을 담당합니다.
- 네트워크 탭은 HTTP 뷰로, 복제된
Mcp-*헤더가 강조 표시되고 센티널 값도 디코딩됩니다. - 프로토콜 탭은 JSON-RPC 뷰로, 각각의 사양 오류가 일반적인 오류가 아닌 별도의 형태로 표시됩니다.
test-servers/configs/modern-network-http.json는 각 클래스별로 실제 HTTP 상태 코드와 JSON-RPC 오류 본문을 모두 생성하는 네 가지 도구를 제공합니다.
| 도구 | HTTP | JSON-RPC 코드 | 의미 |
|---|---|---|---|
trigger_header_mismatch | 400 | -32020 | 필수인 미러링 헤더가 누락되었거나 잘못되었습니다. |
trigger_missing_capability | 400 | -32021 | 요청에 서버가 요구하는 클라이언트의 기능이 포함되어 있지 않습니다. |
trigger_unsupported_version | 400 | -32022 | 지원되지 않는 버전입니다. 지원되는 버전은 data.supported에 나와 있습니다. |
trigger_method_not_found | 404 | -32601 | 메서드가 찾을 수 없습니다. |


세션
구식의 스트리머블 HTTP 연결의 경우 서버가 할당한 세션 ID(Mcp-Session-Id)가 포함될 수 있으며, 클라이언트는 HTTP DELETE를 통해 해당 연결을 종료합니다. 반면 현대적인 연결은 세션 없이 요청별로 작동하므로 세션 ID가 없어 클라이언트 SDK는 서버에 DELETE를 전송하지 않아 연결 해제가 순전히 클라이언트 측에서 이루어집니다.
이는 클라이언트가 사용하는 테스트 서버에 실질적인 영향을 미칩니다. 요청별로 생성되는 상태 없는 최신 핸들러는 호출 간에 상태를 유지할 수 없기 때문에, 기존의 구식 핸들러와는 달리 test-servers/configs/subscriptions-modern-http.json에서는 update_resource 도구가 생략됩니다. 즉, 변경 작업은 일회용 서버 인스턴스에서 수행되어 다음 읽기 작업에서는 전혀 반영되지 않습니다.