loomiomcp
This server acts as a Model Context Protocol (MCP) interface for Loomio, enabling programmatic reading and writing of discussions, polls, and comments, managing group memberships, and analyzing user activity.
Discussions
Fetch a single discussion by ID or key, list discussions in a group (with status filter and pagination), create new discussions with title, description, privacy, and notification settings, and post comments on existing threads.
Polls
Fetch a single poll by ID or key, list polls in a group (with status filter and pagination), and create polls of various types (proposal, poll, count, score, ranked_choice, meeting, dot_vote) with options, closing time, anonymity, and recipient notifications.
Memberships & Groups
List group members with email addresses and roles (requires admin), invite users by email, and optionally remove members not in a provided list (destructive — use with care). Discover all groups visible to the API key by probing a range of group IDs (workaround for Loomio's lack of a native list-groups endpoint).
Events & Activity
Fetch the full event stream for a discussion (comments, reactions, poll votes, outcomes, etc.). Aggregate a single user's activity across multiple groups with counts by event kind, group, and month — ideal for participation analysis.
Admin (instance operators only)
Deactivate or reactivate user accounts instance-wide (requires a separate
LOOMIO_B3_API_KEY).
Operational Modes
Set
LOOMIO_MCP_READONLY=1to restrict the server to read-only tools, disabling all write operations at startup.
loomiomcp
Model Context Protocol server for Loomio. Lets Claude (Desktop, Code, or web Projects via Custom Connector) read and write Loomio discussions, polls, comments, and group memberships — and analyse member activity — in plain English. Targets Loomio's b2 API — the canonical surface documented at /help/api2 and the namespace where the controllers actually live in the open-source repo.
Tools (b2, per-user API key):
get_discussion(id_or_key)— fetch one discussionlist_discussions(group_id, status?, limit?, offset?)— list a group's discussionscreate_discussion(title, group_id, …)— start a new oneget_poll(id_or_key)— fetch one polllist_polls(group_id, status?, limit?, offset?)— list a group's pollscreate_poll(title, poll_type, …)— start a new polllist_memberships(group_id, limit?, offset?)— list a group's members with email addresses. Requires the connector's user to be a group admin (coordinator); Loomio only returns the member list to admins. On a 403 the connector probes to explain why — bot lacks the admin role vs. invalid key vs. not-a-member — and points atget_user_activity/list_eventsfor names/ids (email stays admin-only).list_groups({start_id?, end_id?, stop_after_consecutive_misses?})— enumerate visible groups by probingb2/pollsacross an id range. Loomio has no api-key-authed list-groups endpoint; this is the workaround. Default scans are ~50–200 outbound calls; a single invocation is capped at 500 idslist_events(discussion_id, limit?, offset?, kinds?)— the event stream for one discussion (comments, reactions, stances, outcomes, …) withactor_id,kind, timestamps, and embeddedusers/comments/polls. With nolimit/offsetit paginates up to a bounded cap and reportsscope.complete; with either pagination knob it returns that one page.get_user_activity(user_id, group_ids, since?, until?)— aggregate one user's participation across groups (counts by kind / group / month, first/last activity). The primary tool for any user-centric question; fans out server-side with a bounded budget and reports completeness viascope.complete. If bothsinceanduntilare supplied,untilmust be later thansince.manage_memberships({group_id, emails, remove_absent})— add and (withremove_absent: true) remove members. See SECURITY.md before usingremove_absent.create_comment(discussion_id, body, body_format?)— reply on a discussion
Opt-in admin tools (b3, server-instance secret):
Set LOOMIO_B3_API_KEY to enable. Only useful for Loomio instance operators.
deactivate_user(id)— disable a user account instance-widereactivate_user(id)— re-enable a previously deactivated user
Quick start (stdio, local)
LOOMIO_API_KEY=… npx loomiomcpAdd it to your Claude Desktop / Claude Code config the same way you would any stdio MCP server.
Related MCP server: capsulemcp
Remote (HTTP)
See DEPLOY.md for Cloud Run.
Auth
Loomio authenticates by API key sent in an HTTP bearer header:
Authorization: Bearer <API_KEY>The connector injects it server-side; it never reaches the MCP client. Generate one in Loomio under your profile → API keys.
Keys passed in the query string (?api_key=…) are rejected — Loomio
removed that scheme in July 2026 because URLs are retained in browser
history, proxy logs, and monitoring systems. A request carrying its key
that way is treated as unauthenticated and 403s.
The optional b3 admin namespace uses the same bearer header with a
different secret (validated against ENV['B3_API_KEY'] on the Loomio
server, >16 chars). Only relevant if you operate a Loomio instance.
Read-only mode
Set LOOMIO_MCP_READONLY=1 to register only the 8 read tools
(get_* / list_* / get_user_activity). All write tools
(create_*, manage_*) are skipped at server-init time. This is the
mode the Cloud Run deployment runs in.
Docs map
File | When to read |
"I want to use this locally with Claude Desktop / Code today" | |
"I want to run this as a remote HTTP/OAuth endpoint" | |
"I want example prompts and use cases" | |
"I want to understand the load-bearing choices" | |
"I'm hitting a weird Loomio behaviour, or want the line-by-line endpoint reference" | |
"I'm doing a security review or rotating secrets" | |
"I want observability / usage analytics queries" | |
"I want to add a tool or send a PR" | |
"What changed?" |
License
Apache-2.0
Available Tools
8 toolscreate_commentA
Post a comment (reply) on an existing Loomio discussion. Required: discussion_id, body. Optional body_format ('md' or 'html'; defaults to the group's setting). Caller must be permitted to post in the discussion's group. Use for 'reply to thread X', 'add a follow-up to discussion Y', or to chain a series of automated updates. For starting a new thread instead, use create_discussion.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | Comment body (required). | |
| body_format | No | Format of `body`. Defaults to Loomio's group default when omitted. | |
| discussion_id | Yes | ID of the discussion to comment on. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations show readOnlyHint=false (write operation), destructiveHint=false, idempotentHint=false, openWorldHint=true. The description adds behavioral context beyond annotations: it states permission requirement ('Caller must be permitted to post in the discussion's group'), and default behavior for body_format. It does not mention return value or side effects, but with openWorldHint=true, this is acceptable. Slightly incomplete but adds meaningful 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?
Four sentences, front-loaded with purpose, then parameter info, then usage guidance, then alternative. Every sentence provides necessary information without redundancy. Extremely concise and well-structured.
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 (3 params, no output schema), the description covers purpose, usage, permissions, parameter details, and alternative tool. It addresses all essential aspects for an agent to select and invoke this tool correctly. Missing return value is acceptable since no output 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 description coverage is 100%, so baseline is 3. The description rephrases the required and optional parameters ('Required: discussion_id, body. Optional body_format') and adds default behavior ('defaults to the group's setting'), which is already in the schema description. No new semantic information beyond 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 'Post a comment (reply) on an existing Loomio discussion.' It uses a specific verb (post), resource (comment/reply), and scope (existing discussion). It explicitly distinguishes from the sibling tool create_discussion by stating 'For starting a new thread instead, use create_discussion.'
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 explicit when-to-use scenarios: 'reply to thread X', 'add a follow-up to discussion Y', or 'chain a series of automated updates.' It also specifies a when-not-to-use alternative: 'For starting a new thread instead, use create_discussion.' It mentions required and optional parameters, and permission requirements.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_pollA
Create a new Loomio poll. Required: title, poll_type — one of 'proposal' (built-in agree / disagree / abstain), 'poll' (single-choice), 'count' (count signers), 'score' (1-5 rating, configurable via min_score / max_score), 'ranked_choice' (STV), 'meeting' (time poll), 'dot_vote' (point allocation, see dots_per_person). For every type except 'proposal' you MUST supply options (array of strings). Either supply group_id for a standalone poll or discussion_id to attach to an existing thread. Optional: details + details_format, closing_at (ISO-8601), anonymous, hide_results ('off' / 'until_vote' / 'until_closed'), specified_voters_only, shuffle_options, notify_on_closing_soon, recipient fields. KNOWN UPSTREAM LIMITATION: Loomio's b2 permitted_params omits :private, so the auto-created Topic always defaults to private: true and groups with public-discussions-only policy reject the create with a 422 and empty errors hash. See NOTES-ON-LOOMIO-API.md. Workaround at the moment: create polls only in groups that allow private discussions.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | Poll title (required). | |
| details | No | Optional poll body / context. | |
| options | No | Voting options. `proposal` has built-in agree/disagree/abstain options; for poll / count / score / ranked_choice / meeting / dot_vote you MUST supply your own. | |
| group_id | No | Group the poll belongs to. Required when not attaching to an existing discussion via discussion_id. | |
| anonymous | No | If true, hide voter identities. | |
| poll_type | Yes | Poll type. One of: proposal, poll, count, score, ranked_choice, meeting, dot_vote. | |
| closing_at | No | ISO-8601 timestamp at which the poll closes. | |
| hide_results | No | Results visibility policy. Defaults to 'off'. | |
| discussion_id | No | Attach the poll to an existing discussion. When set, group_id is taken from the discussion. | |
| details_format | No | Format of `details`. Defaults to 'md'. | |
| shuffle_options | No | If true, shuffle option display order. | |
| recipient_emails | No | ||
| notify_recipients | No | If false, suppress the initial notification email. Defaults to false. | |
| recipient_message | No | ||
| recipient_audience | No | ||
| recipient_user_ids | No | ||
| specified_voters_only | No | If true, only users in recipient_user_ids / recipient_emails can vote. | |
| notify_on_closing_soon | No | Who Loomio notifies as the closing date approaches. Defaults to 'nobody'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are minimal (readOnlyHint=false, destructiveHint=false, idempotentHint=false, openWorldHint=true). The description adds substantial behavioral context: it explains the create action, the required parameters, the special handling for private discussions, and the error scenario. 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the purpose and key requirements, then covers optional parameters and limitations. It is fairly long but every sentence adds value; no wasted words. Could be slightly trimmed but overall well-organized.
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 18 parameters, 78% schema coverage, no output schema, the description is comprehensive. It covers creation, parameter dependencies, and a known edge case. It does not explain the response structure, but that is acceptable since the tool creates a resource and the output is likely the poll object. The description is complete for the agent to use correctly.
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 78%, so many parameters already have descriptions. However, the description adds meaning beyond schema: it explains the poll_type enum values, the requirement for options for most types, the group_id vs discussion_id decision, and the crucial known limitation. This enriches the semantics.
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 'Create a new Loomio poll' with specific verb and resource. It distinguishes from sibling tools (create_comment, create_discussion) by focusing solely on polls and detailing required fields like title, poll_type, and the different types.
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 explicit when-to-use guidance: it explains that for poll types other than 'proposal', options MUST be supplied, and the choice between group_id (standalone) and discussion_id (attached to thread). It also warns about a known upstream limitation and suggests a workaround, effectively telling when not to use (groups requiring public discussions).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_user_activityARead-onlyIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| since | No | ISO-8601 timestamp; ignore events before this time. Rejected if unparseable (so a typo can't silently widen the scan to all history). | |
| until | No | ISO-8601 timestamp; ignore events at or after this time. Rejected if unparseable. | |
| user_id | Yes | Loomio user id whose activity to summarise. | |
| group_ids | Yes | Groups 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. |
TDQS
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.
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.
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.
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.
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.
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.
list_discussionsARead-onlyIdempotent
List discussions in a Loomio group, ordered by latest activity. Required: group_id. Optional status filter — 'open' (unlocked, default), 'closed' (locked), 'all' (every kept thread); limit 1-200 (Loomio default 50); offset for pagination. Caller must be a group member. Use to answer 'what's being discussed in group X', 'show me recent threads', or before create_discussion to check for duplicates. For one specific thread, use get_discussion.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Page size. Loomio defaults to 50. | |
| offset | No | Page offset. Defaults to 0. | |
| status | No | Filter by status. 'open' = unlocked, 'closed' = locked, 'all' = every kept discussion. Loomio defaults to 'open'. | |
| group_id | Yes | ID of the Loomio group whose discussions to list (required). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, destructiveHint=false, idempotentHint=true. Description adds behavioral context: 'Caller must be a group member,' pagination with `limit` and `offset`, and ordering by latest activity. 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?
Description is a single paragraph but well-structured: starts with main action, then required param, optional params with defaults, use cases, and sibling reference. Every sentence adds value; 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?
For a simple list tool with no output schema, description covers purpose, required/optional parameters with defaults, member requirement, pagination, and use cases. Lacks output description but ordering is noted. Sufficient for selection and invocation.
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 descriptions for all 4 parameters. Description adds meaning: clarifies `group_id` is required, explains `status` enum values (open/unlocked, closed/locked, all), notes default `limit` is 50, and describes `offset` for pagination. This goes beyond 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 clearly states 'List discussions in a Loomio group, ordered by latest activity,' specifying verb, resource, and ordering. It distinguishes from sibling tool `get_discussion` by noting 'For one specific thread, use get_discussion.'
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 explicit use cases: 'to answer what's being discussed in group X, show me recent threads, or before create_discussion to check for duplicates.' Mentions alternative `get_discussion` for single threads. Lacks explicit when-not-to-use, but guidance is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_groupsARead-onlyIdempotent
List groups the connector's api-key user can see, by probing a group_id range. Loomio's API has no native 'list groups' endpoint that honours api-key auth (v1's profile/groups needs a session; the v1 explore endpoint returns only public groups). This tool works around that by issuing one b2/polls?group_id=N&limit=1&status=all per id and collecting the group objects from the 200 responses — 404s skipped, 403s treated as soft misses. Scope: returns every group the bot is a member of (plus their parent groups, which b2/polls embeds in the response). Bot users with is_admin: true bypass the membership check and see every group on the instance. Optional knobs: start_id (default 1), end_id (default 200; a single call may scan at most 500 ids), stop_after_consecutive_misses (default 50; early-exit on sparse id ranges). Caveat: this is the right tool to answer 'what groups can you see' and similar discovery questions, but it costs O(end_id - start_id) outbound calls — typically ~50–200 HTTP requests in 2–5 seconds. The returned group objects are slimmed to {id, key, handle, name, parent_id, discussion_privacy_options, is_visible_to_public, memberships_count}; to drill in, use list_memberships, list_discussions, list_polls with the relevant id.
| Name | Required | Description | Default |
|---|---|---|---|
| end_id | No | Last group_id to probe (inclusive). Defaults to 200. A single call may scan at most 500 ids; use multiple calls for wider ranges. | |
| start_id | No | First group_id to probe (inclusive). Defaults to 1. | |
| stop_after_consecutive_misses | No | Early-exit heuristic: stop probing after this many consecutive 404/403 misses. Saves wall time on sparse id ranges. Defaults to 50. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, and openWorld hints. The description adds context on the workaround mechanism, 404/403 handling, scope, and slimmed return fields, providing incremental behavioral transparency without contradiction.
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 detailed but well-structured, front-loading the purpose. Every sentence adds value, though it could be slightly trimmed without losing clarity.
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 lack of output schema, the description adequately explains return fields, cost, and limitations. It covers all necessary context for an agent to use the tool correctly.
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 descriptions. The description further clarifies defaults, the 500-id limit, and the early-exit heuristic, adding significant meaning 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 tool lists groups visible to the API key user via a probing workaround, distinguishes from other tools by explaining the lack of a native endpoint, and specifies the return scope (member groups, admin bypass).
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?
Explicitly states this is the right tool for 'what groups can you see' discovery, identifies alternatives for drill-down (list_memberships, etc.), and warns about the cost (~50–200 HTTP requests).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_membershipsARead-onlyIdempotent
List members of a Loomio group with their email addresses, roles, and join state. Required: group_id. Caller MUST be a group admin (non-admins get HTTP 403; the response is server-side scoped to include include_email: true). Optional limit 1-200 (default 50) and offset for pagination. Use to answer 'who's in group X', 'find a member by email', or — critically — BEFORE calling manage_memberships with remove_absent=true, since the diff between current and intended members is what makes that destructive call safe. Do NOT use this tool to construct a participation analysis (e.g. 'how active is each member', 'who voted in our polls') by combining its output with list_polls. That reconstruction is more expensive in round-trips AND ambiguous about abstain-vs-didn't-vote. Use get_user_activity per member instead — it answers participation directly from the event stream.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Page size. Loomio defaults to 50. | |
| offset | No | Page offset. Defaults to 0. | |
| group_id | Yes | ID of the Loomio group whose memberships to list (required). The connector's bot user must be an admin (coordinator) of the group — Loomio only returns the member list, including email addresses, to group admins. For a non-admin bot this returns a clear 403 explaining the role requirement; names/usernames/ids (not emails) are still reachable via get_user_activity / list_events. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=true, destructiveHint=false, idempotentHint=true, and openWorldHint=true. The description adds critical context: caller must be admin (non-admins get 403), response includes email only for admins, and names/ids are still reachable via other tools. This goes beyond annotations without contradiction.
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 front-loaded with the core purpose and each sentence adds value. While slightly long, it is well-structured with clear sections. Minor redundancy (e.g., re-explaining parameters) keeps it from a 5.
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 (3 params, no output schema, but strong annotations), the description is thorough. It covers purpose, parameters, usage guidelines, behavioral details, and alternatives. Lack of explicit return format is acceptable since annotations and schema cover most needs.
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 baseline is 3. The description adds value by clarifying group_id is required with admin requirement, limit range 1-200 default 50, and offset defaults to 0. It explains behavior beyond schema, justifying a 4.
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 Loomio group members with email, roles, and join state. It specifies the required parameter group_id and differentiates from siblings like manage_memberships, list_polls, and get_user_activity, providing a specific verb+resource with sibling distinction.
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 explicitly states when to use (e.g., answer 'who's in group X', before calling manage_memberships) and when NOT to use (e.g., avoid constructing participation analysis; use get_user_activity instead). It provides clear context and alternatives, fulfilling the highest standard.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_pollsARead-onlyIdempotent
List polls in a Loomio group, ordered by creation date (newest first). Required: group_id. Optional status filter — 'active' (default), 'closed', 'all' (every kept poll); limit 1-200 (default 50); offset for pagination. Caller must be a group member. Use to answer 'what's up for vote in group X', 'show me past poll results', or before create_poll to check what's already proposed. FOR PER-USER PARTICIPATION QUESTIONS — 'who voted', 'how often did X vote', 'compare members' turnout' — prefer get_user_activity. It returns participation directly (via the underlying events stream) and avoids the ambiguity between 'didn't vote' and 'abstained' that you can't tell apart from a list_polls response alone.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Page size. Loomio defaults to 50. | |
| offset | No | Page offset. Defaults to 0. | |
| status | No | Filter polls by status. Loomio defaults to 'active'. | |
| group_id | Yes | ID of the Loomio group whose polls to list (required). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnly, non-destructive, idempotent, and open-world. Description adds that caller must be a group member, explains default filter behavior, ordering, and pagination parameters. Also details the ambiguity between 'didn't vote' and 'abstained' that list_polls cannot resolve, which is valuable behavioral context 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 well-structured: first sentence defines purpose, then details parameters, then use cases, then sibling differentiation. It is relatively concise but contains some redundancy (e.g., 'Caller must be a group member' could be part of parameter notes). Still, no filler sentences.
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 no output schema, the description explains ordering, pagination, membership requirement, and use cases. It covers the main aspects needed to use the tool correctly. Could mention what fields are returned per poll object, but overall sufficient for a simple list tool with good annotations.
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%; description reinforces defaults and meanings (status default 'active', limit default 50, offset default 0). Adds clarity on the 'all' status option ('every kept poll') and explains that status defaults to 'active'. This provides additional context not in schema descriptions.
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 'List polls in a Loomio group, ordered by creation date (newest first).' It specifies the action (list), resource (polls), and scope (group with ordering). It also distinguishes from sibling 'get_user_activity' by noting it for per-user participation questions.
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 explicit required parameter (group_id), optional filters with defaults, and concrete use cases: 'what's up for vote in group X', 'show me past poll results', 'check what's already proposed'. Also clearly states when not to use it: for per-user participation questions, prefer get_user_activity, with reasoning about ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_membershipsADestructive
Invite users to a Loomio group by email and (optionally) REMOVE members not in the supplied list. Required: group_id (caller must be a group admin), emails (array of email addresses). Default mode is additive: every address in emails that isn't already a member is invited / added; no existing member is touched. DANGEROUS OPTION — remove_absent: true: Loomio REMOVES every existing group member whose email is NOT in emails. The zero-or-stale-emails case can wipe the entire group. There is no server-side dry-run and no undo. ALWAYS call list_memberships first, compute the diff explicitly, and confirm with a human before invoking with remove_absent=true. Returns {added_emails: [...], removed_emails: [...]} listing exactly what changed.
| Name | Required | Description | Default |
|---|---|---|---|
| emails | Yes | Email addresses to ensure are members. Each address that isn't already a member is invited / added. | |
| group_id | Yes | ID of the Loomio group to modify (required). Caller must be a group admin. | |
| remove_absent | No | DANGEROUS. When true, Loomio REMOVES every existing member whose email is NOT in `emails`. Empty-emails (after dedupe) effectively removes the entire group. Default false. Only set true after reading list_memberships and confirming the diff with a human. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses destructive nature, no dry-run, no undo, and the risk of wiping the group. Adds significant context beyond annotations that already mark it destructive.
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?
Every sentence adds value, front-loaded with purpose and danger warning. Length is justified by complexity of the tool.
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?
Covers required params, optional danger flag, preconditions, side effects, and return value. Complete for a tool with no output 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%, but description adds crucial context: explanation of additive mode, danger of remove_absent, and admin requirement. Exceeds the baseline 3 for fully covered schemas.
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 invites users by email and optionally removes absent members. It distinguishes from siblings like list_memberships and other group-related 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?
Explicitly guides on when to use default additive mode vs. dangerous remove_absent option. Recommends calling list_memberships first and confirming with a human, setting clear usage boundaries.
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.
4 tool updates
v0.0.10- Removed
create_discussion - Removed
get_discussion - Removed
get_poll - Removed
list_events
12 tool updates
v0.0.6- First observed
create_comment - First observed
create_discussion - First observed
create_poll - First observed
get_discussion - First observed
get_poll - First observed
get_user_activity - First observed
list_discussions - First observed
list_events - First observed
list_groups - First observed
list_memberships - First observed
list_polls - First observed
manage_memberships
TDQS
Each tool targets a distinct operation—listing discussions, polls, members, groups; creating polls/comments; managing memberships; and getting user activity—with clear, non-overlapping purposes reinforced by detailed descriptions.
All tool names follow a consistent verb_noun snake_case pattern (e.g., list_discussions, create_poll, get_user_activity), with no deviations or mixed conventions.
With 8 tools, the set is well-scoped for a Loomio integration covering key functionalities like discussions, polls, members, and comments—neither sparse nor overwhelming.
Several core operations are missing: no get_discussion, create_discussion, get_poll, update_poll, delete_poll, or list_comments, despite being referenced in descriptions. This leaves significant gaps for typical CRUD and lifecycle management.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Connect Claude to Fathom meeting recordings, transcripts, and summaries
- platform7nOAuthtech.p7n
Connect Claude to your Platform7n workspaces — chat, links, and tasks. One-click OAuth.
WHOOP recovery, strain, sleep and workouts in Claude via official WHOOP OAuth. Free, open source.
Persistent context for Claude. Your AI always knows your projects and next actions across sessions.
Related MCP Servers
- FlicenseNot gradedqualityCmaintenanceConnects Claude AI to any development project (Django, Next.js, Laravel, etc.) with 15+ universal tools for shell, file, git, logs, Docker, tests, and more.1-
- AlicenseAqualityAmaintenanceCapsule CRM tools for Claude. Local install via npx, org-wide via Custom Connectors. Read-only mode supported.92765Apache 2.0
- AlicenseNot gradedqualityBmaintenanceConnects Claude Desktop to your Obsidian vault, enabling reading, writing, searching, and organizing notes locally.1MIT
- FlicenseNot gradedqualityDmaintenanceExposes locally-built AI tools to Claude, enabling article summarization, promo generation, and semantic search over an Obsidian vault.-
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/soil-dev/loomiomcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server