Agent-Native Calendar
Agent-Native Google Calendar - manage events, sync, and public booking
Description from the maker (original English)
Your recipes as plain files in your own Google Drive, searchable by your AI assistant.
These three are never merged into one score: opinions, measurements and popularity are different things.
We have not written a plain-language summary for this one yet. Below are the facts we read from the registry.
Pick the AI app you use, then copy the settings.
You need
Which app do you use?
Pick your app above. We remember it, so next time the button says “Install in …”.
Works in Claude on the web, desktop and mobile:
https://chowdown.apps.mrida.ng/mcpRun this in your terminal
claude mcp add --transport http chowdown https://chowdown.apps.mrida.ng/mcpPaste into .cursor/mcp.json in your project, or ~/.cursor/mcp.json
{
"mcpServers": {
"chowdown": {
"url": "https://chowdown.apps.mrida.ng/mcp"
}
}
}Your browser asks to open the app, then the app shows the settings and asks you to confirm. Key values are left empty for you to fill in.
Paste into .vscode/mcp.json in your project
{
"servers": {
"chowdown": {
"type": "http",
"url": "https://chowdown.apps.mrida.ng/mcp"
}
}
}Your browser asks to open the app, then the app shows the settings and asks you to confirm. Key values are left empty for you to fill in.
ChatGPT connects only to servers on the internet:
https://chowdown.apps.mrida.ng/mcpMenu names can differ slightly by plan and over time.
Your choice stays on this device in a cookie; no account needed.
These settings are generated from the maker’s registry entry. If the README says otherwise, follow the README.
The server asks you to sign in before it lists its tools.
We check information anyone can see; we have not read the code. Checks that do not apply are left out of the count. · Checked Nov 7, 2026
The registry name was verified with the GitHub account mridang, which owns the repo
We have not read this repo from GitHub yet
We have not read this repo from GitHub yet
Responded in 1381 ms (HTTP 401)
Declares OAuth sign-in, so your AI app can take you to log in
Not checked yet; we read the tool list when we check the endpoint
Compared with every active server in this category in the registry. Stars count only when the publisher owns the repo.
It passed 3 of 3 applicable basic checks. We have not read the code. Before adding a key or token, see what access the server asks for and use a key with only the permissions you need.
The registry does not list a required key, though some servers ask you to sign in on first use.
It runs in the maker’s cloud. Connect over the internet with nothing to install, but what you send passes through the maker’s servers.
The GitHub repo last changed –, and the latest version (0.1.0) reached the registry 14 days ago.
Apps that support MCP, such as Claude Desktop, Claude Code, Cursor and VS Code. It connects by URL, so apps that accept remote MCP servers work too, such as ChatGPT in developer mode.
In the same category: Agent-Native Calendar, Excel MCP Server, MCP Server for Excel
Servers in the same category from other makers, sorted by stars.
Reading a card:★ GitHub starsiThree pillars: reviews · checks · usageiUpdated = latest version published to the registryi
Agent-Native Google Calendar - manage events, sync, and public booking
Lets AI create and edit Excel files itself, including formulas, charts and PivotTables, without Excel installed.
Excel automation for AI - Sheets, Power Query, DAX, VBA, Tables, Ranges and more. Windows only.
Copied from the maker’s repo as written. PopNx MCP has not reviewed or endorsed it. HTML, images and scripts are removed. Links lead off this site.
A recipe app for Cooklang .cook files, kept in the person's own Google Drive. Built as a Next.js app on Cloudflare Workers (OpenNext).
The Cloudflare Worker does the real work: Google sign-in, a separate "Connect Google Drive" step, syncing the Recipes folder into a D1 cache, the REST API, the MCP server (with its OAuth 2.1 endpoints) and the model calls for tagging and "find similar" (Workers AI). Drive stays the source of truth; D1 is a cache so pages render in one round trip.
@opennextjs/cloudflare)@mridang/eslint-defaults for linting@cooklang/cooklang-ts for parsingSigning in and connecting Google Drive are two separate steps, each with its own Google consent screen:
openid email profile). It creates the account and a signed session cookie, and nothing else.GET /auth/drive) adds the drive.file scope and an offline refresh token, then creates the app-managed "Recipes" folder. drive.file is non-sensitive and only reaches files Chowdown created, so there is no Google verification and nothing is published to the Marketplace.Until Drive is connected a person can look around and see anything already cached, but anything that reads or writes their Drive files is refused (the REST API answers 409 /problems/drive-not-connected, MCP tools return an error result that says what to do).
Set up in Google Cloud:
.../auth/drive.file scope, add your Gmail as a test user (or publish to production — still review-free).http://localhost:3737/auth/callback (dev)https://chowdown.apps.mrida.ng/auth/callback (prod)Secrets, in .env locally and wrangler secret put in production (see Deploy):
GOOGLE_OAUTH_CLIENT_ID=....apps.googleusercontent.com
GOOGLE_OAUTH_CLIENT_SECRET=... SESSION_SECRET=... # openssl rand -base64 32 — signs the session cookie TOKEN_ENCRYPTION_KEY=... # openssl rand -base64 32 — seals Drive refresh tokens
APP_URL is optional (the public origin, if it can't be read from the request).
Chowdown is an MCP server at https:// /mcp, protected with OAuth 2.1 as the MCP authorization spec describes. Add that URL as a connector in ChatGPT, Claude or any MCP client, sign in with Google when asked, and approve. There is no secret to copy. The person needs to have connected Google Drive (see above); until then the assistant is told so instead of being shown an empty collection.
Chowdown is listed in the MCP Registry as io.github.mridang/chowdown; the listing is server.json in this repository.
recipes:read (browse and search) and recipes:write (add, edit, tag, favourite, annotate). An assistant can be granted read only.browse_recipes ("I feel like cooking Indian", "something vegetarian under 30 minutes"), recipes_from_ingredients ("I have 3 tomatoes and 400 g of pasta" returns what can be cooked now and what is a couple of ingredients short) and list_filters. Every recipe is classed as vegan, vegetarian, pescatarian or non-vegetarian from its ingredients, so results can be grouped and filtered by diet; existing recipes get this without being re-tagged./.well-known/oauth-protected-resource/mcp (RFC 9728) and /.well-known/oauth-authorization-server (RFC 8414)./oauth/register, RFC 7591). Public clients only, PKCE S256 required.POST /oauth/revoke.The app's data is available as a REST API under /api, designed to the Zalando RESTful API guidelines (plural nouns, snake_case JSON, RFC 9457 problem details, cursor pagination, JSON Merge Patch, ETag / If-Match, X-Flow-ID). The deliberate departures are the /api prefix and path segments without hyphens (recipes/imports, not recipe-imports).
| Resource | Methods |
|---|---|
/api/recipes, /api/recipes/{id} | list, create · read, replace, patch, delete |
/api/recipes/{id}/notes[/{note_id}] | list, create · read, replace, delete |
/api/recipes/{id}/similar | list |
/api/recipes/suggestions?q= | list |
/api/recipes/imports[/{id}] | list, create · read, delete |
/api/users/self | read, patch, delete |
/api/users/self/favourites[/{recipe_id}] | list · read, put, delete |
/api/users/self/connections[/{grant_id}] | list · delete |
/api/sessions | delete (sign out everywhere) |
/api/sessions/self | delete (sign out) |
Auth is the signed session cookie. Writes must come from the app's own pages (cross-site writes get 403). Signing in does not connect Google Drive: writes and /api/recipes/suggestions answer 409 /problems/drive-not-connected until the person has connected it in the browser. Everything that is not a resource stays out of the API: MCP (/mcp), OAuth (/oauth/*, /.well-known/*), the Google sign-in and Drive-connection redirects (/auth/*), the health check (/health), the image proxy (/img), CSP reports (/csp/reports).
openapi.json at the root of the repository describes exactly the routes under src/app/api, nothing else. test/openapi.test.ts fails when the two drift: every exported METHOD /path must be an operation and the other way round, a public operation must answer without a session and a secured one must answer 401, bad input must answer a documented status as application/problem+json, and good answers must fit their schemas.
Every operation can be called by one ordinary signed-in account; there is no administrator role. Sign in with Google in a browser, connect Google Drive once (until then the operations that read or write recipe files answer 409), and copy the value of the chowdown_session cookie from the browser's developer tools into an environment variable. Then run, against a local or deployed instance:
export CHOWDOWN_SESSION='<the cookie value>' # a credential: keep it out of logs and files
schemathesis run openapi.json --url https://your-instance.example \ --header "Cookie: chowdown_session=$CHOWDOWN_SESSION" \ --exclude-operation-id deleteCurrentUser \ --exclude-operation-id deleteSessions
Leave the last two operations out of a long run: they delete the account and end every session, so the account is gone after the first call. The requests Schemathesis generates carry no Sec-Fetch-Site or Origin header, which the cross-site check lets through; they count against the platform's rate limits and the daily allowances of importing and suggesting, so expect some 429s with Retry-After.
All commands go through devbox, which pins Node 24:
devbox run -- npx wrangler login # once: the AI binding is remote-only in dev
devbox run -- npm run migrate # apply D1 migrations to the local database devbox run -- npm run build:views # once, and after changing src/views: the generated widget pages devbox run -- npm run dev # next dev on http://localhost:3737 devbox run -- npm test # jest, including the MCP conformance suite devbox run -- npm run lint # eslint devbox run -- npm run typecheck # tsc --noEmit devbox run -- npm run format # prettier
Put the secrets listed under Google setup in .env (gitignored) before signing in. http://localhost:3737 needs no certificate, because Google OAuth allows http for localhost: add http://localhost:3737/auth/callback to the OAuth client's redirect URIs.
# one-time per environment
devbox run -- npx wrangler d1 create chowdown-db # paste the id into wrangler.jsonc devbox run -- npx wrangler d1 migrations apply DB --remote devbox run -- npx wrangler secret put GOOGLE_OAUTH_CLIENT_ID devbox run -- npx wrangler secret put GOOGLE_OAUTH_CLIENT_SECRET devbox run -- npx wrangler secret put SESSION_SECRET devbox run -- npx wrangler secret put TOKEN_ENCRYPTION_KEY
devbox run -- npm run deploy # opennextjs-cloudflare build && wrangler deploy
The custom domain chowdown.apps.mrida.ng requires the apps.mrida.ng zone on the Cloudflare account, and the Worker needs the AI and Images bindings (declared in wrangler.jsonc).
GitHub Actions (deploy.yml) applies the D1 migrations and deploys on pushes to master. It needs a CLOUDFLARE_API_TOKEN secret and a CLOUDFLARE_ACCOUNT_ID variable in the production environment.
Settings. SESSION_SECRET signs the session cookie and TOKEN_ENCRYPTION_KEY seals Drive refresh tokens; both are Worker secrets. APP_URL is the public origin: set it in production, because when it is missing the origin is read from the request's Host header. MCP_ALLOWED_ORIGINS (comma-separated, exact origins such as chrome-extension://abcdef) lets a browser-based or webview MCP client call /mcp; leave it unset for assistants that run on a server.
Rate limits. Three layers, cheapest first:
ratelimits in wrangler.jsonc, thirteen of them), checked in the Worker before the app runs. Which request counts against which binding is in src/lib/core/http/edge-limits.ts, and a test keeps the two in step. They are per Cloudflare location and eventually consistent: a cost guard that refuses floods, not an accounting system. Optionally add one Cloudflare WAF rate-limiting rule on top (dashboard: Security, WAF, Rate limiting rules) to stop a flood before the Worker is invoked at all.src/lib/util/daily-budget.ts).A refused call answers 429 with Retry-After.
Checks. devbox run -- npm test runs the official MCP conformance suite against the server's request handling for 2026-07-28 and 2025-11-25 (test/e2e/mcp.e2e.test.ts, which also lists the known gaps with their reasons). MCP 2024-11-05 clients work over streamable HTTP only (no HTTP+SSE transport is hosted).
Skills are folders an AI agent can load to carry out a task end to end. They follow the op
Only the beginning is shown; read the rest in the repo