Move Email to Archive Skill
⚠️ IMPORTANT: Claude Context Required
This skill ONLY works when executed within Claude Agent context (bassi, Claude Code, or other Claude Agent environments).
- •✅ Works: Inside a Claude agent that has MS365 authentication
- •❌ Does NOT work: As a standalone Python script outside Claude context
- •❌ Does NOT work: Without MS365 authentication already provided by Claude
The Python script (scripts/move_to_archive.py) is a parameter preparation tool, not a standalone email mover. It prepares parameters that Claude's tool system then executes.
Purpose
Move one specific email message to the Archive folder in Microsoft 365 Mail with a clean, context-efficient interface.
When to Use
- •Moving individual emails to Archive (spam, no-TODO items, notifications)
- •Bulk archive operations (chain multiple calls efficiently)
- •Any workflow requiring reliable, one-at-a-time email archival
- •When the main context should not be polluted by full email move operation details
How to Use This Skill
Quick Start: Direct API Call (Within Claude Context)
For a single email move, use the MS365 mail API directly with these parameters:
Function: mcp__ms365__move-mail-message
Required Parameters:
- •
messageId: The unique message ID of the email to move (string) - •
body: JSON object with destination folder ID
Optional Parameter:
- •Archive Folder ID: Use default from
references/archive_config.mdunless overriding
Example Call Structure
# Minimum parameters needed (within Claude agent context)
messageId = "AAMkADA4YjhhZDYwLWZiMWYtNDVkMy1hNjE3LWI3YzRlMzAwNGE0MgBGAAA..."
archive_folder_id = "AQMkADA4YjhhZDYwLWZiMWYtNDVkMy1hNjE3LWI3YzRlMzAwADRhNDIALgAAA-cCSmDe9C5Ai1IxFty3vKgBACIai-AjXXpFuMeLL-NexTAAAAIBVAAAAA=="
response = mcp__ms365__move-mail-message(
messageId=messageId,
body={"DestinationId": archive_folder_id}
)
Key Success Pattern: One Email at a Time
Critical Finding: Moving emails individually (one per call) works reliably. Batch operations cause ErrorInvalidIdMalformed errors. Always move ONE email per operation call.
Python Script Approach (Prepares Parameters for Claude)
Use scripts/move_to_archive.py to prepare parameters. This script:
- •Handles default Archive folder ID lookup
- •Validates messageId parameter format
- •Returns JSON with parameters ready for Claude's API execution
- •Can be chained in loops without context pollution
What it does: Returns the parameters Claude needs to execute the move What it does NOT do: Move emails directly (requires Claude context)
Usage:
python scripts/move_to_archive.py --message-id "AAMkADA4YjhhZDYwLWZiMWYtNDVkMy1h..." [--archive-id "custom-id"]
Output:
{
"status": "ready",
"operation": {
"api_function": "mcp__ms365__move-mail-message",
"parameters": {
"messageId": "AAMkADA4YjhhZDYwLWZiMWYtNDVkMy1h...",
"body": {
"DestinationId": "AQMkADA4YjhhZDYwLWZi..."
}
}
}
}
Reference Materials
- •API Documentation: See
references/api_docs.mdfor full MS365 Mail API parameter details - •Archive Configuration: See
references/archive_config.mdfor Archive folder ID and defaults - •Archive Folder ID Default:
AQMkADA4YjhhZDYwLWZiMWYtNDVkMy1hNjE3LWI3YzRlMzAwADRhNDIALgAAA-cCSmDe9C5Ai1IxFty3vKgBACIai-AjXXpFuMeLL-NexTAAAAIBVAAAAA==
Expected Response
Success response includes:
- •
id: Email ID (confirming which email was moved) - •
parentFolderId: Archive folder ID (confirming destination) - •
subject: Email subject (for reference) - •
receivedDateTime: When email was received
Indicates Success: parentFolderId equals the Archive folder ID
Important Notes
- •One at a time: Always move ONE email per operation call
- •Message ID format: Use the full message ID from the email list response
- •No batch operations: Do not attempt to move multiple emails in a single call
- •Claude context required: All operations must happen within Claude agent context
- •Context efficiency: This skill is designed to keep operations lean and not blow up context window
Troubleshooting
| Error | Cause | Solution |
|---|---|---|
ErrorInvalidIdMalformed | Invalid or malformed message ID | Verify message ID from current email list response |
ErrorItemNotFound | Email no longer exists | Refresh email list; may have been deleted |
ErrorAccessDenied | Permission issue | Verify authenticated user has Archive folder access |
| Wrong parentFolderId | Incorrect Archive folder ID | Verify folder ID from references/archive_config.md |
| Script doesn't move emails | Running outside Claude context | Ensure script runs within Claude agent environment |
Bulk Operations: Using Sub-Agents
For archiving multiple emails without polluting context:
- •Prepare list of message IDs to archive
- •Launch a sub-agent using the bulk archive agent template
- •Sub-agent iterates through each ID and calls the move operation
- •Sub-agent returns summary to main context (one-line result, not 50+ lines)
Sub-Agent Usage
See .claude/agents/bulk-archive-agent.md and .claude/agents/BULK_ARCHIVE_TASK_TEMPLATE.md for:
- •Complete sub-agent architecture
- •Task prompt template ready to copy/paste
- •Examples of bulk archive workflows
- •Error handling patterns
Quick Example:
Main Context: "Archive 50 emails" → Launch bulk-archive sub-agent with message IDs → Sub-agent moves silently (one at a time) → Returns: "✅ Archived 48 emails. ❌ 2 failed." Result: Clean context, 1 summary line instead of 50 confirmations
Architecture Overview
Single Email Move (use skill directly):
User request → Direct API call → Archive → Done (inline, context stays clean)
Bulk Email Move (use sub-agent):
User request → Identify emails → Launch sub-agent → Sub-agent archives silently → Summary to context
↓
(50+ operations happen here,
context stays clean)