ActivityPub MCP Server
The ActivityPub MCP Server acts as a Fediverse client for LLMs, enabling exploration and interaction with decentralized social networks (Mastodon, Misskey, Pleroma, etc.) via the Model Context Protocol — read-only by default, with optional write access.
Public Read Tools (no account needed)
Discover actors — Look up any Fediverse user profile by handle, retrieving bio, follower/following URLs, and inbox/outbox endpoints
Fetch actor timelines — Retrieve posts from any user's public timeline with pagination
Get post threads — Fetch a post and its full conversation (replies and parent posts) up to configurable depth
Search the Fediverse — Unified search for accounts, posts, or hashtags across any instance
Get trending hashtags/posts — See what's currently trending on a given instance
Get public timelines — Browse an instance's local or federated public timeline
Get instance info — Retrieve detailed metadata about any Fediverse instance
Discover instances — Find instances with filters for software type, language, user count, registration status, and more
Authenticated Read Tools (account required)
List and switch between configured accounts
Verify credentials and obtain account information
Get your personalized home timeline
Retrieve notifications (mentions, follows, boosts, favourites)
Access bookmarks and favourited posts
Check relationship status with other accounts (following, blocked, muted, etc.)
Write Tools (opt-in via ACTIVITYPUB_ENABLE_WRITES=true)
Post, reply, and delete statuses
Boost, favourite, and bookmark posts
Follow, mute, and block accounts
Vote in polls, upload media, and schedule posts
Authentication is handled via OAuth/MiAuth with multi-account support and CLI login. An HTTP transport mode with bearer authentication and a health check endpoint is also available.
Enables interaction with the ActivityPub protocol, allowing discovery and interaction with actors and content across the Fediverse.
Provides tools to interact with Mastodon instances, including reading timelines, posting, and managing accounts.
Provides tools to interact with Misskey instances, including reading timelines, posting, and managing accounts.
Provides tools to interact with Pleroma instances, including reading timelines, posting, and managing accounts.
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., "@ActivityPub MCP Servershow trending posts on mastodon.social"
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.
Install
Requires Node.js 20+.
npx -y activitypub-mcpOne-click install:
Claude Desktop
One-click: download the .mcpb bundle (activitypub-mcp-<version>.mcpb) from the latest release and open it in Claude Desktop.
Manual: edit ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):
{
"mcpServers": {
"activitypub": {
"command": "npx",
"args": ["-y", "activitypub-mcp"]
}
}
}Restart Claude Desktop.
Cursor
Edit ~/.cursor/mcp.json:
{
"mcpServers": {
"activitypub": {
"command": "npx",
"args": ["-y", "activitypub-mcp"]
}
}
}Restart Cursor.
Related MCP server: Claude-LMStudio Bridge
Read-only by default
Out of the box, only read tools are registered: discover actors, fetch timelines, search, get threads, explore instances, read trending content. No write tools exist in the MCP session, so injected fediverse content cannot trigger account actions.
Public read tools (no account needed): discover-actor, fetch-timeline, get-post-thread, get-instance-info, get-public-timeline, get-trending-hashtags, get-trending-posts, search, discover-instances.
Authenticated read tools (account required): list-accounts, switch-account, verify-account, get-home-timeline, get-notifications, get-bookmarks, get-favourites, get-relationship.
Enabling writes
Set ACTIVITYPUB_ENABLE_WRITES=true in the environment or MCP config env block. This registers the full set of mutation tools: post, reply, delete, boost, favourite, bookmark, follow, mute, block, vote, upload media, and scheduled posts. Read the threat model before enabling.
{
"mcpServers": {
"activitypub": {
"command": "npx",
"args": ["-y", "activitypub-mcp"],
"env": {
"ACTIVITYPUB_ENABLE_WRITES": "true"
}
}
}
}Authentication
Log in with the CLI:
npx activitypub-mcp login mastodon.socialThis runs OAuth (Mastodon-family) or MiAuth (Misskey) in your browser and saves credentials to ~/.config/activitypub-mcp/accounts.json. Multi-account is supported — use switch-account to change the active account.
Alternatively, set ACTIVITYPUB_DEFAULT_INSTANCE and ACTIVITYPUB_DEFAULT_TOKEN env vars for a single account without the CLI flow.
Platform support
discover-actor and fetch-timeline speak plain ActivityPub (WebFinger → actor → outbox), so they read any conformant ActivityPub server — Mastodon, Misskey, Foundkey, Pleroma/Akkoma, Lemmy (communities and users), PeerTube (channels and accounts), GoToSocial, and Pixelfed.
The instance-API read tools (search, get-trending-hashtags, get-trending-posts, get-public-timeline) and every write tool require a Mastodon- or Misskey-API instance, since they call those platforms' REST APIs. Login uses OAuth (Mastodon-family) or MiAuth (Misskey).
Example
After adding the server to your MCP client, try:
"Look up @gargron@mastodon.social and summarize their latest posts."
The model will call discover-actor to fetch the profile, then fetch-timeline to read recent posts.
See examples/ for copy-pasteable recipes — Fediverse research digests, scheduled threads, notification triage, image posts with alt text, and topic curation.
HTTP transport
In addition to stdio (default), the server supports HTTP mode with a bearer-gated /mcp endpoint and /health liveness check. Set MCP_HTTP_SECRET (min 16 chars) to enable.
To self-host it as a service, the repo includes a Dockerfile and a docker-compose.yml (HTTP mode):
export MCP_HTTP_SECRET=$(node -e "console.log(require('crypto').randomBytes(32).toString('hex'))")
docker compose up --build # then: curl http://localhost:8080/healthSee the docs for full configuration.
Security
This server fetches world-writable fediverse content — posts, bios, notifications — and feeds it to the LLM. That content can contain prompt-injection payloads. Notifications are an unsolicited channel: anyone can mention your account. The <untrusted-content> envelope and read-only default reduce the risk surface, but do not eliminate it.
See SECURITY.md for the full threat model, SSRF protections, credential handling, and reporting instructions.
Documentation
The full tool reference, resource list, prompt catalog, environment variable guide, and deployment notes live on the docs site:
cameronrye.github.io/activitypub-mcp/docs/
License
MIT — see LICENSE.
Acknowledgments
Built on the Model Context Protocol by Anthropic, and interacts with the decentralized social web as specified by ActivityPub (W3C) and ActivityStreams.
Available Tools
18 toolsdiscover-actorDiscover Fediverse ActorARead-only
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'.
| Name | Required | Description | Default |
|---|---|---|---|
| identifier | Yes | Actor handle in 'user@domain' or '@user@domain' form (e.g., 'alice@mastodon.social') |
Output Schema
| Name | Required | Description |
|---|---|---|
| actor | Yes |
discover-instancesDiscover Fediverse InstancesARead-only
Discover fediverse instances in real-time using the instances.social API with advanced filtering
| Name | Required | Description | Default |
|---|---|---|---|
| software | No | Filter by software type | |
| language | No | Filter by language code (e.g., 'en', 'de', 'ja') | |
| minUsers | No | Minimum number of users | |
| maxUsers | No | Maximum number of users | |
| openRegistrations | No | Only show instances with open registrations | |
| sortBy | No | Sort results by field | |
| sortOrder | No | Sort order (default: desc) | |
| limit | No | Number of results (default: 20) |
Output Schema
| Name | Required | Description |
|---|---|---|
| instances | Yes | |
| hasMore | No |
fetch-timelineFetch Actor TimelineARead-only
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'.
| Name | Required | Description | Default |
|---|---|---|---|
| identifier | Yes | Actor identifier (e.g., user@example.social) | |
| limit | No | Number of posts to fetch (default: 20) | |
| cursor | No | Pagination cursor from previous response to fetch next page | |
| minId | No | Return posts newer than this post ID (pagination) | |
| maxId | No | Return posts older than this post ID (pagination) | |
| sinceId | No | Return posts more recent than this post ID |
Output Schema
| Name | Required | Description |
|---|---|---|
| posts | Yes | |
| nextCursor | No | Opaque cursor for the next page, if more results |
| hasMore | No | |
| source | No | Account/actor/instance the posts came from |
get-bookmarksGet BookmarksBRead-only
Get your bookmarked posts
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Number of posts (default: 20) | |
| accountId | No | Account ID |
Output Schema
| Name | Required | Description |
|---|---|---|
| posts | Yes | |
| nextCursor | No | Opaque cursor for the next page, if more results |
| hasMore | No | |
| source | No | Account/actor/instance the posts came from |
get-favouritesGet FavouritesARead-only
Get posts you have favourited
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Number of posts (default: 20) | |
| accountId | No | Account ID |
Output Schema
| Name | Required | Description |
|---|---|---|
| posts | Yes | |
| nextCursor | No | Opaque cursor for the next page, if more results |
| hasMore | No | |
| source | No | Account/actor/instance the posts came from |
get-home-timelineGet Home TimelineARead-only
Get your personalized home timeline (posts from accounts you follow)
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Number of posts (default: 20) | |
| maxId | No | Return posts older than this ID | |
| sinceId | No | Return posts newer than this ID | |
| accountId | No | Account ID |
Output Schema
| Name | Required | Description |
|---|---|---|
| posts | Yes | |
| nextCursor | No | Opaque cursor for the next page, if more results |
| hasMore | No | |
| source | No | Account/actor/instance the posts came from |
get-instance-infoGet Instance InformationARead-only
Get detailed information about a fediverse instance: software and version, description, registration policy, supported languages, user/post/domain counts, and contact account.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | Instance domain (e.g., example.social) |
Output Schema
| Name | Required | Description |
|---|---|---|
| domain | Yes | |
| title | No | |
| description | No | |
| version | No | |
| software | No | |
| users | No | |
| registrationsOpen | No |
get-notificationsGet NotificationsCRead-only
Get your notifications (mentions, follows, boosts, favourites)
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Number of notifications (default: 20) | |
| types | No | Filter by notification types | |
| accountId | No | Account ID |
Output Schema
| Name | Required | Description |
|---|---|---|
| notifications | Yes |
get-post-threadGet Post ThreadARead-only
Fetch a post and its full conversation thread including replies and parent posts
| Name | Required | Description | Default |
|---|---|---|---|
| postUrl | Yes | The URL of the post to fetch the thread for | |
| depth | No | How many levels of nested replies to fetch (default: 2) | |
| maxReplies | No | Maximum number of replies to fetch (default: 50) |
Output Schema
| Name | Required | Description |
|---|---|---|
| ancestors | Yes | |
| post | Yes | |
| replies | Yes |
get-public-timelineGet Public TimelineARead-only
Fetch an instance's public timeline. scope 'federated' (default) shows posts the instance has seen from across the fediverse; 'local' shows only posts authored on that instance.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | Instance domain, e.g. mastodon.social | |
| scope | No | default: federated | |
| limit | No | Number of posts to fetch (default: 20) | |
| maxId | No | Return results older than this ID (for pagination) |
Output Schema
| Name | Required | Description |
|---|---|---|
| posts | Yes | |
| nextCursor | No | Opaque cursor for the next page, if more results |
| hasMore | No | |
| source | No | Account/actor/instance the posts came from |
get-relationshipGet RelationshipARead-only
Check your relationship status with another account (following, followed by, blocking, muting, etc.). Pass a single acct like 'username@instance'. To check multiple accounts, call this tool once per account.
| Name | Required | Description | Default |
|---|---|---|---|
| acct | Yes | Account to check relationship with (username@instance). If you have multiple accounts to check, call this tool once per account. | |
| accountId | No | Your account ID | |
| accountIds | No | Deprecated / not supported. Use 'acct' (a single username@instance string) and call this tool once per account. |
Output Schema
| Name | Required | Description |
|---|---|---|
| acct | Yes | |
| following | No | |
| followedBy | No | |
| blocking | No | |
| muting | No | |
| requested | No |
get-scheduled-postsGet Scheduled PostsARead-only
List your scheduled posts that haven't been published yet
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Number of posts (default: 20) | |
| accountId | No | Account ID |
Output Schema
| Name | Required | Description |
|---|---|---|
| scheduledPosts | Yes |
get-trending-hashtagsGet Trending HashtagsARead-only
Get currently trending hashtags on a fediverse instance (Mastodon-compatible instances that expose a trends API).
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | Instance domain (e.g., mastodon.social) | |
| limit | No | Number of hashtags to fetch (default: 20) |
Output Schema
| Name | Required | Description |
|---|---|---|
| hashtags | Yes |
get-trending-postsGet Trending PostsARead-only
Get currently trending posts on a fediverse instance (Mastodon-compatible instances that expose a trends API).
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | Instance domain (e.g., mastodon.social) | |
| limit | No | Number of posts to fetch (default: 20) |
Output Schema
| Name | Required | Description |
|---|---|---|
| posts | Yes | |
| nextCursor | No | Opaque cursor for the next page, if more results |
| hasMore | No | |
| source | No | Account/actor/instance the posts came from |
list-accountsList Configured AccountsARead-only
List all configured authenticated accounts for write operations
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| accounts | Yes | |
| writeEnabled | Yes | |
| activeAccountId | No |
searchSearch FediverseARead-only
Unified search across the fediverse - find accounts, posts, or hashtags on any instance
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Search query | |
| domain | No | Instance domain to search on (default: mastodon.social) | |
| type | No | Type of content to search for (default: all) | |
| limit | No | Number of results per type (default: 10) |
Output Schema
| Name | Required | Description |
|---|---|---|
| accounts | No | |
| statuses | No | |
| hashtags | No |
switch-accountSwitch Active AccountA
Switch the active account used for write operations
| Name | Required | Description | Default |
|---|---|---|---|
| accountId | Yes | The account ID to switch to (use list-accounts to see IDs) |
Output Schema
| Name | Required | Description |
|---|---|---|
| accountId | No | |
| username | No | |
| instance | No | |
| active | No | |
| verified | No |
verify-accountVerify Account CredentialsBRead-only
Verify that the account credentials are valid and get account information
| Name | Required | Description | Default |
|---|---|---|---|
| accountId | No | The account ID to verify (defaults to active account) |
Output Schema
| Name | Required | Description |
|---|---|---|
| accountId | No | |
| username | No | |
| instance | No | |
| active | No | |
| verified | No |
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
18 tool updates
v3.1.4- Changed
discover-actor1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "actor": { + "additionalProperties": false, + "properties": { + "followers": { + "type": "string" + }, + "following": { + "type": "string" + }, + "id": { + "type": "string" + }, + "inbox": { + "type": "string" + }, + "name": { + "type": "string" + }, + "outbox": { + "type": "string" + }, + "preferredUsername": { + "type": "string" + }, + "summary": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id" + ], + "type": "object" + } + }, + "required": [ + "actor" + ], + "type": "object" +}
- Changed
discover-instances1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "hasMore": { + "type": "boolean" + }, + "instances": { + "items": { + "additionalProperties": false, + "properties": { + "description": { + "type": "string" + }, + "domain": { + "type": "string" + }, + "software": { + "type": "string" + }, + "users": { + "type": "number" + } + }, + "required": [ + "domain" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "instances" + ], + "type": "object" +}
- Changed
fetch-timeline1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "hasMore": { + "type": "boolean" + }, + "nextCursor": { + "description": "Opaque cursor for the next page, if more results", + "type": "string" + }, + "posts": { + "items": { + "additionalProperties": false, + "properties": { + "author": { + "description": "Author handle or display name", + "type": "string" + }, + "content": { + "description": "Plain-text/summarized post body", + "type": "string" + }, + "contentWarning": { + "description": "Content warning / summary, if any", + "type": "string" + }, + "createdAt": { + "description": "ISO timestamp", + "type": "string" + }, + "favourites": { + "type": "number" + }, + "id": { + "description": "Post/status ID", + "type": "string" + }, + "reblogs": { + "type": "number" + }, + "replies": { + "type": "number" + }, + "type": { + "description": "ActivityPub object type (Note, Announce, …)", + "type": "string" + }, + "url": { + "description": "Canonical URL of the post", + "type": "string" + } + }, + "required": [ + "id", + "content" + ], + "type": "object" + }, + "type": "array" + }, + "source": { + "description": "Account/actor/instance the posts came from", + "type": "string" + } + }, + "required": [ + "posts" + ], + "type": "object" +}
- Changed
get-bookmarks1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "hasMore": { + "type": "boolean" + }, + "nextCursor": { + "description": "Opaque cursor for the next page, if more results", + "type": "string" + }, + "posts": { + "items": { + "additionalProperties": false, + "properties": { + "author": { + "description": "Author handle or display name", + "type": "string" + }, + "content": { + "description": "Plain-text/summarized post body", + "type": "string" + }, + "contentWarning": { + "description": "Content warning / summary, if any", + "type": "string" + }, + "createdAt": { + "description": "ISO timestamp", + "type": "string" + }, + "favourites": { + "type": "number" + }, + "id": { + "description": "Post/status ID", + "type": "string" + }, + "reblogs": { + "type": "number" + }, + "replies": { + "type": "number" + }, + "type": { + "description": "ActivityPub object type (Note, Announce, …)", + "type": "string" + }, + "url": { + "description": "Canonical URL of the post", + "type": "string" + } + }, + "required": [ + "id", + "content" + ], + "type": "object" + }, + "type": "array" + }, + "source": { + "description": "Account/actor/instance the posts came from", + "type": "string" + } + }, + "required": [ + "posts" + ], + "type": "object" +}
- Changed
get-favourites1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "hasMore": { + "type": "boolean" + }, + "nextCursor": { + "description": "Opaque cursor for the next page, if more results", + "type": "string" + }, + "posts": { + "items": { + "additionalProperties": false, + "properties": { + "author": { + "description": "Author handle or display name", + "type": "string" + }, + "content": { + "description": "Plain-text/summarized post body", + "type": "string" + }, + "contentWarning": { + "description": "Content warning / summary, if any", + "type": "string" + }, + "createdAt": { + "description": "ISO timestamp", + "type": "string" + }, + "favourites": { + "type": "number" + }, + "id": { + "description": "Post/status ID", + "type": "string" + }, + "reblogs": { + "type": "number" + }, + "replies": { + "type": "number" + }, + "type": { + "description": "ActivityPub object type (Note, Announce, …)", + "type": "string" + }, + "url": { + "description": "Canonical URL of the post", + "type": "string" + } + }, + "required": [ + "id", + "content" + ], + "type": "object" + }, + "type": "array" + }, + "source": { + "description": "Account/actor/instance the posts came from", + "type": "string" + } + }, + "required": [ + "posts" + ], + "type": "object" +}
- Changed
get-home-timeline1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "hasMore": { + "type": "boolean" + }, + "nextCursor": { + "description": "Opaque cursor for the next page, if more results", + "type": "string" + }, + "posts": { + "items": { + "additionalProperties": false, + "properties": { + "author": { + "description": "Author handle or display name", + "type": "string" + }, + "content": { + "description": "Plain-text/summarized post body", + "type": "string" + }, + "contentWarning": { + "description": "Content warning / summary, if any", + "type": "string" + }, + "createdAt": { + "description": "ISO timestamp", + "type": "string" + }, + "favourites": { + "type": "number" + }, + "id": { + "description": "Post/status ID", + "type": "string" + }, + "reblogs": { + "type": "number" + }, + "replies": { + "type": "number" + }, + "type": { + "description": "ActivityPub object type (Note, Announce, …)", + "type": "string" + }, + "url": { + "description": "Canonical URL of the post", + "type": "string" + } + }, + "required": [ + "id", + "content" + ], + "type": "object" + }, + "type": "array" + }, + "source": { + "description": "Account/actor/instance the posts came from", + "type": "string" + } + }, + "required": [ + "posts" + ], + "type": "object" +}
- Changed
get-instance-info1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "description": { + "type": "string" + }, + "domain": { + "type": "string" + }, + "registrationsOpen": { + "type": "boolean" + }, + "software": { + "type": "string" + }, + "title": { + "type": "string" + }, + "users": { + "type": "number" + }, + "version": { + "type": "string" + } + }, + "required": [ + "domain" + ], + "type": "object" +}
- Changed
get-notifications1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "notifications": { + "items": { + "additionalProperties": false, + "properties": { + "account": { + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "id": { + "type": "string" + }, + "status": { + "additionalProperties": false, + "properties": { + "author": { + "description": "Author handle or display name", + "type": "string" + }, + "content": { + "description": "Plain-text/summarized post body", + "type": "string" + }, + "contentWarning": { + "description": "Content warning / summary, if any", + "type": "string" + }, + "createdAt": { + "description": "ISO timestamp", + "type": "string" + }, + "favourites": { + "type": "number" + }, + "id": { + "description": "Post/status ID", + "type": "string" + }, + "reblogs": { + "type": "number" + }, + "replies": { + "type": "number" + }, + "type": { + "description": "ActivityPub object type (Note, Announce, …)", + "type": "string" + }, + "url": { + "description": "Canonical URL of the post", + "type": "string" + } + }, + "required": [ + "id", + "content" + ], + "type": "object" + }, + "type": { + "type": "string" + } + }, + "required": [ + "id", + "type" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "notifications" + ], + "type": "object" +}
- Changed
get-post-thread1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "ancestors": { + "items": { + "additionalProperties": false, + "properties": { + "author": { + "description": "Author handle or display name", + "type": "string" + }, + "content": { + "description": "Plain-text/summarized post body", + "type": "string" + }, + "contentWarning": { + "description": "Content warning / summary, if any", + "type": "string" + }, + "createdAt": { + "description": "ISO timestamp", + "type": "string" + }, + "favourites": { + "type": "number" + }, + "id": { + "description": "Post/status ID", + "type": "string" + }, + "reblogs": { + "type": "number" + }, + "replies": { + "type": "number" + }, + "type": { + "description": "ActivityPub object type (Note, Announce, …)", + "type": "string" + }, + "url": { + "description": "Canonical URL of the post", + "type": "string" + } + }, + "required": [ + "id", + "content" + ], + "type": "object" + }, + "type": "array" + }, + "post": { + "additionalProperties": false, + "properties": { + "author": { + "description": "Author handle or display name", + "type": "string" + }, + "content": { + "description": "Plain-text/summarized post body", + "type": "string" + }, + "contentWarning": { + "description": "Content warning / summary, if any", + "type": "string" + }, + "createdAt": { + "description": "ISO timestamp", + "type": "string" + }, + "favourites": { + "type": "number" + }, + "id": { + "description": "Post/status ID", + "type": "string" + }, + "reblogs": { + "type": "number" + }, + "replies": { + "type": "number" + }, + "type": { + "description": "ActivityPub object type (Note, Announce, …)", + "type": "string" + }, + "url": { + "description": "Canonical URL of the post", + "type": "string" + } + }, + "required": [ + "id", + "content" + ], + "type": "object" + }, + "replies": { + "items": { + "additionalProperties": false, + "properties": { + "author": { + "description": "Author handle or display name", + "type": "string" + }, + "content": { + "description": "Plain-text/summarized post body", + "type": "string" + }, + "contentWarning": { + "description": "Content warning / summary, if any", + "type": "string" + }, + "createdAt": { + "description": "ISO timestamp", + "type": "string" + }, + "favourites": { + "type": "number" + }, + "id": { + "description": "Post/status ID", + "type": "string" + }, + "reblogs": { + "type": "number" + }, + "replies": { + "type": "number" + }, + "type": { + "description": "ActivityPub object type (Note, Announce, …)", + "type": "string" + }, + "url": { + "description": "Canonical URL of the post", + "type": "string" + } + }, + "required": [ + "id", + "content" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "ancestors", + "post", + "replies" + ], + "type": "object" +}
- Changed
get-public-timeline1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "hasMore": { + "type": "boolean" + }, + "nextCursor": { + "description": "Opaque cursor for the next page, if more results", + "type": "string" + }, + "posts": { + "items": { + "additionalProperties": false, + "properties": { + "author": { + "description": "Author handle or display name", + "type": "string" + }, + "content": { + "description": "Plain-text/summarized post body", + "type": "string" + }, + "contentWarning": { + "description": "Content warning / summary, if any", + "type": "string" + }, + "createdAt": { + "description": "ISO timestamp", + "type": "string" + }, + "favourites": { + "type": "number" + }, + "id": { + "description": "Post/status ID", + "type": "string" + }, + "reblogs": { + "type": "number" + }, + "replies": { + "type": "number" + }, + "type": { + "description": "ActivityPub object type (Note, Announce, …)", + "type": "string" + }, + "url": { + "description": "Canonical URL of the post", + "type": "string" + } + }, + "required": [ + "id", + "content" + ], + "type": "object" + }, + "type": "array" + }, + "source": { + "description": "Account/actor/instance the posts came from", + "type": "string" + } + }, + "required": [ + "posts" + ], + "type": "object" +}
- Changed
get-relationship2 fields changed- added
Input schema / properties / accountIds / descriptionAdded value: +"Deprecated / not supported. Use 'acct' (a single username@instance string) and call this tool once per account." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "acct": { + "type": "string" + }, + "blocking": { + "type": "boolean" + }, + "followedBy": { + "type": "boolean" + }, + "following": { + "type": "boolean" + }, + "muting": { + "type": "boolean" + }, + "requested": { + "type": "boolean" + } + }, + "required": [ + "acct" + ], + "type": "object" +}
- Added
get-scheduled-posts - Changed
get-trending-hashtags1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "hashtags": { + "items": { + "additionalProperties": false, + "properties": { + "accounts": { + "type": "number" + }, + "name": { + "type": "string" + }, + "url": { + "type": "string" + }, + "uses": { + "type": "number" + } + }, + "required": [ + "name" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "hashtags" + ], + "type": "object" +}
- Changed
get-trending-posts1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "hasMore": { + "type": "boolean" + }, + "nextCursor": { + "description": "Opaque cursor for the next page, if more results", + "type": "string" + }, + "posts": { + "items": { + "additionalProperties": false, + "properties": { + "author": { + "description": "Author handle or display name", + "type": "string" + }, + "content": { + "description": "Plain-text/summarized post body", + "type": "string" + }, + "contentWarning": { + "description": "Content warning / summary, if any", + "type": "string" + }, + "createdAt": { + "description": "ISO timestamp", + "type": "string" + }, + "favourites": { + "type": "number" + }, + "id": { + "description": "Post/status ID", + "type": "string" + }, + "reblogs": { + "type": "number" + }, + "replies": { + "type": "number" + }, + "type": { + "description": "ActivityPub object type (Note, Announce, …)", + "type": "string" + }, + "url": { + "description": "Canonical URL of the post", + "type": "string" + } + }, + "required": [ + "id", + "content" + ], + "type": "object" + }, + "type": "array" + }, + "source": { + "description": "Account/actor/instance the posts came from", + "type": "string" + } + }, + "required": [ + "posts" + ], + "type": "object" +}
- Changed
list-accounts1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "accounts": { + "items": { + "additionalProperties": false, + "properties": { + "id": { + "type": "string" + }, + "instance": { + "type": "string" + }, + "isActive": { + "type": "boolean" + }, + "label": { + "type": "string" + }, + "scopes": { + "items": { + "type": "string" + }, + "type": "array" + }, + "username": { + "type": "string" + } + }, + "required": [ + "id", + "username", + "instance", + "isActive", + "scopes" + ], + "type": "object" + }, + "type": "array" + }, + "activeAccountId": { + "type": "string" + }, + "writeEnabled": { + "type": "boolean" + } + }, + "required": [ + "accounts", + "writeEnabled" + ], + "type": "object" +}
- Changed
search1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "accounts": { + "items": { + "additionalProperties": false, + "properties": { + "followers": { + "type": "string" + }, + "following": { + "type": "string" + }, + "id": { + "type": "string" + }, + "inbox": { + "type": "string" + }, + "name": { + "type": "string" + }, + "outbox": { + "type": "string" + }, + "preferredUsername": { + "type": "string" + }, + "summary": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id" + ], + "type": "object" + }, + "type": "array" + }, + "hashtags": { + "items": { + "additionalProperties": false, + "properties": { + "name": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + }, + "type": "array" + }, + "statuses": { + "items": { + "additionalProperties": false, + "properties": { + "author": { + "description": "Author handle or display name", + "type": "string" + }, + "content": { + "description": "Plain-text/summarized post body", + "type": "string" + }, + "contentWarning": { + "description": "Content warning / summary, if any", + "type": "string" + }, + "createdAt": { + "description": "ISO timestamp", + "type": "string" + }, + "favourites": { + "type": "number" + }, + "id": { + "description": "Post/status ID", + "type": "string" + }, + "reblogs": { + "type": "number" + }, + "replies": { + "type": "number" + }, + "type": { + "description": "ActivityPub object type (Note, Announce, …)", + "type": "string" + }, + "url": { + "description": "Canonical URL of the post", + "type": "string" + } + }, + "required": [ + "id", + "content" + ], + "type": "object" + }, + "type": "array" + } + }, + "type": "object" +}
- Changed
switch-account1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "accountId": { + "type": "string" + }, + "active": { + "type": "boolean" + }, + "instance": { + "type": "string" + }, + "username": { + "type": "string" + }, + "verified": { + "type": "boolean" + } + }, + "type": "object" +}
- Changed
verify-account1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "accountId": { + "type": "string" + }, + "active": { + "type": "boolean" + }, + "instance": { + "type": "string" + }, + "username": { + "type": "string" + }, + "verified": { + "type": "boolean" + } + }, + "type": "object" +}
1 tool update
v3.1.2- Changed
fetch-timeline3 fields changed- changed
Input schema / properties / maxId / descriptionPrevious value: -"Return results older than this ID"New value: +"Return posts older than this post ID (pagination)" - changed
Input schema / properties / minId / descriptionPrevious value: -"Return results newer than this ID"New value: +"Return posts newer than this post ID (pagination)" - changed
Input schema / properties / sinceId / descriptionPrevious value: -"Return results since this ID"New value: +"Return posts more recent than this post ID"
17 tool updates
v0.1.0- First observed
discover-actor - First observed
discover-instances - First observed
fetch-timeline - First observed
get-bookmarks - First observed
get-favourites - First observed
get-home-timeline - First observed
get-instance-info - First observed
get-notifications - First observed
get-post-thread - First observed
get-public-timeline - First observed
get-relationship - First observed
get-trending-hashtags - First observed
get-trending-posts - First observed
list-accounts - First observed
search - First observed
switch-account - First observed
verify-account
TDQS
Scored across 18 tools
Most tools are clearly scoped by resource type such as actor, instance, timeline, or account, and timeline tools are distinguished by source (actor outbox, instance public, home). A few potential overlaps exist, such as discover-actor vs. search and discover-instances vs. get-instance-info, but the descriptions provide enough context for an agent to choose correctly.
Tool names follow a consistent lowercase hyphenated verb-noun pattern like discover-actor, fetch-timeline, and get-notifications. The main deviation is the bare verb 'search', and the mix of get/fetch/discover/list verbs is mild rather than chaotic.
At 18 tools, the server sits in the heavy range for a typical MCP server. While most tools have distinct uses, several read-only endpoints such as trending hashtags vs. trending posts and bookmarks vs. favourites could potentially be consolidated without losing clarity.
The server covers a broad read surface—profiles, timelines, threads, trends, notifications, and relationships—but lacks any mutation tools for core ActivityPub interactions like posting, replying, boosting, favouriting, or following. This is a significant gap, especially since list-accounts and switch-account are explicitly described as being for write operations yet no write operation exists.
Maintenance
Related MCP Connectors
The Remote MCP server acts as a standardized bridge between LLM applications (like Claude, ChatGPT, and Cursor) and external services, enabling AI agents to access external tools and resources. Its primary capability is providing a centralized search tool to discover other MCP servers and their respective tools. Unlike local implementations, it runs remotely with OAuth authentication and permission controls for security.
Hosted X (Twitter) MCP server for Claude, ChatGPT and Cursor, with each action switched per account.
Hosted MCP server for live public-data APIs and Skills for AI agents.
An MCP server that provides an API to LLMs to manage their JumpCloud resources.
Related MCP Servers
- AlicenseBqualityDmaintenanceA Model Context Protocol server that provides tools for interacting with Mastodon, enabling users to create toots with customizable visibility and attach media files with descriptions.48MIT
- FlicenseNot gradedqualityFmaintenanceAn MCP server that allows Claude to interact with local LLMs running in LM Studio, providing access to list models, generate text, and use chat completions through local models.13-
- FlicenseNot gradedqualityDmaintenanceA customizable Model Context Protocol server built with mcp-framework that enables Claude to access external tools and capabilities through a standardized interface.92 npm-
- AlicenseBqualityDmaintenanceA personal MCP server for AI assistant integration that provides custom tools, resources, and prompts for use with Claude Desktop and other MCP-compatible clients.2MIT