whatevr
Log meals and read calories and macros from any AI assistant. Pairs with the whatevr iPhone app.
我該用這個嗎
品質與安全性
根據工具定義與協定合規性的自動化分析。
上下文成本
這是每次將伺服器的工具載入模型上下文時所消耗的約略 token 數量。數量越高,可用於其他工作的注意力就越少。
安裝
一鍵安裝
將以下內容加入你的 `claude_desktop_config.json` 檔案:
{
"mcpServers": {
"whatevr": {
"url": "https://api.trywhatevr.app/mcp"
}
}
}遠端端點
https://api.trywhatevr.app/mcpstreamable-http它能做什麼
工具清單
工具(12)
🟡log_anything(text, logged_at, tz_offset_min)
Log food, drinks, water, exercise, or a weigh-in from one natural-language sentence — the same parser as the app's voice logging. Examples: 'two eggs and toast', '30 minute run', '3 glasses of water', 'weighed 184 this morning'. Spoken dates like 'yesterday I had pizza' work. Describe the FOOD, not just numbers: stating explicit nutrition in the text ('burrito, 800 calories') pins those totals exactly but logs ONE pre-computed item with no ingredient breakdown — if you do that, follow up with update_log's `ingredients` array so the log keeps its per-item detail.
輸入結構描述
{
"type": "object",
"properties": {
"text": {
"type": "string",
"maxLength": 2000,
"description": "What to log, in plain words."
},
"logged_at": {
"type": "string",
"description": "Bare-local timestamp YYYY-MM-DDThh:mm:ss (no zone). Omit to use the user's 'now'."
},
"tz_offset_min": {
"type": "number",
"description": "The user's JS getTimezoneOffset() — minutes BEHIND UTC (e.g. 240 for EDT). Optional: when omitted, the user's app-reported timezone is used (UTC only if the account has never reported one)."
}
},
"required": [
"text"
]
}⚪log_exercise(activity, duration_minutes, calories_burned, logged_at, tz_offset_min)
Log structured exercise with a known calorie burn. For an ESTIMATED burn from plain text, use log_anything ('30 minute run').
輸入結構描述
{
"type": "object",
"properties": {
"activity": {
"type": "string",
"description": "e.g. 'running'"
},
"duration_minutes": {
"type": "number",
"minimum": 1,
"maximum": 1440
},
"calories_burned": {
"type": "number",
"minimum": 0,
"maximum": 20000
},
"logged_at": {
"type": "string",
"description": "Bare-local timestamp YYYY-MM-DDThh:mm:ss (no zone). Omit to use the user's 'now'."
},
"tz_offset_min": {
"type": "number",
"description": "The user's JS getTimezoneOffset() — minutes BEHIND UTC (e.g. 240 for EDT). Optional: when omitted, the user's app-reported timezone is used (UTC only if the account has never reported one)."
}
},
"required": [
"activity",
"duration_minutes",
"calories_burned"
]
}⚪log_weight(weight_lb, note, logged_at, tz_offset_min)
Log a weigh-in in pounds. The newest reading also becomes the user's current weight (drives their calorie targets).
輸入結構描述
{
"type": "object",
"properties": {
"weight_lb": {
"type": "number",
"minimum": 20,
"maximum": 1500
},
"note": {
"type": "string"
},
"logged_at": {
"type": "string",
"description": "Bare-local timestamp YYYY-MM-DDThh:mm:ss (no zone). Omit to use the user's 'now'."
},
"tz_offset_min": {
"type": "number",
"description": "The user's JS getTimezoneOffset() — minutes BEHIND UTC (e.g. 240 for EDT). Optional: when omitted, the user's app-reported timezone is used (UTC only if the account has never reported one)."
}
},
"required": [
"weight_lb"
]
}⚪log_water(glasses, amount_fl_oz, logged_at, tz_offset_min)
Log water — glasses (8 fl oz each) or an exact amount_fl_oz. Defaults to 1 glass.
輸入結構描述
{
"type": "object",
"properties": {
"glasses": {
"type": "number",
"minimum": 1,
"maximum": 32,
"description": "8 fl oz each; used when amount_fl_oz is absent"
},
"amount_fl_oz": {
"type": "number",
"minimum": 1,
"maximum": 256
},
"logged_at": {
"type": "string",
"description": "Bare-local timestamp YYYY-MM-DDThh:mm:ss (no zone). Omit to use the user's 'now'."
},
"tz_offset_min": {
"type": "number",
"description": "The user's JS getTimezoneOffset() — minutes BEHIND UTC (e.g. 240 for EDT). Optional: when omitted, the user's app-reported timezone is used (UTC only if the account has never reported one)."
}
}
}🟢get_today(tz_offset_min)
Today's complete picture: calorie/macro totals vs targets, water, streak, exercises, and the item-by-item food log (`recent`: every logged item's name, calories, macros, ingredients). Each `recent` item's `id` works with update_log to correct mistakes.
輸入結構描述
{
"type": "object",
"properties": {
"tz_offset_min": {
"type": "number",
"description": "The user's JS getTimezoneOffset() — minutes BEHIND UTC (e.g. 240 for EDT). Optional: when omitted, the user's app-reported timezone is used (UTC only if the account has never reported one)."
}
}
}🟢get_day(date)
Everything logged on a specific day, INCLUDING each food item's name and nutrition (same shape as get_today). Use this to answer “what did I eat yesterday / on <date>”. Each `recent` item's `id` works with update_log to correct mistakes.
輸入結構描述
{
"type": "object",
"properties": {
"date": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "YYYY-MM-DD"
}
},
"required": [
"date"
]
}🟢get_progress(days, anchor, tz_offset_min)
Daily calorie/macro/exercise TOTALS over time + the weight trend (no food item names — use get_day for what was actually eaten).
輸入結構描述
{
"type": "object",
"properties": {
"days": {
"type": "number",
"description": "1–730, or 0 for all-time (default 30)"
},
"anchor": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Window end date (default: the user's today)"
},
"tz_offset_min": {
"type": "number",
"description": "The user's JS getTimezoneOffset() — minutes BEHIND UTC (e.g. 240 for EDT). Optional: when omitted, the user's app-reported timezone is used (UTC only if the account has never reported one)."
}
}
}🟢get_me
Who the user is: name/handle/email, health profile, calorie/macro targets, and derived metrics.
輸入結構描述
{
"type": "object",
"properties": {}
}🔴update_goals(goal, goal_weight_lb, rate_lb_per_week, activity_level, calorie_target, ...)
Change the user's goal and daily targets — the same settings as the app's Goals screen. Send ONLY the fields to change. Each target takes a number (a custom target) or "auto" (computed from their body, activity and goal). The server keeps calories and macros consistent (protein×4 + carbs×4 + fat×9 ≈ calories), so the targets it returns can differ slightly from what you sent — report the returned ones. Current weight is not here: log a weigh-in with log_weight. Needs the user's "Change goals & settings" switch for this connection (whatevr app → Settings → Connections); if it's off you'll get a message saying so — relay it. The user is notified of every change.
輸入結構描述
{
"type": "object",
"properties": {
"goal": {
"type": "string",
"enum": [
"lose",
"maintain",
"gain"
]
},
"goal_weight_lb": {
"type": "number",
"minimum": 50,
"maximum": 700
},
"rate_lb_per_week": {
"type": "number",
"minimum": 0,
"maximum": 2,
"description": "Pace for lose/gain (ignored for maintain)."
},
"activity_level": {
"type": "string",
"enum": [
"sedentary",
"light",
"moderate",
"very",
"extra"
]
},
"calorie_target": {
"description": "1000–5000, or \"auto\".",
"anyOf": [
{
"type": "number",
"minimum": 1000,
"maximum": 5000
},
{
"type": "string",
"enum": [
"auto"
]
}
]
},
"protein_target_g": {
"description": "20–400, or \"auto\".",
"anyOf": [
{
"type": "number",
"minimum": 20,
"maximum": 400
},
{
"type": "string",
"enum": [
"auto"
]
}
]
},
"carbs_target_g": {
"description": "20–600, or \"auto\".",
"anyOf": [
{
"type": "number",
"minimum": 20,
"maximum": 600
},
{
"type": "string",
"enum": [
"auto"
]
}
]
},
"fat_target_g": {
"description": "10–250, or \"auto\".",
"anyOf": [
{
"type": "number",
"minimum": 10,
"maximum": 250
},
{
"type": "string",
"enum": [
"auto"
]
}
]
},
"water_goal_glasses": {
"type": "number",
"minimum": 1,
"maximum": 20
},
"fiber_minimum_g": {
"type": "number",
"minimum": 5,
"maximum": 60
},
"sugar_maximum_g": {
"type": "number",
"minimum": 10,
"maximum": 150
},
"sodium_maximum_mg": {
"type": "number",
"minimum": 500,
"maximum": 5000
}
}
}🟡update_reminders(log_reminder, streak_reminder, tz_offset_min)
Turn the user's daily reminders on or off: the evening 'nothing logged today' nudge and the streak reminder. Same as the app's Notifications screen. Needs the user's "Change goals & settings" switch for this connection. The user is notified of the change.
輸入結構描述
{
"type": "object",
"properties": {
"log_reminder": {
"type": "boolean"
},
"streak_reminder": {
"type": "boolean"
},
"tz_offset_min": {
"type": "number",
"description": "The user's JS getTimezoneOffset(). Only used if the app has never reported their timezone; then it's required."
}
}
}🔴delete_log(log_id, type)
Delete ONE entry from the user's log: a food, exercise, weigh-in or water entry. Read get_today/get_day first — each item in `recent` carries its `id` and `type`; pass both. Deleting a weigh-in updates their current weight to the newest remaining one. This can't be undone, so confirm with the user first. Needs the user's "Delete entries" switch for this connection (whatevr app → Settings → Connections). The user is notified.
輸入結構描述
{
"type": "object",
"properties": {
"log_id": {
"type": "string",
"description": "The item's `id` from get_today/get_day `recent`."
},
"type": {
"type": "string",
"enum": [
"food",
"exercise",
"weight",
"water"
],
"description": "The item's `type` from `recent`."
}
},
"required": [
"log_id",
"type"
]
}🔴update_log(log_id, title, calories, protein_g, carbs_g, ...)
Correct an existing FOOD log: title, nutrition numbers, the ingredient list, meal, or time-of-day. Read get_today/get_day first — each item in `recent` (type "food") carries the `id` to pass here. Send ONLY the fields to change; values are absolute for the item as logged. Two modes, never mixed: send `ingredients` to REPLACE the whole list (include every ingredient you want kept — the log's totals recompute from it, so don't also send calories/macros), OR send top-level numbers to set totals directly — the existing ingredient breakdown then RESCALES proportionally so the parts always sum to the new totals (ingredient names/amounts don't change, so when the COMPOSITION changed — something added or removed — send `ingredients` instead). Note: ANY edit that changes a routine-created log's title or its calories — including an ingredients replacement, since totals recompute — also updates that saved routine. When logged_time changes, the log's meal may re-infer from the new hour unless you set meal explicitly. Requires a full-access token; edit one log at a time.
輸入結構描述
{
"type": "object",
"properties": {
"log_id": {
"type": "string",
"description": "The item's `id` from get_today/get_day `recent` (type \"food\" only)."
},
"title": {
"type": "string",
"maxLength": 200
},
"calories": {
"type": "number",
"minimum": 0,
"maximum": 20000
},
"protein_g": {
"type": "number",
"minimum": 0,
"maximum": 2000
},
"carbs_g": {
"type": "number",
"minimum": 0,
"maximum": 2000
},
"fat_g": {
"type": "number",
"minimum": 0,
"maximum": 2000
},
"fiber_g": {
"type": "number",
"minimum": 0,
"maximum": 2000
},
"sugar_g": {
"type": "number",
"minimum": 0,
"maximum": 2000
},
"sodium_mg": {
"type": "number",
"minimum": 0,
"maximum": 100000
},
"meal": {
"type": "string",
"enum": [
"breakfast",
"lunch",
"dinner",
"snack"
]
},
"logged_time": {
"type": "string",
"pattern": "^\\d{2}:\\d{2}$",
"description": "HH:MM 24h — time-of-day only; the log's DATE never changes."
},
"ingredients": {
"type": "array",
"maxItems": 50,
"description": "REPLACES the full ingredient list; totals recompute from it. Cannot be combined with top-level numeric fields.",
"items": {
"type": "object",
"required": [
"name",
"calories"
],
"properties": {
"name": {
"type": "string",
"maxLength": 120
},
"amount": {
"type": "string",
"maxLength": 60
},
"calories": {
"type": "number",
"minimum": 0,
"maximum": 20000
},
"protein_g": {
"type": "number",
"minimum": 0,
"maximum": 2000
},
"carbs_g": {
"type": "number",
"minimum": 0,
"maximum": 2000
},
"fat_g": {
"type": "number",
"minimum": 0,
"maximum": 2000
},
"fiber_g": {
"type": "number",
"minimum": 0,
"maximum": 2000
},
"sugar_g": {
"type": "number",
"minimum": 0,
"maximum": 2000
},
"sodium_mg": {
"type": "number",
"minimum": 0,
"maximum": 100000
}
}
}
}
},
"required": [
"log_id"
]
}社群
證據