After restarting the MCP server (or restarting Claude Desktop), paste each prompt below into Claude Desktop one at a time. Expected behavior is described after each prompt.
Prompt:
Are you connected to Brightspace?
Expected: Claude calls auth_status.
Response shows "authenticated": true. If false, run
bs_auth() in an interactive R session first.
Prompt:
What datasets are available? List them for me.
Expected: Claude calls list_datasets.
You see a list of all BDS dataset names with descriptions. Should be
dozens of datasets.
Prompt:
Find any datasets related to grades.
Expected: Claude calls search_datasets
with keyword “grade” (or similar). Returns a filtered list – should
include “Grade Results” and possibly others.
Prompt:
Describe the Users dataset. What columns does it have?
Expected: Claude calls describe_dataset
with name “Users”. Response should show:
execute_rPrompt:
How many users are there in total?
Expected: Claude calls execute_r with
something like:
Returns a single number. No raw data transfer.
Prompt:
Show me the top 10 most common role names in the User Enrollments dataset.
Expected: Claude calls execute_r with a
dplyr pipeline like:
Returns a compact text table (not JSON, not thousands of rows).
Prompt:
Now filter those enrollments to just Students and tell me how many there are.
Expected: Claude uses variables from the previous call (or re-loads and filters). The key test is that Claude can reference or build on prior work. Should return a count.
Prompt:
Create an interactive bar chart showing enrollment counts by role.
Expected: Claude should:
execute_r to compute the counts (e.g.,
count(role_name, sort = TRUE))writeLines() to the output directorybrowseURL() to open itThe response should include the HTML file path. Opening it shows an interactive bar chart with tooltips and hover effects.
Prompt:
Use ggplot to create a bar chart of enrollment counts by role. Return the plot object.
Expected: Claude calls execute_r with
ggplot code (no ggsave()). The server detects the ggplot
object and saves it as PNG + HTML viewer. Response should include:
This tests the static chart fallback for when Chart.js is not suitable.
Prompt:
Give me a quick summary of the Grade Results dataset.
Expected: Claude calls get_data_summary
with dataset “Grade Results”. Returns row/column counts and per-column
statistics. Footer suggests execute_r for custom
analysis.
Prompt:
Summarize the User Enrollments dataset, but only for the “Student” role.
Expected: Claude calls get_data_summary
with:
{"role_name": "Student"}Returns stats for the filtered subset only. Row count should be less than the full dataset.
Prompt:
Break down User Enrollments by role_name. How many of each role are there?
Expected: Claude calls get_data_summary
with:
["role_name"]Returns group counts sorted by frequency (Student, Instructor, etc.). May also show numeric column means per group.
Prompt:
Join the Users and User Enrollments datasets. How many courses is each user enrolled in on average?
Expected: Claude calls execute_r with
something like:
users <- bs_get_dataset("Users")
enrollments <- bs_get_dataset("User Enrollments")
joined <- bs_join(users, enrollments)
joined %>%
group_by(user_id) %>%
summarise(n_courses = n_distinct(org_unit_id)) %>%
summarise(
mean_courses = mean(n_courses),
median_courses = median(n_courses)
)Returns a small summary table.
Prompt:
Run this R code:
nonexistent_function(123)
Expected: Claude calls execute_r. The
result should have isError: true with a message like “could
not find function ‘nonexistent_function’”. Claude should explain the
error gracefully.
Prompt:
I want a complete analysis of grade performance. First describe the Grade Results dataset so I understand the columns, then show me the distribution of final grades as a histogram, and finally give me the mean grade broken down by org_unit_id (show the top 10).
Expected: Claude makes 3+ tool calls in sequence:
describe_dataset or execute_r to explore
columnsexecute_r with ggplot histogram – inline image
appearsexecute_r with grouped summary – text table of top
10This tests the full workflow: discover, visualize, summarize.
Prompt:
Use the get_dataset tool to download the Users table.
Expected: Claude should NOT have access to
get_dataset (it was removed). Instead it should either:
execute_r to load the data:
bs_get_dataset("Users") %>% head(20)get_data_summary for statsget_dataset, the server returns “Unknown
tool” errorPrompt:
What schemas are registered and what are their key columns?
Expected: Claude calls list_schemas.
Returns a list of schema names with their key columns (the foreign keys
used by bs_join()).
Server won’t start:
claude_desktop_config.json has the right path to
server.Rcwd points to the directory with
config.ymlRscript /path/to/server.R manually to see stderr
errorsAuth fails:
library(brightspaceR); bs_auth() to get a tokenPlots don’t render:
png() graphics device is available (it
should be on all standard R installs)grDevices::png()Results are truncated:
head() or
filter() in execute_r to narrow results