Build Rally dashboards with AI
Last updated: October 13, 2026
If you want to create dashboards, here are two options that you can use. Each is a ready-made prompt you paste into the AI tool your team already uses. The tool pulls live data from your Rally workspace through the Rally MCP and builds an interactive dashboard in Rally's look and feel.
Dashboard | What it shows | Best for |
|---|---|---|
Study Dashboard | Studies published and closed over time, and published studies by team and by owner | Seeing research volume and who's running studies |
Research Operations Dashboard | 10 ResearchOps metrics, including completed surveys, interviews, no-shows, cancellations, opt-outs, screeners, and time to insight | Tracking participant and session activity across your studies |
Before you start
Connect the Rally MCP to your AI tool. Both prompts pull data only from the Rally MCP, so your tool needs to support MCP connections and have Rally connected. It also needs to be able to create and display an interactive web page.
Know what data you'll see. Results are scoped to the teams you belong to, or the full workspace if you're a Rally admin.
Expect a snapshot, not a live feed. The dashboard reflects your data on the day you run the prompt. Re-run it whenever you want fresh numbers.
Copy the full prompt. Paste it into your AI tool as-is. The detailed instructions are what keep the numbers accurate and the styling consistent.
Tips
Give it a few minutes on large workspaces. The AI makes one call per study for some data, so bigger workspaces take longer.
Tweak the prompt to fit your needs. You can change chart titles, the date range, or which charts appear. Keep the data rules intact so the numbers stay accurate.
Share it with your team. How you share the dashboard depends on your AI tool. In Claude, for example, it's created as a private page you can share when you're ready.
Study Dashboard
This option replicates Rally's Study dashboard. It shows four charts: studies published over time, studies closed over time, studies published by team, and studies published by owner, each broken out by study type.
Dates come only from each study's published and closed dates. Drafts that never went live are left out. After building, the AI prints a verification table so you can check the numbers against the charts.
Copy and paste this prompt into your AI tool:
Build an interactive dashboard (a single self-contained HTML page) that replicates Rally's "Study" dashboard, using live data from the Rally MCP. Do not use any skills, plugins, or external tools other than the Rally MCP and the dashboard page itself.
Data collection
1. Call Rally's search_studies with no filters at all — no teamId, no status, no studyType, no ownedByMe. Rally automatically scopes results to the teams I belong to (or the full workspace if I'm an admin). Use limit 200 and keep paginating with nextCursor until hasMore is false. Set timezone to my local timezone.
2. Compute the widest range start: the first day of the month three months before the current month (e.g. run on Oct 13 → Jul 1). To keep this fast on large workspaces, skip get_study for any study whose createdAt is before that date AND whose status is not Closed — it cannot have a publishedAt or closedAt inside any selectable range. Call get_study for every other study.
3. From get_study capture: studyId, name, studyType, status, team.name, owners[].fullname, publishedAt, and closedAt. publishedAt and closedAt are the only source of truth for dates — do not substitute createdAt, startDate, endDate, or any other field, and do not estimate or infer dates. Convert both timestamps to my local timezone before bucketing.
4. A study counts as "published" in the month of its publishedAt. A study counts as "closed" in the month of its closedAt. Count each study at most once per chart. Studies with no publishedAt (drafts that never went live) are excluded from all charts. Studies with a publishedAt but no closedAt appear only in the published-based charts.
Time range control
- At the top of the page, a joined button group with two options: "Last 3 months" (default) and "Last month". Selecting one re-renders ALL cards with the same range.
- Range definitions (in my local timezone, where today = the day the prompt runs):
- Last 3 months: the first day of the month three months before the current month, through today. The three prior months are whole; the current month is partial. (Run on Oct 13 → Jul 1 through Oct 13.)
- Last month: the first day of the previous month through today. (Run on Oct 13 → Sep 1 through Oct 13.)
- To the right of the buttons, a muted uppercase mono label: "Source: Rally MCP, pulled Mon D, YYYY" using today's date.
- Each card shows a small badge in its header reading "Last 3 months" or "Last month" matching the active range.
- Bucket the time-series charts by calendar month. Show every month in the range on the x-axis as "Mon" labels (add the year only if the range spans two years), even months with zero studies.
Charts (four cards in a two-column grid, stacking to one column on narrow screens)
1. "Studies Published Over Time" — vertical stacked bar chart, one bar per month, stacked by studyType (e.g., INTERVIEWS, SURVEY, UNMODERATED TEST, GROUP INTERVIEW). Y-axis label: "Published Studies". Legend below the chart. Hover tooltip showing type and count.
2. "Studies Closed Over Time" — same format, stacked by studyType. Y-axis label: "Closed Studies".
3. "Studies Published by Team" — horizontal stacked bar chart, one row per team (team.name), stacked by studyType, sorted by total descending, top 25 only. X-axis label: "Published Studies". Counts studies whose publishedAt falls in the selected range.
4. "Studies Published by Owner" — same format, one row per owner (owners[].fullname; a study with multiple owners counts once for each owner), sorted by total descending, top 25 only. X-axis label: "Published Studies".
Any chart with no data in the range shows "No data to display" centered in the chart area and hides its legend. No card menus, no footer text.
Visual style (Rally brand — use these exact values, inline as CSS variables; single light theme, no dark mode)
- Page: background #f3f2ef, max-width 1240px centered, 24px side padding. Page title "Study Dashboard" as an h1: serif, weight 400, 26px, letter-spacing -0.02em.
- Fonts: serif stack "Iowan Old Style", Palatino, "Palatino Linotype", Georgia, serif; sans stack -apple-system, BlinkMacSystemFont, "Segoe UI", "Helvetica Neue", Arial, sans-serif (14px body); mono stack ui-monospace, "SF Mono", Menlo, monospace.
- Mono label style (used for range buttons, source line, card badges): 11px, uppercase, letter-spacing 0.04em.
- Range buttons: joined group, mono label style, white background, 1px #e3e0df border, 7px 12px padding, 6px outer radius; active button background #d8e1ff with #101014 text. Source line to the right in #6f7a9a.
- Cards: white, 1px #e3e0df border, 8px radius, 16px padding, two-column grid with 16px gap (one column under 760px), equal heights. Card header is a row: title (serif, 400, 17px, letter-spacing -0.02em) on the left, badge on the right (mono label style, #6f7a9a text, 1px #e3e0df border, 4px radius).
- Charts: inline SVG filling the card (min-height 230px), 10px sans axis text in #101014, gridlines #e3e0df at 0.6px, upright x-axis month labels, y-axis label rotated. Bars hover to 78% opacity. Legend below the chart, left-aligned, 12px, 10px color swatches.
- Series colors by study type, in this order: #3e85f6, #fe6658, #b4bb42, #ffc079, #6f7a9a, #a75744, #ffe45f, #526621.
- Tooltip: fixed-position white box with 1px #e3e0df border and 6px radius; header strip background #d8e1ff with swatch + series name, body shows "Label: value". All type stays black — never light text on a colored background.
Verification
- After building the dashboard, print in your reply: (a) a table of each month in the 3-month range with published and closed counts by type, (b) published counts by team and by owner for the same range, (c) the total number of studies returned by search_studies, how many get_study calls were made, and how many studies were excluded for having no publishedAt. These numbers must match the charts exactly.
- Do not hardcode or fabricate any study data.Research Operations Dashboard
This option builds 10 charts: completed surveys, average time to insight, opt-outs, interview no-shows, canceled interviews, completed interviews, scheduled interviews, interview invites, completed unmoderated tests, and completed screeners.
Copy and paste this prompt into your AI tool:
Build an interactive dashboard (a single self-contained HTML page) that replicates my Rally analytics dashboard, using only the Rally MCP connector for data. Pull every number from Rally MCP read tools (search_studies, search_study_responses, search_participants, search_interviews, search_study_message_campaigns) and compute aggregates yourself. Do not estimate, sample, or invent data.
Data scope: pull only what the dashboard can show. The window starts on the first day of the month three months before the current month and ends today (e.g. on Oct 12 the window is Jul 1 – Oct 12).
- search_studies: one call, no date filter, limit 200, paginate until hasMore is false. Keep only studies that could have activity in the window: status Active or Paused, or status Closed with endDate on or after the window start. Drop Draft studies and studies closed before the window start. Do not use createdBetween — it filters on creation date and would drop older studies still running.
- search_interviews: one workspace-wide call with dateRange {from: window start, to: today} and your timezone, limit 50, paginate until hasMore is false. Do not call it per study.
- search_study_responses: per kept study only, limit 50, paginate until hasMore is false, then keep submissions with submittedAt inside the window. There is no server-side date filter on this tool.
- search_participants: per kept study only, and only with the status filter the panel needs (OPTED_OUT for panel 3; INTERVIEW_INVITE_SENT, INTERVIEW_SCHEDULED, INTERVIEW_COMPLETED for panel 8), limit 50, paginate until hasMore is false.
- search_study_message_campaigns: per kept study, one call (default limit returns all).
Do not pull all-time data and do not call get_study or get_study_participant per participant.
Do not use any skills, plugins, or other connectors for data or page behavior. The one exception: any built-in skill your platform requires to create or publish the page is fine. Do not use any live-refresh capability.
Do not ask me questions before building. The decisions below cover every known gap in the MCP; apply them and build. Begin with a short list of the MCP calls used per panel and the definition applied, then the dashboard.
Data model: the MCP exposes current participant status plus a few fixed timestamps (addedToStudyAt, invitedToStudyAt, approvedAt, screenerResponseDate), response submittedAt, interview records with state and start time, and per-study email campaigns with sentAt. It does not expose a status-change event history. Use the fields it has, as defined per panel below, and embed the data in the page as a dated static snapshot. Rally's own dashboard uses status-change events, so some panels are approximations; mark each approximate panel with a one-line note under its chart stating what it is bucketed by.
Date range: add a two-button selector at the top of the page — "Last 3 months" (default) and "Last month". Both use whole calendar months plus the current partial month: "Last 3 months" runs from the first day of the month three months ago through today (in October: Jul 1 – today, four bars Jul/Aug/Sep/Oct); "Last month" runs from the first day of the previous month through today (in October: Sep 1 – today, two bars Sep/Oct). The selected range applies to every panel and re-buckets the embedded data in the page; all 10 charts always show the same months. Bucket by calendar month. Show every month label even when it has zero data; use "Jul", "Aug" labels, adding the year when the range spans two years. Each panel shows a small badge with the selected range, e.g. "Last 3 months".
Layout: page title "Research Operations Dashboard" at the top, then the range selector and a one-line "Source: Rally MCP, pulled <date>" note, then a two-column grid of 10 chart panels in the order below. Each panel has a title, the range badge, and a y-axis label. No menus, "..." buttons, dropdowns, or other controls that don't do anything. No footer text under the charts. Charts fill the full height of their card; cards in a row are the same height. Hand-built HTML/SVG, no chart library.
Panels and definitions:
1. Completed Surveys Over Time — search_study_responses on each kept Survey study; count submissions by submittedAt month. Stack by study: one series per study with completions in range, labeled with the study name, with a color legend below the chart listing only studies with data in range. Y-axis "Completed Surveys".
2. Average Time To Insight Over Time — one duration per study, averaged by the month of the study's first activity.
- Start: the study's first email send date — the earliest non-null sentAt across search_study_message_campaigns for that study.
- End: the study's first recorded activity — the earliest populated date among: first interview booked (earliest search_interviews start), first survey response submittedAt, first unmoderated test response submittedAt. Only populated fields count; ignore missing ones. (Survey "started" is not exposed; completion is the proxy.)
- Exclude studies with no sent campaign (typically shareable-link or external-panel studies). Do not count them as zero.
Y-axis "Average Time to Insight", tick labels on clean steps (minutes, hours, or days as the data warrants) formatted as durations ("0 seconds", "15 min", "1 hr", "1 d 12 hr"), never raw numbers, with a left margin wide enough that labels don't collide with the axis.
3. Opt Outs Over Time — search_participants, status OPTED_OUT, bucketed by addedToStudyAt. Note: "bucketed by date added to study; opt-out date not exposed".
4. Interview No Shows Over Time — search_interviews, state NO_SHOWED, bucketed by interview start date. Note: "bucketed by session date".
5. Canceled Interviews Over Time — search_interviews, state CANCELED, bucketed by interview start date. Note: "bucketed by session date".
6. Completed Interviews Over Time — search_interviews, state COMPLETED, bucketed by interview start date.
7. Scheduled Interviews Over Time — search_interviews, all bookings regardless of state, bucketed by interview start date. Note: "bucketed by session date".
8. Interview Invites Over Time — search_participants on kept Interview and Group Interview studies, status INTERVIEW_INVITE_SENT, INTERVIEW_SCHEDULED, or INTERVIEW_COMPLETED, bucketed by invitedToStudyAt. Note: "bucketed by study invite date".
9. Completed Unmoderated Tests Over Time — search_study_responses on kept Unmoderated Test studies, by submittedAt.
10. Completed Screeners Over Time — search_study_responses on kept Interview, Group Interview, and Unmoderated Test studies only (screeners attached to non-survey studies), by submittedAt. Survey-study submissions count only in panel 1, never here.
A panel with no data renders an empty chart with a 0.0–1.0 y-axis, not an error.
Hover: every bar shows a tooltip with a haze header band carrying a small swatch of the series color beside the series name (study name for panel 1, metric name elsewhere), and a body line "Month: value" (e.g. "Sep: 11", "Oct: 20 min"). The hovered bar dims slightly.
Style — Rally brand. Use exactly these values; no other colors anywhere on the page.
Palette:
--off-white:#f3f2ef (page background) --newsprint:#e3e0df (card borders, hairlines, grid lines)
--black:#101014 (all type: titles, axis labels, legend) --storm:#6f7a9a (secondary text: badges, source line, approximation notes)
Chart series, in this order: --cornflower:#3e85f6, --ember:#fe6658, --seedling:#b4bb42, --apricot:#ffc079, --storm:#6f7a9a, --clay:#a75744, --goldenrod:#ffe45f, --grove:#526621
Tints for UI only (never for data): --haze:#d8e1ff (selected range button background, tooltip header), --shell:#fbd9cd, --wheat:#fff0ba
Type: display serif for the page title and panel titles — font-family "Iowan Old Style", Palatino, "Palatino Linotype", Georgia, serif; weight 400 (regular), never bold; letter-spacing -0.02em; line-height 1.2; page title 26px, panel titles 17px. Body and axis text — system sans: -apple-system, BlinkMacSystemFont, "Segoe UI", "Helvetica Neue", Arial, sans-serif; 14px / 1.4, axis text 10px. Badges, the source line, and the range buttons in monospace, uppercase, 11px, letter-spacing 0.04em: ui-monospace, "SF Mono", Menlo, monospace. Do not load web fonts.
Rules: all type is black (#101014) or storm; never light text on a colored background. Cards are white (#ffffff) on the off-white page with a 1px newsprint border, 8px radius, no shadow. Axis and grid lines are 0.6px newsprint hairlines. Range selector: two buttons in a row with newsprint borders; the active one has a haze background and black text. Tooltip: white card, newsprint border, haze header band with black text. Colors are categorical only — never use red/green to mean bad/good. Keep it clean; no textures, gradients, or decorative graphics.