Any MCP Client
Connect any client that speaks Model Context Protocol revision 2026-07-28 over HTTP.
These servers speak that one revision. There is no initialize handshake and no session id — every request carries its own protocol envelope in params._meta and declares its method in an Mcp-Method header. A 2025-era client will be answered with an unsupported-protocol-version error naming this revision.
Available Endpoints
Left Hook Public MCP
https://mcp.lefthook.com/mcp23 tools, 8 resources, 3 prompts | No auth | Stateless
Left Hook Docs MCP
https://mcp.lefthook.com/docs/mcp11 tools, 6 resources | No auth | Stateless
Protocol Details
| Protocol Revision | 2026-07-28 (only) |
| Transport | HTTP POST to a single endpoint |
| Content-Type | application/json |
| Accept | application/json, text/event-stream |
| Message Format | JSON-RPC 2.0 |
| Required Headers | Mcp-Protocol-Version, Mcp-Method (plus Mcp-Name on tools/call) |
| Discovery | server/discover |
| Authentication | None required |
| CORS | All origins (*) allowed |
| Session | None — the revision removed sessions |
Example: Discover the Server
server/discover replaces the old handshake. It returns the revisions the server speaks, its capabilities, and a description of what it can reach.
curl -X POST https://mcp.lefthook.com/mcp \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-H "Mcp-Protocol-Version: 2026-07-28" \
-H "Mcp-Method: server/discover" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "server/discover",
"params": {
"_meta": {
"io.modelcontextprotocol/protocolVersion": "2026-07-28",
"io.modelcontextprotocol/clientInfo": {
"name": "my-client",
"version": "1.0.0"
},
"io.modelcontextprotocol/clientCapabilities": {}
}
}
}'Example: List Tools
curl -X POST https://mcp.lefthook.com/mcp \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-H "Mcp-Protocol-Version: 2026-07-28" \
-H "Mcp-Method: tools/list" \
-d '{
"jsonrpc": "2.0",
"id": 2,
"method": "tools/list",
"params": {
"_meta": {
"io.modelcontextprotocol/protocolVersion": "2026-07-28",
"io.modelcontextprotocol/clientInfo": {
"name": "my-client",
"version": "1.0.0"
},
"io.modelcontextprotocol/clientCapabilities": {}
}
}
}'Example: Call a Tool
A tool call additionally declares the tool name in an Mcp-Name header; the server rejects the request if it disagrees with the body.
curl -X POST https://mcp.lefthook.com/mcp \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-H "Mcp-Protocol-Version: 2026-07-28" \
-H "Mcp-Method: tools/call" \
-H "Mcp-Name: search_catalog" \
-d '{
"jsonrpc": "2.0",
"id": 3,
"method": "tools/call",
"params": {
"name": "search_catalog",
"arguments": {
"query": "CRM integrations"
},
"_meta": {
"io.modelcontextprotocol/protocolVersion": "2026-07-28",
"io.modelcontextprotocol/clientInfo": {
"name": "my-client",
"version": "1.0.0"
},
"io.modelcontextprotocol/clientCapabilities": {}
}
}
}'MCP SDK Configuration
Use @modelcontextprotocol/client v2, which speaks 2026-07-28. The v1 @modelcontextprotocol/sdk client cannot connect to these endpoints.
import { Client } from "@modelcontextprotocol/client";
import { StreamableHTTPClientTransport } from "@modelcontextprotocol/client";
const transport = new StreamableHTTPClientTransport(
new URL("https://mcp.lefthook.com/mcp")
);
const client = new Client({
name: "my-app",
version: "1.0.0",
});
// The client probes server/discover and pins the negotiated revision.
await client.connect(transport);
// List available tools
const tools = await client.listTools();
console.log(tools);
// Call a tool
const result = await client.callTool({
name: "search_catalog",
arguments: { query: "CRM integrations" },
});
console.log(result);MCP Config File
For clients that read mcp.json or claude_desktop_config.json:
{
"mcpServers": {
"lefthook-catalog": {
"url": "https://mcp.lefthook.com/mcp"
},
"lefthook-docs": {
"url": "https://mcp.lefthook.com/docs/mcp"
}
}
}