Illuminate MCP Server
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Illuminate MCP Servershow student enrollments this term"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Illuminate MCP Server
Local-first MCP server for querying Anthology Illuminate data in Snowflake, with interactive MCP App dashboards that render directly in the conversation.
Features
Local
stdiotransport (Content-Length framed, with ndjson fallback)MCP Apps — interactive UI components (dashboards, schema explorer, insights feed, SQL viewer) rendered inline in the conversation via the MCP Apps extension
9 CDM domains with builtin metadata catalog, extensible via Snowflake introspection
Optional LEARN schema support (Blackboard Open Database Schema, Premium tier)
Read-only SQL policy with schema/table allowlists
Metadata-grounded SQL planning without server-side LLM credentials
Query optimizer — automatic term scoping, smart LIMIT inference, EXPLAIN pre-check for large scans
Insights engine — automated diagnostic queries with anomaly detection, term-scoped to current academic period
Adaptive response payloads: summary text, table data, chart hints
Budget tracking with configurable credit thresholds
Async query execution for long-running jobs
Paginated results — dashboard fetches additional rows on scroll via
get_result_pagePlanner feedback loop with optional persistence
Related MCP server: MCP Snowflake Server NSP
MCP Apps
This server uses the MCP Apps extension to render interactive UI components directly inside the AI conversation. MCP Apps are supported by Claude Desktop, ChatGPT, VS Code Copilot, and other MCP-compatible hosts.
Available Apps
App | Tool | Description |
Results Dashboard |
| Interactive table with sorting, filtering, pagination, Chart.js visualization, CSV export, drill-down with follow-up suggestions, cell popovers for JSON/long text |
Schema Explorer |
| Browse domains, entities, columns, and relationships. Modal detail view with Data preview tab. "Analyze in chat" sends queries via |
Insights Feed |
| Automated health dashboard — 10 diagnostic checks across CDM domains, term-scoped, severity-ranked cards with "Dig into this" drill-down |
SQL Viewer |
| Syntax-highlighted SQL display with copy button, "Run this query" and "Edit and run" actions |
How MCP Apps work
Tools declare a
_meta.ui.resourceUripointing to aui://HTML resourceWhen the host calls a tool with UI binding, it fetches the HTML and renders it in a sandboxed iframe
The app receives tool results via
ontoolresultand renders the interactive UIThe app can call server tools via
callServerTool(e.g., paginated data fetch, entity details)The app can send messages to the chat via
sendMessage(e.g., drill-down follow-ups)The app can update model context via
updateModelContextfor background context
Tool selection rules
The server instructs the LLM to use tools in this order:
run_query— default for ALL data gathering and analysis. Returns data to the LLM with no UI rendered.display_query— ONLY after analysis is complete and the user should see an interactive dashboard. Re-runs the same SQL (Snowflake caches results, so re-execution is instant and free).display_sql— when the user asks to see or review a generated SQL query.discover_insights— when the user asks for anomalies, red flags, or what they should look at.open_schema_explorer— ONLY when the user explicitly asks to browse the schema.
Supported domains
Domain | Description | Refresh Rate |
CDM_LMS | Learning Management System (courses, grades, enrollments, assignments) | Overnight |
CDM_SIS | Student Information System (students, terms, programs, registrations) | Daily |
CDM_TLM | Teaching & Learning Metadata (telemetry, activity events, Ultra events) | Every 30 min |
CDM_ALY | Analytics (course scores, content scores, accessibility) | Every 12 hours |
CDM_CLB | Collaborate (virtual classroom sessions, attendance, recordings) | Every 2 hours |
CDM_MAP | Cross-system mapping (user and course identity linking) | Every 2 hours |
CDM_MEDIA | Video Studio (media content, viewing activity) | Near real-time |
CDM_META | Metadata (data sources, instance reference data) | Static |
LEARN | Blackboard Learn Open Database Schema (Premium only, opt-in) | Every 4 hours |
Quick start
macOS / Linux
Requirements: Python 3.12+ (pyenv recommended)
# 1. Clone and enter the repo
cd illuminate-mcp
# 2. Set Python version
pyenv local 3.12.12
# 3. Install package
python -m pip install -e .
# 4. Install Snowflake connector (required for live queries)
python -m pip install -r requirements-snowflake.txt
# 5. Configure environment
cp .env.example .env
# Edit .env with your Snowflake credentials and desired settings
# 6. Run tests
PYTHONPATH=src python -m unittest discover -s tests -v
# 7. Start the server
illuminate-mcpWindows
Requirements: Python 3.12+ from python.org or via winget install Python.Python.3.12
# 1. Clone and enter the repo
cd illuminate-mcp
# 2. Install package
python -m pip install -e .
# 3. Install Snowflake connector (required for live queries)
python -m pip install -r requirements-snowflake.txt
# 4. Configure environment
copy .env.example .env
# Edit .env with your Snowflake credentials and desired settings
# 5. Run tests
set PYTHONPATH=src
python -m unittest discover -s tests -v
# 6. Start the server
illuminate-mcpClaude Code / Claude Desktop configuration
Add the server to your MCP client config. The config file location depends on your platform:
macOS:
~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:
%APPDATA%\Claude\claude_desktop_config.jsonLinux:
~/.config/Claude/claude_desktop_config.json
{
"mcpServers": {
"illuminate-mcp": {
"command": "illuminate-mcp",
"env": {
"SNOWFLAKE_ACCOUNT": "your-account",
"SNOWFLAKE_USER": "your-user",
"SNOWFLAKE_PASSWORD": "your-password",
"SNOWFLAKE_ROLE": "your-role",
"SNOWFLAKE_WAREHOUSE": "your-warehouse",
"SNOWFLAKE_DATABASE": "your-database",
"ENABLE_QUERY_EXECUTION": "true",
"ENABLE_METADATA_INTROSPECTION": "true"
}
}
}
}Note: Env vars in the client config take precedence over
.env. You can put credentials in the client config and keep everything else in.env— the server merges both, with client config winning on conflicts.
Windows note: If
illuminate-mcpis not found in PATH after pip install, use the full path to the script:"command": "C:\\Users\\<you>\\AppData\\Local\\Programs\\Python\\Python312\\Scripts\\illuminate-mcp.exe"
The server automatically loads .env from the project directory on startup — no manual env sourcing needed.
Configuration
All configuration is via environment variables in .env. See .env.example for the full template with comments.
Snowflake credentials
Required when ENABLE_QUERY_EXECUTION=true or ENABLE_METADATA_INTROSPECTION=true:
SNOWFLAKE_ACCOUNT- Account identifier (URL prefix is stripped automatically)SNOWFLAKE_USER- Service account usernameSNOWFLAKE_PASSWORD- Service account passwordSNOWFLAKE_ROLE- Query execution roleSNOWFLAKE_WAREHOUSE- Compute warehouseSNOWFLAKE_DATABASE- Target database
Domain and schema allowlists
ALLOWED_DOMAINS- Comma-separated CDM domains to expose (default:CDM_LMS,CDM_TLM,CDM_ALY)ALLOWED_SCHEMAS- Comma-separated schemas for policy enforcement (should match domains)ALLOWED_TABLES- Optional table-level allowlist (empty = all tables in allowed schemas)
Domains with no tables in Snowflake are automatically excluded when metadata introspection is enabled.
LEARN schema (opt-in)
The LEARN schema provides access to 191+ raw Blackboard Learn source tables. It requires Illuminate Premium tier.
ENABLE_LEARN_SCHEMA=trueWhen enabled, LEARN is automatically added to ALLOWED_DOMAINS and ALLOWED_SCHEMAS.
Feature flags
Variable | Default | Description |
|
| Allow SQL execution against Snowflake |
|
| Load schema from Snowflake instead of builtin catalog |
|
| Preflight SQL candidates for non-empty results |
|
| Persist planner feedback to disk |
|
| Include LEARN schema (Premium only) |
Runtime limits
Variable | Default | Description |
|
| Maximum rows returned per query |
|
| Snowflake statement timeout |
|
| Require |
|
|
|
Budget governance
Variable | Default | Description |
|
| Monthly Snowflake credit limit |
|
| Warning percentages |
|
| Fallback credit estimate rate |
Output shaping
Variable | Default | Description |
|
|
|
|
| Maximum summary text length |
MCP tools
Query tools
Tool | UI | Description |
| No | Execute SQL and return results as data (default for all data gathering) |
| Results Dashboard | Execute SQL and display interactive dashboard (only for final presentation) |
| SQL Viewer | Display formatted SQL with syntax highlighting and copy button |
| No | Start async query execution, returns job ID |
| No | Poll async job status |
| No | Retrieve completed async job results |
| No (app-only) | Fetch paginated rows for dashboard lazy loading |
Schema tools
Tool | UI | Description |
| Schema Explorer | Interactive visual schema browser (only on explicit user request) |
| No | List configured CDM domains |
| No | List entities in a domain |
| No | Describe entity schema with column definitions |
Planning tools
Tool | Description |
| Generate multiple ranked SQL candidates with confidence/complexity |
| Return recommended SQL (strict + fallback) from plan_query |
| Refine a failed query into strict and fallback retry candidates |
| Validate SQL against read-only policy |
Analytics tools
Tool | UI | Description |
| Insights Feed | Automated diagnostic scan across configured domains |
Governance tools
Tool | Description |
| Inspect execution feedback statistics |
| Switch approval mode ( |
| Check budget tracking status |
MCP resources
URI | Description |
| Current non-secret runtime configuration |
| Full domain and entity metadata snapshot |
| Metadata source and fallback warnings |
| Entity listing for a domain |
| Single entity detail |
| Results Dashboard MCP App HTML |
| Schema Explorer MCP App HTML |
| Insights Feed MCP App HTML |
| SQL Viewer MCP App HTML |
Query optimizer
The query optimizer runs automatically before every run_query and display_query execution:
Term scoping — if the query touches a table with a temporal column and the question doesn't ask for historical/trend data, a current-term date filter is injected automatically (~120 days)
Smart LIMIT — non-aggregate queries without a LIMIT get one inferred from the question intent (25 for previews, 200 for lists, 500 for investigations, 5000 for "all")
EXPLAIN pre-check — estimates scan size before execution and warns if >10M rows or >500 partitions
SELECT * hint — flags queries using
SELECT *for potential column reductionSafety wrapper — the optimizer never blocks execution; if it fails, the original SQL runs unchanged
Applied optimizations are returned in optimizations_applied and warnings in optimization_warnings in the query response.
Insights engine
discover_insights runs 10 diagnostic queries across configured CDM domains:
CDM_LMS: Enrollment trend, zero-activity courses, low normalized scores, attempt completion, low instructor activity
CDM_TLM: Telemetry event volume
CDM_ALY: Course accessibility score distribution, stale content scores
CDM_SIS: Enrollment trend, student status distribution
Queries are scoped to the current academic term (resolved from CDM_LMS.TERM). Findings are severity-ranked (critical/warning/info/ok) with threshold-based anomaly detection. Each insight card includes:
Severity badge and domain tag
Metric display with change percentage
Info icon with explanation of what the check measures
SQL icon showing the exact query that ran
"Dig into this" button that sends a follow-up query via
sendMessage
Errors from missing schemas are classified as "skipped" (not "failed") for clean UX.
MCP prompts
Prompt | Description |
| Guided exploration of LMS schema |
| Guided enrollment trend analysis (optional |
Query planning workflow
Use
plan_queryto get multiple ranked SQL candidatesgenerate_sqlreturns the top recommended candidateExecute with
run_query(sync) orstart_query(async)If no data returned, check
no_data_diagnostics.refinement_candidatesin the responseUse
refine_sqlto get retry candidates for failed queriesUse
get_planner_feedbackto inspect execution history influencing rankings
MCP compatibility
Supports MCP Apps extension (SEP-1865, spec
2026-01-26) for inline interactive UISupports
prompts/listandprompts/getfor clients that resolve prompt payloads explicitlyTool execution failures are returned as
tools/callresults withisError=trueSupports Content-Length framed stdio (default) and ndjson mode (
MCP_STDIO_MODE=ndjson)
Run tests
PYTHONPATH=src python -m unittest discover -s tests -vOperations
See OPERATOR_RUNBOOK.md for startup checks, troubleshooting, and incident handling.
Architecture
See DESIGN.md for design decisions and system architecture.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/shurrey/illuminate-mcp-opensource'
If you have feedback or need assistance with the MCP directory API, please join our Discord server