Back to Blog

2025-09-05

Searching Your Life from the Command Line

#mcp#open-source#cloudflare-workers#typescript

Lifelog data flowing from a Limitless Pendant into a queryable interface

There's a moment that happens a few times a week. Someone mentions a decision that was made in a meeting. You remember the meeting. You remember the general vibe. But the specific thing — the number, the deadline, the exact wording — is gone. You dig through your notes. You check Slack. You ask the person who said it. Twenty minutes later you've got your answer, or you've given up and are working from a foggy approximation.

We wore the Limitless Pendant for a few months before we realized the real problem. The recordings were there. The transcripts were there. But getting answers out of them required opening the app, scrolling through a timeline, and reading through full transcripts. It was a filing cabinet full of answers with no librarian.

So we built one.

What Limitless Actually Captures

For anyone unfamiliar: the Limitless Pendant is a small wearable that records your conversations throughout the day. Meetings, phone calls, in-person chats, even your own verbal notes when you're thinking out loud. It transcribes everything, generates summaries, and stores it all in a searchable archive.

The product is genuinely good. But we kept running into the same friction. The information was captured perfectly and locked behind an interface that required you to already know roughly when and where to look.

The MCP Connection

We were already building MCP servers for other tools when the idea clicked. What if Claude could search your Limitless recordings directly? Not just keyword search — actual semantic search. "What did the client say about the timeline in last Tuesday's meeting?" That kind of query.

MCP Limitless is a Cloudflare Workers-based MCP server that gives Claude three tools:

search_lifelogs does hybrid semantic and keyword search across all your recordings. Natural language queries work, boolean operators work, date filtering works. This is the one that changed our daily workflow the most.

list_recent_lifelogs lets Claude browse your recent recordings with date filtering and pagination. Good for "what meetings did I have this week" type questions.

get_lifelog retrieves the full content of a specific recording — complete transcript, AI-generated summary, timestamps, everything.

The Architecture Choice

We deployed this on Cloudflare Workers for a specific reason: latency. MCP tool calls need to feel instant, or the conversational flow breaks. Workers run at the edge, so the round trip between Claude and the Limitless API goes through a node geographically close to both endpoints.

Authentication was the interesting design problem. The server needs access to your Limitless API key, but it also needs to verify that the person connecting is actually you. We went with GitHub OAuth — you authorize once, the token gets stored in Cloudflare KV, and subsequent connections are seamless.

The whole thing runs on Cloudflare's free tier. 100,000 requests per day, which is roughly 100x more than anyone would use through Claude. No credit card required for the infrastructure piece.

What Changed

The honest answer is that we use it more than we expected.

The obvious use case is meeting recall. "What did Sarah say about the budget?" and Claude pulls the relevant section of the transcript. That alone is worth the setup time.

But the less obvious use case is decision archaeology. When you're building software, you make hundreds of small decisions over weeks and months. Why did we choose Redis over Postgres for that service? What was the reasoning behind the API structure? These conversations happened, they were recorded, and now they're queryable. No more reconstructing rationale from memory.

The other thing that happened: we started being more verbal about our reasoning. Knowing that spoken thoughts are captured and searchable changes behavior. You narrate your thinking more. You state assumptions out loud. Future-you benefits from present-you's narration in a way that typed notes never quite captured.

Building MCP on Workers

A few things we learned deploying MCP servers to Cloudflare Workers specifically:

The SSE (Server-Sent Events) transport that MCP uses works well on Workers, but you have to be mindful of the execution time limits. Workers on the free tier get 10ms of CPU time per invocation. That sounds tiny, but most of the wall-clock time is spent waiting on the Limitless API, which doesn't count against CPU time. We've never hit the limit in practice.

KV storage for OAuth tokens is simple and effective. Tokens expire after an hour, KV handles the TTL natively, and there's no database to manage.

Durable Objects handle the MCP agent state. Each connected client gets its own Durable Object instance that maintains the conversation context for that MCP session.

Privacy Considerations

This is worth addressing directly. The Limitless Pendant records conversations. Connecting that data to an AI assistant raises legitimate questions.

Our server doesn't store or cache any lifelog content. Every query goes directly to the Limitless API, and the response passes through to Claude. The Cloudflare Worker is a passthrough, not a data store. Your recordings stay in Limitless's infrastructure, protected by their HIPAA-compliant security model.

The GitHub OAuth layer ensures that only you can access your recordings through the MCP server. No shared access, no team features, no way for another user's Claude session to hit your data.

Try It

The server is open source on GitHub. Setup takes about 15 minutes — you'll need a Cloudflare account (free), a Limitless API key, and a GitHub OAuth app for authentication.

If you're wearing a Pendant and using Claude, this turns two good tools into something meaningfully better than either one alone. Your AI assistant gets access to everything you've heard and said, searchable in natural language, without ever leaving the conversation.