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

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
LOOMIO_API_KEYYesYour Loomio API key for b2 API authentication.
LOOMIO_B3_API_KEYNoOptional secret for b3 admin tools.
LOOMIO_MCP_READONLYNoSet to '1' to enable read-only mode.

Instructions

Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.

This server publishes no instructions, or was last inspected before Glama recorded them.

Capabilities

Features and capabilities supported by this server

Protocol revision2025-11-25

CapabilityDetails
tools
{
  "listChanged": true
}

Tools

Functions exposed to the LLM to take actions

NameDescription
check_connectionA

Call FIRST when unsure whether the connector works or what it can see: 1 health probe, no input. Returns key_status ('valid' | 'rejected' | 'unreachable'), the key's user, its groups[] with member_state, readonly, b3_enabled and notes[].

list_groupsA

The connector user's groups, pending invitations included: 1 call, no input. Subgroup parents are appended with member: false. get_group reads one record, even a public group this list omits.

get_groupA

One group by numeric id, short key or URL handle: 1 call; works for public groups the user has not joined. Returns the full record (members_can_* flags included, billing subscription dropped) plus member, membership, parent, url. 403 'Not authorized to show Group.' = hidden from this user; unknown = 404.

get_discussionA

One discussion by numeric id or short key: 1 call (2 with include_items). Returns the full body, topic_id, counters, url; include_items: true embeds list_thread_items as thread_items (items_limit; next_offset says when to page on). Prose: get_thread_markdown; a group's threads: list_discussions.

list_discussionsA

One group's discussions, newest activity first: 1 call. status defaults to 'open'; description_max_chars (default 1500) caps bodies, description_truncated: true marking a cut; strip_html (default true) gives plain text. Every visible group: list_threads; keywords: search_content. Subgroups are excluded.

create_discussionA

Start a discussion in a group: 1 call. Required title, group_id; optional description (+ description_format: 'html' for HTML), private (omit for the group's default), tags, recipients. Returns id, key, url, topic_id. Check list_discussions for duplicates first; to add to a thread use create_comment.

update_discussionA

Edit a discussion by id_or_key: 1 call. Pass only what changes: title, description (REPLACES the body: read it first, send the whole text), private, allow_* flags, recipients to add. Cannot move a thread or change its tags; a discarded thread cannot be edited.

delete_discussionA

Discard a discussion by id_or_key: 1 call. Loomio's SOFT delete: it leaves every list and its text is blanked, but nothing is permanently erased (a group admin can restore it). For a text mistake prefer update_discussion.

get_pollA

One poll by numeric id or short key: 1 call. Returns poll (full details, topic_id), poll_options[], current_outcome, my_stance, url; votes as items: list_thread_items with its topic_id. Results gate: results_visible / results_hidden_reason say whether tallies are present; absent counts mean HIDDEN, never zero.

list_pollsA

One group's polls, newest first: 1 call. status defaults to 'active' ('closed', 'all'); description_max_chars caps details; strip_html (default true). Slim rows with poll_options[] and stance_counts when visible (trust results_visible). For member activity use get_participation_report, not this plus list_memberships.

create_pollA

Create a poll: 1 call (2 with discussion_id). Required title, poll_type, options (NO default options; only 'question' takes none) and group_id (standalone) or discussion_id / topic_id (inside a thread). closing_at (ISO-8601, future) is effectively REQUIRED: without it Loomio saves the poll UNOPENED and the result carries opened: false and a warning. An opening poll is announced because notify_on_open defaults to TRUE; pass notify_on_open: false for a quiet create.

update_pollA

Edit an OPEN poll by id_or_key: 1 call (2 with options). Pass only what changes: title, details (REPLACES the text), closing_at (future; opening a draft announces unless notify_on_open is false), options (names to ADD: merged with the current list, so it never removes an option it saw; not atomic), settings. Cannot change poll_type, anonymous, group or tags; a closed poll answers 403.

delete_pollA

Discard a poll by id_or_key: 1 call. Loomio's SOFT delete: the poll and its votes leave the thread view, but nothing is permanently erased (a group admin can restore it). To end voting set closing_at to the next full hour with update_poll; no immediate close exists.

list_threadsA

The cheapest 'what is new across everything I can see': 1 call lists every visible thread, newest activity first (topic_id, type, title, group_id, counters, url; no bodies). group_id / type filter client-side within the page (one group: list_discussions / list_polls). No date filter upstream: pass since and page with offset until scope.exhausted.

list_thread_itemsA

One thread as structured items: 1 call by topic_id (2 by discussion_id or poll_id; pass exactly one). Returns items[] in thread order plus the comments, polls, stances (votes), outcomes and users they reference. The whole thread is fetched once and sliced here (limit, offset, kinds) under the max_total_chars budget; next_offset says where to continue.

get_thread_markdownA

The best single call for 'summarise / read this thread': 1 call by topic_id (2 by discussion_id or poll_id; pass exactly one) returns Loomio's server-rendered Markdown of the thread (markdown, chars, truncated). Structured data: list_thread_items. max_chars cuts from the END, so truncated: true means the newest items were dropped.

search_contentA

Keyword search over everything the connector's user can see: 1 call. Pass query (prefix match; !word excludes), author_id alone for 'what did X post', or both. Hard cap: at most 20 results, no paging; capped: true means narrow the search. Stance hits on polls with hidden results are DROPPED from a query search; never use search to probe hidden vote reasons.

get_participation_reportA

Rank the members of a group set: 1 call returns Loomio's own report, a row per user sorted by total desc. Scope by group_ids (1-50, counted together) or group_scope: 'my'; top limit rows (default 50, max 500), zero-activity users dropped unless include_inactive. Anonymous polls are excluded; a vote counts in the month its counted stance row was created.

get_user_activityA

One person's participation across groups: 1 call per group + 1. Required user_id (from list_memberships or a participation row) and group_ids. Returns counts, by_group, sample_events (newest items with urls, not a full list). MONTH-GRAINED: since / until widen to whole months; anonymous polls never count; a vote counts in the month its counted stance row was created.

list_membershipsA

A group's members: 1 call. Returns memberships[] (user_email only where the connector's user is a group admin), users[], total. Use it to resolve a name to a user_id and ALWAYS before manage_memberships with remove_absent. A non-member gets an EMPTY list, not 403: never report it as an empty group.

manage_membershipsA

Invite users to a group by email and optionally REMOVE members not in the list: 1 call; the connector's user must be an admin of THAT group. Default is additive: new addresses are invited, nobody is touched. DANGEROUS: remove_absent: true removes every member whose email is absent, own user included, with no undo: list_memberships first, then confirm the diff with a human.

create_commentA

Post a comment in a thread: 1 call (2 when discussion_id is a short key). Required body (+ body_format: 'html' for HTML; Loomio stores an omitted format as Markdown) and a target: discussion_id for a top-level comment, or parent_id + parent_type ('Comment' for a threaded reply; 'Poll' / 'Stance' / 'Outcome'). A new thread: create_discussion.

update_commentA

Edit a comment: 1 call. Required numeric id and body (REPLACES the whole text: read it with list_thread_items first), optional body_format. Only the author, or a thread admin where the group allows it, may edit; the thread must be unlocked.

delete_commentA

Discard a comment by numeric id: 1 call. Loomio's SOFT delete: the body is blanked and the comment leaves the thread view, but nothing is permanently erased (restorable in Loomio). For a wording fix prefer update_comment.

Prompts

Interactive templates invoked by user choice

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription

No resources

TDQS

A3.9/5.0

Scored across 24 tools

Disambiguation4/5

Most tools target clearly distinct resources and actions, but the thread-reading surface (list_threads, list_discussions, list_polls, list_thread_items, get_thread_markdown, get_discussion, get_poll) has enough overlap that an agent may hesitate. The detailed descriptions largely resolve the ambiguity, but not perfectly.

Naming Consistency5/5

All tools use consistent snake_case verb_noun naming (create_poll, list_groups, get_discussion, update_poll, delete_comment, etc.) with no mixed conventions or vague verbs.

Tool Count3/5

24 tools is heavy for the domain and falls into the borderline 16-25 range. While each tool covers a real operation, the set could be consolidated, especially around separate list/read tools for threads, discussions, and polls.

Completeness2/5

CRUD is present for discussions, polls, and comments, but the Loomio decision-making core is incomplete: there is no tool to cast or manage a vote/stance, and group lifecycle operations are missing. Agents cannot fully participate in polls or manage groups end-to-end.

Maintenance

ActivityMaintained
ResponsivenessNo issues