Bevel MCP
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
Personal client for Bevel Health's private, undocumented API (reverse-engineered; may break without notice).
Start with bevel_auth_status to check the token (Bevel tokens last 60 days).
Every write tool supports dryRun and needs BEVEL_ENABLE_WRITES=true for real writes; prefer a dry run first.
Journal: bevel_get_journal / bevel_set_journal_boolean / bevel_clear_journal_boolean work on one entry per factor per day.
Meals: bevel_search_food, then bevel_log_food with an fdbId; Bevel files foods into meals by time.
Goals: bevel_get_macro_goals / bevel_set_macro_goals. Workouts: bevel_get_workout_data, bevel_save_routine, bevel_delete_routine, bevel_create_custom_exercise. Completed workouts cannot be logged yet.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| bevel_auth_statusA | Reports whether a Bevel API token is configured and decodes its non-secret JWT claims locally (account, issued/expiry times, lifetime). With checkApi, also makes one tiny request to confirm Bevel accepts it. Never returns the token. |
| bevel_get_journalA | Pulls Journal data via GET /api/journal/v1/user-journal-data/pull, following pagination. Boolean entries are returned as {day, factorKey, value, ...}, optionally filtered by date and factor; value is null and cleared is true for a factor that was cleared in the app. Other collections (defaults) are returned raw because their schema has not been captured yet. |
| bevel_get_custom_journal_typesB | Pulls custom Journal types via GET /api/journal/v1/custom-journal-types/pull, following pagination. Items are raw (schema not captured yet). |
| bevel_set_journal_booleanA | Sets a yes/no Journal factor (e.g. Added Sugar) for one day, the way the app does: if an entry for that factor and day exists it is updated in place (same uuid and createdAt), otherwise a new entry is created. Does nothing if the value is already set. Requires BEVEL_ENABLE_WRITES=true unless dryRun is set. Success means Bevel listed the entry's uuid as succeeded; confirm it in the app after restarting it. |
| bevel_clear_journal_booleanA | Clears a yes/no Journal factor for one day, so it shows as not answered — exactly what the app sends: the same entry with isNotSet: true and no boolValue. Does nothing if there is no entry or it is already cleared. Requires BEVEL_ENABLE_WRITES=true unless dryRun is set. |
| bevel_get_macro_goalsA | Lists calorie/protein/carb/fat goals (each with a start and optional end date) and marks the one active on the given day. |
| bevel_set_macro_goalsA | Sets daily calorie and macro goals from today on, exactly like the app: if the current goal started before today it is ended yesterday and a new goal starts today; if it already started today it is updated in place. Calories default to 4×protein + 4×carbs + 9×fat. Requires BEVEL_ENABLE_WRITES=true unless dryRun is set. |
| bevel_search_foodA | Searches foods the way the app does (generic + branded, 5 each). Returns fdbId, serving options and per-serving calories, protein, carbohydrate, fat, fiber, sugar and caffeine. Use an fdbId from here with bevel_log_food. |
| bevel_log_foodA | Logs a food (from bevel_search_food) to the Nutrition log, building the exact entry the app sends. Bevel files a log into breakfast/lunch/dinner by its time; there is no separate meal field. Requires BEVEL_ENABLE_WRITES=true unless dryRun is set. |
| bevel_get_food_logsA | Lists the foods logged on a day with time, servings and calories/protein/carbs/fat/fiber/sugar/caffeine, plus day totals. |
| bevel_update_food_logA | Changes the servings and/or time of a logged food (same entry, as the app does). Requires BEVEL_ENABLE_WRITES=true unless dryRun is set. |
| bevel_delete_food_logA | Deletes a logged food the way the app does (soft delete: deletedAt is set on the same entry). Requires BEVEL_ENABLE_WRITES=true unless dryRun is set. |
| bevel_get_workout_dataA | Lists strength routines (exercises, sets, weights) and custom exercises. Deleted items are hidden. Completed workouts are listed by bevel_get_workout_history; cardio and exercise notes are only counted. |
| bevel_get_workout_historyA | Lists completed strength workouts (most recent first): date, start time, duration, effort, and each exercise's sets with reps and weight in the unit you use, plus volume (reps × lb). Filter by date range or exercise name. Read-only. |
| bevel_create_custom_exerciseA | Creates a custom exercise (captured shape). Equipment, exercise type and muscle groups must be values Bevel is known to use (captured or already in your data) unless allowUnverifiedValues is set. Requires BEVEL_ENABLE_WRITES=true unless dryRun is set. |
| bevel_save_routineA | Creates a routine, or (with id) replaces an existing routine's name and exercises — the app also re-sends routines whole. Each exercise is a built-in presetWorkoutId or a customExerciseId with sets of reps or durationSec. Supersets are not supported yet. Requires BEVEL_ENABLE_WRITES=true unless dryRun is set. |
| bevel_delete_routineA | Deletes a routine the way the app does (re-sent whole with isDeleted: true). Requires BEVEL_ENABLE_WRITES=true unless dryRun is set. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 17 tools
Each tool targets a distinct resource+action (goals, journal factors, food logs, routines, workout history), and descriptions draw the key boundaries explicitly (e.g. get_workout_data = routines/exercises vs get_workout_history = completed workouts). Minor residual ambiguity: routine reads live inside bevel_get_workout_data while routine writes use bevel_save_routine/bevel_delete_routine, so an agent looking for 'get_routine' has to infer the mapping, and set vs clear journal boolean could be confused at a glance.
Nearly all 17 tools follow a consistent bevel_verb_noun snake_case pattern (get_, set_, clear_, delete_, create_, save_, search_, log_, update_). The only deviation is bevel_auth_status, a noun phrase without a verb, which breaks the pattern slightly but remains clear.
17 tools is on the high side but justified: the surface spans four distinct sub-domains (nutrition, workouts, journal, macro goals) plus auth. Each tool maps to a real operation rather than being redundant, though the nutrition set (5 tools) plus routine/journal writes pushes it toward the upper bound.
Food logs have full CRUD, and goals/journal booleans have read+write coverage, but there are notable gaps: workout history is read-only with no way to log a completed workout or cardio, routines can be created/replaced/deleted but not read via a dedicated tool, and custom journal types are read-only with raw schemas. Supersets and custom-journal-type creation are explicitly unsupported.