> ## Documentation Index
> Fetch the complete documentation index at: https://developers.investorlift.com/llms.txt
> Use this file to discover all available pages before exploring further.

# The two protocol legs

> The 2026-07-28 leg and the initialize-era leg on the one route: the headers each needs, the frames each returns, and how the API bills each.

`POST /mcp` answers two protocol legs, both stateless. The client picks the leg, and the API serves either on the
same route with the same key. [Connecting a client](/mcp/connect) says which leg each client takes, as far as a live
call confirmed it. This page shows the wire.

## The initialize-era leg

An `initialize`-era client sends the plain handshake. It gets one `text/event-stream` frame, and the frame closes as
soon as the server writes it, so a proxy has nothing to hold open:

```
curl -s -D - "https://api.investorlift.com/mcp" -H "Authorization: Bearer $GM_API_KEY" \
  -H 'Accept: application/json, text/event-stream' -H 'Content-Type: application/json' \
  -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-11-25","capabilities":{},"clientInfo":{"name":"curl","version":"0"}}}'
```

```
HTTP/1.1 200 OK
x-request-id: ef81aef9-...   zp-rid: ef81aef9-...
cache-control: no-cache, no-transform   vary: Authorization   x-accel-buffering: no
x-dataset-version: hou=1789052706,phx=1789053358   x-data-end: hou=2026-08-11,phx=2026-08-12
content-type: text/event-stream

event: message
data: {"result":{"protocolVersion":"2025-11-25","capabilities":{"tools":{"listChanged":false},"resources":{"listChanged":false,"subscribe":false},"prompts":{"listChanged":false},"completions":{}},"serverInfo":{"name":"god-mode"},"instructions":"Deed, MLS, Investorlift and parcel data ..."},"jsonrpc":"2.0","id":1}
```

The frame answers the protocol version the client named when the server speaks it, else the newest the server
speaks. The real frame also carries `serverInfo.version`, the API version that answers, the figure at the top of the
[changelog](/changelog). This page leaves it out, because it moves with every release.

The API writes the frame before the tool runs. So a charged `tools/call` on this leg is billed per call, at the
largest cost its page can have, served or refused. `meta.credits.charged` carries that weight.

## The 2026-07-28 leg

The 2026-07-28 leg adds three headers and the two `_meta` protocol keys inside `params`. The answer is
`application/json` with `cache-control: private, no-cache` and no `x-accel-buffering`. `Mcp-Protocol-Version` and
`Mcp-Method` go on every message. `Mcp-Name` carries the name or the uri the body names, on a `tools/call`, a
`resources/read` and a `prompts/get` alike:

```
curl -s "https://api.investorlift.com/mcp" -H "Authorization: Bearer $GM_API_KEY" \
  -H 'Accept: application/json, text/event-stream' -H 'Content-Type: application/json' \
  -H 'Mcp-Protocol-Version: 2026-07-28' -H 'Mcp-Method: tools/call' -H 'Mcp-Name: godmode_coverage' \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"godmode_coverage","arguments":{},"_meta":{"io.modelcontextprotocol/protocolVersion":"2026-07-28","io.modelcontextprotocol/clientCapabilities":{}}}}'
```

Swap `tools/call` for `server/discover` or `tools/list`, and drop `Mcp-Name`: those two methods name nothing.
`resources/read` and `prompts/get` still need it, with `godmode://concepts` or `who_owns_this_house` as the value.
Without it the route answers `400` with JSON-RPC `-32020`. The message says that the request headers and the body
disagree, because the body carries `params.uri` or `params.name` and the required header is absent.

On this leg a charged `tools/call` pays one credit per record new to your account, plus the tool's base. A record the
account already saw costs nothing. `meta.credits.charged` is the ledger's figure.

## What both legs share

Every answer carries `x-request-id`, the id to quote in a bug report. It also carries one label per loaded market on
`x-dataset-version` and `x-data-end`, the values `meta.coverage[]` carries too. The server sends no `Mcp-Session-Id`,
invites no change stream (`listChanged` and `subscribe` are false) and answers a notification with `202` and no body.
`GET /mcp` and `DELETE /mcp` answer `405`. The three error shapes a call can meet are on [Errors over MCP](/mcp/errors).


## Related topics

- [Connecting a client](/mcp/connect.md)
- [Changelog](/changelog.md)
- [Frequently asked questions](/guides/faq.md)
- [Plans and limits](/guides/plans-and-limits.md)
- [The MCP endpoint](/mcp/overview.md)
