Canvas MCP for Poke - Custom MCP server that uses Canvas LMS APIs
Project description
Canvas MCP for Poke
Custom MCP server that uses Canvas LMS APIs to provide grades, deadlines, assignments, etc context to Poke
What is Poke? - AI assistant that I use day to day for managing daily tasks, emails, to do lists, etc. via texting on imessage
Overview
- Authentication: Canvas Personal Access Token
- Data Access: Read only, Canvas student account
Questions this MCP can help answer with Poke
- What are my upcoming deadlines?
- What announcements were posted recently?
- What does my upcoming week look like?
- What does my academic day today look like?
- Did any of my assignments get graded recently?
Setting Up Canvas Access Token
- Log in to your canvas account
- Go to your Account, Settings Page
- Scroll to Approved Integrations
- Create New Access Token (copy the token as you won't see it again)
Quick Start
git clone https://github.com/Shashwatpog/poke-canvas-mcp
cd poke-canvas-mcp
# Create a virtual environment and install required packages
python -m venv venv
source venv/bin/activate
pip install -r requirements.txt
cp .env.example .env
# Edit .env with your Canvas credentials
# Run
python src/server.py
# In a different terminal run the inspector for testing
npx @modelcontextprotocol/inspector
Server runs on http://localhost:8000/mcp, connect using "Streamable HTTP" Transport
Environment Variables
CANVAS_BASE_URL=https://your_school.instructure.com
CANVAS_ACCESS_TOKEN=you_canvas_access_token
Deploying
The render.yaml file contains configuration to deploy on render
- Fork this repository
- Create a new web service on render
- Connect your forked repository
- Enter the environment variables and deploy
Poke Integration
After deploying the MCP, add the MCP URL in poke settings at poke.com/settings/connections
To test it out, ask poke "What do I need to do today on canvas?" "What are my upcoming deadlines on canvas?"
Or you can ask poke explicitly to use the MCP by mentioning its connection name and asking it to call one of the tools directly.
Example: "Use Canvas MCP connection's get_today_summary tool"
Features and MCP Tools
1. get_today_summary
- This tool is designed for daily check-ins and notifications.
- Used for creating a list of deadlines, announcements, grade notifications in a 24 to 48 hour window with any overdue assignments in the past week.
2. get_upcoming_assignments
- This tool aggregates assignments across current courses including upcoming deadlines, overdue items and sorts with most urgent items first.
3. get_recent_announcements
- This tool returns all the recent announcements with various options: limiting number of courses, number of announcements per course during look up.
- Also has option to get full message body in case user wants a summary of the full announcement message.
4. get_recently_graded
- This tool detects when an assignment is newly graded and uses canvas planner feed. Used to notify user when their grades are released for quizzes and assignments.
5. get_week_ahead
- This tool returns upcoming assignments, deadlines, announcements, calendar events in the upcoming week to help user plan their week better.
6. list_courses_raw
- This tool returns list of all the courses that are active.
7. get_dashboard_cards
- This tool returns list of all the courses currently on the dashboard in the order set by the user. Used for easy filtering of courses.
8. get_course_assignments
- This tool returns all the upcoming assignments for a specific course with the option to include overdue assignments using course id.
Problems I faced
Managing a personal email, school email, work email, canvas notifications, and todo lists is pretty hard and time consuming.
I often found myself trying to keep up with canvas notifications and deadlines and losing track of them in the middle of the semester when classes pick up pace.
Poke as an assistant was very good at keeping track of my emails but everytime I had to keep track of canvas deadlines I had to manually take a screen shot of the canvas calendar and feed the image to poke or ask it to create events manually.
The solution to this pain point is this Canvas MCP Integration!
How this MCP works
I was able to go through the Canvas LMS API documentation (which was difficult and confusing) along with manually playing around in the Networks tab to find various API endpoints that we can hit to get student and course data.
The MCP aggregates and normalizes multiple endpoints:
| Endpoint | Description |
|---|---|
| GET /api/v1/dashboard/dashboard_cards | Fetch active courses in dashboard order |
| GET /api/v1/courses/:course_id/assignments?include[]=submission | Fetch assignments with submission metadata |
| GET /api/v1/courses/:course_id/discussion_topics?only_announcements=true | Fetch course announcements |
| GET /api/v1/planner/items | Planner feed for events, assignments, quizzes, and grades |
| GET /api/v1/courses | Fetch all enrolled courses |
Challenges
Some challenges I ran into definitely includes finding the right API endpoints as Canvas LMS documentation has a bunch of different APIs listed under it. It was a hassle to figure out which ones would be used when especially given the fact that half of the API endpoints listed there can only be accessed with Admin access or developer keys.
Students like myself don't have that authorization and cannot generate developer keys. Students, however, can generate Access Tokens, which we have used for this MCP.
Hence, I had to manually hit each API endpoint before using it to make sure I had access to them.
As the response in json format also included a lot of metadata and details that were unnecessary, I decided to look through the responses and figure out which items to keep and feed as context to poke. For example, when fetching courses, I decided to only return the course id and name in the mcp tool.
Another challenge I faced was Canvas keeping my old courses from previous semesters active and enrolled. The only work around to this was using the prefix for each term such as "26FS" which shows 2026 Fall Semester courses or "26SS" which shows 2026 Spring Semester courses.
Moreover, I also had to normalize the timestamps in various fields such as "due_at", "graded_at", etc. to UTC to make it consistent and easy to filter deadlines.
Shoutout to exa.ai: made it easy for me to search up api endpoints for Canvas after losing my mind in Canvas API docs!
Future Goals
- No plans so far, will test it out for a few weeks and if I have any issues, will add more tools / update the current ones
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file iflow_mcp_shashwatpog_poke_canvas_mcp-0.1.0.tar.gz.
File metadata
- Download URL: iflow_mcp_shashwatpog_poke_canvas_mcp-0.1.0.tar.gz
- Upload date:
- Size: 10.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.28 {"installer":{"name":"uv","version":"0.9.28","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":"13","id":"trixie","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
66163995951732262671ab3d7db88926996249c4c7c77272c237ad2fd7dcb715
|
|
| MD5 |
6a6401422c498784ab77341edc6d50df
|
|
| BLAKE2b-256 |
e7a60108f0324143226491e2d243c7ed958d26e6142601e3ec573985997abd9b
|
File details
Details for the file iflow_mcp_shashwatpog_poke_canvas_mcp-0.1.0-py3-none-any.whl.
File metadata
- Download URL: iflow_mcp_shashwatpog_poke_canvas_mcp-0.1.0-py3-none-any.whl
- Upload date:
- Size: 10.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.28 {"installer":{"name":"uv","version":"0.9.28","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":"13","id":"trixie","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7bedabb26e08554a0267ba867ecf67b58320e63e93c7887e013890869f2046ca
|
|
| MD5 |
d1e0cf1b32afec03baa1ecbe959207f3
|
|
| BLAKE2b-256 |
65e09d1858ca6aa921e642262442640f080c1c8c71ca42ff240ad01a40c687d3
|