Render BestYou MCP tool responses as rich visual cards using OpenClaw's canvas.
Before calling any tools, check that mcporter is installed and the BestYou server is configured:
bash
mcporter --config ~/.openclaw/workspace/config/mcporter.json list
mcporter is not found: npm install -g mcporterbestyou is not listed: walk the user through setup. See references/setup.md for the full guide.Setup summary:
config/mcporter.json with the key in the Authorization Bearer header (see references/setup.md for the exact JSON format)All tools use this syntax:
bash
mcporter --config config/mcporter.json call bestyou.<tool_name> [param=value ...]
If a custom config path is needed (e.g. calling from outside the workspace), use the full path:
bash
mcporter --config ~/.openclaw/workspace/config/mcporter.json call bestyou.<tool_name> [param=value ...]
Examples:
bash
mcporter call bestyou.get_account_link_status
mcporter call bestyou.get_daily_briefing date=2026-03-15
mcporter call bestyou.get_todays_action_plan date=2026-03-15
mcporter call bestyou.get_progress_snapshot date=2026-03-15
mcporter call bestyou.get_weekly_summary weekEndDate=2026-03-15
mcporter call bestyou.generate_workout type=strength duration=20 equipment=bodyweight experienceLevel=Intermediate goal="General strength"
mcporter call bestyou.analyze_meal_text description="chicken burrito bowl" timestamp=2026-03-15T12:30:00-06:00
If a custom mcporter config path is needed, add --config <path>.
MCP ToolTemplateDescriptionget_account_link_status``assets/account-status.htmlConnection status, scopesget_daily_briefing``assets/daily-briefing.htmlReadiness, insights, prioritiesget_todays_action_plan``assets/action-plan.htmlTimeline of today's blocksget_progress_snapshot``assets/progress-snapshot.htmlDomain scores, recommendationsget_weekly_summary``assets/weekly-summary.htmlWeekly scores, trends, goalsanalyze_meal_text``assets/meal-analysis.htmlMacro breakdown, componentsgenerate_workout``assets/workout.htmlExercise cards with images
assets/assets/shared.css into a <style> tag in the HTML <head> so the output is self-containedcanvas(action="present") or canvas(action="a2ui_push")All templates use the BestYou Dark Glass design system ( assets/shared.css):
#0a0a0a, cards: #141414, borders: #1e1e1e#4ade80) = good, yellow ( #facc15) = moderate, orange ( #fb923c) = warning, red ( #f87171) = poorAPI responses may contain null or missing fields. Rules:
totalCalories or calorieGoal is null, omit the calorie summary rowAPI response structure (nested):
API PathTemplate ElementNotesheadline``.headline textreadinessScore``.gauge-value + SVG stroke-dashoffsetFormula: 314 - (314 * score / 100)``dayType``.day-type .valueCapitalize, add emoji: recovery=🔄, active=💪, rest=😴yesterday.highlights[]``.insight-card blocksPositive insights (icon, title, description)yesterday.areas[]``.insight-card blocksNegative/improvement insights, render after highlightstoday.priorities[]``.action-item blocksNumbered, with title and descriptiontoday.plans[]``.plan-tag blocksEmoji, plan name, week/day infoinsightCards[]Cross-domain sectionFilter for domain: "multi" entries, render as cross-domain insight cards
API PathTemplate ElementNotesreadiness.score``.readiness-score + badgereadiness.dayType``.rm-type``blocks[]``.block-card itemsGroup by timePeriod: morning/afternoon/evening
Block icon mapping by blockType:
wakeUp → 😴 (recovery icon bg)breakfast → 🍳 (nutrition icon bg)lunch → 🥗 (nutrition icon bg)snack → 🥤 (nutrition icon bg, or 🥑 for second snack)dinner → 🍽️ (nutrition icon bg)workout / cardio / strength → 🏃 (fitness icon bg)goToBed → 🌙 (recovery icon bg)Block status: completed → ✅, upcoming or pending → ⬜
API PathTemplate ElementNotesdomains[]``.domain-card gridEach: name, score, color-coded mini barinsights[]``.insight-item cardsWith severity badge (high=red, medium=orange, low=blue)recommendations[]``.rec-item cardsWith actionSteps[] as list itemscrossDomainPatterns[]``.cross-domain cardsWith domain badges
API PathTemplate ElementNotesoverallScoreGauge SVG + labeldomains[]``.domain-section blocksEach: trend badge (improving/declining/stable), stats, insightachievements[]``.achievement cardsEmoji + title + descriptionnextWeekFocus[]``.next-week-goal itemsWith priority badge
API PathTemplate ElementNotesmealName``.meal-name``calories``.meal-cal``protein_g, fat_g, carbs_g, fiber_gMacro bar segments + legendFlex ratios = gram valuescomponents[]``.component rowsName, amount, calories, per-component macrosinsights[]``.insight-row items.positive or .negative indicator bardailyTotals``.daily-totals sectionCalories, protein, fat, carbs
API PathTemplate ElementNotessessionNameHeader h1``duration, equipment, levelHeader .meta spansblocks[]``.block sectionsPhase badge: warmup=green, main=orange, cooldown=blue
Each exercise within a block:
imageUrl → <img> src (CDN: cdn.bestyou.ai)name → h3sets, reps, weight, rpe, rest → .rx-pill spansnotes → .exercise-notestargetMuscle, exerciseType → .exercise-cuesUser: "What's my day look like?" or "Morning briefing"
get_account_link_status → verify connectedget_daily_briefing → render briefing widgetget_todays_action_plan → render action plan widgetUser: "How am I doing?" or "Show my progress"
get_progress_snapshot → render snapshot widgetUser: "I just had [food description]"
analyze_meal_text with the description → render meal widgetUser: "Give me a workout" or "[duration] [type] workout"
generate_workout with parameters → render workout widgetUser: "Weekly summary" or "How was my week?"
get_weekly_summary → render weekly widgetKeep text summaries alongside widgets brief and actionable: