MCP 를 대화답게 만들어주는 건 client 쪽 셋이야. 이 셋은 저마다, server 가 host 를 거쳐 host 만 할 수 있는 일에 손을 뻗게 해줘.
Sampling 은 server 가 host 의 LLM 한테 대신 추론해달라고 부탁하는 거야. 전형적인 경우는 이래. 코드를 분석하는 server 가 가능한 리팩터링 몇 가지를 놓고 판단을 해야 해. 자기 LLM 을 싣는 대신 sampling 요청을 보내면 host 가 추론을 돌려줘. Host 는 그걸 넘기기 전에 반드시 user 한테 물어봐야 해. sampling 은 결국 'server 가 내 두뇌를 빌리고 싶다' 는 말이라 동의가 필요하거든. 승인이 나면 결과가 sampling 결과로 server 에 흘러가.
Roots 는 server 가 host 한테 이번 session 의 활동 범위를 묻는 거야. Filesystem server 는 $HOME 에 접근할 수 있다고 넘겨짚으면 안 돼. Host 한테 root 를 물어서 file:///Users/me/project 같은 답을 받고 그 안에서만 움직여야지. Host 는 보통 지금 열려 있는 workspace 나 user 가 고른 폴더에서 root 를 뽑아내. Protocol 은 그 질문을 어떻게 주고받는지만 정해줘.
Elicitation 은 셋 중 제일 인간적이야. Server 가 workflow 중간에, 처음부터 다시 돌리지 않고도 user 한테 입력을 더 달라고 하는 거지. '어느 환경에 배포할까?' '테스트 파일도 포함할까?' Server 가 원하는 입력을 작은 JSON Schema 로 그려서 elicitation/create 요청을 보내면, host 가 입력 폼을 띄우고 답을 모아 돌려줘. Elicitation 덕에, protocol 의 구조를 하나도 안 깨면서 한 번 부르고 끝나던 tool 이 오가는 대화로 바뀌어.