mastodon-mcp-server
A comprehensive MCP (Model Context Protocol) gateway enabling AI assistants to interact with Mastodon instances, supporting both read and write operations across all major API areas:
Instance Information: Retrieve instance metadata (name, description, version, rules).
Account Management: View/update your own profile, look up and search accounts, browse followers/following, follow/unfollow, block/unblock, mute/unmute, and check relationships.
Timelines: Read home, local, public, and hashtag timelines.
Statuses: Fetch statuses and thread context; post new statuses (with content warnings, visibility, media, polls, and reply threading); delete, favourite/unfavourite, reblog/unreblog, bookmark/unbookmark; see who favourited or reblogged.
Notifications: List (with filtering), dismiss individual, or clear all notifications.
Search & Discovery: Search accounts, statuses, and hashtags; view trending tags, statuses, and links; browse the profile directory.
Collections: View your favourited statuses, bookmarked statuses, muted accounts, and blocked accounts.
Lists: Create/delete lists, view/add/remove list members.
Polls: Vote in active polls.
Follow Requests: View, approve, or reject pending follow requests.
Media: Upload image, video, or audio attachments with alt text.
Read-Only Mode: Optionally disable all write operations for safe browsing.
Provides tools for interacting with Mastodon instances, enabling AI assistants to read timelines, post and manage statuses, follow/unfollow accounts, search, and handle notifications, lists, polls, and media.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@mastodon-mcp-servershow me my home timeline"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
mastodon-mcp-server
A comprehensive MCP (Model Context Protocol) server for Mastodon integration. Enables AI assistants and other MCP clients to interact with Mastodon instances — read timelines, post statuses, manage accounts, search, and more.
Features
Timelines: home, local, public, hashtag
Statuses: post, delete, favourite, reblog, bookmark
Accounts: follow, unfollow, block, mute, relationships, profile update
Notifications: read, dismiss individual or all
Search: accounts, statuses, hashtags
Trending: tags, statuses, links
Lists: create, delete, manage members
Media: upload attachments
Polls: vote
Read-only mode: safe browsing without write access
STDIO and HTTP transports: works with any MCP-compatible client
Related MCP server: X(Twitter) V2 MCP Server
Installation
Debian 13+ / Ubuntu 24+
apt install mastodon-mcp-serverpip
pip install mastodon-mcp-serverFrom source
git clone https://github.com/VitexSoftware/mastodon-mcp-server.git
cd mastodon-mcp-server
pip install -e .Configuration
Copy .env.example to .env and fill in your credentials:
cp .env.example .envVariable | Required | Default | Description |
| yes | — | Mastodon instance URL (e.g. |
| yes | — | OAuth access token |
| no |
| Disable all write operations |
| no |
| Transport: |
| no |
| HTTP transport bind address |
| no |
| HTTP transport port |
| no |
| Disable HTTP session state |
| no |
| Enable verbose logging |
Getting an Access Token
Go to your Mastodon instance → Preferences → Development → New application
Grant required scopes:
read,write,followCopy the Your access token value
Client Setup
Claude Code (CLI)
claude mcp add --scope user mastodon /usr/bin/mastodon-mcp \
-e MASTODON_INSTANCE=mastodon.social \
-e MASTODON_ACCESS_TOKEN=your-token-hereClaude Desktop
~/.config/claude/claude_desktop_config.json:
{
"mcpServers": {
"mastodon": {
"command": "mastodon-mcp",
"env": {
"MASTODON_INSTANCE": "https://mastodon.social",
"MASTODON_ACCESS_TOKEN": "your-token-here"
}
}
}
}Warp Terminal
~/.warp/mcp_config.json:
{
"mcpServers": {
"mastodon": {
"command": "/usr/bin/mastodon-mcp",
"args": [],
"env": {
"MASTODON_INSTANCE": "https://mastodon.social",
"MASTODON_ACCESS_TOKEN": "your-token-here"
}
}
}
}VSCode (GitHub Copilot / Continue)
~/.config/Code/User/mcp.json:
{
"servers": {
"MastodonMCP": {
"type": "stdio",
"command": "/usr/bin/mastodon-mcp",
"args": [],
"env": {
"MASTODON_INSTANCE": "https://mastodon.social",
"MASTODON_ACCESS_TOKEN": "your-token-here"
}
}
}
}HTTP transport (any MCP client)
MASTODON_MCP_TRANSPORT=streamable-http mastodon-mcpUsage
usage: mastodon-mcp [-h] [--version]
Model Context Protocol server for Mastodon integration.
options:
-h, --help show this help message and exit
--version show program's version number and exit
Environment variables:
MASTODON_INSTANCE Mastodon instance URL (required)
MASTODON_ACCESS_TOKEN OAuth access token (required)
MASTODON_MCP_TRANSPORT Transport mode: stdio (default) or streamable-http
MASTODON_MCP_HOST HTTP bind address (default: 127.0.0.1)
MASTODON_MCP_PORT HTTP port (default: 8000)
MASTODON_MCP_STATELESS_HTTP Disable HTTP session state (default: false)
READ_ONLY Restrict to read-only operations (default: true)
DEBUG Enable verbose logging (default: false)Available Tools
Instance
Tool | Description |
| Instance name, description, version, rules |
Accounts
Tool | Description |
| Own profile |
| Account by numeric ID |
| Search accounts by username or display name |
| Posts by an account |
| Social graph |
| Follow management |
| Block management |
| Mute management |
| Relationship to one or more accounts |
| Update own display name, bio, locked status |
Timelines
Tool | Description |
| Home timeline (followed accounts) |
| Local instance public timeline |
| Federated public timeline |
| Statuses with a specific hashtag |
Statuses
Tool | Description |
| Single status by ID |
| Thread ancestors and descendants |
| Post a new status (supports CW, visibility, media, polls) |
| Delete own status |
| Favourite management |
| Boost management |
| Bookmark management |
| Who engaged with a status |
Notifications
Tool | Description |
| List notifications (filterable by type) |
| Dismiss a single notification |
| Clear all notifications |
Search & Discovery
Tool | Description |
| Search accounts, statuses, and hashtags |
| Trending hashtags |
| Trending statuses |
| Trending links/articles |
| Browse the instance profile directory |
Collections
Tool | Description |
| Own favourited statuses |
| Own bookmarked statuses |
| Muted accounts |
| Blocked accounts |
Lists
Tool | Description |
| All lists |
| Accounts in a list |
| Create/delete lists |
| Add/remove list members |
Polls
Tool | Description |
| Vote in a poll |
Follow Requests
Tool | Description |
| Pending follow requests |
| Accept/reject requests |
Media
Tool | Description |
| Upload image/video/audio attachment |
Future Tools (Mastodon.py ≥ 2.x / Mastodon server ≥ 3.5)
The following tools are implemented but commented out in server.py. Uncomment them when your distribution ships python3-mastodon >= 2.0.1 (already available on Debian 13/trixie):
Tool | Requirement |
| Edit a status (server 3.5+) |
| Edit history (server 3.5+) |
| Plain-text source for editing |
| Translate a status (server 4.0+) |
| Direct-message conversations |
| List scheduled posts |
| Reschedule a post |
| Cancel a scheduled post |
| Unread notification count |
Testing
# Offline (tool registration + helper functions + version check)
python3 scripts/test_server.py
# With live instance
MASTODON_INSTANCE=mastodon.social \
MASTODON_ACCESS_TOKEN=your-token \
python3 scripts/test_server.pyArchitecture
The server uses a bundled stdlib-only MCP implementation (mastodon_mcp_server/_mcp.py) so it has no dependency on python3-fastmcp or its deep dependency chain. This makes packaging for Debian/Ubuntu straightforward. The implementation is compatible with the FastMCP decorator API (@mcp.tool()).
Citation
This project is built on Mastodon.py. If you use it in academic work, please cite:
@article{Diener2026,
author = {Diener, Lorenz and Delcourt, Corentin},
title = {Mastodon.py: A Python library for the Mastodon API},
journal = {Journal of Open Source Software},
year = {2026},
volume = {11},
number = {120},
pages = {8946},
doi = {10.21105/joss.08946},
url = {https://doi.org/10.21105/joss.08946}
}See Mastodon.py's CITATION.cff for details.
License
MIT — Vítězslav Dvořák info@vitexsoftware.cz
Available Tools
54 toolsaccount_blockAccount BlockCIdempotent
Block an account.
| Name | Required | Description | Default |
|---|---|---|---|
| account_id | Yes | Numeric account ID to block. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a non-read-only, idempotent, non-destructive, open-world operation, so safety is partly covered. However, the description adds nothing about actual effects on the target account (relationship changes, visibility, reversibility), which is exactly the context a caller needs for a mutating account action.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence with no filler and the action front-loaded; nothing is redundant. It is efficient, though arguably too terse to be maximally useful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and the single parameter is fully documented. Still missing are the operational consequences of blocking and whether it can target the authenticated account, leaving the definition minimally adequate for a mutation tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single account_id parameter is documented in the schema as a numeric account ID. The description adds no extra meaning, so the baseline of 3 applies when the schema carries the load.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a concrete verb and resource ("Block an account"), which is unambiguous on its own. It does not, however, distinguish this from adjacent siblings like account_unblock or account_mute, so the agent must infer the direction from the name alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to block versus mute or unfollow, no mention of the inverse tool account_unblock, and no stated preconditions. The agent gets no routing help beyond the tool name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
account_followAccount FollowCIdempotent
Follow an account.
| Name | Required | Description | Default |
|---|---|---|---|
| account_id | Yes | Numeric account ID to follow. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnly=false, destructive=false, idempotent=true, openWorld=true), so the agent knows this is a safe, repeatable write. But the description adds nothing beyond them: it does not state whether following is private/approved, whether it triggers notifications, what happens on re-follow, or what the output contains. For a mutation tool the structured fields do the work and the prose is empty.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One short sentence, front-loaded with verb and resource, with no wasted words. It is terse to the point of under-specification, but structurally it is clean.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and the single param is fully documented. What remains missing is any behavioral or routing context for a write action in a dense sibling set. Adequate but with clear gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the single account_id parameter is documented as 'Numeric account ID to follow.' The description adds no syntax or format detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Follow) and resource (account), so the basic action is clear. However, it does nothing to differentiate from the obvious sibling account_unfollow, or from account_mute/account_block which are adjacent relationship actions. The name and title already convey this much, so the description adds almost no clarity beyond the label.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance and no mention of related alternatives. With 50+ siblings including account_unfollow, account_mute, account_block, and account_relationships, an agent gets no help choosing this tool over the others.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
account_followersAccount FollowersCRead-onlyIdempotent
Get followers of an account.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results (default 40, max 80). | |
| account_id | Yes | Numeric account ID. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=true, so the safety profile is fully covered by structured data. The description adds no behavioral context of its own — no pagination behavior, no visibility/blocking caveats, no note on whether followers are returned in a stable order.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single short, front-loaded sentence with zero wasted words. Its terseness is a completeness problem rather than a structure problem, so it scores well here even though the content is thin.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Because an output schema exists, return values need not be described, and the schema fully covers the two parameters. However, for a paginated follower-listing read operation, the complete absence of usage or behavioral context leaves the definition minimally viable rather than complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, documenting both account_id and the limit default/max, so the schema does the heavy lifting. The description contributes no additional parameter meaning, which is acceptable but yields the baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a clear verb and resource ('Get followers of an account'), which is more than a tautology, but it does not distinguish itself from the closely related sibling account_following (the inverse relationship) or explain any scope nuance. An agent can infer the purpose, but the description adds nothing beyond the name.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no mention of the alternative account_following for the reverse direction, and no prerequisites or context for selecting this tool over account_relationships or list_accounts. The agent must infer usage entirely from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
account_followingAccount FollowingBRead-onlyIdempotent
Get accounts that a given account follows.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results (default 40, max 80). | |
| account_id | Yes | Numeric account ID. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is fully covered. The description adds no behavioral context beyond that—no ordering, no pagination/cursor semantics, no note on what happens past the 80-result cap. It merely restates the operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with zero waste and no filler. It is appropriately sized, though the extreme brevity borders on under-specification for a tool with paginated results.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and annotations cover safety. What's missing is the relationship to the sibling account_followers and any pagination/ordering note; for a simple two-parameter read tool the description is minimally adequate but leaves routing to the agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%: both account_id and limit (default 40, max 80) are documented in the schema itself. The description adds no syntax, format, or range meaning beyond what the schema already provides, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Get') and resource ('accounts that a given account follows'), and the follows/followers wording inherently distinguishes it from the sibling account_followers. An agent can select it without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this versus account_followers, account_relationships, or account_follow. No mention of pagination behavior or when to raise the limit. The agent must infer usage from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
account_getAccount GetBRead-onlyIdempotent
Get a Mastodon account by its numeric ID.
| Name | Required | Description | Default |
|---|---|---|---|
| account_id | Yes | Numeric account ID. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true, and openWorldHint=true, so the safety profile is fully covered. The description adds no behavioral context beyond that—no authentication requirements, failure behavior for missing accounts, or rate-limit notes—so it contributes little beyond the structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence, no waste, and the key constraint (numeric ID) is front-loaded. It is appropriately sized for a simple single-parameter tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple, has full schema coverage, rich annotations, and an output schema, so the description does not need to explain return values or safety. It is complete enough to invoke correctly, though with many sibling account tools a routing hint would improve completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the single parameter is already documented as 'Numeric account ID.' The description repeats the same numeric-ID constraint without adding format details, examples, or edge cases, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Get') and resource ('Mastodon account') with the lookup key ('numeric ID'), which clearly separates it from account_search and timeline-style siblings. However, it does not explicitly name or differentiate itself from related account tools like account_verify or account_relationships, so an agent still has to infer the boundary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description only implies usage by requiring a numeric ID. It gives no guidance on when to choose this tool over account_search, account_verify, or other account-related siblings, and no prerequisites or exclusions are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
account_muteAccount MuteCIdempotent
Mute an account.
| Name | Required | Description | Default |
|---|---|---|---|
| account_id | Yes | Numeric account ID to mute. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, idempotentHint=true, and openWorldHint=true, so the safety profile is covered structurally. The description adds nothing beyond that: it doesn't state what muting changes, whether it is reversible, or whether authentication as the muting account is required.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is a single front-loaded sentence with zero padding, which is structurally clean. However, the brevity crosses into under-specification for a mutation tool rather than representing genuine economy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained. But for a state-changing relationship operation with no annotations describing effects, the description leaves out side effects, reversibility, and relationship to sibling mute/block tools, making it too thin for the operation's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single account_id parameter is fully documented in the schema, so the baseline of 3 applies. The description contributes no additional meaning about accepted ID forms or whether the caller's own ID is permitted.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The phrase "Mute an account" gives a verb and resource, so the action is identifiable, but it is essentially a restatement of the tool name and title with no elaboration. It does not distinguish the tool from close siblings such as account_block, account_unmute, or mutes, nor does it say what muting actually suppresses (notifications, timeline visibility).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no prerequisites, and no mention of alternatives such as account_block for stronger suppression or mutes for reviewing muted accounts. The agent must infer the use case entirely from the tool name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
account_relationshipsAccount RelationshipsARead-onlyIdempotent
Get the authenticated user's relationship to one or more accounts.
| Name | Required | Description | Default |
|---|---|---|---|
| account_ids | Yes | List of numeric account IDs. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare it as a safe read-only, idempotent operation. The description adds that it returns relationship data (which could include following, blocking, muting, etc.) but doesn't specify what fields are returned or the behavior for accounts that don't exist. Since annotations cover the safety profile and an output schema exists, this is adequate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single concise sentence that front-loads the action and resource. No extraneous information, and the scope ('one or more') is stated efficiently.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read operation with a single required parameter, comprehensive schema, annotations, and an output schema, the description is nearly sufficient. It could mention pagination or return format, but given the output schema exists, those details are available elsewhere.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With one parameter and 100% schema description coverage, the schema fully documents account_ids as a list of numeric IDs. The description implies batch operations ('one or more accounts'), which adds context but doesn't specify whether it's limited to a maximum or how it handles invalid IDs. Baseline 4 applies since schema is comprehensive.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Get) and resource (relationship to accounts) with clear scope ('one or more'). Clearly distinguishes from siblings like account_followers (who follows an account) or account_search (finding accounts) since this returns the authenticated user's own relationship.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The use case is implied by the description: retrieving relationship data for specific accounts the user already knows IDs for. However, it doesn't explicitly differentiate from similar tools like account_statuses or explain when to use this vs. other account methods beyond a general read operation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
account_searchAccount SearchBRead-onlyIdempotent
Search for accounts by username or display name.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results (default 10, max 80). | |
| query | Yes | Search string (username or display name). | |
| resolve | No | Whether to resolve non-local accounts (default False). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false, and openWorldHint, so the safety profile is fully covered without the description. The description adds nothing behavioral on top: it doesn't note that non-local accounts require resolve, that results are capped, or anything about rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single efficient sentence with the resource and matching fields front-loaded and no waste. It is appropriately sized, though it could carry a bit more routing information without becoming bloated.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only search with full schema coverage, rich annotations, and an existing output schema, the essentials are covered. The only gap is sibling disambiguation, which is minor given the structured data available.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so limit, query, and resolve are all documented in the schema; the description only echoes the query semantics ('username or display name'). Baseline 3 is appropriate when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Search for accounts') plus the match fields (username or display name). It is reasonably distinct from account_get or account_verify, but it never differentiates itself from the broader sibling 'search' tool, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use guidance, no mention of alternatives like account_get, directory, or the generic 'search' tool, and no exclusions. The agent must infer the use case from the one-line purpose.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
account_statusesAccount StatusesCRead-onlyIdempotent
Get statuses posted by a specific account.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results (default 20, max 40). | |
| account_id | Yes | Numeric account ID. | |
| only_media | No | Only return statuses with media (default False). | |
| exclude_reblogs | No | Exclude reblogs (default False). | |
| exclude_replies | No | Exclude replies (default False). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds nothing beyond that: no mention of visibility constraints, rate limiting, or pagination behavior for a tool whose default limit of 20 is capped at 40.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence with no filler. It is appropriately terse for a simple read tool, though it is arguably too terse to earn a top score given the sibling ambiguity it leaves unaddressed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists and rich annotations cover the safety profile, so the description need not explain return values. Still, it omits result ordering, pagination, and any hint of how it differs from timeline tools, leaving a modest gap for a 5-parameter account-scoped list operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter (limit, account_id, only_media, exclude_reblogs, exclude_replies) is already documented in the schema. The description adds no extra meaning, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get statuses posted by a specific account'), which is clear enough to act on. However, it does not differentiate itself from overlapping siblings such as timeline_home, timeline_hashtag, or search, all of which also return statuses.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this versus the timeline_* or search siblings, no prerequisites, and no mention of whether the account must be public or followed. The agent must infer the context entirely.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
account_unblockAccount UnblockCIdempotent
Unblock an account.
| Name | Required | Description | Default |
|---|---|---|---|
| account_id | Yes | Numeric account ID to unblock. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare idempotentHint=true, destructiveHint=false, and openWorldHint=true, so the safety profile is covered. The description adds nothing beyond that – no mention of auth requirements, side effects (e.g., whether the blocked account is notified), or reversibility. With rich annotations the burden is lower, but zero added context merits a low score.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no waste. It is terse rather than verbose, though arguably under-specified rather than genuinely concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists and the single parameter is fully documented, so the description needn't explain returns. Still, for a state-mutating account operation it provides no context about preconditions or effects, leaving the definition merely adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with a single, well-described account_id parameter, so the schema does the heavy lifting. The description adds no format or constraint detail beyond the schema, which is the baseline-3 case.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (unblock an account), which an agent can clearly distinguish from the sibling account_block. However, it adds no scope or qualifier beyond the inverse operation, so it is clear but not richly differentiated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this versus alternatives, what preconditions apply (e.g., the account must currently be blocked), or what happens if the account is not blocked. The agent must infer usage entirely from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
account_unfollowAccount UnfollowCIdempotent
Unfollow an account.
| Name | Required | Description | Default |
|---|---|---|---|
| account_id | Yes | Numeric account ID to unfollow. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true, destructiveHint=false, and openWorldHint=true, covering the safety and repeat-call profile. The description adds nothing beyond that—no note on whether the follow relationship is mutual, whether the target account is notified, or what errors occur for invalid/self IDs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single three-word sentence with zero waste and the action front-loaded. It is terse to the point of being thin, but nothing is padded or buried.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple (one required param), the output schema covers return values, and annotations cover the safety profile, so very little prose is required. However, for a mutation that changes a social relationship, the description omits any effect/error context an agent might want before calling it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single parameter carries its own description ('Numeric account ID to unfollow'), so the schema fully documents the input. The description adds no format, range, or resolution detail, which is the expected baseline when the schema does the work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb (Unfollow) and resource (an account), so an agent can immediately tell it apart from account_follow and the block/mute family. It stops short of explicitly naming the inverse or scoping behavior, but the purpose is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no prerequisites, and no pointer to alternatives such as account_block or account_mute for related but distinct intents. The agent must infer the use case entirely from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
account_unmuteAccount UnmuteBIdempotent
Unmute an account.
| Name | Required | Description | Default |
|---|---|---|---|
| account_id | Yes | Numeric account ID to unmute. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true, destructiveHint=false, and openWorldHint=true, covering the safety and repeat-call profile. The description adds nothing beyond that: it does not note reversibility (the mute counterpart), auth requirements, or effects on existing relationships.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with zero waste, appropriate for a low-complexity one-parameter tool. It stops just short of earning a 5 because the brevity leaves the sibling ambiguity unresolved.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter operation with full schema coverage, rich annotations, and an output schema, the description does not need to explain return values or safety. The only real gap is distinguishing this from account_mute/account_unblock.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single account_id parameter is fully documented in the schema as 'Numeric account ID to unmute.' The description contributes no additional parameter meaning, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Unmute') and resource ('an account'), so the operation is unambiguous. However it offers no differentiation from closely related siblings like account_mute, account_block, or account_unblock, which an agent selecting between them would benefit from.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no indication of when to use this tool versus alternatives, no prerequisites, and no exclusion conditions. The sibling set contains both account_mute and account_unblock, so guidance on choosing among them is genuinely needed and entirely absent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
account_updateAccount UpdateBIdempotent
Update the authenticated account's profile.
| Name | Required | Description | Default |
|---|---|---|---|
| bot | No | Mark account as a bot (True/False). | |
| note | No | New bio/note (profile description). | |
| locked | No | Require approval for follow requests (True/False). | |
| display_name | No | New display name. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true, destructiveHint=false and openWorldHint=true, so the safety profile is covered. The description adds the one thing annotations cannot: the target is strictly the authenticated account, not an arbitrary user. It still omits partial-update semantics (do omitted/null fields leave values unchanged?) and any rate-limit or auth-scope detail.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with zero padding, which is efficient. It is arguably too terse to be maximally useful, but no sentence is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Complexity is low (a four-field, all-optional update), an output schema exists, and annotations carry the safety profile, so the terse description is close to sufficient. What is missing is the key operational fact that this is a partial merge update where omitted fields are left unchanged, plus any permission context — a gap an agent could trip over.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all four parameters (bot, note, locked, display_name) are already documented in the schema. The description only gestures at 'profile', which arguably covers note and display_name but not bot or locked, and adds no format or defaulting guidance. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Update) and resource (the authenticated account's profile), which is unambiguous. It does not, however, differentiate itself from siblings like account_get or account_verify, so an agent gets no routing help from the text alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no mention of alternatives (e.g., other account_* tools), and no prerequisites such as authentication requirements or what happens if no fields are supplied. The agent must infer everything from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
account_verifyAccount VerifyARead-onlyIdempotent
Get the authenticated account's own profile.
Returns: str: JSON with account id, username, display_name, followers_count, etc.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly=true, idempotent=true, non-destructive, openWorld, covering the safety profile. The description adds only that it returns a profile JSON with field examples, which duplicates the output schema; it says nothing extra about auth prerequisites or failure modes for an unauthenticated caller.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Very short and front-loaded, with the operative statement in the first sentence. The "Returns" block is somewhat redundant given an output schema exists, but it is compact and does no real harm.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter read with annotations covering safety and a declared output schema, the description covers what the tool does and what it touches. Since an output schema is present, the enumerated return fields are surplus rather than missing, so nothing essential is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate and the schema-completeness baseline of 4 applies. It correctly avoids inventing parameter semantics that do not exist.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ("Get the authenticated account's own profile") and its scope word "own" implicitly distinguishes it from sibling account_get, which would target arbitrary accounts. It is clear, but it never names the sibling it differs from, so the differentiation must be inferred from the sibling list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use or when-not-to-use statement and no named alternative. The phrase "authenticated account's own profile" implies the usage context (no id needed, self-scoped), which is enough to be usable but leaves the agent to infer the boundary against account_get and account_search.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
blocksBlocksBRead-onlyIdempotent
Get accounts blocked by the authenticated account.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results (default 40). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=true. The description adds no behavioral context beyond these annotations, such as pagination behavior, rate limits, or authentication requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with zero wasted words. It is appropriately sized for a simple list endpoint.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity, the presence of an output schema, and rich annotations, the description is nearly complete. It could mention pagination or limit handling, but the schema and output structure cover most context an agent needs.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single 'limit' parameter is fully documented in the schema. The description does not add any parameter meaning, which is acceptable given the high schema coverage baseline of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Get accounts blocked by the authenticated account.' It clearly distinguishes blocked accounts from muted accounts and other sibling resources, but it does not explicitly differentiate itself from similar list endpoints or mention scope beyond the authenticated account.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus siblings like mutes, account_relationships, or account_block. Usage is only implied by the tool's purpose, with no explicit when-to-use or when-not-to-use instructions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bookmarksBookmarksBRead-onlyIdempotent
Get statuses bookmarked by the authenticated account.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results (default 20, max 40). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=true, so the safety profile is fully covered. The description adds nothing beyond that — no pagination behavior, ordering, or auth context — so it contributes no behavioral value.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence with zero wasted words. It is appropriately terse for a one-parameter list tool, though it leaves room for routing context that would earn a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple (one optional param, output schema present, rich annotations), so return values need not be explained. Still, the description could note that results are the authenticated account's and how pagination beyond the limit behaves; adequate but with clear gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with a single optional 'limit' parameter fully documented (default 20, max 40). The description adds no additional parameter meaning, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Get) and resource (statuses bookmarked by the authenticated account), and the word 'bookmarked' distinguishes it from the sibling 'favourites'. However it does not explicitly contrast with status_bookmark/status_unbookmark or favourites beyond the implicit wording.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied: an agent can infer this lists the authenticated user's bookmarks. But there is no explicit when-to-use guidance, no mention of the favoured 'favourites' alternative, and no prerequisites or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
directoryDirectoryCRead-onlyIdempotent
Browse the profile directory of the instance.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of accounts (default 20, max 80). | |
| local | No | Only show local accounts (default False). | |
| order | No | 'active' (recently active) or 'new' (recently joined). | active |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds essentially nothing beyond the name - it doesn't explain what makes a 'profile directory' distinct (e.g., only discoverable/opted-in accounts) or ordering behavior beyond what the schema already states.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single short sentence with no waste and a clear front-loaded verb+resource. It is efficient, though the terseness contributes to the missing usage and behavioral detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Complexity is low (three optional params, read-only), the output schema covers return values, and annotations cover safety, so the description only needs to convey purpose and routing. It does state purpose but leaves the agent without the key distinction from account_search, which is a meaningful gap for a browse tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema itself documents limit, local, and order including the 'active'/'new' values. The description adds no parameter meaning beyond that, so the baseline 3 for full schema coverage applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('browse') and resource ('profile directory of the instance'), which an agent can distinguish from account_search or timeline tools. However, it does not name or contrast with those siblings, so the differentiation relies on the agent's own inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit guidance on when to use this tool versus account_search, timeline_local, or trending tools. The description implies a browse-style discovery use case but offers no conditions or alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
favouritesFavouritesCRead-onlyIdempotent
Get statuses favourited by the authenticated account.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results (default 20, max 40). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is fully covered by structured data. The description adds nothing beyond that: no ordering, no pagination/cursor behavior, no note on whether the list is live or cached. It essentially restates the read semantics the annotations already encode.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One short sentence, front-loaded with the key scope. Nothing is padded, but it is arguably too terse for a list tool with no usage framing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and the single parameter is fully documented. However, for a paginated-style list endpoint capped at 40 results, the absence of any guidance on ordering, cursor behavior, or how to get older favourites leaves a real gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single optional parameter and schema description coverage is 100%, so the schema fully documents limit with its default and maximum. Per the baseline rule for high coverage, 3 is appropriate; the description adds no syntax or formatting detail the schema lacks.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: retrieving statuses favourited by the authenticated account. The 'by the authenticated account' scoping implicitly separates it from status_favourited_by, but the description never names or contrasts with its closest sibling (bookmarks), so differentiation is left to inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance, no exclusions, and no mention of the obvious alternative (bookmarks, status_favourited_by) or when a plain timeline call would be preferable. The agent gets a purpose but no routing criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
follow_request_authorizeFollow Request AuthorizeCIdempotent
Approve a follow request.
| Name | Required | Description | Default |
|---|---|---|---|
| account_id | Yes | Numeric account ID of the requester. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true, destructiveHint=false, and openWorldHint=true, so the safety and idempotency profile is covered. The description adds no behavioral context beyond the action itself, such as what changes occur or whether authorization is required.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence with no redundant or filler content. It is highly concise, though its brevity means it carries very little supporting detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter mutation tool with full schema coverage, an output schema, and annotations covering the safety profile, the description is minimally adequate. It omits explicit usage guidance and behavioral details, but the structured fields compensate for much of the missing context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, including a clear description for account_id as the numeric account ID of the requester. The description does not add parameter meaning beyond the schema, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb+resource: 'Approve a follow request.' This clearly distinguishes it from follow_request_reject and follow_requests by action and object. It does not explicitly name sibling alternatives, but the purpose is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit guidance on when to use this tool versus alternatives such as follow_request_reject or follow_requests. The intended use is implied by the verb 'approve,' but no conditions, prerequisites, or exclusions are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
follow_request_rejectFollow Request RejectCDestructiveIdempotent
Reject a follow request.
| Name | Required | Description | Default |
|---|---|---|---|
| account_id | Yes | Numeric account ID of the requester. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, readOnlyHint=false and openWorldHint=true, so the safety profile is covered structurally. The description adds nothing beyond that - no statement about irreversible removal of the request, no side effects, no confirmation semantics - so it earns no credit above the annotation floor.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with zero filler, which is structurally clean. It is nevertheless underspecified rather than genuinely concise - there is no second sentence earning its place because no useful detail is provided at all.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple (one required param), an output schema exists so return values need no explanation, and annotations carry the destructive/idempotent profile. What is still missing for an agent is routing relative to follow_request_authorize and follow_requests, which is the only real gap for a tool of this complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single account_id parameter is fully documented in the schema as the requester's numeric ID. The description adds no additional meaning about the identifier, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The sentence names a verb (reject) and a resource (follow request), so the action is not ambiguous. However, it is essentially a restatement of the tool name/title and offers no differentiation from the sibling follow_request_authorize, which is the tool an agent would plausibly confuse it with.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to reject versus when to use follow_request_authorize, no mention of prerequisites (e.g., that the request must exist or that auth as the target account is required), and no exclusions. The agent is left to infer everything from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
follow_requestsFollow RequestsARead-onlyIdempotent
Get pending follow requests for the authenticated account.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results (default 40). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is fully covered. The description contributes the meaningful qualifiers "pending" and "for the authenticated account" (i.e., not an arbitrary account), but adds nothing on ordering, pagination, or result behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with the resource and scope stated immediately and zero filler. Nothing is repeated from the title or schema and nothing is left dangling.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter read-only list tool with an output schema, the description covers what it returns and whose requests they are, which is sufficient. The only omission is any hint about ordering or how requests relate to the authorize/reject siblings, which is minor given the output schema exists.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are no parameters to explain, only 'limit', which the schema already documents at 100% coverage with a default of 40. The description adds no syntax, range, or paging semantics beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource ("Get pending follow requests") and scopes it to the authenticated account, so the operation is unambiguous. It does not name the sibling tools that act on these requests (follow_request_authorize, follow_request_reject), so it stops short of full sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied: an agent can infer this is the read step that precedes follow_request_authorize or follow_request_reject when reviewing pending requests. However, the description never states when to call it versus those siblings, nor any prerequisites or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
instance_infoInstance InfoARead-onlyIdempotent
Get information about the connected Mastodon instance.
Returns: str: JSON with instance name, description, version, rules, etc.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, openWorldHint=true and destructiveHint=false, so the safety and repeatability profile is covered. The description adds only the returned content shape (name, description, version, rules) and says nothing about authentication needs, rate limits, or freshness, so it adds modest value beyond structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the operation, then a short returns note; nothing extraneous. The 'Returns:' block is mildly redundant given a dedicated output schema exists, which keeps it just short of ideal.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and annotations covering the safety profile, the description need not explain return values, and it still does so briefly. Purpose and expected payload are clear; only explicit usage context is missing, which is minor for a single unambiguous tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate. The baseline for a parameterless tool applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get information about the connected Mastodon instance') that unambiguously identifies the tool. No sibling in the list covers instance-level metadata (all others target accounts, statuses, lists, notifications, etc.), so the distinction is automatic.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use guidance (e.g., to discover the server version for feature compatibility) and no mention of alternatives. However, because this is the only instance-scoped tool and its name/purpose are self-evident, usage is strongly implied rather than misleading.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_accountsList AccountsCRead-onlyIdempotent
Get accounts in a specific list.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of accounts (default 40). | |
| list_id | Yes | Numeric list ID. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so the safety profile is fully covered elsewhere. The description adds no behavioral context beyond those hints: no pagination behavior, no visibility/permission notes, no indication of what happens for an empty or invalid list. With an output schema present, return-shape explanation is not required, but the description still contributes essentially nothing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler or redundancy. It is efficient, though arguably too terse to be maximally useful given the missing usage guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple (2 params, 1 required), the schema is fully described, annotations cover the safety profile, and an output schema exists, so the description need not explain returns. It is still minimally adequate only: an agent gets no guidance on when this is the right tool versus its list_accounts_* siblings.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters (limit, list_id) are already documented in the schema; the baseline is 3. The description adds no meaning beyond the schema, such as the format or origin of list_id.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Get) and resource (accounts in a specific list), which is unambiguous on its own. It does not, however, distinguish itself from siblings that also touch list membership, such as list_accounts_add and list_accounts_delete, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no when-to-use guidance, no prerequisites (e.g. that the list must exist or belong to the caller), and names no alternative tool. The agent must infer from the name alone that this is the read counterpart to list_accounts_add/list_accounts_delete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_accounts_addList Accounts AddBIdempotent
Add accounts to a list.
| Name | Required | Description | Default |
|---|---|---|---|
| list_id | Yes | Numeric list ID. | |
| account_ids | Yes | List of numeric account IDs to add. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true, destructiveHint=false, and openWorldHint=true, so the safety and idempotency profile is covered. The description adds nothing beyond the basic action; it does not explain effects like duplicate handling (implied by idempotentHint) or response behavior, which would add value.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence that is front-loaded and wastes no words. Perfectly concise for a simple tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple parameters, full schema coverage, annotations, and existing output schema, the description is adequate for correct invocation. It could mention idempotency or duplicate handling, but the annotations cover the essential behavioral traits.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so parameters are fully documented in the schema. The description adds no extra meaning beyond what the schema provides; baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (add) and resources (accounts to a list), which is clear enough to distinguish from siblings like list_accounts_delete. However, it doesn't differentiate from list_accounts (the read counterpart) as explicitly as it could.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this instead of list_accounts_delete or how it relates to list_accounts. The tool is implied to be for modifying list membership, but no exclusions or alternatives are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_accounts_deleteList Accounts DeleteCDestructiveIdempotent
Remove accounts from a list.
| Name | Required | Description | Default |
|---|---|---|---|
| list_id | Yes | Numeric list ID. | |
| account_ids | Yes | List of numeric account IDs to remove. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, and readOnlyHint=false, covering the safety profile. The description adds nothing beyond those annotations - no note on permissions/ownership required, reversibility, or error behavior when an account isn't in the list - so it earns little extra credit.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single efficient sentence with the verb front-loaded and no wasted words. It is appropriately sized, though it is arguably too terse to carry its share of the semantic load.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Annotations cover the destructive/idempotent profile, the output schema covers return values, and the schema fully documents both params. The description is adequate given that structured coverage, but adds no routing or edge-case context for a mutation on a sibling-rich list API.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%: both list_id and account_ids are documented, including that account_ids accepts an array of numeric IDs. The description neither repeats nor extends this, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (remove) and resource (accounts from a list), which is clear enough to distinguish from the sibling list_accounts_add by contrast. However it does not name that alternative or otherwise anchor itself within the list_* family explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance, no prerequisites, and no mention of list_accounts_add as the inverse operation. The agent must infer that this is the removal counterpart to list_accounts_add from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_createList CreateC
Create a new list.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | Title of the list. | |
| replies_policy | No | 'followed', 'list', or 'none' (default 'list'). | list |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a non-read-only, non-destructive, non-idempotent, open-world mutation. The description adds nothing beyond that: no auth/permission requirements, no statement about what replies_policy controls, and no indication of what happens on creation. For a write tool it carries little extra context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with zero filler. It is efficient, though its brevity borders on under-specification rather than deliberate conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, but for a mutation tool with minimal annotations the description leaves key gaps: what kind of list this is, whether it requires authentication, and why/when to set replies_policy. The definition is too thin for the operation's context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already documented in the schema, which sets the baseline at 3. The description adds no meaning beyond the schema for title or replies_policy.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ("Create a new list"), making the operation unambiguous. However, it offers no differentiation from siblings like lists_get or list_delete, and does not clarify the domain meaning of "list" (a curated account list), so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool, no prerequisites, and no mention of alternatives (e.g. list_accounts_add for populating an existing list). The agent must infer usage entirely from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_deleteList DeleteCDestructiveIdempotent
Delete a list.
| Name | Required | Description | Default |
|---|---|---|---|
| list_id | Yes | Numeric list ID. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (destructiveHint=true, idempotentHint=true, readOnlyHint=false), so the description need not restate them. It nonetheless adds nothing beyond them, omitting whether deletion cascades to list members, whether it is reversible, or auth requirements, which matters for an openWorld destructive operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One short sentence, front-loaded and free of padding. It is terse but not wasteful; the problem is under-specification rather than excess.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need no explanation, but for a destructive, open-world mutation the description should convey effects like membership cascade or irreversibility. With one parameter and full schema coverage the bar is met on the structural side, yet the behavioral context for a delete is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single list_id parameter is documented in the schema, so baseline 3 applies. The description adds no format or type guidance beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Delete) and resource (list), which is clear enough. However, it offers no differentiation from siblings like list_accounts_delete or lists_get, leaving the agent to infer that this deletes the whole list container rather than members.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use, prerequisites, or alternatives mentioned. The nearby sibling list_accounts_delete performs a different deletion, yet the description does nothing to distinguish the two, so an agent gets no routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lists_getLists GetBRead-onlyIdempotent
Get all lists created by the authenticated account.
Returns: str: JSON list of list objects with id and title.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=true, so the safety profile is fully covered. The description adds the ownership scoping (only the authenticated account's lists) and the returned fields, which is modest added context beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One front-loaded sentence states the purpose immediately. The trailing 'Returns:' block is somewhat redundant given an output schema already exists, but it is short and not harmful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a trivial zero-parameter read tool with full annotations and an output schema, the description is adequate. The return-value portion is redundant since the output schema covers it, leaving only minor room for improvement in distinguishing siblings.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With zero parameters and 100% schema description coverage, there is nothing for the description to disambiguate. Baseline 4 applies since no parameter semantics are needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Get) and resource (lists) with clear ownership scope: 'created by the authenticated account.' This distinguishes it from sibling list_accounts (accounts within a list), though it does not explicitly name that sibling to route the agent.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description only states what the tool does; it gives no when-to-use guidance, no prerequisites (e.g. authentication requirement is only implied by 'authenticated account'), and never mentions list_accounts or list_create as alternatives. An agent must infer context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
media_postMedia PostC
Upload a media file (image, video, audio) to Mastodon.
| Name | Required | Description | Default |
|---|---|---|---|
| file_path | Yes | Absolute path to the media file to upload. | |
| description | No | Alt text / accessibility description for the media. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a non-read-only, non-idempotent, non-destructive open-world write, so the safety profile is covered. The description adds only the accepted file types and nothing else — no note that it returns a media identifier for later attachment, no size/rate limits, no handling of duplicate uploads.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler or redundancy. It is efficient, though the brevity that helps here is exactly what leaves usage and behavioral gaps elsewhere.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value explanation is not required. However, for an upload tool in a large Mastodon toolset, the description omits how the result connects to status_post and gives no constraints on file size or format, making it only minimally complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already documented with clear descriptions for file_path and alt text. The description's mention of image/video/audio adds a small amount of type context but nothing beyond the schema baseline, so 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb (upload), resource (media file), accepted types (image, video, audio), and destination (Mastodon). It is unambiguous versus list/read siblings, though it does not relate itself to status_post, which is the natural consumer of an uploaded media ID.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no exclusions, and no mention of an alternative. An agent is not told that this is typically a prerequisite step before attaching media to a status, leaving the workflow to inference from sibling names alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mutesMutesBRead-onlyIdempotent
Get accounts muted by the authenticated account.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results (default 40). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=true, so the safety and idempotency profile is covered. The description adds only the scope constraint ('by the authenticated account'), not pagination or ordering behavior, so with annotations carrying the load a 3 is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single short sentence with zero padding, front-loaded and directly to the point.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation. Annotations cover the safety profile. The remaining gap is that the description doesn't mention pagination or how to interpret results, which is minor but leaves the definition minimally complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with the 'limit' parameter's purpose and default fully documented in the schema. The description adds no additional parameter meaning, which is baseline-appropriate when the schema does the work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: retrieve accounts muted by the authenticated account. Clear and unambiguous, though it doesn't distinguish itself explicitly from siblings like account_relationships or blocks, which serve analogous list purposes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance or alternatives named. An agent must infer that this is the muted-accounts counterpart to the 'blocks' sibling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
notification_dismissNotification DismissCDestructiveIdempotent
Dismiss (clear) a single notification.
| Name | Required | Description | Default |
|---|---|---|---|
| notification_id | Yes | Numeric notification ID. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, and openWorldHint=true, so the safety profile is partly covered. However, the description adds nothing about what dismissal does to the underlying data (permanent removal vs. hiding), whether it requires auth, or any rate limits. It largely restsates the name.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler. The parenthetical '(clear)' is the only addition and it aids comprehension without excess.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be explained. But for a destructive, idempotent mutation with an openWorld hint, the description should clarify scope relative to notifications_clear and any auth requirements. The one-liner is inadequate for a destructive operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema fully documents notification_id as a numeric string. The description adds no syntax, format, or constraint details beyond what the schema provides, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (dismiss/clear) and resource (a single notification), and the parenthetical clarifies intent. It implicitly distinguishes from the sibling notifications_clear, which likely clears all, but does not name that distinction explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use or when-not-to-use guidance. The description does not mention the sibling notifications_clear, which is the obvious alternative for bulk clearing, leaving the agent to infer the single-vs-bulk distinction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
notifications_clearNotifications ClearADestructiveIdempotent
Dismiss all notifications for the authenticated account.
Returns: str: JSON confirmation.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true and openWorldHint=true, so the safety profile is covered. The description adds the auth scoping ('authenticated account') but does not disclose whether the dismissal is permanent, reversible, or affects server-side data beyond the local client, leaving the destructive consequence unelaborated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and scope in one efficient sentence. The trailing 'Returns: str: JSON confirmation' is mildly redundant given an output schema exists, but it costs little.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter tool with full annotation coverage and an output schema, the description is essentially sufficient. The only missing piece is the relationship to notification_dismiss and notifications_get, which an agent would benefit from knowing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4; there is nothing for the description to clarify and it correctly adds no parameter noise. No syntax or filtering options exist to document.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Dismiss) and resource (all notifications) scoped to the authenticated account, which is more precise than the bare name. However, it never names or contrasts with the sibling notification_dismiss, so the agent must infer that this is the bulk form versus the single-item form.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The word 'all' implicitly signals bulk clearing in contrast to the singular sibling notification_dismiss, but there is no explicit when-to-use guidance, no prerequisites, and no stated exclusion (e.g., that this cannot be undone or cannot be filtered). Usage is only inferable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
notifications_getNotifications GetCRead-onlyIdempotent
Get notifications for the authenticated account.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of notifications (default 20, max 30). | |
| exclude_types | No | Types to exclude: 'follow', 'favourite', 'reblog', 'mention', 'poll', 'follow_request', 'update', 'status'. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is fully covered elsewhere. The description adds nothing beyond that — no mention of pagination, ordering, or whether results are consumed/cleared after reading, which is the key behavioral question for a notifications endpoint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler or redundancy. It is appropriately compact, though its brevity borders on under-specification rather than true economy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With rich annotations, a complete input schema, and an output schema present, the description needn't explain return values. For a simple two-parameter read tool this is minimally adequate, but the absence of any note about pagination limits or the relationship to notification_dismiss leaves a small gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%; both limit (with default/max) and exclude_types (with the full enum of types) are fully documented in the schema, so the description need not repeat them. Baseline 3 applies since the description adds no extra parameter meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a clear verb (Get) and resource (notifications) scoped to the authenticated account, which is unambiguous on its own. It does not, however, distinguish itself from siblings like notification_dismiss or notifications_clear, though the verb difference makes the distinction reasonably inferable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no guidance on when to call this versus notification_dismiss or notifications_clear, nor any prerequisites such as authentication requirements. Usage must be inferred entirely from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
poll_votePoll VoteC
Vote in a poll.
| Name | Required | Description | Default |
|---|---|---|---|
| choices | Yes | List of choice indices (0-based) to vote for. | |
| poll_id | Yes | Numeric poll ID. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=false, and openWorldHint=true, so the write/non-idempotent profile is covered structurally. The description adds nothing beyond that: it does not say whether voting again replaces a prior vote, whether multiple choices are allowed for a single-choice poll, what errors appear if the poll is closed, or that an auth context is required. For a mutation tool whose non-idempotency is the key operational fact, this is a real gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single short sentence with no filler and the action front-loaded. It is efficient, though its brevity reflects under-specification rather than disciplined editing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described. However, for a non-idempotent mutation tool the description leaves open how repeated votes behave, whether partial ballots are valid, and what state the target poll must be in — all facts an agent needs before invoking it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% — both poll_id ("Numeric poll ID") and choices ("List of choice indices (0-based)") are documented in the schema itself. The description adds no syntax or constraint detail beyond this, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
"Vote in a poll" restates the tool name (poll_vote) almost verbatim, giving no information the agent doesn't already have from the identifier. It does name a resource and an action, but adds nothing about scope, poll types, or what a vote does to the poll state, so it reads as a tautology rather than a differentiated purpose statement.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use, when-not-to-use, or prerequisite guidance whatsoever. Nothing tells the agent whether the poll must be open, whether the account must follow its author, or whether an existing vote should be changed with this tool or a different one.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
searchSearchCRead-onlyIdempotent
Search Mastodon for accounts, statuses, and hashtags.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum results per category (default 20). | |
| query | Yes | Search string. | |
| resolve | No | Resolve non-local accounts/statuses (default False). | |
| search_type | No | Restrict to 'accounts', 'statuses', or 'hashtags'. None returns all types. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, openWorldHint=true, and destructiveHint=false, so the safety profile is covered. The description adds nothing further — no note on instance-wide scope, auth requirements, rate limits, or how public/remote results are handled — leaving no value beyond structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single efficient sentence with no waste, front-loading the verb and scope. It is appropriately sized, though minimal content means it is concise almost by omission.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and the annotations cover the safety profile. Still, given the overlapping account_search sibling and four parameters, the description is too thin to fully orient an agent on when this tool is the right choice.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all four parameters (query, limit, resolve, search_type) are documented in the schema itself. The description adds no additional parameter meaning, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Search) and resource (Mastodon) along with the result categories (accounts, statuses, hashtags). However, it does not distinguish itself from the sibling account_search, which overlaps on account results, so an agent cannot tell them apart from the description alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternatives; it never mentions the account_search sibling that overlaps its scope. No exclusions, prerequisites, or context are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
status_bookmarkStatus BookmarkCIdempotent
Bookmark a status.
| Name | Required | Description | Default |
|---|---|---|---|
| status_id | Yes | Numeric status ID. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover idempotency, read-only, and destructive hints, so the safety profile is known. But the description adds nothing beyond the name—no mention of auth requirements, whether the status must exist, or what happens on repeat calls. With annotations, a 2 reflects minimal added value.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Extremely concise—one short sentence—but arguably under-specified for a tool with annotations and output schema. It is front-loaded but lacks any supporting detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has an output schema and annotations, the description needn't explain return values, but it should at least mention usage context or behavioral expectations. It does neither, leaving significant gaps for an agent to infer.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the parameter is fully documented as 'Numeric status ID.' The description adds no further parameter semantics beyond the schema baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Bookmark) and resource (a status), clearly distinguishable from sibling status_unbookmark and status_favourite. However, it's terse and doesn't clarify what bookmarking entails versus other interactions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No indication of when to use this tool versus alternatives like status_favourite or status_reblog, nor any prerequisites or context for bookmarking.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
status_contextStatus ContextBRead-onlyIdempotent
Get ancestors and descendants of a status (thread context).
| Name | Required | Description | Default |
|---|---|---|---|
| status_id | Yes | Numeric status ID. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so the safety profile is fully covered. The description adds the useful behavioral fact that the result spans both ancestors and descendants (a thread, not just one direction), but discloses nothing about pagination, depth limits, or handling of deleted parent posts.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with the key scope ('ancestors and descendants') stated first and a compact clarifying parenthetical. Nothing is wasted and nothing needs to be skimmed past.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value explanation is unnecessary, and rich annotations cover the safety profile; the description plus those structured fields give an agent enough to call this correctly. The only meaningful gap is the absence of routing guidance versus status_get and other thread-adjacent status tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% ('Numeric status ID.'), so the parameter is fully documented in structured data. The description restates only that a status is involved and adds no format, validation, or ID-sourcing detail beyond the schema, making the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Get') and resource ('ancestors and descendants of a status') and clarifies scope with '(thread context)', which distinguishes it from a plain status fetch like status_get. However, it never names status_get or any sibling explicitly, so differentiation is inferential rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no exclusion of related tools such as status_get, and no statement of prerequisites. The parenthetical '(thread context)' only hints at the scenario; an agent must infer that this is the tool for reconstructing a reply thread.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
status_deleteStatus DeleteBDestructiveIdempotent
Delete a status posted by the authenticated account.
| Name | Required | Description | Default |
|---|---|---|---|
| status_id | Yes | Numeric ID of the status to delete. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, and openWorldHint=true, so the safety profile is covered by structured data. The description adds the ownership restriction, but does not say whether deletion is permanent/irreversible or what error occurs when the status isn't the caller's. A modest addition over annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One short sentence with no filler, front-loading the verb and resource. It is appropriately sized, though it stops short of using the remaining space for usage or behavioral detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter destructive tool with full annotations and an output schema, the description covers the essentials (what it does, whose status). It omits error/permission behavior and sibling disambiguation, but does not leave an agent unable to call the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with a single documented parameter (status_id, described as the numeric ID), so the schema already carries the full parameter burden. The description adds nothing parameter-specific, which is the expected baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource ('Delete a status') and adds a meaningful scope constraint ('posted by the authenticated account'), which separates it from write siblings like status_post or status_reblog. It does not explicitly differentiate against the other destructive siblings (status_unfavourite, status_unbookmark), but the purpose is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The ownership constraint ('posted by the authenticated account') implicitly tells the agent when this tool is applicable, but there is no explicit when/when-not guidance, no mention of alternatives, and no statement of what happens if the status is not owned by the account. Usage is inferable rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
status_favouriteStatus FavouriteAIdempotent
Favourite (like) a status.
| Name | Required | Description | Default |
|---|---|---|---|
| status_id | Yes | Numeric status ID. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false, idempotentHint=true, destructiveHint=false, openWorldHint=true, so the safety profile is covered structurally. Description adds the parenthetical synonym '(like)' but no new behavioral context about idempotency effect, errors (already-favourited), or auth. Credit limited as annotations carry most of the burden.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single four-word sentence, front-loaded and free of noise. Ideal size for a simple action.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values needn't be explained, and annotations cover the safety profile. For a one-param mutation, the description is minimally sufficient. It could note the sibling status_unfavourite or idempotent behavior, but nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%: status_id is documented as 'Numeric status ID.' The description adds nothing beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: 'Favourite (like) a status.' Clear what it does and distinguishes the action from siblings like status_unfavourite and status_reblog via the parenthetical synonym. It does not, however, name or differentiate against the closely related status_reblog (also a write interaction) beyond action name.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied: this is the counterpart of status_unfavourite which is a sibling. No explicit when-to-use/when-not or prerequisites. Adequate minimum viability for a simple toggle action.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
status_favourited_byStatus Favourited ByCRead-onlyIdempotent
Get accounts that favourited a status.
| Name | Required | Description | Default |
|---|---|---|---|
| status_id | Yes | Numeric status ID. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, covering the safety profile. The description adds no behavioral context beyond that — no pagination, no rate-limit, no visibility/permission notes for a lookup that depends on the authenticated account.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single clean, front-loaded sentence with zero filler. It is efficient, though arguably under-specified rather than optimally concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be explained, and annotations cover safety. Still, for a read tool whose output set may be paginated and that duplicates a sibling, the description leaves gaps an agent would want filled.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% (status_id is documented as 'Numeric status ID.'), so the description does not need to carry parameter meaning. Baseline 3 applies; the description adds nothing over the schema here.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource+filter: 'Get accounts that favourited a status.' An agent can understand exactly what it returns. However, it does not distinguish itself from the near-identical sibling status_reblogged_by, which would be confusing on a pure text basis.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no prerequisite (e.g., the status must exist / be visible), and no mention of the obvious alternative status_reblogged_by. Usage is only implied by the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
status_getStatus GetBRead-onlyIdempotent
Get a single status by ID.
| Name | Required | Description | Default |
|---|---|---|---|
| status_id | Yes | Numeric status ID. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, open-world. The description adds little beyond confirming a single-record read; no return shape or error behavior noted, but output schema exists so return values needn't be explained.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One short sentence, front-loaded with the verb and resource. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read tool with full schema coverage, output schema, and rich annotations, the description is minimally adequate. It lacks routing guidance to sibling tools like status_context, which an agent may need to choose correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single parameter status_id is fully documented in the schema. The description adds no syntax or format detail beyond what the schema provides, matching the baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clear verb 'Get' and resource 'status' scoped to a single entity by ID. Distinguishes from siblings like status_context or timeline_* by specifying a single-record fetch, though it doesn't explicitly name an alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this versus status_context, timeline tools, or account_statuses. The description implies fetching a known ID but offers no conditions or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
status_postStatus PostC
Post a new status (toot).
| Name | Required | Description | Default |
|---|---|---|---|
| status | No | Text content of the status (preferred argument name). | |
| content | No | Backward-compatible alias for status text. | |
| language | No | ISO 639-1 language code (e.g. 'en', 'cs'). If omitted, the language is auto-detected from 'status'/'content'. | |
| media_ids | No | List of media attachment IDs to attach. | |
| sensitive | No | Mark media as sensitive (default False). | |
| visibility | No | 'public', 'unlisted', 'private', or 'direct' (default 'public'). | public |
| spoiler_text | No | Content warning / spoiler text shown before the status. | |
| in_reply_to_id | No | Numeric ID of the status to reply to. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=false, openWorldHint=true and destructiveHint=false, so the safety profile is covered. The description adds nothing beyond that – no mention that posting is public by default, that it is non-idempotent (duplicate posts), or that it publishes to the open network. No value added over structured data.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence with zero waste. It is appropriately sized, though the extreme brevity borders on under-specification rather than true conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter publish/mutation tool, the description is too thin. With no output schema explanation needed, an agent still lacks confirmation about the default public visibility, the alias relationship between status and content, or the reply/thread behavior implied by in_reply_to_id.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter (status/content aliases, language, media_ids, sensitive, visibility, spoiler_text, in_reply_to_id) is fully documented in the schema. The description adds no parameter meaning, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Post a new status') and the parenthetical '(toot)' clarifies the Mastodon domain term. An agent can distinguish it from read-oriented siblings like status_get or status_context, though it never explicitly names which sibling to use for a reply or boost.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this versus alternatives such as status_reblog or status_favourite, nor any prerequisites. The agent must infer usage entirely from the tool name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
status_reblogStatus ReblogBIdempotent
Reblog (boost) a status.
| Name | Required | Description | Default |
|---|---|---|---|
| status_id | Yes | Numeric status ID. | |
| visibility | No | Visibility of the reblog: 'public', 'unlisted', or 'private'. | public |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true, destructiveHint=false, and openWorldHint=true, covering the safety and idempotency profile. The description adds no behavioral context beyond the action name, such as authentication needs, rate limits, or side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no wasted words. It communicates the operation efficiently and is appropriately sized for a simple action tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the low complexity, rich annotations, complete schema descriptions, and an output schema, the description is nearly complete for invoking the tool. It states the operation clearly, though it could mention idempotency or undo behavior, which are either in annotations or handled by a sibling tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters (status_id, visibility) are fully documented in the schema. The description adds no parameter meaning beyond what the schema already provides, which is the baseline for high-coverage schemas.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource ('Reblog (boost) a status'), making the core action clear. It does not explicitly distinguish itself from the inverse sibling 'status_unreblog' or other status actions, but the action name is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no when-to-use, when-not-to-use, or alternative guidance. It only restates the operation without indicating context, preconditions, or how it relates to siblings like status_unreblog or status_favourite.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
status_reblogged_byStatus Reblogged ByARead-onlyIdempotent
Get accounts that reblogged a status.
| Name | Required | Description | Default |
|---|---|---|---|
| status_id | Yes | Numeric status ID. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=true, openWorldHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds no behavioral context beyond those annotations—such as pagination behavior or authentication needs—but it does not contradict them. A baseline 3 is appropriate for a simple read tool with complete annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence with no wasted words. For a simple lookup tool, this is appropriately sized and direct.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the low complexity, complete schema description, rich annotations, and presence of an output schema, the one-sentence description is largely sufficient. The only minor gap is the absence of explicit usage guidance versus sibling tools, which keeps it from a 5.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the single status_id parameter is already documented as a numeric status ID. The description adds no additional parameter meaning or format details beyond the schema, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a clear verb and resource: 'Get accounts that reblogged a status.' This distinguishes it from the related action tools like status_reblog and the analogous status_favourited_by by specifying the reblog relationship. It stops short of explicitly naming alternative siblings, so it is strong but not fully differentiated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implicitly clear: call this when you need the accounts that reblogged a given status. However, there is no explicit when-to-use guidance, no exclusions, and no comparison to alternatives such as status_favourited_by or the reblog/unreblog actions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
status_unbookmarkStatus UnbookmarkBIdempotent
Remove a bookmark from a status.
| Name | Required | Description | Default |
|---|---|---|---|
| status_id | Yes | Numeric status ID. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the full behavioral profile: readOnlyHint=false (a mutation), idempotentHint=true, destructiveHint=false, openWorldHint=true. The description repeats the mutating action but adds nothing beyond the annotations — e.g., no note that deleting a non-existent bookmark is a no-op, despite the idempotency hint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence with zero filler, front-loaded with the action. It is appropriately sized for a simple single-parameter operation, though it is at the sparse end of usable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter mutation with a full output schema and annotations covering safety and idempotency, the description is nearly sufficient. The main gap is the absence of any reference to the inverse status_bookmark tool or error/no-op behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the single status_id parameter, so the schema fully documents the argument. The description adds no format or semantic detail beyond what the schema already provides, which is the expected baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Remove a bookmark from a status.' This clearly identifies the action and the object. However, it makes no attempt to distinguish itself from the obvious inverse sibling status_bookmark, so an agent gets the action but no routing signal.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no mention of the inverse status_bookmark tool, and no note on preconditions (e.g., whether the status must currently be bookmarked). The agent is left to infer usage entirely from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
status_unfavouriteStatus UnfavouriteCIdempotent
Remove a favourite from a status.
| Name | Required | Description | Default |
|---|---|---|---|
| status_id | Yes | Numeric status ID. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare idempotentHint=true, destructiveHint=false, and openWorldHint=true, so the safety and repeat-safety profile is fully covered by structured data. The description adds essentially nothing on top, offering no auth requirements, no behavior when the status is not already favourited, and no outcome semantics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One short, front-loaded sentence with zero filler, appropriate for a simple toggle. It is efficient but borders on under-specified given the surrounding tool set.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described, and the annotations carry the safety profile. The description is nonetheless terse for a mutation tool, leaving error/precondition behavior unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter is fully documented in the schema ('Numeric status ID', 100% coverage), so the baseline is 3. The description adds no syntax, format, or edge-case detail beyond what the schema already conveys.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (remove) and resource (a favourite from a status), which is unambiguous and pairs naturally with the inverse sibling status_favourite. It does not explicitly name or differentiate itself from the sibling, which holds it below a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no when-to-use context, no prerequisites, and never references the counterpart status_favourite or the related status_bookmark/status_unbookmark tools. An agent must infer the whole usage scenario from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
status_unreblogStatus UnreblogBIdempotent
Remove a reblog (unboost) of a status.
| Name | Required | Description | Default |
|---|---|---|---|
| status_id | Yes | Numeric status ID. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (idempotentHint=true, destructiveHint=false, readOnlyHint=false, openWorldHint=true), so the agent knows this is a safe, idempotent write. The description adds no additional behavioral context, but with annotations this does not need to repeat or contradict them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, clear sentence with no waste. It's appropriately sized and front-loaded, though extremely minimal.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description needn't explain return values. Annotations already cover safety. The definition is adequate but on the thin side: it doesn't clarify whether the status_id refers to the original post or the reblog, nor does it mention prerequisites like being the author of the reblog.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%; the only parameter, status_id, is documented as 'Numeric status ID.' The description adds no parameter semantics beyond what the schema already provides. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: 'Remove a reblog of a status.' It distinguishes itself from the sibling tool status_reblog by being the inverse operation. It's clear enough, though it could clarify what 'boost' means in context.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies this is the inverse of status_reblog, which an agent can infer from sibling names, but it doesn't explicitly say when or when not to use it. No exclusions, no guidance on error conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
timeline_hashtagTimeline HashtagCRead-onlyIdempotent
Get statuses with a specific hashtag.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of statuses (default 20, max 40). | |
| local | No | Only show statuses from the local instance (default False). | |
| hashtag | Yes | Hashtag to search (without the # prefix). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, open-world behavior, so the safety profile is fully covered. The description adds nothing beyond that – no pagination behavior, no note on rate limits, no return-shape hints – it essentially restates the name.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no wasted words. It is efficient, though its brevity edges toward under-specification rather than true conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and annotations cover safety. Still, for a timeline query tool with pagination-relevant parameters (limit), the absence of any usage or paging context leaves it only minimally complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, including the 'without the # prefix' guidance, limit max of 40, and local-instance toggle, so baseline is 3. The description contributes no additional parameter meaning beyond what the schema already documents.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get statuses') plus the scoping qualifier ('with a specific hashtag'), which separates it from timeline_home/local/public. It doesn't explicitly name those siblings, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance and no mention of alternatives such as search, trending_tags, or the other timeline_* tools. The agent must infer the selection context from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
timeline_homeTimeline HomeBRead-onlyIdempotent
Get the authenticated user's home timeline.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of statuses (default 20, max 40). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true, and openWorldHint=true, so the safety profile is fully covered by structured data. The phrase "authenticated user's" lightly implies an auth requirement, but the description adds no rate-limit, pagination, or result-ordering context beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence with zero padding, and the core action is front-loaded. It is appropriately sized for a one-parameter read tool, though it is arguably too terse to route among the sibling timeline tools.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and 100% schema coverage plus full annotations, the mechanical calling information is complete. The remaining gap is contextual routing: four sibling timeline tools exist and the description does not say how this one differs, which is the main thing an agent could get wrong here.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the single optional limit parameter is fully documented in the schema (default 20, max 40). The description adds nothing about the parameter, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: getting the home timeline of the authenticated user. That is a clear, distinguishable operation on its face, but it offers no explicit contrast with the closely related siblings timeline_local, timeline_public, and timeline_hashtag, so an agent must infer the home-vs-other distinction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no exclusions, and no mention of the alternative timeline tools. The agent gets no signal about when the home timeline is the right choice versus timeline_local, timeline_public, or timeline_hashtag.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
timeline_localTimeline LocalBRead-onlyIdempotent
Get the local (instance) public timeline.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of statuses (default 20, max 40). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, so the safety profile is fully covered by structured data. The description adds only the local-instance scope and says nothing about pagination, authentication, or return behavior. With annotations doing the heavy lifting, this is adequate but thin.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence with no filler. It directly states the timeline type and instance scope, and every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only timeline endpoint with one fully documented parameter, an output schema, and comprehensive annotations, the description provides the essential scope. It could still mention sibling timelines for routing clarity, but nothing required to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the sole limit parameter is fully documented in the schema with its default of 20 and maximum of 40. The description adds no additional parameter semantics, so the baseline score of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Get the local (instance) public timeline.' The parenthetical clarifies the local-instance scope, which helps separate it from the broader public timeline concept. However, it does not explicitly name or contrast with sibling tools such as timeline_public or timeline_home, so it falls short of the top score.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no when-to-use guidance, no prerequisites, and no alternative timelines to consider. An agent must infer that this is for local instance posts and that timeline_public or timeline_home are the alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
timeline_publicTimeline PublicBRead-onlyIdempotent
Get the federated public timeline.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of statuses (default 20, max 40). | |
| remote | No | Only show remote statuses (default False). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and non-destructive behavior, so safety is covered. The description adds only the content scope ('federated public') and says nothing about pagination, authentication requirements, or rate limits. It adds marginal value beyond the structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler. For a two-parameter read tool, this is appropriately sized and every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The output schema covers return values and annotations cover the safety profile, so the description need not explain those. However, for a paginated federated feed, the description omits any mention of pagination behavior or auth requirements, leaving it just barely adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so limit and remote are already fully documented with defaults and max values. The description adds no parameter information, which is acceptable but unhelpful; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get the ... timeline') and the qualifier 'federated public' distinguishes it from timeline_home, timeline_local, and timeline_hashtag without naming them. The scope is identifiable, though it relies on the reader's understanding of Mastodon-style timelines to differentiate siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance, no prerequisites, and no alternatives named. An agent must infer from the word 'federated' that this is the cross-instance public feed rather than timeline_local. Implied at best, and the calibration for a no-guidance description is 2.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
trending_linksTrending LinksARead-onlyIdempotent
Get trending links (articles) on the instance.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of links (default 10). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, openWorldHint=true, so safety is covered. The description adds that results are scoped to the instance, a useful behavioral detail, but nothing about freshness window, pagination, or ordering.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence with zero waste. Nothing to trim and nothing buried.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists, so return format needn't be explained. Annotations cover safety. The description is sufficient for this simple, single-parameter read tool, though a note on ranking or time window would fully close the loop.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one optional parameter (limit) with 100% schema coverage including its default. The description adds no parameter detail but the schema fully covers it; per rules, zero required params with full coverage warrants a 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clear verb+resource: 'Get trending links (articles) on the instance.' Distinguishes from siblings trending_tags and trending_statuses by specifying 'links (articles)'. Slight overlap with trending_statuses, but the parenthetical clarifies the resource.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Trending' implies a discovery/context use case, but there is no explicit when-to-use or when-not-to-use guidance versus trending_tags or trending_statuses. Implied usage only.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
trending_statusesTrending StatusesBRead-onlyIdempotent
Get trending statuses on the instance.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of statuses (default 20). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is fully covered by structured data. The description's only additional behavioral signal is the instance-local scope (as opposed to federated), which is modest added value but not a rich disclosure of ranking, recency, or pagination behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single short sentence with zero filler and the resource front-loaded. It is efficient, though its brevity comes at the cost of the guidance an agent would need, so it earns conciseness but not a perfect mark.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return-value explanation is not required, and read-only annotations cover the safety profile. Still, for a discovery tool the description never clarifies what "trending" means (ranking window, instance-local vs federated origin) or how it differs from trending_tags/trending_links, leaving a small but real gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the single limit parameter, so the schema already explains the default and meaning. The description adds nothing about the limit or any cap beyond what the schema states, making 3 the correct baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a clear verb and resource ("Get trending statuses") and scopes it to "the instance", so an agent knows it returns a list of statuses rather than tags or links. It does not, however, explicitly distinguish itself from the close siblings trending_tags and trending_links, leaving that differentiation to the tool name alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to use this tool versus the related trending_tags/trending_links tools, nor any prerequisite or context about what makes a status "trending". "On the instance" is a scope hint, not usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
trending_tagsTrending TagsCRead-onlyIdempotent
Get trending hashtags on the instance.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of tags (default 10). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, openWorldHint=true, and destructiveHint=false, covering the safety profile. The description adds no behavioral context beyond that, e.g. how 'trending' is computed, the time window, or whether results are cached.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no wasted words. It is appropriately terse for a simple one-parameter read tool, though the brevity leaves little room for added value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and annotations cover safety. However, for a trend-discovery tool the description omits what 'trending' means here (time window, instance scope vs federated), which an agent would need to use results sensibly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description gives no parameter detail, but schema description coverage is 100% and the single 'limit' parameter is fully documented in the schema with a default. Baseline 3 applies when the schema carries the parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Get) and resource (trending hashtags) scoped to the instance, so an agent knows the operation. It does not explicitly distinguish itself from sibling tools like trending_statuses or trending_links, though the noun 'hashtags' is relatively self-differentiating.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no prerequisites, and no mention of the closely related trending_statuses/trending_links siblings. The agent must infer when trending hashtags are appropriate versus other trend endpoints.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
54 tool updates
v1.0.5- Changed
account_block2 fields changed- added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Changed
account_follow2 fields changed- added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Changed
account_followers3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / limit / defaultAdded value: +40 - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Changed
account_following3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / limit / defaultAdded value: +40 - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Changed
account_get2 fields changed- added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Changed
account_mute2 fields changed- added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Changed
account_relationships2 fields changed- added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Changed
account_search4 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / limit / defaultAdded value: +10 - added
Input schema / properties / resolve / defaultAdded value: +false - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Changed
account_statuses6 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / exclude_reblogs / defaultAdded value: +false - added
Input schema / properties / exclude_replies / defaultAdded value: +false - added
Input schema / properties / limit / defaultAdded value: +20 - added
Input schema / properties / only_media / defaultAdded value: +false - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Changed
account_unblock2 fields changed- added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Changed
account_unfollow2 fields changed- added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Changed
account_unmute2 fields changed- added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Changed
account_update14 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / bot / anyOfAdded value: +[ + { + "type": "boolean" + }, + { + "type": "null" + } +] - added
Input schema / properties / bot / defaultAdded value: +null - removed
Input schema / properties / bot / typeRemoved value: -"boolean" - added
Input schema / properties / display_name / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / display_name / defaultAdded value: +null - removed
Input schema / properties / display_name / typeRemoved value: -"string" - added
Input schema / properties / locked / anyOfAdded value: +[ + { + "type": "boolean" + }, + { + "type": "null" + } +] - added
Input schema / properties / locked / defaultAdded value: +null - removed
Input schema / properties / locked / typeRemoved value: -"boolean" - added
Input schema / properties / note / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / note / defaultAdded value: +null - removed
Input schema / properties / note / typeRemoved value: -"string" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Changed
account_verify2 fields changed- added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Changed
blocks3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / limit / defaultAdded value: +40 - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Changed
bookmarks3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / limit / defaultAdded value: +20 - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Changed
directory5 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / limit / defaultAdded value: +20 - added
Input schema / properties / local / defaultAdded value: +false - added
Input schema / properties / order / defaultAdded value: +"active" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Changed
favourites3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / limit / defaultAdded value: +20 - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Changed
follow_request_authorize2 fields changed- added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Changed
follow_request_reject2 fields changed- added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Changed
follow_requests3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / limit / defaultAdded value: +40 - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Changed
instance_info2 fields changed- added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Changed
list_accounts3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / limit / defaultAdded value: +40 - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Changed
list_accounts_add2 fields changed- added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Changed
list_accounts_delete2 fields changed- added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Changed
list_create3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / replies_policy / defaultAdded value: +"list" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Changed
list_delete2 fields changed- added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Changed
lists_get2 fields changed- added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Changed
media_post5 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / description / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / description / defaultAdded value: +null - removed
Input schema / properties / description / typeRemoved value: -"string" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Changed
mutes3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / limit / defaultAdded value: +40 - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Changed
notification_dismiss2 fields changed- added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Changed
notifications_clear2 fields changed- added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Changed
notifications_get8 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / exclude_types / anyOfAdded value: +[ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } +] - added
Input schema / properties / exclude_types / defaultAdded value: +null - changed
Input schema / properties / exclude_types / descriptionPrevious value: -"Types to exclude: 'follow', 'favourite', 'reblog',"New value: +"Types to exclude: 'follow', 'favourite', 'reblog',\n 'mention', 'poll', 'follow_request', 'update', 'status'." - removed
Input schema / properties / exclude_types / itemsRemoved value: -{ - "type": "string" -} - removed
Input schema / properties / exclude_types / typeRemoved value: -"array" - added
Input schema / properties / limit / defaultAdded value: +20 - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Changed
poll_vote2 fields changed- added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Changed
search8 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / limit / defaultAdded value: +20 - added
Input schema / properties / resolve / defaultAdded value: +false - added
Input schema / properties / search_type / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / search_type / defaultAdded value: +null - changed
Input schema / properties / search_type / descriptionPrevious value: -"Restrict to 'accounts', 'statuses', or 'hashtags'."New value: +"Restrict to 'accounts', 'statuses', or 'hashtags'.\n None returns all types." - removed
Input schema / properties / search_type / typeRemoved value: -"string" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Changed
status_bookmark2 fields changed- added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Changed
status_context2 fields changed- added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Changed
status_delete2 fields changed- added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Changed
status_favourite2 fields changed- added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Changed
status_favourited_by2 fields changed- added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Changed
status_get2 fields changed- added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Changed
status_post24 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / content / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / content / defaultAdded value: +null - changed
Input schema / properties / content / descriptionPrevious value: -"Text content of the status. Supports HTML or plain text."New value: +"Backward-compatible alias for status text." - removed
Input schema / properties / content / typeRemoved value: -"string" - added
Input schema / properties / in_reply_to_id / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / in_reply_to_id / defaultAdded value: +null - removed
Input schema / properties / in_reply_to_id / typeRemoved value: -"string" - added
Input schema / properties / language / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / language / defaultAdded value: +null - changed
Input schema / properties / language / descriptionPrevious value: -"ISO 639-1 language code (e.g. 'en', 'cs')."New value: +"ISO 639-1 language code (e.g. 'en', 'cs'). If omitted, the\nlanguage is auto-detected from 'status'/'content'." - removed
Input schema / properties / language / typeRemoved value: -"string" - added
Input schema / properties / media_ids / anyOfAdded value: +[ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } +] - added
Input schema / properties / media_ids / defaultAdded value: +null - removed
Input schema / properties / media_ids / itemsRemoved value: -{ - "type": "string" -} - removed
Input schema / properties / media_ids / typeRemoved value: -"array" - added
Input schema / properties / sensitive / defaultAdded value: +false - added
Input schema / properties / spoiler_text / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / spoiler_text / defaultAdded value: +null - removed
Input schema / properties / spoiler_text / typeRemoved value: -"string" - added
Input schema / properties / statusAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Text content of the status (preferred argument name)." +} - added
Input schema / properties / visibility / defaultAdded value: +"public" - removed
Input schema / requiredRemoved value: -[ - "content" -] - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Changed
status_reblog3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / visibility / defaultAdded value: +"public" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Changed
status_reblogged_by2 fields changed- added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Changed
status_unbookmark2 fields changed- added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Changed
status_unfavourite2 fields changed- added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Changed
status_unreblog2 fields changed- added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Changed
timeline_hashtag4 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / limit / defaultAdded value: +20 - added
Input schema / properties / local / defaultAdded value: +false - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Changed
timeline_home3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / limit / defaultAdded value: +20 - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Changed
timeline_local3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / limit / defaultAdded value: +20 - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Changed
timeline_public4 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / limit / defaultAdded value: +20 - added
Input schema / properties / remote / defaultAdded value: +false - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Changed
trending_links3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / limit / defaultAdded value: +10 - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Changed
trending_statuses3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / limit / defaultAdded value: +20 - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Changed
trending_tags3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / limit / defaultAdded value: +10 - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
54 tool updates
v1.0.1- First observed
account_block - First observed
account_follow - First observed
account_followers - First observed
account_following - First observed
account_get - First observed
account_mute - First observed
account_relationships - First observed
account_search - First observed
account_statuses - First observed
account_unblock - First observed
account_unfollow - First observed
account_unmute - First observed
account_update - First observed
account_verify - First observed
blocks - First observed
bookmarks - First observed
directory - First observed
favourites - First observed
follow_request_authorize - First observed
follow_request_reject - First observed
follow_requests - First observed
instance_info - First observed
list_accounts - First observed
list_accounts_add - First observed
list_accounts_delete - First observed
list_create - First observed
list_delete - First observed
lists_get - First observed
media_post - First observed
mutes - First observed
notification_dismiss - First observed
notifications_clear - First observed
notifications_get - First observed
poll_vote - First observed
search - First observed
status_bookmark - First observed
status_context - First observed
status_delete - First observed
status_favourite - First observed
status_favourited_by - First observed
status_get - First observed
status_post - First observed
status_reblog - First observed
status_reblogged_by - First observed
status_unbookmark - First observed
status_unfavourite - First observed
status_unreblog - First observed
timeline_hashtag - First observed
timeline_home - First observed
timeline_local - First observed
timeline_public - First observed
trending_links - First observed
trending_statuses - First observed
trending_tags
TDQS
Scored across 54 tools
Most tools map to clearly distinct resource+action pairs (account_get vs account_follow vs status_reblog), and the domain vocabulary is well-known. Minor overlaps exist, e.g. account_search vs the general search tool, and the notification_get/dismiss/clear trio requires reading descriptions to distinguish granularity.
The dominant pattern is noun_verb (account_get, status_post, list_create), but there are notable deviations: bare nouns with no verb (mutes, blocks, favourites, bookmarks, search, directory) and scrambled multi-part names (list_accounts_add, follow_request_authorize). Plurals are also inconsistent within the same family (notifications_get vs notification_dismiss).
54 tools is a very heavy surface for an agent to navigate and is well past the 25+ threshold for concern. The breadth of the Mastodon API justifies many of them individually, but the set would benefit from consolidation (e.g. generic follow/mute/block with an action parameter).
Coverage is broad and lifecycle-aware: accounts, statuses, timelines, lists, notifications, polls, media, follow requests, mutes/blocks, and trending data are all present with create/delete/action variants. Gaps remain around direct-message/conversation tools, status editing (only status_delete exists despite account_update), and list updates, but core workflows are covered.
Maintenance
Related MCP Connectors
MCP server for AI dialogue using various LLM models via AceDataCloud
Nifty's MCP server — exposes tasks, projects, messages, and files as tools for AI agents.
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with yo…
- UnifAPIOAuthcom.unifapi
Hosted MCP server for live public-data APIs and Skills for AI agents.
Related MCP Servers
- AlicenseAqualityFmaintenanceAn MCP server that enables AI assistants to access and interact with Reddit content through features like user analysis, post retrieval, subreddit statistics, and authenticated posting capabilities.15301MIT
- AlicenseNot gradedqualityDmaintenanceAn MCP server for interacting with the Twitter/X API v2, enabling AI assistants to retrieve tweets, post content, reply, quote, and more programmatically.681 npm13MIT
- AlicenseBqualityCmaintenanceA comprehensive MCP server that enables LLMs like Claude to explore and interact with the existing Fediverse through standardized MCP tools, resources, and prompts.1884 npm17MIT
- AlicenseBqualityAmaintenanceAn MCP server that enables AI assistants to interact with Twitter/X through a single authenticated session without an official API key, providing 27 tools for reading and writing tweets, user management, timeline access, trends, and direct messages.271MIT