MCP 의 primitive 는 셋씩 두 묶음으로 깔끔하게 갈려. Server 쪽 은 host 가 갖다 쓸 capability 를 내놓고, client 쪽 은 server 가 부탁할 수 있는 capability 를 내놔. 일부러 대칭으로 만든 거고, 개별 primitive 를 파기 전에 한 번 짚어둘 값을 해.
| Server feature (server → host) | Client feature (host → server) |
|---|---|
| Resources — host 가 가져다 읽는 읽기 전용 데이터 | Sampling — server 가 host 의 LLM 한테 대신 생각해달라고 부탁 |
| Prompts — user 가 불러 쓰는, 틀이 잡힌 workflow | Roots — server 가 host 한테 어디까지가 자기 영역인지 물음 |
| Tools — side effect 가 있을 수 있는, 부를 수 있는 함수 | Elicitation — server 가 host 를 통해 user 한테 입력을 받음 |
이렇게 갈라놓으면 책임이 또렷해져. Server 는 자기가 가진 것 을 내놓고, client 는 host 만 해줄 수 있는 것 을 내놓아. Server 한테는 LLM 이 없으니까 sampling 은 server 가 부탁하는 client capability 여야 하고, client 는 본 적도 없는 DB 의 table 을 훑을 수 없으니까 resource 는 client 가 가져가는 server capability 여야 하는 거지.
Trio 두 묶음만 기억하고 표는 잊어버려도 돼. 남길 건 '이 기능은 어디에 사는가' 라는 질문 하나야. 읽기 전용 데이터면 Resource, user 가 부르는 workflow 면 Prompt, side effect 가 있는 동작이면 Tool, server 가 부탁하는 LLM 호출이면 Sampling, filesystem 경계면 Roots, user 한테 던지는 질문이면 Elicitation.