delete_announcement_with_confirmation
Remove announcements from Canvas courses with safety checks, including optional title matching verification and dry-run testing to prevent accidental deletions.
Instructions
Delete an announcement with optional safety checks.
Args:
course_identifier: The Canvas course code or ID
announcement_id: The announcement ID to delete
require_title_match: If provided, only delete if the announcement title matches exactly
dry_run: If True, verify but don't actually delete (for testing)
Returns:
String with operation result including status and title match information
Raises:
ValueError: If require_title_match is provided and doesn't match the actual title
Example usage:
# Delete only if title matches exactly (safety check)
result = delete_announcement_with_confirmation(
"60366",
"925355",
require_title_match="Preparing for the week",
dry_run=False
)
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| announcement_id | Yes | ||
| course_identifier | Yes | ||
| dry_run | No | ||
| require_title_match | No |
Implementation Reference
- The main handler function for the 'delete_announcement_with_confirmation' MCP tool. It fetches announcement details, performs safety checks (title match, dry-run), and deletes the announcement via Canvas API if conditions are met.async def delete_announcement_with_confirmation( course_identifier: str | int, announcement_id: str | int, require_title_match: str | None = None, dry_run: bool = False ) -> str: """ Delete an announcement with optional safety checks. Args: course_identifier: The Canvas course code or ID announcement_id: The announcement ID to delete require_title_match: If provided, only delete if the announcement title matches exactly dry_run: If True, verify but don't actually delete (for testing) Returns: String with operation result including status and title match information Raises: ValueError: If require_title_match is provided and doesn't match the actual title Example usage: # Delete only if title matches exactly (safety check) result = delete_announcement_with_confirmation( "60366", "925355", require_title_match="Preparing for the week", dry_run=False ) """ course_id = await get_course_id(course_identifier) # First fetch the announcement details announcement = await make_canvas_request( "get", f"/courses/{course_id}/discussion_topics/{announcement_id}" ) if "error" in announcement: return f"Error fetching announcement details: {announcement['error']}" actual_title = announcement.get("title", "Unknown Title") title_matched = True # Check title match if required if require_title_match is not None: title_matched = actual_title == require_title_match if not title_matched: return f"Title mismatch - Expected: '{require_title_match}', Actual: '{actual_title}'. Deletion aborted for safety." # Handle dry run if dry_run: course_display = await get_course_code(course_id) or course_identifier result = f"DRY RUN - Would delete announcement from course {course_display}:\n\n" result += f"ID: {announcement_id}\n" result += f"Title: {actual_title}\n" result += "Status: dry_run\n" result += "Message: Announcement would be deleted (dry run mode)\n" if require_title_match: result += f"Title matched: {title_matched}\n" return result # Proceed with actual deletion response = await make_canvas_request( "delete", f"/courses/{course_id}/discussion_topics/{announcement_id}" ) if "error" in response: return f"Error deleting announcement '{actual_title}': {response['error']}" course_display = await get_course_code(course_id) or course_identifier result = f"Announcement deleted successfully from course {course_display}:\n\n" result += f"ID: {announcement_id}\n" result += f"Title: {actual_title}\n" result += "Status: deleted\n" result += "Message: Announcement deleted successfully\n" if require_title_match: result += f"Title matched: {title_matched}\n" return result
- src/canvas_mcp/server.py:49-49 (registration)Registration call for discussion tools (including delete_announcement_with_confirmation) in the main server setup.register_discussion_tools(mcp)