The thing most people actually want from an AI assistant is the morning briefing: a one-page summary of what’s on the calendar, what mattered in the inbox overnight, what tasks rolled over, and what’s still open in the notes app. That’s a tool-using loop over four boring APIs. The hard part is wiring Gmail, Calendar, Drive, and Notion into one coherent loop the model can actually run on schedule.
A weekend personal-assistant project starts with enthusiasm and dies at OAuth refresh tokens. Then it almost works, until the model invents a calendar method name that doesn’t exist, because the SDK shapes don’t map cleanly to a tool schema. Then Notion’s blocks API turns out to need three calls to read one page. Then it’s Sunday and you’ve built nothing.
The shape that works: a tool gateway that already speaks Google Workspace and Notion, exposes typed MCP methods the model can call by name, and handles auth refresh under the hood. You ship the briefing prompt in an afternoon and spend Sunday on the actual question — what should land in your morning brief.
wmcp.sh is that gateway. /integration/google covers Gmail, Calendar, Drive, and Sheets; /integration/notion covers pages and databases. wmcp.sh is not affiliated with Google or Notion.
1. Cron trigger. A scheduler — Cloudflare Cron, GitHub Actions cron, or any host — fires every weekday at your wake time and invokes the assistant runner.
2. Tool gateway (wmcp.sh). The runner pulls MCP tools for Gmail (read-only), Calendar (read + freebusy), Drive + Sheets (read), and Notion (read + page-write for the brief output).
3. Reasoning loop. The model lists today’s calendar events, scans the last 12 hours of inbox for VIP senders and explicit asks, reads the tracking sheet for habit metrics, and pulls open tasks from Notion.
4. Output. The assistant writes a one-page brief to a dated Notion page and (optionally) emails a plain-text version to your inbox. Nothing gets sent or scheduled on your behalf.
| Capability | Vendor | How wmcp.sh wires it |
|---|---|---|
| Read recent email | Gmail | ✅ /integration/google — scoped to messages.list + messages.get |
| List today’s events + freebusy | Google Calendar | ✅ /integration/google — events.list + freebusy.query |
| Read tracking spreadsheet | Google Sheets | ✅ /integration/google — spreadsheets.values.get |
| Read + write notes / tasks | Notion | ✅ /integration/notion — pages + databases |
| Draft (not send) email | Gmail | ✅ drafts.create only — never messages.send |
| Inspect a public URL | Any URL | ✅ Generic /api/v1/tools?url=... |
Python sketch. Runs on cron, reads across Google + Notion, writes a one-page brief to a dated Notion page. Never sends mail, never books meetings.
import httpx
from datetime import date
from anthropic import Anthropic
client = Anthropic()
WMCP = "https://wmcp.sh"
def tools_for(url):
return httpx.get(f"{WMCP}/api/v1/tools", params={"url": url}).json()["tools"]
tools = (
tools_for("https://gmail.googleapis.com")
+ tools_for("https://www.googleapis.com/calendar/v3")
+ tools_for("https://sheets.googleapis.com")
+ tools_for("https://api.notion.com/v1")
)
today = date.today().isoformat()
msg = client.messages.create(
model="claude-sonnet-4-5",
max_tokens=2048,
tools=tools,
messages=[{"role": "user",
"content": f"Morning brief for {today}. List today's calendar, summarize the last 12h "
"of inbox for VIPs and explicit asks, read the habits sheet, and list open tasks "
"from Notion. Write the brief to a new Notion page titled 'Brief — {today}'. "
"Never send email. Never auto-schedule."}],
)
print(msg.content)
drafts.create only. Never wire messages.send.Custom adapter + hosted MCP at mcp.yourbrand.com + verified badge. Starter $499 one-time · Managed Retainer $999/mo · Enterprise $4,999+/mo.