Skip to main content
Glama
cameronrye

AT Protocol MCP Server

get_user_summary

Read-only

Retrieve a user's profile, recent posts, and engagement statistics (average likes, reposts, replies) in a single API call.

Instructions

Get comprehensive user information in a single call, combining profile, recent posts, and engagement statistics. Works without authentication; richer with auth. Use get_user_profile for just the profile or get_author_feed for posts alone; use this tool when you need both in one round-trip. Subject to per-tool rate limiting.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
actorYesHandle (e.g. alice.bsky.social) or DID of the target account.
includeRecentPostsNoWhether to include recent posts in the response. Default true.
postLimitNoNumber of recent posts to fetch (1–50, default 10). Only used when includeRecentPosts or includeEngagementStats is true.
includeEngagementStatsNoWhether to compute engagement statistics (avg likes, reposts, replies) over the recent posts. Default true.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
successYesWhether the summary was retrieved successfully.
profileYesThe user's full profile, including optional viewer context when authenticated.
recentPostsNoRecent posts (present when includeRecentPosts is true).
engagementStatsNoEngagement statistics computed over the fetched posts (present when includeEngagementStats is true).
summaryYesCondensed key metrics for quick consumption.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changedv0.6.2
    • removedInput schema / additionalProperties
      Removed value: -false
  2. Changed5 schema fields changedv0.6.0
    • addedInput schema / properties / actor / description
      Added value: +"Handle (e.g. alice.bsky.social) or DID of the target account."
    • addedInput schema / properties / includeEngagementStats / description
      Added value: +"Whether to compute engagement statistics (avg likes, reposts, replies) over the recent posts. Default true."
    • addedInput schema / properties / includeRecentPosts / description
      Added value: +"Whether to include recent posts in the response. Default true."
    • addedInput schema / properties / postLimit / description
      Added value: +"Number of recent posts to fetch (1–50, default 10). Only used when includeRecentPosts or includeEngagementStats is true."
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "properties": {
      +    "engagementStats": {
      +      "description": "Engagement statistics computed over the fetched posts (present when includeEngagementStats is true).",
      +      "properties": {
      +        "averageLikesPerPost": {
      +          "description": "Mean likes per post.",
      +          "type": "number"
      +        },
      +        "averageRepliesPerPost": {
      +          "description": "Mean replies per post.",
      +          "type": "number"
      +        },
      +        "averageRepostsPerPost": {
      +          "description": "Mean reposts per post.",
      +          "type": "number"
      +        },
      +        "mostLikedPost": {
      +          "description": "The post with the highest like count.",
      +          "type": "object"
      +        },
      +        "mostRepostedPost": {
      +          "description": "The post with the highest repost count.",
      +          "type": "object"
      +        },
      +        "totalLikes": {
      +          "description": "Sum of likes across analysed posts.",
      +          "type": "number"
      +        },
      +        "totalPosts": {
      +          "description": "Number of posts analysed.",
      +          "type": "number"
      +        },
      +        "totalReplies": {
      +          "description": "Sum of replies across analysed posts.",
      +          "type": "number"
      +        },
      +        "totalReposts": {
      +          "description": "Sum of reposts across analysed posts.",
      +          "type": "number"
      +        }
      +      },
      +      "required": [
      +        "totalPosts",
      +        "totalLikes",
      +        "totalReposts",
      +        "totalReplies",
      +        "averageLikesPerPost",
      +        "averageRepostsPerPost",
      +        "averageRepliesPerPost"
      +      ],
      +      "type": "object"
      +    },
      +    "profile": {
      +      "description": "The user's full profile, including optional viewer context when authenticated.",
      +      "properties": {
      +        "avatar": {
      +          "description": "URL to the avatar image.",
      +          "type": "string"
      +        },
      +        "description": {
      +          "description": "Profile bio.",
      +          "type": "string"
      +        },
      +        "did": {
      +          "description": "The user's DID.",
      +          "type": "string"
      +        },
      +        "displayName": {
      +          "description": "The user's display name.",
      +          "type": "string"
      +        },
      +        "followersCount": {
      +          "description": "Number of followers.",
      +          "type": "number"
      +        },
      +        "followsCount": {
      +          "description": "Number of accounts followed.",
      +          "type": "number"
      +        },
      +        "handle": {
      +          "description": "The user's handle.",
      +          "type": "string"
      +        },
      +        "indexedAt": {
      +          "description": "ISO timestamp when the profile was first indexed.",
      +          "type": "string"
      +        },
      +        "postsCount": {
      +          "description": "Total number of posts.",
      +          "type": "number"
      +        },
      +        "viewer": {
      +          "description": "Viewer relationship context (muted, blocking, following, etc.) — only present when authenticated.",
      +          "properties": {
      +            "blockedBy": {
      +              "description": "Whether this account has blocked the authenticated user.",
      +              "type": "boolean"
      +            },
      +            "blocking": {
      +              "description": "AT-URI of the block record if the authenticated user is blocking this account.",
      +              "type": "string"
      +            },
      +            "followedBy": {
      +              "description": "AT-URI of the follow record if this account follows the authenticated user.",
      +              "type": "string"
      +            },
      +            "following": {
      +              "description": "AT-URI of the follow record if the authenticated user follows this account.",
      +              "type": "string"
      +            },
      +            "muted": {
      +              "description": "Whether the authenticated user has muted this account.",
      +              "type": "boolean"
      +            }
      +          },
      +          "type": "object"
      +        }
      +      },
      +      "required": [
      +        "did",
      +        "handle"
      +      ],
      +      "type": "object"
      +    },
      +    "recentPosts": {
      +      "description": "Recent posts (present when includeRecentPosts is true).",
      +      "items": {
      +        "description": "Normalized post view.",
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "success": {
      +      "description": "Whether the summary was retrieved successfully.",
      +      "type": "boolean"
      +    },
      +    "summary": {
      +      "description": "Condensed key metrics for quick consumption.",
      +      "properties": {
      +        "displayName": {
      +          "description": "The user's display name.",
      +          "type": "string"
      +        },
      +        "followersCount": {
      +          "description": "Follower count.",
      +          "type": "number"
      +        },
      +        "followsCount": {
      +          "description": "Following count.",
      +          "type": "number"
      +        },
      +        "handle": {
      +          "description": "The user's handle.",
      +          "type": "string"
      +        },
      +        "isAuthenticated": {
      +          "description": "Whether the current session is authenticated.",
      +          "type": "boolean"
      +        },
      +        "postsCount": {
      +          "description": "Total post count.",
      +          "type": "number"
      +        }
      +      },
      +      "required": [
      +        "handle",
      +        "followersCount",
      +        "followsCount",
      +        "postsCount",
      +        "isAuthenticated"
      +      ],
      +      "type": "object"
      +    }
      +  },
      +  "required": [
      +    "success",
      +    "profile",
      +    "summary"
      +  ],
      +  "type": "object"
      +}
  3. Changed1 schema field changedv0.3.0
    • removedInput schema / $schema
      Removed value: -"http://json-schema.org/draft-07/schema#"
  4. First observedv0.2.1

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true (non-destructive) and openWorldHint=true (variable results). Description adds behavior beyond annotations: mentions rate limiting and authentication sensitivity, which are useful for agent decision-making.

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 concise sentences that front-load the purpose, then provide usage guidelines and behavioral notes. Every sentence adds value with no wasted 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 4 parameters with 100% schema coverage, presence of output schema, and comprehensive annotations, the description is fully adequate. It covers purpose, alternatives, authentication behavior, and rate limiting, leaving no gaps for agent comprehension.

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 baseline is 3. The description does not add significant meaning beyond what the schema provides; it mentions authentication context but does not elaborate on parameter usage or dependencies beyond 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 uses a specific verb ('Get'), identifies the resource ('comprehensive user information'), and distinguishes from sibling tools like get_user_profile and get_author_feed by stating it combines profile, recent posts, and engagement statistics in one call.

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

Usage Guidelines5/5

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

Explicitly states when to use ('when you need both in one round-trip'), when not to use (alternatives get_user_profile and get_author_feed), and authentication context ('Works without authentication; richer with auth').

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