delete_page
Delete a Canvas course page by specifying the course identifier and page URL or ID. Optionally require exact title match as a safety check.
Instructions
Delete a page from a Canvas course.
Permanent — Canvas may retain a recycle-bin copy depending on admin settings.
Args:
course_identifier: Course code or Canvas ID
page_url_or_id: Page URL slug or page ID to delete
require_title_match: Safety check — only delete if page title matches exactly
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| course_identifier | Yes | ||
| page_url_or_id | Yes | ||
| require_title_match | No |
Output Schema
| Name | Required | Description | Default |
|---|---|---|---|
| result | Yes |
Implementation Reference
- src/canvas_mcp/tools/pages.py:290-341 (handler)The delete_page handler function that executes the tool logic: fetches page details, performs a safety title match check, then sends a DELETE request to the Canvas API.
async def delete_page( course_identifier: str | int, page_url_or_id: str, require_title_match: str | None = None ) -> str: """Delete a page from a Canvas course. Permanent — Canvas may retain a recycle-bin copy depending on admin settings. Args: course_identifier: Course code or Canvas ID page_url_or_id: Page URL slug or page ID to delete require_title_match: Safety check — only delete if page title matches exactly """ course_id = await get_course_id(course_identifier) # Fetch page details first for confirmation and safety check page = await make_canvas_request( "get", f"/courses/{course_id}/pages/{page_url_or_id}" ) if "error" in page: return f"Error fetching page details: {page['error']}" page_title = page.get("title", "Unknown Title") page_url = page.get("url", page_url_or_id) # Safety check: verify title match if requested if require_title_match and page_title != require_title_match: return ( f"❌ Title mismatch — deletion aborted.\n\n" f" Expected: {require_title_match}\n" f" Actual: {page_title}\n\n" f" Page URL: {page_url}" ) # Proceed with deletion response = await make_canvas_request( "delete", f"/courses/{course_id}/pages/{page_url_or_id}" ) if "error" in response: return f"Error deleting page '{page_title}': {response['error']}" course_display = await get_course_code(course_id) or course_identifier return ( f"✅ Page deleted successfully!\n\n" f" **{page_title}**\n" f" Course: {course_display}\n" f" URL slug: {page_url}\n" f" Status: deleted" ) - The @mcp.tool decorator with destructiveHint=True annotation and @validate_params decorator, plus the function signature defining the input schema.
@mcp.tool(annotations=ToolAnnotations(destructiveHint=True)) @validate_params async def delete_page( course_identifier: str | int, page_url_or_id: str, require_title_match: str | None = None ) -> str: - src/canvas_mcp/server.py:131-132 (registration)Registration of the page tools (including delete_page) via register_page_tools(mcp) call, only for educator or all roles.
register_page_tools(mcp) register_educator_page_crud_tools(mcp) - src/canvas_mcp/tools/pages.py:190-190 (registration)The register_educator_page_crud_tools function that defines delete_page (and other page CRUD tools) and registers them via @mcp.tool decorators.
def register_educator_page_crud_tools(mcp: FastMCP):