mcp-lab-00-raw-protocol
by lucas-moont
README.md
# mcp-lab-00-raw-protocol
Nível 00 da trilha **MCP Lab**: implementação **manual** do protocolo MCP (Model Context Protocol) sobre stdio, sem usar o SDK oficial. O objetivo não é construir um servidor útil — é ver as mensagens JSON-RPC trocando de lado a lado com as próprias mãos, antes de deixar um SDK esconder isso de você.
Termos técnicos (Tool, Server, Client, Transport...) seguem o glossário em [`../CONTEXT.md`](../CONTEXT.md).
## O que este Server faz
Um único Tool, de propósito — `add`, que soma dois números. É só o suficiente pra passar pelo ciclo completo: handshake → listar Tools → chamar um Tool.
```mermaid
sequenceDiagram
participant H as Host (Claude Code)
participant S as Server (este projeto)
H->>S: initialize (id: 1, protocolVersion)
S-->>H: result (protocolVersion, capabilities, serverInfo)
H->>S: notifications/initialized
Note over S: sem resposta — é uma Notification
H->>S: tools/list (id: 2)
S-->>H: result (lista de Tools: "add")
H->>S: tools/call (id: 3, name: "add", arguments: {a, b})
S-->>H: result (content: texto com a soma)
```
## Como rodar
```bash
uv sync # instala as dependências
uv run pytest -q # roda os 15 testes
uv run ruff check . # lint
uv run mypy # checagem de tipos (modo strict)
```
Pra ver o protocolo funcionando de verdade, sem o SDK, sem o Claude Code — só você mandando as mensagens na mão:
```bash
printf '%s\n' \
'{"jsonrpc": "2.0", "id": 1, "method": "initialize", "params": {"protocolVersion": "2025-06-18"}}' \
'{"jsonrpc": "2.0", "method": "notifications/initialized"}' \
'{"jsonrpc": "2.0", "id": 2, "method": "tools/list"}' \
'{"jsonrpc": "2.0", "id": 3, "method": "tools/call", "params": {"name": "add", "arguments": {"a": 4, "b": 5}}}' \
| uv run raw-mcp-protocol
```
## Estrutura do código
```
src/raw_mcp_protocol/
├── jsonrpc.py → camada de transporte: lê/escreve linhas JSON, não entende o conteúdo
├── server.py → camada de lógica: decide a resposta pra cada "method"
└── __init__.py → ponto de entrada: liga as duas camadas num loop
```
Cada camada tem seu próprio `.md` em [`docs/`](./docs/) explicando o pra-quê, o quê e como:
- [`docs/01-transporte-stdio.md`](./docs/01-transporte-stdio.md)
- [`docs/02-jsonrpc.md`](./docs/02-jsonrpc.md)
- [`docs/03-handshake-initialize.md`](./docs/03-handshake-initialize.md)
- [`docs/04-tools.md`](./docs/04-tools.md)
## O que este nível deliberadamente NÃO faz
- Não valida rigorosamente o ciclo de vida (chamar `tools/call` antes do `initialize` não é bloqueado) — fica como leitura, não como bloqueio ativo.
- Não implementa Resources, Prompts, Sampling, Roots nem Elicitation — isso é o Nível `02-resources-prompts` em diante.
- Não roda sobre HTTP — isso é o Nível `04-remote-http-auth`.
## Referência oficial
[modelcontextprotocol.io/specification](https://modelcontextprotocol.io/specification) — a fonte da verdade. As versões de protocolo hardcoded em `server.py` (`SUPPORTED_PROTOCOL_VERSIONS`) devem ser conferidas contra essa página se você estiver lendo isto muito tempo depois de escrito.
TDQS
A3.8/5.0
Scored across 1 tool
Disambiguation5/5
Only one tool exists, so there is no possibility of overlapping or ambiguous tool purposes. The single 'add' tool has a clear, singular function.
Naming Consistency4/5
The tool name 'add' is clear, concise, and uses a lowercase verb style. With only one tool, there is no established pattern to fully evaluate, but the naming is appropriate and unambiguous.
Tool Count3/5
A single tool feels minimal and thin for most practical use cases. It is not necessarily inappropriate for a very narrow addition-only server, but the count is at the borderline lower end.
Completeness2/5
The tool set only supports addition. If the intended domain is basic arithmetic, significant operations such as subtraction, multiplication, and division are missing, leaving substantial gaps.
Maintenance
ActivityMaintained
ResponsivenessNo issues