Skip to main content
Glama
soil-dev
by soil-dev

loomiomcp

npm CI License: Apache-2.0 Glama

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 discussion

  • list_discussions(group_id, status?, limit?, offset?) — list a group's discussions

  • create_discussion(title, group_id, …) — start a new one

  • get_poll(id_or_key) — fetch one poll

  • list_polls(group_id, status?, limit?, offset?) — list a group's polls

  • create_poll(title, poll_type, …) — start a new poll

  • list_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 at get_user_activity / list_events for names/ids (email stays admin-only).

  • list_groups({start_id?, end_id?, stop_after_consecutive_misses?}) — enumerate visible groups by probing b2/polls across 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 ids

  • list_events(discussion_id, limit?, offset?, kinds?) — the event stream for one discussion (comments, reactions, stances, outcomes, …) with actor_id, kind, timestamps, and embedded users / comments / polls. With no limit/offset it paginates up to a bounded cap and reports scope.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 via scope.complete. If both since and until are supplied, until must be later than since.

  • manage_memberships({group_id, emails, remove_absent}) — add and (with remove_absent: true) remove members. See SECURITY.md before using remove_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-wide

  • reactivate_user(id) — re-enable a previously deactivated user

Quick start (stdio, local)

LOOMIO_API_KEY=… npx loomiomcp

Add 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

INSTALL.md

"I want to use this locally with Claude Desktop / Code today"

DEPLOY.md

"I want to run this as a remote HTTP/OAuth endpoint"

HOWTO.md

"I want example prompts and use cases"

DESIGN.md

"I want to understand the load-bearing choices"

NOTES-ON-LOOMIO-API.md

"I'm hitting a weird Loomio behaviour, or want the line-by-line endpoint reference"

SECURITY.md

"I'm doing a security review or rotating secrets"

OPTIMIZATIONS.md

"I want observability / usage analytics queries"

CONTRIBUTING.md

"I want to add a tool or send a PR"

CHANGELOG.md

"What changed?"

License

Apache-2.0

Available Tools

8 tools
create_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.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyYesComment body (required).
body_formatNoFormat of `body`. Defaults to Loomio's group default when omitted.
discussion_idYesID of the discussion to comment on.

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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

Given the tool's simplicity (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.

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

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleYesPoll title (required).
detailsNoOptional poll body / context.
optionsNoVoting options. `proposal` has built-in agree/disagree/abstain options; for poll / count / score / ranked_choice / meeting / dot_vote you MUST supply your own.
group_idNoGroup the poll belongs to. Required when not attaching to an existing discussion via discussion_id.
anonymousNoIf true, hide voter identities.
poll_typeYesPoll type. One of: proposal, poll, count, score, ranked_choice, meeting, dot_vote.
closing_atNoISO-8601 timestamp at which the poll closes.
hide_resultsNoResults visibility policy. Defaults to 'off'.
discussion_idNoAttach the poll to an existing discussion. When set, group_id is taken from the discussion.
details_formatNoFormat of `details`. Defaults to 'md'.
shuffle_optionsNoIf true, shuffle option display order.
recipient_emailsNo
notify_recipientsNoIf false, suppress the initial notification email. Defaults to false.
recipient_messageNo
recipient_audienceNo
recipient_user_idsNo
specified_voters_onlyNoIf true, only users in recipient_user_ids / recipient_emails can vote.
notify_on_closing_soonNoWho Loomio notifies as the closing date approaches. Defaults to 'nobody'.

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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_activityA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
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.
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.

TDQS

A4.8/5.0
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.

list_discussionsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoPage size. Loomio defaults to 50.
offsetNoPage offset. Defaults to 0.
statusNoFilter by status. 'open' = unlocked, 'closed' = locked, 'all' = every kept discussion. Loomio defaults to 'open'.
group_idYesID of the Loomio group whose discussions to list (required).

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_groupsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
end_idNoLast group_id to probe (inclusive). Defaults to 200. A single call may scan at most 500 ids; use multiple calls for wider ranges.
start_idNoFirst group_id to probe (inclusive). Defaults to 1.
stop_after_consecutive_missesNoEarly-exit heuristic: stop probing after this many consecutive 404/403 misses. Saves wall time on sparse id ranges. Defaults to 50.

TDQS

A4.7/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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

The description clearly states the tool lists 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.

Usage Guidelines5/5

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_membershipsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoPage size. Loomio defaults to 50.
offsetNoPage offset. Defaults to 0.
group_idYesID 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

A4.7/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness4/5

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.

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

Purpose5/5

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

The description clearly states the tool lists 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.

Usage Guidelines5/5

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_pollsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoPage size. Loomio defaults to 50.
offsetNoPage offset. Defaults to 0.
statusNoFilter polls by status. Loomio defaults to 'active'.
group_idYesID of the Loomio group whose polls to list (required).

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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_membershipsA
Destructive

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
emailsYesEmail addresses to ensure are members. Each address that isn't already a member is invited / added.
group_idYesID of the Loomio group to modify (required). Caller must be a group admin.
remove_absentNoDANGEROUS. 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

A4.9/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

  1. 4 tool updatesv0.0.10
    • Removedcreate_discussion
    • Removedget_discussion
    • Removedget_poll
    • Removedlist_events
  2. 12 tool updatesv0.0.6
    • First observedcreate_comment
    • First observedcreate_discussion
    • First observedcreate_poll
    • First observedget_discussion
    • First observedget_poll
    • First observedget_user_activity
    • First observedlist_discussions
    • First observedlist_events
    • First observedlist_groups
    • First observedlist_memberships
    • First observedlist_polls
    • First observedmanage_memberships

TDQS

A4.4/5.0
Disambiguation5/5

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.

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness2/5

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

ActivitySlowing
ResponsivenessNo issues

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

Related MCP Servers

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