← All work

Tools I made for myself

MCP Server

Brag-tracker

A multi-tenant MCP server for logging work with AI agents: strict isolation, hand-rolled JSON-RPC, and self-hosted Google OAuth on the free tier.

See in graph

The problem

If an agent can write to a log, it can also write to the wrong person’s log. Off-the-shelf auth on a toy project is how that happens. I wanted a private record that still behaved like a real multi-tenant service.

What it is

Weekly updates were turning into archaeology. I built a remote MCP server so an agent can write accomplishments as they happen, with per-tenant isolation in every query path and OAuth that I actually understand.

What I built

The server is a remote MCP endpoint on Cloudflare Workers with D1. The JSON-RPC transport is hand-rolled and stateless, which keeps the Worker model honest: no leftover session on the isolate.

Every query path is tenant-scoped. There is no “forget the WHERE” helper. Google OAuth 2.0 is the authorization-code flow with state and nonce checks and a blocked-user gate, hosted by the same project rather than delegated to a black box.

How it fails

A token for tenant A cannot read tenant B. Invalid OAuth state is a hard fail, not a retry that skips the check. The whole thing runs on the free tier, so the design has to stay cheap as well as strict.

Focus

  • Stateless JSON-RPC transport for MCP
  • Per-tenant isolation on every query path
  • Self-hosted Google OAuth 2.0 with state, nonce, and a blocked-user gate

What changed

  • Work is captured while it happens instead of reconstructed on Friday.
  • Isolation and OAuth are part of the product, not a later hardening pass.

Built with

Cloudflare WorkersD1MCPOAuth 2.0TypeScript