Connect
Connect an assistant
Connecting takes two steps in every app: add the URL, then sign in to MCP Cubby. Some apps open the sign-in screen for you. Others, like the Codex app and Claude Code, wait until you click a button or run a login command. Until you sign in, the app will say something like “Auth required” or “Needs authentication”.
On the MCP Cubby sign-in screen, choose Start instantly to begin with no sign-up, or sign in with your username and password if you already have an account. Then try saying “I want to track my workouts.”
Claude (web, desktop, mobile)
- Open Customize → Connectors (older versions: Settings → Connectors) and click + / Add custom connector.
- Name it “MCP Cubby”, paste the URL and click Add.
- Click Connect and finish on the MCP Cubby screen.
Free plans allow one custom connector. On Team and Enterprise, an Owner adds it under Organization settings → Connectors first, then each person clicks Connect.
ChatGPT
- Open Settings → Apps → Advanced settings and turn on Developer mode.
- Back in Apps, click Create app. Paste the URL, set Authentication to OAuth, tick the confirmation and click Create.
- Finish on the MCP Cubby screen.
Needs developer mode, which is web only and not on the Free plan. OpenAI currently allows tools that save data only on Business, Enterprise and Edu. On Plus and Pro, ChatGPT may be able to read your cubbies but not add entries. Workspace admins may have to allow developer mode first.
Codex (app, IDE extension, CLI)
CLI, one command. It adds the server and opens sign-in straight away:
App or IDE extension:
- Settings → MCP servers → Add server. Name
cubby, type Streamable HTTP, paste the URL, save, then Restart. - Click Authenticate next to cubby and finish on the MCP Cubby screen.
In the app, sign-in only starts when you click Authenticate. Until then Codex reports “Auth required”. If you closed the CLI sign-in page, run codex mcp login cubby.
Claude Code
One command that adds it and opens sign-in:
Or add it, then run /mcp inside Claude Code and choose cubby to sign in.
Cursor
Then sign in: in Cursor Settings, find cubby in the MCP list and click its connect / login button.
If the button only opens Cursor’s settings (older builds), add this to ~/.cursor/mcp.json:
{ "mcpServers": { "cubby": { "url": "https://mcpcubby.com/mcp" } } }
VS Code (GitHub Copilot)
VS Code opens the MCP Cubby screen in your browser the first time the server starts. If it doesn’t, click Auth above cubby in mcp.json.
Or: Command Palette → MCP: Add Server → HTTP → paste the URL. Needs VS Code 1.101+. On Copilot Business/Enterprise, your org’s “MCP servers in Copilot” policy must be on.
Gemini CLI
Then run /mcp auth cubby inside Gemini CLI to sign in.
Other apps
Add a remote MCP server (Streamable HTTP) with the URL above. Sign-in uses standard MCP OAuth, so no client ID or API key is needed.
If an app only supports local (stdio) servers, use the standard bridge:
{ "mcpServers": { "cubby": { "command": "npx", "args": ["-y", "mcp-remote", "https://mcpcubby.com/mcp"] } } }
Let your AI agent set it up
Coding agents (Codex, Claude Code, Gemini CLI) can run the command for their own app from above. The sign-in step opens a browser, so a person still clicks Start instantly or signs in once. Full guide for agents: /llms.txt.
Agents without a browser
Create a guest account and API key in one call, then send the key as a bearer token. Give the returned claim_url to the person the agent works for.
curl -X POST https://mcpcubby.com/api/agents/register \
-H "Content-Type: application/json" -d '{"agent_name": "Coach bot"}'
curl -X POST https://mcpcubby.com/mcp \
-H "Authorization: Bearer cub_k_…" -H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"cubby_whoami","arguments":{}}}'
The response also includes a ready-made mcp_config with the key in an Authorization header. Signed-in users can create agent keys under Connections.
What your assistant can do
15 tools. The descriptions are written for the AI, which is why they read like instructions.| Tool | What it does |
|---|---|
cubby_whoami | Shows the account this connection writes to: whether it is claimed by a person or still a guest, preferred units and timezone, the cubbies and tables that already exist, and (for guests) the claim_url the user should open to keep their data and see the dashboard. Call this first in a new conversation. |
cubby_set_preferences | Updates the user's preferences: weight units (kg or lb, also picks km or miles for distance columns), IANA timezone (e.g. "Pacific/Auckland", used to decide what "today" is), and display name. |
cubby_list | Shows every cubby the user has, the tables inside each (with column keys, types and units, row counts, goals) and starter templates. Call this before logging anything in a new conversation, so you use the existing tables and column keys instead of inventing new ones. |
cubby_create | Creates a cubby: a named space such as Fitness, Diet, Money or Garden that holds one or more tables of structured rows. BEFORE calling, design it with the user: suggest the typical tables and columns (templates in cubby_list, e.g. "fitness" = Workouts + Body + Cardio, "diet" = Foods with calories and macros), ask what they want to track, their units and any goals, then create it. Pass template to use a starter layout as-is, or tables to define exactly what was agreed. Tables can be changed later with cubby_edit_table. |
cubby_add_table | Adds a table to an existing cubby, e.g. a "Diet" table inside Fitness, or "Recipes" inside Home. Agree the columns with the user first. Use computed columns for anything derived (volume = sets * reps * weight) so the maths is always done by code. |
cubby_edit_table | Renames a table, adds/renames/removes columns, adds choice options, changes units or formulas, sets or clears a goal, changes the headline column, or archives it. Column keys never change when a column is renamed, so existing rows keep their values. Confirm with the user before removing columns. |
cubby_edit | Renames a cubby or changes its description, icon or colour, or archives/unarchives it (archived cubbies are hidden but keep their data). |
cubby_add_rows | Permanently saves one or more rows to a table. Call this whenever the user reports something that belongs in one of their tables ("had a chicken wrap for lunch", "slept 7h", "3x5 squat at 100kg", "spent $18 on lunch"), then confirm what was saved. Use the column keys from cubby_list. Put each food/exercise/purchase in its own row. Choice options are added automatically; computed columns are filled in for you. Returns the saved rows plus today's total and goal progress, so no extra call is needed to answer "how am I doing". Identical rows re-sent within 15 minutes are not saved twice. |
cubby_get_rows | Reads rows from one table, newest first: filter by date range, column conditions or words, and sort by date, relevance or any column. Use it to answer "what did I eat on Tuesday?", "my heaviest squats" (sort_by weight) or to find row_ids before editing. When you don't know which table holds something, use cubby_search instead. For totals and averages use cubby_summarize instead of adding up rows yourself. |
cubby_search | Finds entries by words across every cubby and table at once. Use it when the user asks about something without naming where it was logged ("when did I last see the dentist?", "that ramen place", "did I note anything about my knee?"), or to find rows to edit. Searches text and choice column values, notes, and the table and cubby names, case- and accent-insensitively. Every word must match somewhere, in any order; plurals, word prefixes ("chick" → Chicken) and one typo in words of 5+ letters also match, "quoted phrases" must appear exactly, and filler words ("when did I last") are ignored. It does not know synonyms ("ate out" won't find "Eating out"), so if nothing matches, try other words. If no entry matches every word, entries matching some words come back with a note saying so. Numbers aren't searched: filter them with cubby_get_rows where. Results are ranked by match quality (column value > note > table name, with a small boost for recent entries) and each gives its table, row_id, date, values, note and matched_in; by_table counts matches per table, has_more means page with offset, and truncated means only the newest 20,000 entries were searched (add a date range or cubby). For totals or column filters, follow up with cubby_summarize or cubby_get_rows on the table it points to. |
cubby_summarize | Computes totals, daily averages, min/max, per-day/week/month series, breakdowns by every choice column (e.g. spending by category), streaks, change vs the previous period and goal progress, all from stored rows. Always use this for "how much / how many / average / trend / best" questions; never estimate or add up numbers yourself. Default range: last 30 days (all time for list tables). |
cubby_update_rows | Fixes saved rows: change values, date, time or note. Only the values you pass change; pass an empty string to clear a value. Get row_ids from cubby_get_rows. |
cubby_delete_rows | Permanently deletes rows by row_id (from cubby_get_rows). Use when the user says something was logged by mistake. |
cubby_get_layout | Shows how one table's dashboard page is arranged: bands of widgets (stats, charts, trends, breakdowns, goal, streak, calendar, entries, latest entry, text) with their options, plus a revision number. Call it before cubby_set_layout, or when the user asks what their dashboard shows. A table nobody has arranged returns its automatic layout (custom: false) in the same format, ready to edit. |
cubby_set_layout | Rearranges one table's dashboard page when the user wants it to show something different: which numbers sit at the top, which charts appear, how entries are listed, a heading or note. Read the current layout with cubby_get_layout first, edit it, and send every band back with the revision you read. Layouts are data only: pick a split per band and a widget per slot, and refer to the table's columns by key. There is no HTML, CSS, images or links, and every number is computed by Cubby. If anything doesn't fit, nothing is saved and every problem comes back at once. reset: true returns the page to its automatic layout. |