Skip to main content
RCP defines three named conformance levels. A server MUST state its level in info/initialize via _meta.conformance ("L0", "L1", or "L2"); clients use it as a coarse expectation, and capabilities as the precise contract.

Levels

L0 — Base (REQUIRED of every server)

Answer initialize, info, and ping (the latter two at any time, echoing a ping nonce); advertise at least one retrieval capability; reject pre-initialize requests with -32001; reject unadvertised capability methods (-32003), undefined methods (-32004), and unsupported options (-32005); return well-formed JSON-RPC 2.0 echoing the request id; validate params (-32602) instead of crashing; ignore unknown notifications; tolerate unknown fields, capability keys, and _meta.
L1 plus a selection of rerank (cross-encoder and/or ColBERT), multiVector / late interaction, graph, query/transform, streaming, and pagination. The frontier profile — hybrid + rerank + graph + multimodal.
Levels are a coarse signal. The precise, machine-checkable contract is always the capability set a server advertises at initialize. A client should gate on supports(...), not on the level string.

The test suite

A transport-agnostic conformance suite validates any server, in any language, over stdio or HTTP:
The harness is level-aware: it tags every check L0/L1/L2, skips the checks for capabilities a server doesn’t advertise, and prints the highest level the server actually reaches:
It also cross-checks honesty: a server that declares _meta.conformance: "L2" but only certifies L1 is flagged as OVERCLAIMED and the run exits non-zero — even with zero failed checks — so a badge can’t lie. Pass --json for a CI-consumable report; the non-zero exit gates a release pipeline. The Python and C++ reference example servers both certify L2 (a real dense + sparse → RRF → rerank hybrid pipeline), and every SDK’s client drives every other SDK’s server over both stdio and HTTP.

Conforming clients

A conforming client must:
1

Initialize first

Send initialize before any gated method.
2

Honour negotiation

Respect the negotiated protocol version.
3

Gate on capabilities

Never call an unadvertised method.
4

Correlate by id

Match responses to requests by id, not order.
5

Tolerate dropped notifications

Function correctly even if it drops every notifications/progress and notifications/log.