Coding assistant for the Rocky-LTI project — a Canvas LTI 1.3 integration with an AI-powered educational agent. Use when working on FastAPI endpoints, MCP server components, SQLAlchemy models, Alembic migrations, Azure Functions workers, React/TypeScript frontend, or LTI/OAuth authentication flows in this codebase.
82
75%
Does it follow best practices?
Impact
91%
1.51xAverage score across 3 eval scenarios
Passed
No known issues
Optimize this skill with Tessl
npx tessl skill review --optimize ./skills/assistant-rocky-lti-assist/SKILL.mdProvides project-aware coding guidance for the Rocky-LTI Canvas integration.
Rocky-LTI is a Canvas LMS integration using LTI 1.3 that exposes an AI agent (Rocky) to students and instructors. The AI agent is powered via Model Context Protocol (MCP), with Canvas course data surfaced as MCP resources and tools.
rocky-lti/
├── lti/
│ ├── backend/
│ │ ├── agent/ # FastAPI server + MCP (PRIMARY backend)
│ │ │ ├── src/
│ │ │ │ ├── app.py # FastAPI entrypoint
│ │ │ │ ├── api/ # Routes, models, services
│ │ │ │ ├── canvas_mcp/ # MCP server (servers, services, classes, models)
│ │ │ │ └── env.py # Pydantic settings
│ │ │ ├── tests/ # pytest-asyncio tests
│ │ │ └── alembic/ # DB migrations (agent-side)
│ │ ├── db/ # Shared SQLAlchemy models package
│ │ │ └── src/canvas_lti_db/
│ │ └── workers/ # Azure Functions (async tasks)
│ ├── setup/ # LTI tool registration scripts
│ └── web/
│ ├── lti-frontend/ # Production React 19 + TypeScript app
│ └── lti-test-app/ # Dev/test Vite app
├── packages/
│ ├── rocky-chat/ # Shared npm chat component
│ └── rocky-chat-next/ # Next.js variant
└── infrastructure/terraform/ # Azure IaCuvruff (replaces flake8/black/isort)Never use pip or python -m venv. Always use:
uv add <package> # add dependency
uv run <script.py> # run script
uv sync # sync environment
uv run pytest # run tests.github/workflows/)
develop push → test environmentinfrastructure/terraform/Routes live under lti/backend/agent/src/api/ organized by domain (e.g., lti/, oauth/, agent/, tools/). Each domain typically has:
router.py — FastAPI router with endpoint definitionsmodels.py — Pydantic request/response modelsservice.py — Business logic (called from router)db.py — Database access layercanvas_mcp/)servers/ — FastMCP server instancesservices/ — Canvas API data fetchingclasses/ — Domain abstractionsmodels/ — Pydantic models for MCP typeslti/backend/db/src/canvas_lti_db/lti/backend/agent/alembic/ and lti/backend/db/alembic/pytest + pytest-asynciolti/backend/agent/tests/uv run pytest from lti/backend/agent//lti/login)/lti/launch)lti/backend/agent/src/env.py — Pydantic BaseSettingsapi/<domain>/router.pyapi/<domain>/models.pyapi/<domain>/service.pytests/canvas_mcp/services/canvas_mcp/servers/ filecanvas_mcp/models/lti/backend/db/src/canvas_lti_db/uv run alembic revision --autogenerate -m "description"uv run alembic upgrade headlti/web/lti-frontend/src/packages/rocky-chat/This project uses Pydantic v2. Key differences:
model_validator, field_validator (not v1 @validator)model_dump() not .dict()model_config = ConfigDict(...) not class Configpydantic-settings BaseSettingsDepends) for DB sessions, authruff for linting and formatting (configured in pyproject.toml); run uv run ruff check and uv run ruff format before committingc0b2e4b
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.