life-hub-mcp
Enables deployment of a remote MCP server on Cloudflare Workers and integration with Cloudflare AI Playground for using MCP tools.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@life-hub-mcpDeploy my MCP server to Workers"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Life Hub MCP
A personal remote MCP server (Cloudflare Worker) that lets Claude log and read structured life-tracking data — starting with nutrition — into an Obsidian vault.
You type a freeform meal in Claude ("3 eggs, oatmeal, a chicken breast, rice"); the model parses it and estimates macros, then calls a tool; the Worker writes one immutable event file to Cloudflare R2; Obsidian (via the Remotely Save plugin) pulls those files into a vault folder, where a Dataview dashboard summarizes them.
Nutrition is the first tracker; the design generalizes to future entry types (journal, workout, etc.) via a shared envelope + a typed body.
How it works
Claude app ──parse+estimate──▶ MCP tool ──▶ Worker ──write──▶ R2 (one file per meal)
│
Remotely Save ◀──sync┘
│
▼
Obsidian vault + Dataview dashboardStorage model
One immutable event file per submission. Never a read-modify-write of a shared daily note.
Daily/weekly totals are derived at read time (and in the dashboard), never stored.
R2 key mirrors the vault subpath, keyed by logical date so "last 7 days" is a cheap prefix-list:
Trackers/Nutrition/entries/2026-06-23/2026-06-23-190712.mdFilename stem
{logical_date}-{HHMMSS}is the idempotency key. A ULID lives inside the file as a stable internalid.
Entry format
Each entry is markdown: a YAML frontmatter envelope (common to all types) + a typed body + a human-readable line.
---
id: 01J8XQ2K7E9...
type: nutrition-entry
date: 2026-06-23 # logical date (6am-Toronto rule)
logged_at: 2026-06-23T23:07:12Z
source: claude
meal: dinner
calories: 820 # derived from items
protein_g: 63
confidence: medium
input_text: "3 eggs, oatmeal, a chicken breast, rice" # raw user text, kept for audit
items:
- { name: eggs, qty: 3, calories: 210, protein_g: 18 }
# ...
---
Dinner — 3 eggs, oatmeal, a chicken breast, riceLogical-date rule
Timezone America/Toronto; a "day" runs 6:00am → 6:00am, so a meal logged at 12:30am belongs to
the previous calendar date. Conversion goes through the IANA timezone (DST-aware), never a fixed
offset. An explicit date passed by the user is used verbatim.
Related MCP server: Remote MCP Server Authless
Tools
Tool | Kind | Purpose |
| write | Log a meal as one nutrition entry; totals derived from per-unit macros × qty. |
| write | Log a bodyweight measurement (weight_lbs, optional waist/body-fat/notes). |
| write | Correct a nutrition entry by its |
| write | Correct a bodyweight entry by its |
| read | Fetch entries in a date range as compact JSON. Omit |
| read | Delete an entry by its |
| read | Per-day nutrition macro rollups for trend questions. |
Writes are typed (one log_X/edit_X per entry type, so each tool's schema shows exactly that
type's fields); reads are generic over the shared envelope. New entry types are added as an
adapter in src/registry.ts — see the Adapter interface (type, folder,
tags, zod input shapes, toBody/applyEdit/bodyLine).
Stack
Cloudflare Workers + TypeScript
Cloudflare R2 (
env.BUCKET) for storageMCP over streamable HTTP, built on the
agentsSDKGitHub OAuth via
@cloudflare/workers-oauth-provider, gated to an allowlist of GitHub loginsObsidian + Dataview for the dashboard (frontmatter properties, not inline fields)
Development
npm install # installs deps and the lefthook pre-commit hook
npm run dev # wrangler dev (local R2 via Miniflare)
npm run check # lint + format check + type-check
npm run lint:fix # apply lint fixes
npm run format # apply formattingTools can be exercised locally against the /mcp endpoint with the
MCP Inspector or any MCP client.
Deployment
Bindings (R2 bucket life-hub, KV namespace OAUTH_KV) are declared in wrangler.jsonc.
Secrets (set via npx wrangler secret put <NAME>):
GITHUB_CLIENT_ID,GITHUB_CLIENT_SECRET— from a GitHub OAuth App whose callback ishttps://<worker-url>/callbackCOOKIE_ENCRYPTION_KEY— e.g.openssl rand -hex 32
npx wrangler deployThen add https://<worker-url>/mcp as a custom connector in Claude and authenticate via GitHub.
Only GitHub logins in ALLOWED_USERNAMES (in src/index.ts) can use the tools.
This server cannot be deployed
Maintenance
Related MCP Connectors
Cloudflare Workers MCP server: ai-gateway
9 remote MCP servers on Cloudflare Workers for AI agents. Free tier + Pro API keys.
Cloudflare Workers MCP server: ai-agent-scratchpad
Cloudflare Workers MCP server: ai-model-router
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables deploying a remote MCP server on Cloudflare Workers without authentication, and connecting it to Cloudflare AI Playground or Claude Desktop.1,620 npm8MIT
- FlicenseNot gradedqualityCmaintenanceEnables deploying a remote MCP server on Cloudflare Workers without authentication, allowing connection to AI Playground or Claude Desktop for tool usage.-
- FlicenseNot gradedqualityCmaintenanceEnables deployment of a remote MCP server on Cloudflare Workers without authentication, allowing connection from AI Playground or Claude Desktop.-
- FlicenseNot gradedqualityDmaintenanceEnables deployment of a remote MCP server on Cloudflare Workers without authentication, allowing connection from AI Playground and Claude Desktop.-