Model Context Protocol (MCP) server for the Fediverse — let Claude and other LLMs explore and post to Mastodon, Misskey, and Pleroma. Read-only by default.
ActivityPub MCP provides 37 tools with generally clear naming following verb_noun patterns (discover-, fetch-, get-, post-, delete-, etc.). Most tools have descriptions and input schemas present. However, there are significant gaps: (1) Many parameter descriptions are minimal or missing entirely; (2) Output schemas are not documented in the provided source, only input schemas are visible; (3) Several tools lack comprehensive error handling guidance; (4) Some parameter constraints (enums, ranges, patterns) are underspecified. The server implements tool annotations (via Risk field) which is good, but the descriptions could be more LLM-optimized. Averaging across 37 tools with partial quality yields a C/fair score.
Find and retrieve the profile of any fediverse user or account (called an 'actor' in ActivityPub). Returns display name, bio, follower/following URLs, and inbox/outbox endpoints. Pass a handle like '@alice@mastodon.social' or 'alice@mastodon.social'.
discover-instances-liveread only37/100
Live discovery of federated instances across the Fediverse
Output schemas are not documented in the provided source code. LLMs cannot plan downstream tool calls or extract needed data without knowing return types and field names.
Several tool descriptions are under 50 characters and lack context: 'get-trending-hashtags: Fetch trending hashtags from a fediverse instance' (58 chars), 'get-trending-posts: Fetch trending posts from a fediverse instance' (65 chars), 'list-accounts: List all configured accounts' (44 chars). These descriptions do not explain WHEN to use the tool or what problem it solves.
Recommendations
Document output schemas for all 37 tools. For each tool, specify return type (object, array, etc.), field names, types, and provide a sample response. This is critical for LLM planning and eliminates guesswork.
Add input schemas to tools that lack them (discover-instances-live, get-trending-hashtags, get-trending-posts, get-public-timeline, list-accounts, verify-account, get-scheduled-posts). Even if these tools accept no parameters, explicitly declare 'input: {}' so the MCP server can validate the schema is complete.
Expand descriptions on underdescribed tools to 80-150 characters. Current baseline is ~194 chars. For example, 'get-trending-hashtags' should become: 'Fetch currently trending hashtags from a fediverse instance. Use this to discover popular conversation topics and suggest relevant content searches to the user.'
Add parameter-level descriptions and constraints. For 'unified-search', clarify: 'Search query (string, 1-500 chars). Searches across actors, hashtags, and posts. Partial matches supported.' For 'limit' parameters in list tools, document the range (e.g. 'limit: 1-50, default 20').
Document pagination semantics. For tools accepting 'limit', specify: 'Returns up to limit results. Include next_cursor in the response if more results exist. Callers should pass cursor to subsequent calls to fetch the next page.' Also return total_count when available.
Add error recovery guidance to tool descriptions. E.g., 'discover-actor: If the handle is not found, the caller should try unified-search with a partial name. Accepted formats: user@domain or @user@domain.'
Spec posture evidence
Inferred effective spec: 2025-06-18+.
Relies on Logging (deprecated) - log to stderr or use OpenTelemetry
Score history
Overall score trend
↑ 19 points across a rubric change (v1 → v2)
59/100
Scored
Grade
Overall
Spec posture
Rubric
2026-09-21
D
59
2025-06-18+
v2
2026-03-09
F
40
-
v1
favourite-postwriteauthsource verified73/100
Favourite a post
fetch-timelineread onlysource verified80/100
Fetch recent posts (the outbox) from any fediverse actor — a user or account — with cursor- and ID-based pagination. Pass a handle like 'alice@mastodon.social'.
follow-accountwriteauthsource verified70/100
Follow an account
get-bookmarksread onlyauthsource verified75/100
Fetch bookmarked posts for the authenticated account
get-favouritesread onlyauthsource verified75/100
Fetch favourited posts for the authenticated account
Parameter descriptions are minimal or absent for many tools. E.g., 'discover-instances-live' and 'get-trending-hashtags' have no visible input parameters documented in the source. Even 'unified-search' with a 'query' parameter lacks guidance on format or search scoping (does it search actors, posts, hashtags, or all?).
Error handling guidance is absent. Tool descriptions do not indicate: (1) What errors can occur, (2) Whether errors are retryable, (3) What the LLM should do if a call fails. E.g., 'discover-actor' with a malformed handle should guide the LLM to try 'unified-search' or provide format hints.
Pagination support is underspecified. 'fetch-timeline', 'get-home-timeline', and 'get-notifications' accept 'limit' but lack documentation on cursor handling, total count return, or pagination semantics.
Tools support natural identifiers (actor handles like 'alice@mastodon.social') but the 'identifier' parameter description does not explain fallback behavior if the handle is invalid or ambiguous. E.g., 'follow-account' accepts 'identifier', does it support both handles and account IDs? What if two instances have the same username?
No documented response field mappings. E.g., if 'discover-actor' returns an 'inbox_url', but 'get-post-thread' accepts a 'url', LLMs may not recognize that actor.inbox_url != post.url.
all tools
Implement confirmation/dry-run for destructive tools. Add an optional 'confirm' parameter to 'delete-post' and 'cancel-scheduled-post'. When true, return a summary of what would be deleted without actually deleting. This prevents agent mistakes.
Clarify identifier resolution behavior. For tools accepting 'identifier' (discover-actor, follow-account, etc.), specify: 'Accepts handle (user@domain), @handle format, or account ID. If ambiguous (e.g. same username on multiple instances), returns the most popular instance or asks for clarification.'
Document field mappings between tool outputs and downstream inputs. Create a reference table: 'discover-actor output (actor_id, inbox_url, display_name, bio) → follow-account input (identifier as actor_id or handle); get-post-thread input (url) expects full ActivityPub post URL.'
Add rate limiting and timeout guidance. Specify: 'This tool may time out if the target instance is slow. Recommend a 30-second timeout. If rate limited (HTTP 429), wait 60 seconds before retrying.' This helps agents backoff intelligently.
For tools that interact with external Fediverse instances, document instance compatibility (Mastodon, Misskey, Pleroma support levels). E.g., 'vote-on-poll: Supported on Mastodon 4.0+ and compatible instances. Returns error on instances without poll support.'
Consolidate similar tools with variant descriptions. 'favourite-post' and 'unfavourite-post' are clear, but 'boost-post' vs 'unboost-post' should explicitly state that 'boost' = 'repost/announce' in ActivityPub terms for clarity.