Connect
The writing, case studies and résumé on this site are also served over MCP, the Model Context Protocol that AI clients use to call outside tools. Point a client at one address and it can read and search all of it for you, with no account and no key. Your client asks the server what it offers when it connects. Enjoy!
Handshake
This is the first message every client sends. Press the button and this page sends it for real, from your browser, to the endpoint on this page.
Request
{
"jsonrpc": "2.0",
"id": 1,
"method": "initialize",
"params": {
"protocolVersion": "2025-06-18",
"capabilities": {},
"clientInfo": {
"name": "ryanlindsey.me/connect",
"version": "1"
}
}
}Reply
Press Say hello and the reply appears here.
- server
- version
- protocol
- answered in
The reply also describes the server's tools. Your client reads them when it connects.
Set up a client
Claude
In claude.ai or the desktop app, open Customize, then Connectors, press the plus button and choose Add custom connector.
Give it a name and paste the endpoint as its URL. Claude Desktop and Cowork pick up the same connector.
https://mcp.ryanlindsey.me/mcp
With a token
On the second step of the same dialog, add a request header named authorization with the value Bearer <token>, including the word Bearer.
A connector cannot have its headers edited once it exists. To change the token, remove the connector and add it again.
Claude Code
Run this in a terminal. It adds the server to the current project; add --scope user to have it everywhere.
claude mcp add --transport http ryanlindsey-me https://mcp.ryanlindsey.me/mcp
With a token
The same command, with the token as a header.
claude mcp add --transport http ryanlindsey-me https://mcp.ryanlindsey.me/mcp --header "Authorization: Bearer <token>"
Any other client
Any client that speaks Streamable HTTP needs the endpoint and nothing else. This is the handshake as a request, the same one the button above sends.
curl https://mcp.ryanlindsey.me/mcp \
-H 'content-type: application/json' \
-H 'accept: application/json, text/event-stream' \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"ryanlindsey.me/connect","version":"1"}}}'With a token
The token travels in the authorization header as a bearer, and nowhere else: not a cookie, not a query parameter.
curl https://mcp.ryanlindsey.me/mcp \
-H 'content-type: application/json' \
-H 'accept: application/json, text/event-stream' \
-H 'authorization: Bearer <token>' \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"ryanlindsey.me/connect","version":"1"}}}'