ChatGPT or Claude is the conversation. Six Thirty is the household record: allergies, pantry, week, and hard rules. Copy your Six Thirty link from Account, paste it, and sign in. A key under Advanced is only for setups that cannot sign in. Help covers sign-in codes, disconnecting, and deleting a household.
| Tool | What it does |
|---|---|
get_household | Members, food rules, stores, budget, and recipe sources. |
get_pantry | What is in the kitchen: name, brand, quantity, and location. |
list_week_plan | This week's meals: day, slot, title, link, ingredients, and a vegetarian swap when there is one. |
get_shopping_gaps | Missing ingredients grouped by aisle. preferred_stores is the family's preferred stores, which a host may use to choose a store when sending the list to a delivery service. |
mark_shopping_bought | Check off what was bought and add those foods to the pantry. |
apply_receipt | Receipt line items become pantry rows. A line that cannot be read, or that breaks a household rule, comes back in rejected. |
apply_pantry_photo | Shelf, fridge, or pantry items and quantities already read. The same line cleaning applies. |
import_recipe_from_scan | A cookbook or recipe card saved as a title and ingredients. A method is never stored. The scanned recipe's photo is saved for this household. |
add_pantry_item update_pantry_item remove_pantry_item | Change one pantry item. Add and update reject foods that break an allergy, celiac, or school nut-free rule. |
keep_recipe dismiss_recipe plan_meal | Save a recipe card, hide it, or put it on a day. Keep and plan reject foods that break those rules. |
discover_recipes | Find recipes on the household's sites first, then the open web. Returns title, source, link, and ingredients. Stays inside the daily cap. |
generate_week_plan | Start a new week. Meals that fail an allergy, celiac, or school nut-free rule are dropped. Six Thirty does not run its own cron. |
Ordinary chat stays in Claude or ChatGPT. Six Thirty answers when one of these tools is used. A registered-dietitian console is not in this release. An RD-scoped key is rejected on purpose until that scope is wired.
apply_receipt — receipt line items, with quantities, become pantry rows. Numbers, units, dates, and barcodes are cleaned. A line that cannot be read, or that breaks a household rule, is returned in rejected with a reason and is not stored.apply_pantry_photo — shelf, fridge, or pantry items and quantities already read. The same line cleaning applies.import_recipe_from_scan — a cookbook or recipe card as a title and ingredients. A method is never stored. The scanned recipe's photo is saved for this household. A source link is not saved. Unreadable ingredient lines come back in rejected with a reason.Server-side reading of a card stays off unless ALLOW_SERVER_VISION=1. More on saving a recipe card is on Help.
generate_week_plan is how a chat starts the week. Six Thirty does not run a cron that plans on its own.
get_shopping_gaps lists what is still missing, grouped by aisle in by_aisle. preferred_stores is the family's preferred stores, which a host may use to choose a store when sending the list to a delivery service. An item's store stays empty unless that item was given a store. After the shop, mark_shopping_bought checks those lines off and puts them in the pantry.
Six Thirty is coming to the ChatGPT app directory soon. Use Claude today.
ChatGPT only lets Business and Enterprise plans add a connector like this; that's OpenAI's rule, not ours.
Connect ChatGPT gives you a Copy link button for your Six Thirty link.
Sign-in is the normal path. A key under Advanced on Account is only for setups that cannot sign in. ChatGPT callbacks under https://chatgpt.com/aip/, https://chat.openai.com/aip/, https://chatgpt.com/connector/oauth/, and https://chat.openai.com/connector/oauth/ are already allowed. If you are already signed in, login returns you to Allow.
Connect Claude uses the same Six Thirty link.
Add to Claude appears on Account only when CLAUDE_CONNECT_URL is set. A local install that cannot sign in still uses a key from Advanced.
{
"mcpServers": {
"six-thirty": {
"command": "node",
"args": ["/absolute/path/to/mcp-stdio.js"],
"env": {
"SIXTHIRTY_BASE_URL": "https://your-host",
"SIXTHIRTY_API_KEY": "st_live_..."
}
}
}
}
Omit SIXTHIRTY_BASE_URL only when this machine has the SQLite file in DATA_DIR. The usual install talks to the hosted POST /mcp endpoint.
{
"mcpServers": {
"six-thirty": {
"url": "https://your-host/mcp",
"headers": { "Authorization": "Bearer st_live_..." }
}
}
}
The header above is the API key path. A client that finishes OAuth puts the st_oat_ access token in that same header.
When a membership is needed, some tools return subscription_required and the text “Planning more weeks needs a Six Thirty membership. Details: sixthirty.app/membership.” get_household still works. discovery_daily_cap means the daily discovery limit was hit. It resets the next UTC day.
| Variable | Role |
|---|---|
ANTHROPIC_API_KEY | Live recipe search and week plans. Empty means practice data. |
RECIPE_SEARCH | anthropic (default), brave, tavily, or parallel. |
BRAVE_SEARCH_API_KEY / TAVILY_API_KEY / PARALLEL_API_KEY | Only if that search provider is selected. Parallel falls back to Anthropic web search when the key is missing or the call fails. |
PARALLEL_SEARCH_USD_PER_1K | Optional. Parallel Search price per 1,000 requests. Default 5, matching basic mode. Counted in the metered cost and inside the daily discovery cap. |
BASE_URL | Public HTTPS origin. Used for Checkout return URLs, sign-in links, and the OpenAPI server. No trailing slash. |
RESEND_API_KEY | Resend API key. Production emails the sign-in link and does not put it in the response. If this or EMAIL_FROM is missing in production, no link is shown and no email goes out. |
EMAIL_FROM | From address, for example Six Thirty <[email protected]>. Verify the domain in Resend first. sixthirty.app DNS is on Cloudflare: add the records Resend shows, and leave the proxy off (grey cloud, DNS only). |
GOOGLE_CLIENT_ID | Optional. Off for the beta: leave this unset. With the secret also set, login and setup show Continue with Google. Only a verified Google email is accepted. If either value is missing, there is no Google button and /auth/google returns 404. |
GOOGLE_CLIENT_SECRET | Optional. Off for the beta: leave this unset. Secret for that web client. Authorized redirect URI is exactly BASE_URL/auth/google/callback. Production: https://sixthirty.app/auth/google/callback. |
STRIPE_SECRET_KEY | Secret key. If missing, billing is skipped for local dev. |
STRIPE_WEBHOOK_SECRET | Signs POST /api/stripe/webhook. |
STRIPE_PRICE_ID | Recurring price used by Checkout. |
PUBLIC_PRICE_LABEL | Sales-page text. Match it to the Stripe Price. |
DISCOVERY_DAILY_CAP | Soft cap on discover_recipes per household per UTC day. Default 12. |
FOUNDER_EMAILS | Comma-separated emails that skip Checkout and stay active. Match is trimmed and case-insensitive. Example: [email protected],[email protected]. |
ALLOW_SERVER_VISION | Optional. Set to 1 to allow this server to read pantry or cookbook photos. Off by default. The happy path is structured JSON from the host. |
MONTHLY_BUDGET_USD | Metered model spend ceiling. Default 4. Mock mode does not block on it. |
OAUTH_CLIENT_ID | Optional. ChatGPT client id. Default sixthirty-chatgpt. |
OAUTH_CLIENT_SECRET | Secret for the confidential ChatGPT client. Claude sign-in does not use it. |
OAUTH_REDIRECT_URIS | Optional extra allowlist. ChatGPT /aip/ and /connector/oauth/ callbacks, https://claude.ai/api/mcp/auth_callback, and loopback /callback are already allowed. A trailing / matches every redirect under that prefix. |
CHATGPT_GPT_URL | Optional. Not used by the Account connect steps. When it is a published https://chatgpt.com/g/g-… link, /api/connect still reports it. |
CLAUDE_CONNECT_URL | Optional https link. When set, Account shows Add to Claude. Leave unset until that link is checked on desktop, iOS, and Android. |
Webhook events: checkout.session.completed, customer.subscription.created, customer.subscription.updated, customer.subscription.deleted. Point Stripe at BASE_URL/api/stripe/webhook.
Sign-in for the beta is a one-time email link (15 minutes). Google is optional and stays off until both Google variables are set. The login response includes that link only when SHOW_DEV_LINKS=1. Unset NODE_ENV does not turn it on, and a failed or unconfigured send does not either. The message is the same whether or not that email already has a household. An existing household email signs in. A new Google email goes to setup and does not create a household until that form is finished.