The MCP Endpoint: Stone Maps as a Tool
The MCP Endpoint: Stone Maps as a Tool
Stone Maps has an MCP server. If you have an MCP client โ Claude Desktop, any tool that speaks the Model Context Protocol โ you can point it at https://stnmps.com/api/mcp/mcp and use Stone Maps as a tool.
You can read your journal. Write entries. Start conversations with the Emissary. Find nearby posts by coordinate. All from inside another AI.
Building it took about a day. But the interesting part wasn't the implementation โ it was what it revealed about the product.
What MCP Is
The Model Context Protocol is a standard for AI tools. Instead of building a bespoke plugin for every AI assistant, you implement one MCP server and any compliant client can use it. The protocol handles discovery (what tools exist, what parameters they take) and invocation (call this tool with these arguments, return the result).
Stone Maps uses the @modelcontextprotocol/sdk with the Web Standard Streamable HTTP transport โ the MCP protocol version designed for stateless HTTP endpoints, not persistent WebSocket connections. This means the server runs inside a Next.js API route (/api/mcp/[transport]) and Vercel scales it like any other serverless function.
Authentication
Every MCP request carries a Bearer token in the Authorization header:
async function handle(req: NextRequest): Promise<Response> {
const apiToken = (req.headers.get('authorization') ?? '').replace(/^Bearer\s+/, '');
const transport = new WebStandardStreamableHTTPServerTransport({ sessionIdGenerator: undefined });
const server = buildServer(apiToken, getApiUrl());
await server.connect(transport);
return transport.handleRequest(req);
}
The API token is your Stone Maps personal API token โ the same kind you can generate from the settings screen. The MCP server proxies every tool call through the Stone Maps REST API using that token as a Bearer credential. It doesn't hold a privileged service account; it acts as you.
This means the MCP endpoint has the same permission scope as your account. You can only read your own private journal entries. You can only create posts as yourself. The access model is not different for AI callers than for browser callers.
The Tools
The MCP server exposes 17 tools:
System
check_healthโ API health check (database, Redis, R2 status)
User
get_user_profileโ your account details
Self-pairs
get_self_pairsโ your paired stones
Posts
get_journal_postsโ paginated journal entries, up to 100 at a timecreate_postโ new journal entry with optional visibility (private,public,team)search_postsโ search by query string
Stones
list_stonesโ all stones you ownget_stone_detailsโ a single stone by ID
Conversations
list_conversationsโ your Emissary conversation historystart_conversationโ begin a new Emissary session, optionally with coordinates
Map
get_nearby_postsโ public posts within a radius (default 1km, max 50km) of a coordinateget_map_postsโ public posts within a bounding box
Teams
list_teamsโ teams you belong to
Campaigns
list_campaignsโ campaigns for a team
Tokens
list_tokensโ your API tokens (metadata only, never the raw token)create_tokenโ generate a new API tokendelete_tokenโ revoke a token by ID
What This Means for the Product
Building the MCP endpoint forced a useful audit. Each tool required a clear, one-sentence description of what it does. That process surfaced inconsistencies in the REST API design โ places where two endpoints did similar things with different parameter shapes, or where a logical tool didn't exist yet.
More interesting was the question of what kind of thing Stone Maps is when accessed through a tool interface.
The journal โ your private record of places and moments โ becomes queryable. An AI assistant can ask "what did I write about last Tuesday?" or "find my posts from near the coast." The Emissary conversation history becomes a data source, not just a UI element.
This is fine. It's arguably one of the more interesting use cases: your journal as a research context for another AI that's helping you think about something. But it's also a thing to be thoughtful about. Private posts are private because you decided they were. The MCP endpoint respects that. But the interface still feels different โ more legible, more extractable โ than typing into a text box.
The start_conversation tool is the one that interests me most. You can initiate an Emissary conversation with an explicit location โ latitude and longitude โ without actually being there. From a desktop MCP client, you could start a conversation situated at a place you remember, not a place you're standing. The Emissary doesn't know the difference.
Whether that's a feature or a problem depends on what you think the journal is for.
Using It
To connect Stone Maps to Claude Desktop, add to your MCP config:
{
"mcpServers": {
"stone-maps": {
"type": "http",
"url": "https://stnmps.com/api/mcp/mcp",
"headers": {
"Authorization": "Bearer YOUR_API_TOKEN"
}
}
}
}
Generate your API token from Settings โ API Tokens. The token is shown once โ copy it before closing the dialog.
From there, any MCP-capable assistant can call into your Stone Maps account. What you do with that is up to you.