ActivityPub MCP Server
The ActivityPub MCP Server acts as a Fediverse client for LLMs, enabling exploration and interaction with decentralized social networks (Mastodon, Misskey, Pleroma, etc.) via the Model Context Protocol — read-only by default, with optional write access.
Public Read Tools (no account needed)
Discover actors — Look up any Fediverse user profile by handle, retrieving bio, follower/following URLs, and inbox/outbox endpoints
Fetch actor timelines — Retrieve posts from any user's public timeline with pagination
Get post threads — Fetch a post and its full conversation (replies and parent posts) up to configurable depth
Search the Fediverse — Unified search for accounts, posts, or hashtags across any instance
Get trending hashtags/posts — See what's currently trending on a given instance
Get public timelines — Browse an instance's local or federated public timeline
Get instance info — Retrieve detailed metadata about any Fediverse instance
Discover instances — Find instances with filters for software type, language, user count, registration status, and more
Authenticated Read Tools (account required)
List and switch between configured accounts
Verify credentials and obtain account information
Get your personalized home timeline
Retrieve notifications (mentions, follows, boosts, favourites)
Access bookmarks and favourited posts
Check relationship status with other accounts (following, blocked, muted, etc.)
Write Tools (opt-in via ACTIVITYPUB_ENABLE_WRITES=true)
Post, reply, and delete statuses
Boost, favourite, and bookmark posts
Follow, mute, and block accounts
Vote in polls, upload media, and schedule posts
Authentication is handled via OAuth/MiAuth with multi-account support and CLI login. An HTTP transport mode with bearer authentication and a health check endpoint is also available.
Enables interaction with the ActivityPub protocol, allowing discovery and interaction with actors and content across the Fediverse.
Provides tools to interact with Mastodon instances, including reading timelines, posting, and managing accounts.
Provides tools to interact with Misskey instances, including reading timelines, posting, and managing accounts.
Provides tools to interact with Pleroma instances, including reading timelines, posting, and managing accounts.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@ActivityPub MCP Servershow trending posts on mastodon.social"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Install
Requires Node.js 20+.
npx -y activitypub-mcpOne-click install:
Claude Desktop
One-click: download the .mcpb bundle (activitypub-mcp-<version>.mcpb) from the latest release and open it in Claude Desktop.
Manual: edit ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):
{
"mcpServers": {
"activitypub": {
"command": "npx",
"args": ["-y", "activitypub-mcp"]
}
}
}Restart Claude Desktop.
Cursor
Edit ~/.cursor/mcp.json:
{
"mcpServers": {
"activitypub": {
"command": "npx",
"args": ["-y", "activitypub-mcp"]
}
}
}Restart Cursor.
Related MCP server: Claude-LMStudio Bridge
Read-only by default
Out of the box, only read tools are registered: discover actors, fetch timelines, search, get threads, explore instances, read trending content. No write tools exist in the MCP session, so injected fediverse content cannot trigger account actions.
Public read tools (no account needed): discover-actor, fetch-timeline, get-post-thread, get-instance-info, get-public-timeline, get-trending-hashtags, get-trending-posts, search, discover-instances.
Authenticated read tools (account required): list-accounts, switch-account, verify-account, get-home-timeline, get-notifications, get-bookmarks, get-favourites, get-relationship.
Enabling writes
Set ACTIVITYPUB_ENABLE_WRITES=true in the environment or MCP config env block. This registers the full set of mutation tools: post, reply, delete, boost, favourite, bookmark, follow, mute, block, vote, upload media, and scheduled posts. Read the threat model before enabling.
{
"mcpServers": {
"activitypub": {
"command": "npx",
"args": ["-y", "activitypub-mcp"],
"env": {
"ACTIVITYPUB_ENABLE_WRITES": "true"
}
}
}
}Authentication
Log in with the CLI:
npx activitypub-mcp login mastodon.socialThis runs OAuth (Mastodon-family) or MiAuth (Misskey) in your browser and saves credentials to ~/.config/activitypub-mcp/accounts.json. Multi-account is supported — use switch-account to change the active account.
Alternatively, set ACTIVITYPUB_DEFAULT_INSTANCE and ACTIVITYPUB_DEFAULT_TOKEN env vars for a single account without the CLI flow.
Platform support
discover-actor and fetch-timeline speak plain ActivityPub (WebFinger → actor → outbox), so they read any conformant ActivityPub server — Mastodon, Misskey, Foundkey, Pleroma/Akkoma, Lemmy (communities and users), PeerTube (channels and accounts), GoToSocial, and Pixelfed.
The instance-API read tools (search, get-trending-hashtags, get-trending-posts, get-public-timeline) and every write tool require a Mastodon- or Misskey-API instance, since they call those platforms' REST APIs. Login uses OAuth (Mastodon-family) or MiAuth (Misskey).
Example
After adding the server to your MCP client, try:
"Look up @gargron@mastodon.social and summarize their latest posts."
The model will call discover-actor to fetch the profile, then fetch-timeline to read recent posts.
See examples/ for copy-pasteable recipes — Fediverse research digests, scheduled threads, notification triage, image posts with alt text, and topic curation.
HTTP transport
In addition to stdio (default), the server supports HTTP mode with a bearer-gated /mcp endpoint and /health liveness check. Set MCP_HTTP_SECRET (min 16 chars) to enable.
To self-host it as a service, the repo includes a Dockerfile and a docker-compose.yml (HTTP mode):
export MCP_HTTP_SECRET=$(node -e "console.log(require('crypto').randomBytes(32).toString('hex'))")
docker compose up --build # then: curl http://localhost:8080/healthSee the docs for full configuration.
Security
This server fetches world-writable fediverse content — posts, bios, notifications — and feeds it to the LLM. That content can contain prompt-injection payloads. Notifications are an unsolicited channel: anyone can mention your account. The <untrusted-content> envelope and read-only default reduce the risk surface, but do not eliminate it.
See SECURITY.md for the full threat model, SSRF protections, credential handling, and reporting instructions.
Documentation
The full tool reference, resource list, prompt catalog, environment variable guide, and deployment notes live on the docs site:
cameronrye.github.io/activitypub-mcp/docs/
License
MIT — see LICENSE.
Acknowledgments
Built on the Model Context Protocol by Anthropic, and interacts with the decentralized social web as specified by ActivityPub (W3C) and ActivityStreams.
Available Tools
18 toolsdiscover-actorDiscover Fediverse ActorARead-only
Find and retrieve the profile of any fediverse user or account (called an 'actor' in ActivityPub). Returns display name, bio, follower/following URLs, and inbox/outbox endpoints. Pass a handle like '@alice@mastodon.social' or 'alice@mastodon.social'.
| Name | Required | Description | Default |
|---|---|---|---|
| identifier | Yes | Actor handle in 'user@domain' or '@user@domain' form (e.g., 'alice@mastodon.social') |
Output Schema
| Name | Required | Description |
|---|---|---|
| actor | Yes |
TDQS
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.
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.
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.
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.
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.
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 InstancesARead-only
Discover fediverse instances in real-time using the instances.social API with advanced filtering
| Name | Required | Description | Default |
|---|---|---|---|
| software | No | Filter by software type | |
| language | No | Filter by language code (e.g., 'en', 'de', 'ja') | |
| minUsers | No | Minimum number of users | |
| maxUsers | No | Maximum number of users | |
| openRegistrations | No | Only show instances with open registrations | |
| sortBy | No | Sort results by field | |
| sortOrder | No | Sort order (default: desc) | |
| limit | No | Number of results (default: 20) |
Output Schema
| Name | Required | Description |
|---|---|---|
| instances | Yes | |
| hasMore | No |
TDQS
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.
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.
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.
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.
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.
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 TimelineARead-only
Fetch recent posts (the outbox) from any fediverse actor — a user or account — with cursor- and ID-based pagination. Pass a handle like 'alice@mastodon.social'.
| Name | Required | Description | Default |
|---|---|---|---|
| identifier | Yes | Actor identifier (e.g., user@example.social) | |
| limit | No | Number of posts to fetch (default: 20) | |
| cursor | No | Pagination cursor from previous response to fetch next page | |
| minId | No | Return posts newer than this post ID (pagination) | |
| maxId | No | Return posts older than this post ID (pagination) | |
| sinceId | No | Return posts more recent than this post ID |
Output Schema
| Name | Required | Description |
|---|---|---|
| posts | Yes | |
| nextCursor | No | Opaque cursor for the next page, if more results |
| hasMore | No | |
| source | No | Account/actor/instance the posts came from |
TDQS
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.
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.
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.
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.
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.
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 BookmarksBRead-only
Get your bookmarked posts
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Number of posts (default: 20) | |
| accountId | No | Account ID |
Output Schema
| Name | Required | Description |
|---|---|---|
| posts | Yes | |
| nextCursor | No | Opaque cursor for the next page, if more results |
| hasMore | No | |
| source | No | Account/actor/instance the posts came from |
TDQS
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.
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.
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.
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.
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.
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 FavouritesARead-only
Get posts you have favourited
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Number of posts (default: 20) | |
| accountId | No | Account ID |
Output Schema
| Name | Required | Description |
|---|---|---|
| posts | Yes | |
| nextCursor | No | Opaque cursor for the next page, if more results |
| hasMore | No | |
| source | No | Account/actor/instance the posts came from |
TDQS
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.
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.
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.
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.
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.
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 TimelineARead-only
Get your personalized home timeline (posts from accounts you follow)
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Number of posts (default: 20) | |
| maxId | No | Return posts older than this ID | |
| sinceId | No | Return posts newer than this ID | |
| accountId | No | Account ID |
Output Schema
| Name | Required | Description |
|---|---|---|
| posts | Yes | |
| nextCursor | No | Opaque cursor for the next page, if more results |
| hasMore | No | |
| source | No | Account/actor/instance the posts came from |
TDQS
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.
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.
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.
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.
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.
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 InformationARead-only
Get detailed information about a fediverse instance: software and version, description, registration policy, supported languages, user/post/domain counts, and contact account.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | Instance domain (e.g., example.social) |
Output Schema
| Name | Required | Description |
|---|---|---|
| domain | Yes | |
| title | No | |
| description | No | |
| version | No | |
| software | No | |
| users | No | |
| registrationsOpen | No |
TDQS
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.
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.
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.
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.
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.
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 NotificationsCRead-only
Get your notifications (mentions, follows, boosts, favourites)
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Number of notifications (default: 20) | |
| types | No | Filter by notification types | |
| accountId | No | Account ID |
Output Schema
| Name | Required | Description |
|---|---|---|
| notifications | Yes |
TDQS
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.
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.
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.
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.
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.
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 ThreadARead-only
Fetch a post and its full conversation thread including replies and parent posts
| Name | Required | Description | Default |
|---|---|---|---|
| postUrl | Yes | The URL of the post to fetch the thread for | |
| depth | No | How many levels of nested replies to fetch (default: 2) | |
| maxReplies | No | Maximum number of replies to fetch (default: 50) |
Output Schema
| Name | Required | Description |
|---|---|---|
| ancestors | Yes | |
| post | Yes | |
| replies | Yes |
TDQS
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.
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.
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.
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.
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.
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 TimelineARead-only
Fetch an instance's public timeline. scope 'federated' (default) shows posts the instance has seen from across the fediverse; 'local' shows only posts authored on that instance.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | Instance domain, e.g. mastodon.social | |
| scope | No | default: federated | |
| limit | No | Number of posts to fetch (default: 20) | |
| maxId | No | Return results older than this ID (for pagination) |
Output Schema
| Name | Required | Description |
|---|---|---|
| posts | Yes | |
| nextCursor | No | Opaque cursor for the next page, if more results |
| hasMore | No | |
| source | No | Account/actor/instance the posts came from |
TDQS
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.
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.
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.
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.
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.
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 RelationshipARead-only
Check your relationship status with another account (following, followed by, blocking, muting, etc.). Pass a single acct like 'username@instance'. To check multiple accounts, call this tool once per account.
| Name | Required | Description | Default |
|---|---|---|---|
| acct | Yes | Account to check relationship with (username@instance). If you have multiple accounts to check, call this tool once per account. | |
| accountId | No | Your account ID | |
| accountIds | No | Deprecated / not supported. Use 'acct' (a single username@instance string) and call this tool once per account. |
Output Schema
| Name | Required | Description |
|---|---|---|
| acct | Yes | |
| following | No | |
| followedBy | No | |
| blocking | No | |
| muting | No | |
| requested | No |
TDQS
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.
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.
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.
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.
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.
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 PostsARead-only
List your scheduled posts that haven't been published yet
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Number of posts (default: 20) | |
| accountId | No | Account ID |
Output Schema
| Name | Required | Description |
|---|---|---|
| scheduledPosts | Yes |
TDQS
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.
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.
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.
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.
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.
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.
get-trending-hashtagsGet Trending HashtagsARead-only
Get currently trending hashtags on a fediverse instance (Mastodon-compatible instances that expose a trends API).
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | Instance domain (e.g., mastodon.social) | |
| limit | No | Number of hashtags to fetch (default: 20) |
Output Schema
| Name | Required | Description |
|---|---|---|
| hashtags | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, signaling a safe read operation. The description adds useful context: it works only on Mastodon-compatible instances that expose a trends API, which is a significant behavioral constraint not captured by annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single clear sentence with no wasted words. It is front-loaded with the action and resource, making it easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's low complexity (2 parameters, simple read operation, output schema exists), the description is sufficient. It could be slightly more detailed about the return format, but the output schema compensates for that.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both parameters (domain and limit) adequately. The description does not add extra meaning beyond the schema, such as explaining the effect of limit or domain patterns.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Get'), the resource ('trending hashtags'), and the context ('on a fediverse instance, Mastodon-compatible instances that expose a trends API'). It distinguishes itself from sibling tools like get-trending-posts, which deal with posts not hashtags.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage (when you need trending hashtags) but does not explicitly state when not to use it or suggest alternatives. There is no comparison with sibling tools or mention of prerequisites (e.g., instance must support trends API).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-trending-postsGet Trending PostsARead-only
Get currently trending posts on a fediverse instance (Mastodon-compatible instances that expose a trends API).
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | Instance domain (e.g., mastodon.social) | |
| limit | No | Number of posts to fetch (default: 20) |
Output Schema
| Name | Required | Description |
|---|---|---|
| posts | Yes | |
| nextCursor | No | Opaque cursor for the next page, if more results |
| hasMore | No | |
| source | No | Account/actor/instance the posts came from |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds context about compatibly beyond the readOnlyHint annotation, noting that it works only on Mastodon-compatible instances with a trends API. This is useful behavioral disclosure, though it does not cover error handling 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence of 15 words that clearly conveys the purpose without redundancy. It achieves conciseness while including essential context.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is adequate for a simple read tool with an output schema. It provides the domain context and instance compatibility, though it does not address failure cases or usage with non-supporting instances.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% (domain and limit are described). The description adds no parameter-specific detail beyond the overall context, so it meets the baseline without significant added value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('get'), the resource ('trending posts'), and the context ('on a fediverse instance'). It also specifies the scope with a parenthetical about Mastodon-compatible instances that expose a trends API, which helps distinguish it from sibling tools like get-public-timeline or fetch-timeline.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for instances with a trends API but does not explicitly state when to use this tool over siblings like get-trending-hashtags or get-public-timeline. No when-not or alternative guidance is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list-accountsList Configured AccountsARead-only
List all configured authenticated accounts for write operations
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| accounts | Yes | |
| writeEnabled | Yes | |
| activeAccountId | No |
TDQS
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.
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.
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.
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.
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.
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.
searchSearch FediverseARead-only
Unified search across the fediverse - find accounts, posts, or hashtags on any instance
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Search query | |
| domain | No | Instance domain to search on (default: mastodon.social) | |
| type | No | Type of content to search for (default: all) | |
| limit | No | Number of results per type (default: 10) |
Output Schema
| Name | Required | Description |
|---|---|---|
| accounts | No | |
| statuses | No | |
| hashtags | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already communicates that this is a safe read operation. The description adds that it searches across instances, but doesn't disclose additional behavioral traits like pagination, result ordering, or whether it only searches public content. With annotations covering safety, a 3 is appropriate – the description adds some context but is not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that is front-loaded with the core action ('Unified search') and then specifies the searchable content types. It is concise with no wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that the tool has 4 parameters, an output schema, and a readOnly annotation, the description is mostly complete. It covers the scope (any instance) and types of content. Minor gaps: it doesn't explicitly state that results come from the specified domain or default instance, and doesn't mention public-only searches. But the output schema likely clarifies return structure.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description mentions 'accounts, posts, or hashtags', which corresponds to the 'type' parameter, but adds no additional detail beyond the schema for any parameter. It does not explain the 'domain' or 'limit' parameters further.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Unified search across the fediverse - find accounts, posts, or hashtags on any instance'. It uses a specific verb ('search') and identifies the resource (fediverse content) and scope (any instance). This distinguishes it from siblings like get-trending-posts or discover-actor.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance is provided on when to use this tool versus alternatives. The description does not mention when not to use it, nor does it reference sibling tools that might be more appropriate for specific tasks (e.g., get-trending-posts for trends). The implied usage is 'for any federated search', but without exclusions or context.
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
| Name | Required | Description | Default |
|---|---|---|---|
| accountId | Yes | The account ID to switch to (use list-accounts to see IDs) |
Output Schema
| Name | Required | Description |
|---|---|---|
| accountId | No | |
| username | No | |
| instance | No | |
| active | No | |
| verified | No |
TDQS
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.
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.
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.
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.
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.
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 CredentialsBRead-only
Verify that the account credentials are valid and get account information
| Name | Required | Description | Default |
|---|---|---|---|
| accountId | No | The account ID to verify (defaults to active account) |
Output Schema
| Name | Required | Description |
|---|---|---|
| accountId | No | |
| username | No | |
| instance | No | |
| active | No | |
| verified | No |
TDQS
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.
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.
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.
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.
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.
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.
18 tool updates
v3.1.4- Changed
discover-actor1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "actor": { + "additionalProperties": false, + "properties": { + "followers": { + "type": "string" + }, + "following": { + "type": "string" + }, + "id": { + "type": "string" + }, + "inbox": { + "type": "string" + }, + "name": { + "type": "string" + }, + "outbox": { + "type": "string" + }, + "preferredUsername": { + "type": "string" + }, + "summary": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id" + ], + "type": "object" + } + }, + "required": [ + "actor" + ], + "type": "object" +}
- Changed
discover-instances1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "hasMore": { + "type": "boolean" + }, + "instances": { + "items": { + "additionalProperties": false, + "properties": { + "description": { + "type": "string" + }, + "domain": { + "type": "string" + }, + "software": { + "type": "string" + }, + "users": { + "type": "number" + } + }, + "required": [ + "domain" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "instances" + ], + "type": "object" +}
- Changed
fetch-timeline1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "hasMore": { + "type": "boolean" + }, + "nextCursor": { + "description": "Opaque cursor for the next page, if more results", + "type": "string" + }, + "posts": { + "items": { + "additionalProperties": false, + "properties": { + "author": { + "description": "Author handle or display name", + "type": "string" + }, + "content": { + "description": "Plain-text/summarized post body", + "type": "string" + }, + "contentWarning": { + "description": "Content warning / summary, if any", + "type": "string" + }, + "createdAt": { + "description": "ISO timestamp", + "type": "string" + }, + "favourites": { + "type": "number" + }, + "id": { + "description": "Post/status ID", + "type": "string" + }, + "reblogs": { + "type": "number" + }, + "replies": { + "type": "number" + }, + "type": { + "description": "ActivityPub object type (Note, Announce, …)", + "type": "string" + }, + "url": { + "description": "Canonical URL of the post", + "type": "string" + } + }, + "required": [ + "id", + "content" + ], + "type": "object" + }, + "type": "array" + }, + "source": { + "description": "Account/actor/instance the posts came from", + "type": "string" + } + }, + "required": [ + "posts" + ], + "type": "object" +}
- Changed
get-bookmarks1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "hasMore": { + "type": "boolean" + }, + "nextCursor": { + "description": "Opaque cursor for the next page, if more results", + "type": "string" + }, + "posts": { + "items": { + "additionalProperties": false, + "properties": { + "author": { + "description": "Author handle or display name", + "type": "string" + }, + "content": { + "description": "Plain-text/summarized post body", + "type": "string" + }, + "contentWarning": { + "description": "Content warning / summary, if any", + "type": "string" + }, + "createdAt": { + "description": "ISO timestamp", + "type": "string" + }, + "favourites": { + "type": "number" + }, + "id": { + "description": "Post/status ID", + "type": "string" + }, + "reblogs": { + "type": "number" + }, + "replies": { + "type": "number" + }, + "type": { + "description": "ActivityPub object type (Note, Announce, …)", + "type": "string" + }, + "url": { + "description": "Canonical URL of the post", + "type": "string" + } + }, + "required": [ + "id", + "content" + ], + "type": "object" + }, + "type": "array" + }, + "source": { + "description": "Account/actor/instance the posts came from", + "type": "string" + } + }, + "required": [ + "posts" + ], + "type": "object" +}
- Changed
get-favourites1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "hasMore": { + "type": "boolean" + }, + "nextCursor": { + "description": "Opaque cursor for the next page, if more results", + "type": "string" + }, + "posts": { + "items": { + "additionalProperties": false, + "properties": { + "author": { + "description": "Author handle or display name", + "type": "string" + }, + "content": { + "description": "Plain-text/summarized post body", + "type": "string" + }, + "contentWarning": { + "description": "Content warning / summary, if any", + "type": "string" + }, + "createdAt": { + "description": "ISO timestamp", + "type": "string" + }, + "favourites": { + "type": "number" + }, + "id": { + "description": "Post/status ID", + "type": "string" + }, + "reblogs": { + "type": "number" + }, + "replies": { + "type": "number" + }, + "type": { + "description": "ActivityPub object type (Note, Announce, …)", + "type": "string" + }, + "url": { + "description": "Canonical URL of the post", + "type": "string" + } + }, + "required": [ + "id", + "content" + ], + "type": "object" + }, + "type": "array" + }, + "source": { + "description": "Account/actor/instance the posts came from", + "type": "string" + } + }, + "required": [ + "posts" + ], + "type": "object" +}
- Changed
get-home-timeline1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "hasMore": { + "type": "boolean" + }, + "nextCursor": { + "description": "Opaque cursor for the next page, if more results", + "type": "string" + }, + "posts": { + "items": { + "additionalProperties": false, + "properties": { + "author": { + "description": "Author handle or display name", + "type": "string" + }, + "content": { + "description": "Plain-text/summarized post body", + "type": "string" + }, + "contentWarning": { + "description": "Content warning / summary, if any", + "type": "string" + }, + "createdAt": { + "description": "ISO timestamp", + "type": "string" + }, + "favourites": { + "type": "number" + }, + "id": { + "description": "Post/status ID", + "type": "string" + }, + "reblogs": { + "type": "number" + }, + "replies": { + "type": "number" + }, + "type": { + "description": "ActivityPub object type (Note, Announce, …)", + "type": "string" + }, + "url": { + "description": "Canonical URL of the post", + "type": "string" + } + }, + "required": [ + "id", + "content" + ], + "type": "object" + }, + "type": "array" + }, + "source": { + "description": "Account/actor/instance the posts came from", + "type": "string" + } + }, + "required": [ + "posts" + ], + "type": "object" +}
- Changed
get-instance-info1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "description": { + "type": "string" + }, + "domain": { + "type": "string" + }, + "registrationsOpen": { + "type": "boolean" + }, + "software": { + "type": "string" + }, + "title": { + "type": "string" + }, + "users": { + "type": "number" + }, + "version": { + "type": "string" + } + }, + "required": [ + "domain" + ], + "type": "object" +}
- Changed
get-notifications1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "notifications": { + "items": { + "additionalProperties": false, + "properties": { + "account": { + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "id": { + "type": "string" + }, + "status": { + "additionalProperties": false, + "properties": { + "author": { + "description": "Author handle or display name", + "type": "string" + }, + "content": { + "description": "Plain-text/summarized post body", + "type": "string" + }, + "contentWarning": { + "description": "Content warning / summary, if any", + "type": "string" + }, + "createdAt": { + "description": "ISO timestamp", + "type": "string" + }, + "favourites": { + "type": "number" + }, + "id": { + "description": "Post/status ID", + "type": "string" + }, + "reblogs": { + "type": "number" + }, + "replies": { + "type": "number" + }, + "type": { + "description": "ActivityPub object type (Note, Announce, …)", + "type": "string" + }, + "url": { + "description": "Canonical URL of the post", + "type": "string" + } + }, + "required": [ + "id", + "content" + ], + "type": "object" + }, + "type": { + "type": "string" + } + }, + "required": [ + "id", + "type" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "notifications" + ], + "type": "object" +}
- Changed
get-post-thread1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "ancestors": { + "items": { + "additionalProperties": false, + "properties": { + "author": { + "description": "Author handle or display name", + "type": "string" + }, + "content": { + "description": "Plain-text/summarized post body", + "type": "string" + }, + "contentWarning": { + "description": "Content warning / summary, if any", + "type": "string" + }, + "createdAt": { + "description": "ISO timestamp", + "type": "string" + }, + "favourites": { + "type": "number" + }, + "id": { + "description": "Post/status ID", + "type": "string" + }, + "reblogs": { + "type": "number" + }, + "replies": { + "type": "number" + }, + "type": { + "description": "ActivityPub object type (Note, Announce, …)", + "type": "string" + }, + "url": { + "description": "Canonical URL of the post", + "type": "string" + } + }, + "required": [ + "id", + "content" + ], + "type": "object" + }, + "type": "array" + }, + "post": { + "additionalProperties": false, + "properties": { + "author": { + "description": "Author handle or display name", + "type": "string" + }, + "content": { + "description": "Plain-text/summarized post body", + "type": "string" + }, + "contentWarning": { + "description": "Content warning / summary, if any", + "type": "string" + }, + "createdAt": { + "description": "ISO timestamp", + "type": "string" + }, + "favourites": { + "type": "number" + }, + "id": { + "description": "Post/status ID", + "type": "string" + }, + "reblogs": { + "type": "number" + }, + "replies": { + "type": "number" + }, + "type": { + "description": "ActivityPub object type (Note, Announce, …)", + "type": "string" + }, + "url": { + "description": "Canonical URL of the post", + "type": "string" + } + }, + "required": [ + "id", + "content" + ], + "type": "object" + }, + "replies": { + "items": { + "additionalProperties": false, + "properties": { + "author": { + "description": "Author handle or display name", + "type": "string" + }, + "content": { + "description": "Plain-text/summarized post body", + "type": "string" + }, + "contentWarning": { + "description": "Content warning / summary, if any", + "type": "string" + }, + "createdAt": { + "description": "ISO timestamp", + "type": "string" + }, + "favourites": { + "type": "number" + }, + "id": { + "description": "Post/status ID", + "type": "string" + }, + "reblogs": { + "type": "number" + }, + "replies": { + "type": "number" + }, + "type": { + "description": "ActivityPub object type (Note, Announce, …)", + "type": "string" + }, + "url": { + "description": "Canonical URL of the post", + "type": "string" + } + }, + "required": [ + "id", + "content" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "ancestors", + "post", + "replies" + ], + "type": "object" +}
- Changed
get-public-timeline1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "hasMore": { + "type": "boolean" + }, + "nextCursor": { + "description": "Opaque cursor for the next page, if more results", + "type": "string" + }, + "posts": { + "items": { + "additionalProperties": false, + "properties": { + "author": { + "description": "Author handle or display name", + "type": "string" + }, + "content": { + "description": "Plain-text/summarized post body", + "type": "string" + }, + "contentWarning": { + "description": "Content warning / summary, if any", + "type": "string" + }, + "createdAt": { + "description": "ISO timestamp", + "type": "string" + }, + "favourites": { + "type": "number" + }, + "id": { + "description": "Post/status ID", + "type": "string" + }, + "reblogs": { + "type": "number" + }, + "replies": { + "type": "number" + }, + "type": { + "description": "ActivityPub object type (Note, Announce, …)", + "type": "string" + }, + "url": { + "description": "Canonical URL of the post", + "type": "string" + } + }, + "required": [ + "id", + "content" + ], + "type": "object" + }, + "type": "array" + }, + "source": { + "description": "Account/actor/instance the posts came from", + "type": "string" + } + }, + "required": [ + "posts" + ], + "type": "object" +}
- Changed
get-relationship2 fields changed- added
Input schema / properties / accountIds / descriptionAdded value: +"Deprecated / not supported. Use 'acct' (a single username@instance string) and call this tool once per account." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "acct": { + "type": "string" + }, + "blocking": { + "type": "boolean" + }, + "followedBy": { + "type": "boolean" + }, + "following": { + "type": "boolean" + }, + "muting": { + "type": "boolean" + }, + "requested": { + "type": "boolean" + } + }, + "required": [ + "acct" + ], + "type": "object" +}
- Added
get-scheduled-posts - Changed
get-trending-hashtags1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "hashtags": { + "items": { + "additionalProperties": false, + "properties": { + "accounts": { + "type": "number" + }, + "name": { + "type": "string" + }, + "url": { + "type": "string" + }, + "uses": { + "type": "number" + } + }, + "required": [ + "name" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "hashtags" + ], + "type": "object" +}
- Changed
get-trending-posts1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "hasMore": { + "type": "boolean" + }, + "nextCursor": { + "description": "Opaque cursor for the next page, if more results", + "type": "string" + }, + "posts": { + "items": { + "additionalProperties": false, + "properties": { + "author": { + "description": "Author handle or display name", + "type": "string" + }, + "content": { + "description": "Plain-text/summarized post body", + "type": "string" + }, + "contentWarning": { + "description": "Content warning / summary, if any", + "type": "string" + }, + "createdAt": { + "description": "ISO timestamp", + "type": "string" + }, + "favourites": { + "type": "number" + }, + "id": { + "description": "Post/status ID", + "type": "string" + }, + "reblogs": { + "type": "number" + }, + "replies": { + "type": "number" + }, + "type": { + "description": "ActivityPub object type (Note, Announce, …)", + "type": "string" + }, + "url": { + "description": "Canonical URL of the post", + "type": "string" + } + }, + "required": [ + "id", + "content" + ], + "type": "object" + }, + "type": "array" + }, + "source": { + "description": "Account/actor/instance the posts came from", + "type": "string" + } + }, + "required": [ + "posts" + ], + "type": "object" +}
- Changed
list-accounts1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "accounts": { + "items": { + "additionalProperties": false, + "properties": { + "id": { + "type": "string" + }, + "instance": { + "type": "string" + }, + "isActive": { + "type": "boolean" + }, + "label": { + "type": "string" + }, + "scopes": { + "items": { + "type": "string" + }, + "type": "array" + }, + "username": { + "type": "string" + } + }, + "required": [ + "id", + "username", + "instance", + "isActive", + "scopes" + ], + "type": "object" + }, + "type": "array" + }, + "activeAccountId": { + "type": "string" + }, + "writeEnabled": { + "type": "boolean" + } + }, + "required": [ + "accounts", + "writeEnabled" + ], + "type": "object" +}
- Changed
search1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "accounts": { + "items": { + "additionalProperties": false, + "properties": { + "followers": { + "type": "string" + }, + "following": { + "type": "string" + }, + "id": { + "type": "string" + }, + "inbox": { + "type": "string" + }, + "name": { + "type": "string" + }, + "outbox": { + "type": "string" + }, + "preferredUsername": { + "type": "string" + }, + "summary": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id" + ], + "type": "object" + }, + "type": "array" + }, + "hashtags": { + "items": { + "additionalProperties": false, + "properties": { + "name": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + }, + "type": "array" + }, + "statuses": { + "items": { + "additionalProperties": false, + "properties": { + "author": { + "description": "Author handle or display name", + "type": "string" + }, + "content": { + "description": "Plain-text/summarized post body", + "type": "string" + }, + "contentWarning": { + "description": "Content warning / summary, if any", + "type": "string" + }, + "createdAt": { + "description": "ISO timestamp", + "type": "string" + }, + "favourites": { + "type": "number" + }, + "id": { + "description": "Post/status ID", + "type": "string" + }, + "reblogs": { + "type": "number" + }, + "replies": { + "type": "number" + }, + "type": { + "description": "ActivityPub object type (Note, Announce, …)", + "type": "string" + }, + "url": { + "description": "Canonical URL of the post", + "type": "string" + } + }, + "required": [ + "id", + "content" + ], + "type": "object" + }, + "type": "array" + } + }, + "type": "object" +}
- Changed
switch-account1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "accountId": { + "type": "string" + }, + "active": { + "type": "boolean" + }, + "instance": { + "type": "string" + }, + "username": { + "type": "string" + }, + "verified": { + "type": "boolean" + } + }, + "type": "object" +}
- Changed
verify-account1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "accountId": { + "type": "string" + }, + "active": { + "type": "boolean" + }, + "instance": { + "type": "string" + }, + "username": { + "type": "string" + }, + "verified": { + "type": "boolean" + } + }, + "type": "object" +}
1 tool update
v3.1.2- Changed
fetch-timeline3 fields changed- changed
Input schema / properties / maxId / descriptionPrevious value: -"Return results older than this ID"New value: +"Return posts older than this post ID (pagination)" - changed
Input schema / properties / minId / descriptionPrevious value: -"Return results newer than this ID"New value: +"Return posts newer than this post ID (pagination)" - changed
Input schema / properties / sinceId / descriptionPrevious value: -"Return results since this ID"New value: +"Return posts more recent than this post ID"
17 tool updates
v0.1.0- First observed
discover-actor - First observed
discover-instances - First observed
fetch-timeline - First observed
get-bookmarks - First observed
get-favourites - First observed
get-home-timeline - First observed
get-instance-info - First observed
get-notifications - First observed
get-post-thread - First observed
get-public-timeline - First observed
get-relationship - First observed
get-trending-hashtags - First observed
get-trending-posts - First observed
list-accounts - First observed
search - First observed
switch-account - First observed
verify-account
TDQS
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.
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.
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.
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
Related MCP Connectors
The Remote MCP server acts as a standardized bridge between LLM applications (like Claude, ChatGPT, and Cursor) and external services, enabling AI agents to access external tools and resources. Its primary capability is providing a centralized search tool to discover other MCP servers and their respective tools. Unlike local implementations, it runs remotely with OAuth authentication and permission controls for security.
- UnifAPIOAuthcom.unifapi
Hosted MCP server for live public-data APIs and Skills for AI agents.
An MCP server that provides an API to LLMs to manage their JumpCloud resources.
- MysocialOAuthio.mysocial
Social media MCP server: your Instagram, TikTok, YouTube, LinkedIn and Threads history for your AI.
1
Related MCP Servers
- AlicenseBqualityDmaintenanceA Model Context Protocol server that provides tools for interacting with Mastodon, enabling users to create toots with customizable visibility and attach media files with descriptions.48MIT
- FlicenseNot gradedqualityFmaintenanceAn MCP server that allows Claude to interact with local LLMs running in LM Studio, providing access to list models, generate text, and use chat completions through local models.13-
- FlicenseNot gradedqualityDmaintenanceA customizable Model Context Protocol server built with mcp-framework that enables Claude to access external tools and capabilities through a standardized interface.88-
- AlicenseBqualityDmaintenanceA personal MCP server for AI assistant integration that provides custom tools, resources, and prompts for use with Claude Desktop and other MCP-compatible clients.2MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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