Skip to main content
Glama

Canvas MCP Server

# Canvas Discussion API Enhancements ## Problem Solved: Discussion Content Truncation & Reply Retrieval ### Original Issues: 1. **Truncated Content**: `list_discussion_entries` showed content with "..." requiring separate API calls for full content 2. **404 Errors**: `get_discussion_entry_details` failed with 404 errors for individual entries 3. **Performance**: Getting full content for 7 posts required 1 + 7 = 8 API calls instead of 1 ### Solutions Implemented: ## 🚀 **Enhanced `list_discussion_entries` Function** ### New Parameters: ```python list_discussion_entries( course_identifier, topic_id, include_full_content=False, # NEW: Get complete content without truncation include_replies=False # NEW: Fetch all replies in one call ) ``` ### Performance Improvements: - **Before**: 8 API calls (1 for list + 7 for individual posts) - **After**: 1-2 API calls total using smart fallback methods ### Smart Fetching Strategy: 1. **Method 1**: Discussion `/view` endpoint (most efficient - gets everything at once) 2. **Method 2**: Entry `/entry_list` endpoint (batch fetch missing entries) 3. **Method 3**: Individual fallback (only if others fail) ## 🔧 **Enhanced `get_discussion_entry_details` Function** ### New Parameters: ```python get_discussion_entry_details( course_identifier, topic_id, entry_id, include_replies=True # NEW: Optional reply fetching ) ``` ### Multiple Fallback Methods: 1. **Method 1**: Discussion view endpoint (`/view`) 2. **Method 2**: Entry list endpoint (`/entry_list`) 3. **Method 3**: All entries search (guaranteed fallback) 4. **Method 4**: Direct replies endpoint (`/replies`) ## 🆕 **New `get_discussion_with_replies` Function** Optimized for bulk processing with clean, formatted output: ```python get_discussion_with_replies( course_identifier, topic_id, include_replies=False # Default False for performance ) ``` ## Usage Examples: ### 1. **Quick Content Review** (Solve the truncation problem): ```python # OLD WAY (8 API calls): entries = list_discussion_entries(course, topic) # 1 call, truncated content for entry in entries: full_content = get_discussion_entry_details(course, topic, entry_id) # 7 more calls # NEW WAY (1-2 API calls): entries = list_discussion_entries(course, topic, include_full_content=True) # 1-2 calls, complete content ``` ### 2. **Comprehensive Analysis** (Get everything): ```python # Get all posts with full content AND replies in minimal API calls entries = list_discussion_entries(course, topic, include_full_content=True, include_replies=True) ``` ### 3. **Performance-Optimized Listing** (Default behavior unchanged): ```python # Backward compatible - still fast preview mode entries = list_discussion_entries(course, topic) # Same as before ``` ## Benefits: ### 🏃 **Performance**: - **87% fewer API calls** for full content review (8 → 1-2 calls) - Smart caching reduces redundant requests - Batch processing where possible ### 🔧 **Reliability**: - Multiple fallback methods ensure content is always retrieved - Graceful degradation if some endpoints fail - Robust error handling ### 🎯 **Flexibility**: - Backward compatible (default behavior unchanged) - Optional parameters for different use cases - Fine-grained control over content depth ### 📊 **Use Cases Enabled**: 1. **Efficient Reflection Writing**: Get all full content in one call 2. **Quick Full Analysis**: See complete student analyses at once 3. **Theme Identification**: Spot connections across all posts 4. **Better Performance**: Reduce API overhead significantly ## Technical Implementation: ### API Endpoints Used: - `/courses/{id}/discussion_topics/{id}/view` - Full threaded discussion - `/courses/{id}/discussion_topics/{id}/entry_list` - Batch entry details - `/courses/{id}/discussion_topics/{id}/entries/{id}/replies` - Direct replies - `/courses/{id}/discussion_topics/{id}/entries` - Basic listing (existing) ### Error Handling: - Graceful fallbacks between methods - Informative error messages - Partial success handling (show what we can get) ### Privacy & Security: - Maintains FERPA compliance with anonymization - Respects Canvas permissions - No additional security risks ## Migration Guide: ### No Breaking Changes: - Existing code continues to work unchanged - New parameters are optional with backward-compatible defaults ### Recommended Updates: ```python # Replace multiple API calls with single enhanced call # OLD: entries = list_discussion_entries(course, topic) for entry in entries: if entry.has_truncated_content: full = get_discussion_entry_details(course, topic, entry.id) # NEW: entries = list_discussion_entries(course, topic, include_full_content=True) ``` ## Testing: To test the enhancements: 1. **Restart Canvas MCP server** to load new functions 2. **Test basic functionality**: `list_discussion_entries(course, topic)` 3. **Test full content**: `list_discussion_entries(course, topic, include_full_content=True)` 4. **Test with replies**: `list_discussion_entries(course, topic, include_full_content=True, include_replies=True)` ## Summary: ✅ **Solved truncated content issue** - No more "..." in discussion posts ✅ **Fixed 404 reply errors** - Robust fallback methods ✅ **87% performance improvement** - Reduced API calls from 8 to 1-2 ✅ **Maintained backward compatibility** - Existing code unchanged ✅ **Added flexible options** - Fine-grained control over content depth The discussion API is now optimized for efficient content retrieval while maintaining reliability and flexibility!

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/vishalsachdev/canvas-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server