Initialize the Android SMS MCP server
Before any tool can be called, the MCP client must perform a handshake with the server. The initialize request establishes a shared protocol version and lets both sides declare which optional MCP capabilities they support. This is always the very first message of an MCP session.
Sequence diagram
sequenceDiagram
participant A as AI Agent
participant S as SMS MCP Server
A->>S: POST /mcp
method: "initialize"
protocolVersion: "2025-11-25" S-->>A: 200 OK
protocolVersion: "2025-11-25"
serverInfo + capabilities Note over A,S: Session established – tools may now be called
method: "initialize"
protocolVersion: "2025-11-25" S-->>A: 200 OK
protocolVersion: "2025-11-25"
serverInfo + capabilities Note over A,S: Session established – tools may now be called
HTTP request
The agent sends a JSON-RPC 2.0 object to POST /mcp.
POST /mcp HTTP/1.1
host: 192.168.0.11:9531
connection: keep-alive
content-type: application/json
accept: application/json, text/event-stream
accept-language: *
sec-fetch-mode: cors
user-agent: node
accept-encoding: gzip, deflate
content-length: 167
{
"method": "initialize",
"params": {
"protocolVersion": "2025-11-25",
"capabilities": {},
"clientInfo": {
"name": "mcp-discovery-tool",
"version": "1.0.0"
}
},
"jsonrpc": "2.0",
"id": 0
}
Request fields
| Field | Example value | Description |
|---|---|---|
jsonrpc |
"2.0" |
JSON-RPC protocol version. Must always be "2.0". |
id |
0 |
Request identifier. The server echoes this value in the response so the client can correlate async replies. |
method |
"initialize" |
The MCP method name. Must be "initialize" for the handshake. |
params.protocolVersion |
"2025-11-25" |
The highest MCP protocol version the client supports. The server responds with the version it will use. |
params.capabilities |
{} |
Optional map of client capabilities (e.g. sampling, roots). An empty object means no extra capabilities are declared. |
params.clientInfo.name |
"mcp-discovery-tool" |
Human-readable name of the MCP client application. |
params.clientInfo.version |
"1.0.0" |
Version string of the MCP client application. |
HTTP response
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 212
Connection: keep-alive
{
"id": 0,
"result": {
"protocolVersion": "2025-11-25",
"capabilities": {
"tools": {
"listChanged": false
}
},
"serverInfo": {
"name": "ozeki_android_mcp",
"version": "1.0.0",
"title": "Ozeki Android SMS MCP server"
}
},
"jsonrpc": "2.0"
}
Response fields
| Field | Example value | Description |
|---|---|---|
id |
0 |
Echoes the request id for correlation. |
result.protocolVersion |
"2025-11-25" |
The protocol version the server will use for this session. |
result.capabilities.tools.listChanged |
false |
When true, the server would send notifications/tools/list_changed events if the tool catalogue changes at runtime. false means the tool list is static. |
result.serverInfo.name |
"ozeki_android_mcp" |
Internal identifier of the server implementation. |
result.serverInfo.version |
"1.0.0" |
Version of the server software. |
result.serverInfo.title |
"Ozeki Android SMS MCP server" |
Human-readable display name shown in MCP client UIs. |
To sum it up
The initialize handshake is a lightweight, one-round-trip
negotiation. Once the server returns a 200 OK with its
serverInfo, the session is active and the agent can proceed to
discover available tools with a tools/list request.