Skip to main content
Glama

get_user_activity

Read-onlyIdempotent

Aggregate a user's activity across multiple groups to get counts by kind, group, and month, plus first/last activity timestamps and a sample of recent events. Ideal for analyzing participation and comparing users.

Instructions

Aggregate one user's activity across a set of groups. Server-side: fans out across every discussion in the specified groups, fetches its event stream, filters to events authored by the target user, and returns counts (by kind, by group, by month), plus first/last activity timestamps and a sample of recent events. Required: user_id, group_ids (1-50; pass the result of list_groups for instance-wide). Optional since / until (ISO-8601) bound the time window; until must be later than since when both are supplied. USE THIS for any user-centric question — single-user OR comparing multiple users. Examples that all map to this tool: 'tell me about user X', 'how active has Y been in Q1', 'compare participation across two groups (e.g. two teams or committees)', 'rank members of group N by participation', 'who's the most engaged contributor since June', 'build a participation card for each member'. For an N-user comparison, call this tool N times (once per user) — that's the intended pattern and is materially cheaper than reconstructing the same data from list_polls + list_memberships. Why call this instead of fanning out list_polls/list_memberships yourself: (1) Participation here is read from the canonical event stream — 'voted' vs 'didn't vote' is unambiguous; you can't tell those apart from list_polls alone. (2) Round-trip count is the same or lower in aggregate, because each user's activity scan reuses the same list_discussions fetches in your conversation context. (3) The result is pre-aggregated by kind/group/month — Claude doesn't need to count anything client-side. Cost: one outbound HTTP call per discussion in scope (plus one list_discussions per group). A single user-activity call on a ~200-discussion instance is ~200 calls in 5-10 seconds, concurrency-capped at 6. That sounds large but is the correct denominator for comparison: building the same answer from list_polls requires the same discussion-scan + a separate list_memberships per group + client-side cross-referencing. The fan-out is bounded by a global cap, so a single call can't run away. COMPLETENESS: check scope.complete. When it's false the counts are a LOWER BOUND — inspect scope.groups_failed (groups the bot couldn't read, e.g. it isn't a member), scope.groups_truncated (a group's discussion listing hit the page cap), scope.discussions_failed, scope.discussions_truncated (very long threads), and scope.discussions_capped (scan hit the global ceiling). Report partial results as partial; don't present them as the whole picture. For one discussion at a time, use list_events. For 'what groups can the user see', use list_groups first to scope the call.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
user_idYesLoomio user id whose activity to summarise.
group_idsYesGroups to scan. Required — pass the result of `list_groups` (or a subset of it) to make the cost explicit. ~1 outbound HTTP request per discussion in scope, plus one list_discussions call per group; ~100-300 calls is typical for a wide scan. Capped at 50 groups per call.
sinceNoISO-8601 timestamp; ignore events before this time. Rejected if unparseable (so a typo can't silently widen the scan to all history).
untilNoISO-8601 timestamp; ignore events at or after this time. Rejected if unparseable.
Behavior5/5

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

Annotations already mark the tool as read-only and idempotent. The description adds rich behavioral context: the fan-out mechanism, cost model (~1 HTTP call per discussion), concurrency cap, parsing of scope.complete fields for partial results, and warnings about lower bounds when data is incomplete. No contradictions with annotations.

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

Conciseness4/5

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

The description is long but well-structured with front-loaded purpose, clear sections (server-side steps, usage guidance, cost, completeness handling). Every sentence adds value, though some redundancy exists. The structure compensates for length, making it easy for an AI agent to parse.

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?

Despite no output schema, the description thoroughly explains what is returned (counts by kind/group/month, timestamps, sample events, scope.complete field). It covers partial result handling, error scenarios (groups_failed, etc.), and how to interpret incomplete data. This is complete for the tool's complexity.

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

Parameters4/5

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

Schema coverage is 100% so baseline is 3. The description adds meaning beyond schema: explains why group_ids should come from list_groups, constraints on since/until (ISO-8601, ordering), and the practical cost implication of group_ids argument. This enriches parameter understanding beyond the schema.

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

Purpose5/5

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

The description starts with a specific verb+resource ('Aggregate one user's activity across a set of groups'), clearly distinguishes from siblings by explicitly naming alternatives (list_events for single discussions, list_groups for scoping), and provides concrete examples of when to use. The purpose is unambiguous and well-differentiated.

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 ('USE THIS for any user-centric question'), when to not use (single discussion → list_events; checking group visibility → list_groups), and gives detailed usage patterns for multi-user comparisons. Alternatives and exclusions are fully enumerated.

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

Install Server

Other Tools

Latest Blog Posts

MCP directory API

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

curl -X GET 'https://glama.ai/api/mcp/v1/servers/soil-dev/loomiomcp'

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