delete_identity
Delete email identities from Migadu mailboxes. Provide target, mailbox, and optional domain; this action is irreversible.
Instructions
Delete identit(ies). DESTRUCTIVE. List of dicts with: target, mailbox, domain (optional).
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| items | Yes |
Implementation Reference
- Tool handler that accepts IdentityDeleteRequest, resolves domain, formats email, logs destruction, calls the identity service's delete_identity, and returns a success envelope.
@migadu_bulk_tool(mcp, IdentityDeleteRequest, entity="identity", destructive=True) async def delete_identity( item: IdentityDeleteRequest, ctx: Context ) -> dict[str, Any]: """Delete identit(ies). DESTRUCTIVE. List of dicts with: target, mailbox, domain (optional).""" domain = item.domain or resolve_domain(None) email = format_email_address(domain, item.target) await ctx.warning(f"🗑️ Deleting identity {email}") await ( get_service_factory() .identity_service() .delete_identity(domain, item.mailbox, item.target) ) return {"deleted": email, "success": True} - migadu_mcp/utils/schemas.py:178-181 (schema)Pydantic schema for the delete_identity tool input: target (local part), mailbox, optional domain.
class IdentityDeleteRequest(BaseModel): target: str mailbox: str domain: str | None = None - migadu_mcp/tools/identity_tools.py:104-110 (registration)Registration is performed by the @migadu_bulk_tool decorator (line 89) which calls mcp.tool() as a side effect. The _ tuple keeps local references to avoid garbage collection.
_ = ( list_identities, get_identity, create_identity, update_identity, delete_identity, ) - Service layer that sends a DELETE request to the Migadu API at /domains/{domain}/mailboxes/{mailbox}/identities/{identity}.
async def delete_identity(self, domain: str, mailbox: str, identity: str) -> None: await self.client.delete( f"/domains/{domain}/mailboxes/{mailbox}/identities/{identity}" ) - HTTP client delete method that handles Migadu's known bug where successful DELETEs return HTTP 500; treats 200, 204, 404, and 500 as success.
async def delete(self, path: str) -> None: """DELETE returning None on success. Migadu has a known bug where successful DELETEs return HTTP 500. This method treats 200 and 500 as success. 404 is also treated as success (idempotent delete — already gone). Other errors raise. """ client = self._get_client() response = await client.request("DELETE", path) if response.status_code in (200, 204, 404, 500): return None raise MigaduAPIError(response.status_code, response.text)