Skip to main content
Glama
cameronrye

ActivityPub MCP Server


Install

Requires Node.js 20+.

npx -y activitypub-mcp

One-click install:

Add to Cursor Install in VS Code

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.social

This 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/health

See 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 tools
discover-actorDiscover Fediverse ActorA
Read-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'.

ParametersJSON Schema
NameRequiredDescriptionDefault
identifierYesActor handle in 'user@domain' or '@user@domain' form (e.g., 'alice@mastodon.social')

Output Schema

ParametersJSON Schema
NameRequiredDescription
actorYes

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=true, so no contradiction. Description adds return field details beyond annotations but does not disclose additional behavioral traits (e.g., rate limits, privacy implications, or whether federation errors occur for non-existent handles).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, directly stating purpose, return fields, and input format. No filler; every sentence adds essential information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter, read-only tool with an output schema (not shown but referenced), the description fully covers what the tool does, what it returns, and how to invoke it. No gaps given the context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with a description for 'identifier'. Tool description supplements with concrete examples of valid handle formats and indicates that the '@' prefix is optional, adding value beyond the schema's pattern.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states the tool finds and retrieves fediverse actor profiles, listing specific return fields (display name, bio, follower/following URLs, inbox/outbox). Distinguishes from sibling 'discover-instances' by focusing on actors.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides specific handle format examples ('@alice@mastodon.social' or 'alice@mastodon.social') but lacks explicit guidance on when to use this tool versus siblings like 'search' or 'list-accounts' for similar lookups.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

discover-instancesDiscover Fediverse InstancesA
Read-only

Discover fediverse instances in real-time using the instances.social API with advanced filtering

ParametersJSON Schema
NameRequiredDescriptionDefault
softwareNoFilter by software type
languageNoFilter by language code (e.g., 'en', 'de', 'ja')
minUsersNoMinimum number of users
maxUsersNoMaximum number of users
openRegistrationsNoOnly show instances with open registrations
sortByNoSort results by field
sortOrderNoSort order (default: desc)
limitNoNumber of results (default: 20)

Output Schema

ParametersJSON Schema
NameRequiredDescription
instancesYes
hasMoreNo

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true. The description adds value by noting the tool operates in 'real-time' and uses an external API, providing meaningful behavioral context beyond the annotation. However, it does not disclose rate limits or error handling details.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, well-structured sentence that front-loads the key action and resource, with no unnecessary words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the 8 parameters with full schema descriptions, an output schema, and annotations, the description adequately covers the tool's purpose and source. It mentions the external API and real-time nature, making it complete for agent usage.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all parameters. The description's mention of 'advanced filtering' adds minimal value beyond the schema, meeting the baseline of 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Discover', the resource 'fediverse instances', the source 'instances.social API', and the capability 'advanced filtering'. It effectively distinguishes from sibling tools like 'discover-actor' which focuses on individual actors.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for discovering instances but does not explicitly state when to use this tool over alternatives or provide exclusions. The context is clear but lacks comparative guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

fetch-timelineFetch Actor TimelineA
Read-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'.

ParametersJSON Schema
NameRequiredDescriptionDefault
identifierYesActor identifier (e.g., user@example.social)
limitNoNumber of posts to fetch (default: 20)
cursorNoPagination cursor from previous response to fetch next page
minIdNoReturn posts newer than this post ID (pagination)
maxIdNoReturn posts older than this post ID (pagination)
sinceIdNoReturn posts more recent than this post ID

Output Schema

ParametersJSON Schema
NameRequiredDescription
postsYes
nextCursorNoOpaque cursor for the next page, if more results
hasMoreNo
sourceNoAccount/actor/instance the posts came from

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=true, confirming safe read operation. Description adds detail about cursor- and ID-based pagination. No contradictions, but no mention of rate limits or error handling for invalid handles.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences: first states purpose and pagination, second provides a concrete example. No wasted words, front-loaded with key information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (6 parameters, pagination, output schema exists), the description covers the essential behavior and usage. No gaps identified.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all parameters. Description reinforces the identifier format and pagination types, adding marginal value beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description states exactly what the tool does: fetch recent posts (outbox) from any fediverse actor with pagination. It clearly distinguishes from sibling tools like get-public-timeline or get-home-timeline.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Clearly describes when to use: to fetch posts from a specific actor. Provides example handle format. Could explicitly mention not to use for public timelines or home timelines, but context with sibling tools makes it clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get-bookmarksGet BookmarksB
Read-only

Get your bookmarked posts

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoNumber of posts (default: 20)
accountIdNoAccount ID

Output Schema

ParametersJSON Schema
NameRequiredDescription
postsYes
nextCursorNoOpaque cursor for the next page, if more results
hasMoreNo
sourceNoAccount/actor/instance the posts came from

TDQS

B3.1/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The readOnlyHint annotation already indicates a safe read operation. The description adds no extra behavioral details (e.g., authentication requirements, privacy of bookmarks, or pagination behavior beyond what the schema provides).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, concise sentence that is front-loaded with the core action. It is appropriately sized, though it could be slightly more informative without losing conciseness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the existence of a complete input schema (100% coverage) and an output schema, the description is reasonably complete for a simple read operation. It captures the main functionality, though it could mention that bookmarks are private to the user.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 100% coverage for both parameters (limit and accountId) with descriptions. The tool description does not add any additional meaning beyond what the schema already provides, resulting in baseline score.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Get') and the resource ('your bookmarked posts'), making the purpose unambiguous. However, it does not explicitly distinguish this tool from similar siblings like 'get-favourites', relying on the name alone for differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives (e.g., 'get-favourites', 'fetch-timeline'). The description lacks context for appropriate usage scenarios.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get-favouritesGet FavouritesA
Read-only

Get posts you have favourited

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoNumber of posts (default: 20)
accountIdNoAccount ID

Output Schema

ParametersJSON Schema
NameRequiredDescription
postsYes
nextCursorNoOpaque cursor for the next page, if more results
hasMoreNo
sourceNoAccount/actor/instance the posts came from

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already declare readOnlyHint=true, and the description adds context (personal favourited posts), but does not disclose additional behaviors such as pagination or sorting.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, efficient sentence that conveys the tool's purpose with no unnecessary words or information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the output schema exists and the tool is simple, the description is sufficiently complete. However, it could mention that accountId and limit are optional.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents the parameters. The description adds no extra meaning beyond what is provided in the input schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description 'Get posts you have favourited' clearly identifies the action (get) and the specific resource (favourited posts), distinguishing it from siblings like get-bookmarks or get-home-timeline.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use (to retrieve favourited posts) but provides no explicit guidance on when not to use it or how it compares to alternatives like get-bookmarks.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get-home-timelineGet Home TimelineA
Read-only

Get your personalized home timeline (posts from accounts you follow)

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoNumber of posts (default: 20)
maxIdNoReturn posts older than this ID
sinceIdNoReturn posts newer than this ID
accountIdNoAccount ID

Output Schema

ParametersJSON Schema
NameRequiredDescription
postsYes
nextCursorNoOpaque cursor for the next page, if more results
hasMoreNo
sourceNoAccount/actor/instance the posts came from

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so no contradiction. The description adds that it returns personalized content from followed accounts, but lacks additional behavioral context like pagination behavior or 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, concise sentence that immediately conveys the tool's purpose without unnecessary words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the existence of an output schema and thorough parameter descriptions, the description is adequate. It could mention optionality or defaults, but the schema already provides details.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, with clear descriptions for all four parameters. The description adds no extra meaning, so baseline score of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Get' and the resource 'personalized home timeline', with the clarification that it includes posts from accounts you follow. This effectively distinguishes it from siblings like get-public-timeline.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for retrieving the authenticated user's timeline but does not provide explicit when or when-not guidance, nor does it mention alternatives such as fetch-timeline or get-public-timeline.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get-instance-infoGet Instance InformationA
Read-only

Get detailed information about a fediverse instance: software and version, description, registration policy, supported languages, user/post/domain counts, and contact account.

ParametersJSON Schema
NameRequiredDescriptionDefault
domainYesInstance domain (e.g., example.social)

Output Schema

ParametersJSON Schema
NameRequiredDescription
domainYes
titleNo
descriptionNo
versionNo
softwareNo
usersNo
registrationsOpenNo

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnlyHint=true, making it clear this is a read operation. The description adds specific data fields returned, which is useful, but does not disclose any potential limitations (e.g., rate limits, authentication requirements) or details 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, well-structured sentence that front-loads the main purpose and lists key data types concisely. Every part adds value; no extraneous words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the simple single-parameter input and the existence of an output schema (inferred from context), the description covers the tool's functionality well. It lists the major categories of returned information, though it might be slightly improved by noting that the output schema contains the full structure.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% (the 'domain' parameter has a description with an example). The tool description adds no additional semantic value beyond what the schema already provides, so a baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it retrieves detailed information about a fediverse instance and lists specific data fields (software, version, description, registration policy, counts, etc.), distinguishing it from sibling tools like discover-actor or discover-instances which serve different purposes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit guidance on when to use this tool versus alternatives. While the purpose is clear, there is no mention of when to prefer this over sibling tools like discover-instances for browsing instances or get-post-thread for post details.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get-notificationsGet NotificationsC
Read-only

Get your notifications (mentions, follows, boosts, favourites)

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoNumber of notifications (default: 20)
typesNoFilter by notification types
accountIdNoAccount ID

Output Schema

ParametersJSON Schema
NameRequiredDescription
notificationsYes

TDQS

C2.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds some behavioral context by listing notification types, but the readOnlyHint annotation already indicates a read operation. The description does not disclose further behavioral traits like pagination or ordering, but the bar is lowered due to annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is very concise (one sentence), which is good, but it omits important details such as filtering options and the fact that the types list is not exhaustive. It is front-loaded but insufficiently complete.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the presence of a full schema and output schema, the description should still provide context about filtering by types and limit. The current version is incomplete and may mislead about available notification types.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 100% coverage with clear parameter descriptions for 'limit', 'types', and 'accountId'. The tool description does not add any additional semantic meaning beyond the schema, so a baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Get' and the resource 'notifications', with examples of types in parentheses. However, it does not differentiate from siblings like 'get-favourites' or 'get-bookmarks', and the listed types are incomplete, not matching the full set in the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives, such as 'get-favourites' for liked posts or 'fetch-timeline' for chronological posts. The description lacks context for appropriate usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get-post-threadGet Post ThreadA
Read-only

Fetch a post and its full conversation thread including replies and parent posts

ParametersJSON Schema
NameRequiredDescriptionDefault
postUrlYesThe URL of the post to fetch the thread for
depthNoHow many levels of nested replies to fetch (default: 2)
maxRepliesNoMaximum number of replies to fetch (default: 50)

Output Schema

ParametersJSON Schema
NameRequiredDescription
ancestorsYes
postYes
repliesYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already provide 'readOnlyHint: true', so the description adds value by detailing that the tool fetches replies and parent posts, confirming it is a read operation with specific output scope. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence that is front-loaded with the core action and resource, containing no extraneous words. Every part is necessary and informative.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has 3 parameters, full schema coverage, and an output schema, the description is complete enough for an agent to understand its purpose and invocation context. The existence of an output schema alleviates the need to describe return values.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already explains each parameter. The description does not add additional semantic meaning beyond what is in the schema, so it meets the baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'fetch' and the specific resource: 'a post and its full conversation thread including replies and parent posts'. It distinguishes from siblings like 'get-home-timeline' or 'get-public-timeline' that focus on timelines rather than a single post's thread.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

While the description is clear about what it does, it does not explicitly state when to use this tool vs alternatives like 'fetch-timeline' or 'get-public-timeline'. However, the context of a thread conversation is distinct enough that usage is implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get-public-timelineGet Public TimelineA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
domainYesInstance domain, e.g. mastodon.social
scopeNodefault: federated
limitNoNumber of posts to fetch (default: 20)
maxIdNoReturn results older than this ID (for pagination)

Output Schema

ParametersJSON Schema
NameRequiredDescription
postsYes
nextCursorNoOpaque cursor for the next page, if more results
hasMoreNo
sourceNoAccount/actor/instance the posts came from

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so the tool is known to be safe. The description adds value by describing what each scope returns, which is behavioral context beyond the annotation. It does not contradict annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise at two sentences, front-loading the core purpose ('Fetch an instance's public timeline') and then elaborating on the scope parameter. Every sentence is necessary and informative.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given that the input schema describes all parameters, annotations declare read-only behavior, and an output schema exists (so return format is documented elsewhere), the description is adequately complete. It covers the essential purpose and scope behavior. Missing would be authentication prerequisites or pagination details, but these are either implied or covered by the schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so parameters are well-documented. The description adds meaningful context for the 'scope' parameter by explaining the difference between 'federated' and 'local' posts, which goes beyond the schema's default value note. For other parameters, the description adds no new info, but the schema already suffices.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it fetches an instance's public timeline and explains the two scope options ('federated' and 'local'). However, it does not distinguish from sibling tools like 'fetch-timeline' or 'get-home-timeline', which may cause confusion about when to use this tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides guidance on the scope parameter (when to use federated vs local), but does not offer any advice on when to use this tool versus its siblings, nor does it mention when not to use it. No alternative tools are suggested.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get-relationshipGet RelationshipA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
acctYesAccount to check relationship with (username@instance). If you have multiple accounts to check, call this tool once per account.
accountIdNoYour account ID
accountIdsNoDeprecated / not supported. Use 'acct' (a single username@instance string) and call this tool once per account.

Output Schema

ParametersJSON Schema
NameRequiredDescription
acctYes
followingNo
followedByNo
blockingNo
mutingNo
requestedNo

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description is consistent with the readOnlyHint annotation (true), as it describes a 'check' operation. It adds behavioral context beyond annotations, such as the types of relationship statuses returned (following, followed by, blocking, muting, etc.). No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise with two sentences, each serving a clear purpose: stating the tool's function and providing usage instructions. No unnecessary words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given that an output schema exists (not shown, but mentioned), the description does not need to explain return values. The combination of description, annotations, and input schema provides a complete picture for the agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has full description coverage (100%) for all three parameters. The description adds meaning by specifying the format for 'acct' (username@instance) and giving usage guidance for multiple accounts. It also clarifies that 'accountIds' is deprecated, which is not evident from the schema alone.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it checks relationship status with another account, listing specific statuses like following, blocked, etc. It distinguishes itself from sibling tools by focusing on relationship checking, which is not covered by other tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear instructions: pass a single acct in 'username@instance' format, and for multiple accounts call once per account. It implicitly tells when to use (when you need a relationship check) but does not explicitly mention when not to use or alternative tools, though the sibling tools are distinct.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get-scheduled-postsGet Scheduled PostsA
Read-only

List your scheduled posts that haven't been published yet

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoNumber of posts (default: 20)
accountIdNoAccount ID

Output Schema

ParametersJSON Schema
NameRequiredDescription
scheduledPostsYes

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description is consistent with the readOnlyHint annotation, indicating a read operation. It adds the nuance that only unpublished posts are listed, but does not provide additional behavioral details beyond what annotations already convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single, front-loaded sentence with no unnecessary words. Efficiently communicates the tool's core function.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple listing tool with an output schema, the description is adequate. It covers the essential functional scope, though it omits optional details like ordering or pagination.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with clear descriptions for both parameters (limit, accountId). The description does not add further meaning to the parameters beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('List') and the resource ('your scheduled posts that haven't been published yet'). It uniquely identifies the tool's purpose among siblings like fetch-timeline and get-home-timeline.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use (to see unpublished scheduled posts) but does not explicitly state when not to use or mention alternatives. Given the sibling list, the context is clear but not stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list-accountsList Configured AccountsA
Read-only

List all configured authenticated accounts for write operations

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
accountsYes
writeEnabledYes
activeAccountIdNo

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotation indicates readOnlyHint=true, so the tool is safe. The description adds context that the accounts listed are configured for write operations, providing extra behavioral insight beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence that conveys all necessary information without fluff, earning its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (no parameters, has output schema), the description completely covers the purpose and context. The presence of an output schema obviates the need to describe return values.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There are no parameters, and schema description coverage is 100%. The description does not need to add parameter details; it succinctly describes the output.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists all configured authenticated accounts, specifying they are for write operations. The name and title are self-explanatory, and no sibling tool serves the same purpose.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit guidance on when to use this tool versus alternatives. However, as a simple list tool with no parameters, the context of use is straightforward and implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

switch-accountSwitch Active AccountA

Switch the active account used for write operations

ParametersJSON Schema
NameRequiredDescriptionDefault
accountIdYesThe account ID to switch to (use list-accounts to see IDs)

Output Schema

ParametersJSON Schema
NameRequiredDescription
accountIdNo
usernameNo
instanceNo
activeNo
verifiedNo

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already set readOnlyHint=false, indicating a mutation. The description adds 'for write operations' which reinforces the context but does not disclose additional behaviors like side effects or scope limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence with no wasted words. Every part is necessary and front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (1 required param, output schema exists), the description is mostly sufficient. It could add a note about the effect on subsequent write operations, but overall it covers the essential context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The single parameter is described in the schema with 'use list-accounts to see IDs'. The description adds no extra meaning beyond what the schema already provides, and schema coverage is 100%, earning baseline 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Switch'), the resource ('active account'), and the scope ('for write operations'). It distinguishes this tool from siblings like 'list-accounts' which only list accounts.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage when you want to change the active account for writes but does not explicitly state when to use it, prerequisites (e.g., call list-accounts first), or when not to use it. No alternative tool is mentioned.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

verify-accountVerify Account CredentialsB
Read-only

Verify that the account credentials are valid and get account information

ParametersJSON Schema
NameRequiredDescriptionDefault
accountIdNoThe account ID to verify (defaults to active account)

Output Schema

ParametersJSON Schema
NameRequiredDescription
accountIdNo
usernameNo
instanceNo
activeNo
verifiedNo

TDQS

B3.4/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With readOnlyHint already declared in annotations, the description adds no extra behavioral context. It doesn't disclose what happens if credentials are invalid, whether rate limits apply, or the nature of the returned account information. Given the annotations provide safety guarantees, the description fails to add additional value.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise—a single sentence that directly conveys the tool's purpose. No superfluous information is present, and it is front-loaded with the primary action.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the presence of an output schema and low complexity (one optional parameter), the description is sufficiently complete. It could briefly mention that it validates credentials before returning info, but overall it meets the needs for a simple verification tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the input parameter is fully documented in the schema. The description does not add any additional meaning or context beyond what the schema already provides, meeting the baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's action: verifying credentials and retrieving account information. While it doesn't explicitly distinguish from siblings like 'list-accounts' or 'discover-actor', the purpose is specific enough for an agent to understand the core function.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for credential validation, but lacks explicit guidance on when to use this tool versus alternatives (e.g., 'get-relationship' or 'switch-account'). It provides no exclusions or prerequisites, though the context suggests it's useful before other account-sensitive operations.

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. Dates show when Glama detected each change.

  1. 18 tool updatesv3.1.4
    • Changeddiscover-actor1 field changed
      • changedOutput 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"
        +}
    • Changeddiscover-instances1 field changed
      • changedOutput 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"
        +}
    • Changedfetch-timeline1 field changed
      • changedOutput 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"
        +}
    • Changedget-bookmarks1 field changed
      • changedOutput 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"
        +}
    • Changedget-favourites1 field changed
      • changedOutput 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"
        +}
    • Changedget-home-timeline1 field changed
      • changedOutput 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"
        +}
    • Changedget-instance-info1 field changed
      • changedOutput 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"
        +}
    • Changedget-notifications1 field changed
      • changedOutput 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"
        +}
    • Changedget-post-thread1 field changed
      • changedOutput 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"
        +}
    • Changedget-public-timeline1 field changed
      • changedOutput 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"
        +}
    • Changedget-relationship2 fields changed
      • addedInput schema / properties / accountIds / description
        Added value: +"Deprecated / not supported. Use 'acct' (a single username@instance string) and call this tool once per account."
      • changedOutput 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"
        +}
    • Addedget-scheduled-posts
    • Changedget-trending-hashtags1 field changed
      • changedOutput 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"
        +}
    • Changedget-trending-posts1 field changed
      • changedOutput 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"
        +}
    • Changedlist-accounts1 field changed
      • changedOutput 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"
        +}
    • Changedsearch1 field changed
      • changedOutput 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"
        +}
    • Changedswitch-account1 field changed
      • changedOutput 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"
        +}
    • Changedverify-account1 field changed
      • changedOutput 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"
        +}
  2. 1 tool updatev3.1.2
    • Changedfetch-timeline3 fields changed
      • changedInput schema / properties / maxId / description
        Previous value: -"Return results older than this ID"New value: +"Return posts older than this post ID (pagination)"
      • changedInput schema / properties / minId / description
        Previous value: -"Return results newer than this ID"New value: +"Return posts newer than this post ID (pagination)"
      • changedInput schema / properties / sinceId / description
        Previous value: -"Return results since this ID"New value: +"Return posts more recent than this post ID"
  3. 17 tool updatesv0.1.0
    • First observeddiscover-actor
    • First observeddiscover-instances
    • First observedfetch-timeline
    • First observedget-bookmarks
    • First observedget-favourites
    • First observedget-home-timeline
    • First observedget-instance-info
    • First observedget-notifications
    • First observedget-post-thread
    • First observedget-public-timeline
    • First observedget-relationship
    • First observedget-trending-hashtags
    • First observedget-trending-posts
    • First observedlist-accounts
    • First observedsearch
    • First observedswitch-account
    • First observedverify-account

TDQS

A3.8/5.0
Disambiguation5/5

Each tool targets a distinct resource or operation: discovery, timelines, bookmarks, favourites, notifications, instance info, relationships, trending, account management, and search. No two tools have overlapping purposes; all are clearly differentiated.

Naming Consistency5/5

All tool names follow a consistent verb-noun pattern using snake_case with hyphens (e.g., discover-actor, get-home-timeline, switch-account). The same style is maintained across all 17 tools, with no mixing of conventions.

Tool Count4/5

17 tools is slightly above the ideal range of 3-15, but the domain of ActivityPub/fediverse is broad enough to justify the count. The tools are well-scoped and each serves a distinct purpose, so the number is reasonable.

Completeness2/5

The tool set is heavily read-oriented, covering discovery, timelines, bookmarks, etc., but lacks essential write operations such as creating posts, favouriting, following, or boosting. This makes it incomplete for typical fediverse interaction, leaving significant gaps.

Maintenance

ActivityStale
ResponsivenessSlow

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    D
    maintenance
    A 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.
    4
    8
    MIT
  • F
    license
    Not graded
    quality
    D
    maintenance
    A customizable Model Context Protocol server built with mcp-framework that enables Claude to access external tools and capabilities through a standardized interface.
    88
    -
  • A
    license
    B
    quality
    D
    maintenance
    A personal MCP server for AI assistant integration that provides custom tools, resources, and prompts for use with Claude Desktop and other MCP-compatible clients.
    2
    MIT

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/cameronrye/activitypub-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server