anilist_delete_from_list
Remove an entry from your AniList anime or manga list with list entry ID or media ID.
Instructions
Remove an entry from your anime or manga list. Pass either a list entry ID or a media ID. Requires ANILIST_TOKEN.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| entryId | No | List entry ID to delete (from anilist_list) | |
| mediaId | No | AniList media ID to remove from your list |
Implementation Reference
- src/tools/write.ts:316-383 (handler)Tool registration with execute handler for anilist_delete_from_list. Resolves mediaId to entryId, snapshots before deletion, calls DELETE_MEDIA_LIST_ENTRY_MUTATION, invalidates caches, and pushes undo record.
server.addTool({ name: "anilist_delete_from_list", description: "Remove an entry from your anime or manga list. " + "Pass either a list entry ID or a media ID. " + "Requires ANILIST_TOKEN.", parameters: DeleteFromListInputSchema, annotations: { title: "Delete from List", readOnlyHint: false, destructiveHint: true, idempotentHint: true, openWorldHint: true, }, execute: async (args) => { try { requireAuth(); // Resolve mediaId to entryId if needed let entryId = args.entryId; if (!entryId && args.mediaId) { const snapshot = await snapshotByMediaId(args.mediaId); if (!snapshot) { return `Media ${args.mediaId} is not on your list.`; } entryId = snapshot.id; } if (!entryId) { return "Provide either an entryId or a mediaId."; } // Snapshot before deletion const before = await snapshotByEntryId(entryId); const data = await anilistClient.query<DeleteMediaListEntryResponse>( DELETE_MEDIA_LIST_ENTRY_MUTATION, { id: entryId }, { cache: null }, ); const viewerName = await getViewerName(); anilistClient.invalidateUser(viewerName); invalidateUserProfiles(viewerName); if (!data.DeleteMediaListEntry.deleted) { return `Entry ${entryId} was not found or already removed.`; } // Track for undo if (before) { pushUndo({ operation: { type: "delete", before }, toolName: "anilist_delete_from_list", timestamp: Date.now(), description: `Deleted entry ${entryId} (media ${before.mediaId})`, }); } const hint = before ? `\n(Deleted ${before.status} entry - say "undo" to restore)` : ""; return `Entry ${entryId} deleted from your list.${hint}`; } catch (error) { return throwToolError(error, "deleting from list"); } }, }); - src/schemas.ts:679-696 (schema)Zod schema for DeleteFromListInputSchema. Accepts optional entryId or mediaId (must provide at least one).
export const DeleteFromListInputSchema = z .object({ entryId: z .number() .int() .positive() .optional() .describe("List entry ID to delete (from anilist_list)"), mediaId: z .number() .int() .positive() .optional() .describe("AniList media ID to remove from your list"), }) .refine((data) => data.entryId !== undefined || data.mediaId !== undefined, { message: "Provide either an entryId or a mediaId.", }); - src/tools/write.ts:105-108 (registration)The registerWriteTools function is called to register all write tools including anilist_delete_from_list.
// === Tool Registration === /** Register list mutation tools */ export function registerWriteTools(server: FastMCP): void { - src/api/queries.ts:475-481 (helper)GraphQL mutation for DeleteMediaListEntry. Sends media list entry ID and expects a 'deleted' boolean response.
export const DELETE_MEDIA_LIST_ENTRY_MUTATION = ` mutation DeleteMediaListEntry($id: Int!) { DeleteMediaListEntry(id: $id) { deleted } } `; - src/types.ts:326-330 (helper)TypeScript interface for the response of delete entry mutation.
export interface DeleteMediaListEntryResponse { DeleteMediaListEntry: { deleted: boolean; }; }