01Safety
0.0 / 30
What changed in the harness
Selection accuracy 94→94, token cost up 4%, unconfirmed writes 0%→0%.
Category breakdown
Earned points across the four signals Gradable measures. Safety and Legibility are scored out of 30; Economics and Discoverability are scored out of 20.
0.0 / 30
21.8 / 30
10.8 / 20
14.0 / 20
Highest-impact fix
Estimated gain +30 pointsExpose machine-readable principal/tenant confirmation and a non-mutating permission check so agents can verify both before destructive actions.
Description evidence
11 defects found across the exposed tool descriptions. Suggested rewrites make purpose, inputs, boundaries, and returns easier for an agent to understand.
| Tool | Defect types | Suggested rewrite |
|---|---|---|
anilist_export |
no_return_description |
Export a user's anime or manga list as CSV or JSON for backup or migration. Use when the user wants to download, back up, or transfer their list data. Returns the list entries serialized in the requested format (csv or json), ready to download or save. |
anilist_whoami |
no_return_description |
Check which AniList account is authenticated and verify the token works. Use when the user wants to confirm their setup or debug auth issues. Returns the authenticated username and account details, confirming the token is valid. |
anilist_rate |
no_return_description |
Score an anime or manga on your list. Use when the user wants to give or update a rating (0-10) on a title. Scores display in the user's preferred format (3/5/10/100-point). Use a score of 0 to remove the existing score. Requires ANILIST_TOKEN. Returns the updated list entry with its applied score and entry ID. |
anilist_delete_from_list |
no_return_description |
Remove an entry from your anime or manga list. Pass either the list entry ID (from anilist_list) or the media ID of the title to remove. Requires ANILIST_TOKEN. Returns confirmation of the deletion, including the removed entry's ID. |
anilist_undo |
no_return_description |
Undo the last write operation (update progress, add to list, rate, delete, or batch update). Restores the affected list entry to its previous state, for example when the user made a mistake or wants to revert a change. Requires ANILIST_TOKEN. Returns the restored list entry with its status, progress, and entry ID. |
anilist_favourite |
no_return_description |
Toggle favourite on an anime, manga, character, staff member, or studio. Calling again on the same entity removes it from favourites. Requires ANILIST_TOKEN. Returns the entity's new favourite state (favourited or not). |
anilist_activity |
no_return_description |
Post a text activity to your AniList feed. Use when the user wants to share a status update, thought, or message. Requires ANILIST_TOKEN. Returns the created activity's ID, author, and text. |
anilist_batch_update |
params_unexplained no_return_description |
Apply a bulk action to multiple list entries that match the filter. Use when the user wants to move all low-scored titles to Dropped, add all planning titles to current, or bulk-change statuses. The filter object selects which entries to match (by status, minimum or maximum score, or unscored) and the action object specifies the change to apply (set a new status and/or score). Defaults to dry-run mode (preview only); set dryRun to false to execute. Requires ANILIST_TOKEN. Returns the matched entries with their status/score before and after, plus the number of entries affected. |
anilist_group_pick |
no_return_description |
Find anime or manga for a group to watch together. Finds titles that appear on multiple users' planning lists (or, when source is COMPLETED, titles all users rated highly). Use when friends want to pick something everyone will enjoy. Returns recommended titles with the usernames who share each pick and the list the recommendation came from. |
anilist_follow_suggestions |
no_return_description |
Find AniList users with similar taste from your following list. Ranks the people you follow by taste compatibility to highlight your best matches, compared over the selected media type (anime or manga). Requires ANILIST_TOKEN for following list access. Returns a ranked list of suggested usernames with their taste compatibility scores. |
anilist_react |
no_return_description |
Like or reply to an AniList activity. Use when the user wants to interact with an activity from their feed. Requires ANILIST_TOKEN. The LIKE action toggles the like state on the activity; the REPLY action posts a reply using the text parameter (required when action is REPLY). Returns the updated activity with its like state and any posted reply. |
Selection evidence
21 pairs where similar names or overlapping descriptions may send an agent toward the wrong tool.
| Tool A | Tool B | Confidence | Why they collide |
|---|---|---|---|
anilist_pick |
anilist_group_pick |
medium | Both recommend what to watch and share the 'pick/watch' tokens. A task like 'what should we watch tonight' or 'pick something for my friends and me' could route to single-user anilist_pick instead of group_pick since the only differentiator is plural vs singular subject. |
anilist_search |
anilist_staff_search |
medium | Both are 'search by name' tools sharing anime/manga/search tokens. A user asking 'search for Makoto Shinkai' or 'find works by Miyazaki' targets staff, but generic phrasing like 'search for X' gives no cue whether X is an anime title or a person. |
anilist_search |
anilist_studio_search |
low | A query like 'search for MAPPA' or 'find Studio Ghibli anime' could be sent to generic title search (which even returns studios as fields), so the agent might not reach studio_search despite its clearer fit. |
anilist_staff_search |
anilist_studio_search |
low | Both take a proper-noun name query, and names like 'Bones' or 'Mappa' could be either a studio or a person; 'who is behind this anime' is ambiguous between staff and studio lookup. |
anilist_seasonal |
anilist_seasonal_stats |
medium | Both concern seasons and share the 'seasonal' token. 'What did I watch this season' could be answered with a seasonal title browser (anilist_seasonal) instead of the per-season stats tool, or vice versa. |
anilist_seasonal |
anilist_seasonal_recap_card |
low | 'Make a seasonal recap' strongly implies the card, but shorter phrasing like 'my seasonal recap' could route to browsing current-season anime instead of generating the user stats image. |
anilist_staff |
anilist_staff_search |
medium | Both are staff-focused and share staff/anime/manga tokens. 'Look up the staff' is ambiguous: it could mean credits for a specific title (anilist_staff) or a name-based staff lookup (anilist_staff_search), and the agent must infer which direction the user means. |
anilist_stats |
anilist_seasonal_stats |
medium | Both return user stats and share the 'stat' token. 'Show me my stats' defaults to overall stats, but a user wanting their per-season completion rates could be routed to the wrong one; the season dimension is an easy miss. |
anilist_taste |
anilist_taste_card |
medium | Same underlying data with identical input schema; the only difference is output format (text summary vs shareable PNG). 'Generate my taste profile' or 'show my taste' is genuinely ambiguous between the two. |
anilist_wrapped |
anilist_wrapped_card |
medium | Same year-in-review data, differing only in text summary vs card image output. 'Give me my wrapped' with no mention of an image could select the wrong member. |
anilist_taste_card |
anilist_wrapped_card |
medium | Both generate a shareable card image of a single user's stats and share nearly all tokens. A request like 'make me a shareable card of my anime' is ambiguous between a taste card and a year-in-review card. |
anilist_taste_card |
anilist_compat_card |
low | Both produce shareable card images; 'make a card about our tastes' could be misread as a single-user taste card even though compat requires two usernames. |
anilist_compat_card |
anilist_wrapped_card |
low | Members of the same card-image family; only the user count and content (comparison vs year review) differentiate them, and a vague 'generate a card' task could land on either. |
anilist_taste_card |
anilist_seasonal_recap_card |
low | Both are shareable card image generators of a single user's stats; 'generate a recap card' is ambiguous between taste profile and seasonal recap. |
anilist_wrapped_card |
anilist_seasonal_recap_card |
medium | Year-in-review and seasonal-recap cards are near-identical in purpose (recap card image). A request like 'my recap card for this year' is ambiguous between the two time spans. |
anilist_compat_card |
anilist_seasonal_recap_card |
low | Both generate card images of user stats; 'make a card showing our season' mixes comparison and seasonal framing and could route to either. |
anilist_genres |
anilist_genre_list |
low | Names differ by one token. 'What genres are available?' targets genre_list, but phrasing like 'show me the genres' could send the agent to the genre-browsing tool, which requires a genre argument and would fail. |
anilist_activity |
anilist_feed |
medium | anilist_activity POSTs to the feed while anilist_feed reads it. A read request like 'show my recent activity' matches the token 'activity' in the posting tool, risking accidentally publishing a post instead of fetching the feed. |
anilist_add_to_list |
anilist_rate |
low | Both mutate a list entry and share an anime/manga/list tokens; add_to_list even accepts an optional score. 'Put an 8 on this' could be routed to add_to_list instead of rate, and 'add to my list and score it' is ambiguous. |
anilist_search |
anilist_characters |
medium | A name like 'Naruto', 'Goku', or 'Levi' is both an anime/manga title and a character. 'Find Naruto' gives no cue which tool is correct, and both take a plain search query. |
anilist_update_progress |
anilist_batch_update |
low | Both are update tools sharing the 'update' token. A bulk-sounding request like 'update my progress' with no specific title could be routed to single-entry update_progress (which requires mediaId) instead of the batch tool, or vice versa. |
Compare the field