Skip to main content
Glama

ibabs-mcp

A local Model Context Protocol (MCP) server for iBabs. It logs into an iBabs site with your credentials, caches the portal session, and exposes tools to list meetings, read agenda items, and download attachments.

Install

Published on npm as ibabs-mcp:

npx -y ibabs-mcp

Requires Node.js 20 or newer.

Related MCP server: tender-documents-mcp

Configuration

All configuration comes from environment variables. Set them in the MCP client config (not in a file the server reads), or export them in your shell.

Variable

Required

Meaning

IBABS_SITE

yes

Tenant/site name, e.g. example-site.

IBABS_EMAIL

yes

Login e-mail address.

IBABS_PASSWORD

yes*

Login password.

IBABS_SESSION_COOKIE

yes*

A pre-existing __Host-ibabsportal cookie value, instead of password.

IBABS_CACHE_DIR

no

Where the session is cached. Defaults to the OS cache dir.

IBABS_DOWNLOAD_DIR

no

Where attachments are written. Defaults to <cache>/downloads.

IBABS_PORTAL_URL

no

Defaults to https://portal.ibabs.eu.

IBABS_LOGIN_URL

no

Defaults to https://signon.ibabs.eu.

IBABS_AUTHORIZE_URL

no

Defaults to https://signon.ibabs.eu/OAuth/Authorize.

IBABS_CLIENT_ID

no

OAuth client id. Defaults to the public iBabs portal client.

IBABS_REDIRECT_URI

no

OAuth redirect. Defaults to https://portal.ibabs.eu/signin-iBabs.

* Provide either IBABS_PASSWORD or IBABS_SESSION_COOKIE.

See .env.example for a template.

Use with Hermes Agent

Hermes reads mcp_servers from ~/.hermes/config.yaml and passes only the env you list explicitly. Keep the secret in ~/.hermes/.env and reference it:

mcp_servers:
  ibabs:
    command: "npx"
    args: ["-y", "ibabs-mcp"]
    env:
      IBABS_SITE: "example-site"
      IBABS_EMAIL: "${IBABS_EMAIL}"
      IBABS_PASSWORD: "${IBABS_PASSWORD}"

Then ~/.hermes/.env:

IBABS_EMAIL=you@example.com
IBABS_PASSWORD=...

Restart Hermes (or run /reload-mcp). Tools appear as mcp_ibabs_*.

Tools

  • list_meetings — list meetings in a date range (defaults to the next 30 days), optionally restricted to council/committee meetings.

  • get_meeting — one meeting with its agenda items and attachments.

  • get_attachment — download an attachment by documentId, returning a local path and, for PDFs/plain text, the extracted text.

Other MCP clients

Any stdio MCP client works — point it at npx -y ibabs-mcp with the env above. For Claude Desktop / Cursor:

{
  "mcpServers": {
    "ibabs": {
      "command": "npx",
      "args": ["-y", "ibabs-mcp"],
      "env": {
        "IBABS_SITE": "example-site",
        "IBABS_EMAIL": "you@example.com",
        "IBABS_PASSWORD": "..."
      }
    }
  }
}

Development

npm install
npm run dev      # run from source with tsx
npm run test     # vitest
npm run build    # compile to dist/

Releasing

Publishing uses npm trusted publishing (OIDC) — no long-lived token.

  1. Bump the version in package.json and commit.

  2. Tag and push: git tag v0.1.0 && git push origin v0.1.0.

  3. The Publish GitHub Action builds, tests, and runs npm publish with provenance.

The npm trusted publisher must be configured for repository anned20/ibabs-mcp, workflow publish.yml.

License

MIT

Available Tools

3 tools
get_attachmentDownload an iBabs attachmentB

Download an attachment by documentId and return its name, mime type and local path. PDFs and text files are also returned as extracted text.

ParametersJSON Schema
NameRequiredDescriptionDefault
documentIdYesThe documentId from a meeting's attachments.
extractTextNoWhether to extract text from PDFs/plain text. Defaults to true.

TDQS

B3.4/5.0
Behavior3/5

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

With no annotations, the description carries the full burden. It usefully discloses the return shape (name, mime type, local path) and that PDFs/text come back as extracted text, which is real behavioral detail. However, it omits side-effect-relevant facts such as whether a file is written to disk, permissions required, or overwrite/error behavior for a tool whose name implies downloading.

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

Conciseness5/5

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

Two lean sentences, front-loaded with the action and input, followed immediately by the return contract. Every clause earns its place and nothing is padded.

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?

No output schema exists, so the description appropriately summarizes returns (name, mime type, local path, extracted text) and schema coverage handles the two params. It is nearly complete for a simple download tool, missing only operational context like where the file lands and failure modes.

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 both parameters (documentId, extractText) are already documented in the schema, and the baseline is 3. The description references documentId but adds no syntax, format, or defaulting detail beyond what the schema already states.

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

Purpose4/5

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

The description pairs a specific verb ('Download') with a specific resource ('an attachment'), identifies the key input (documentId), and summarizes the return payload (name, mime type, local path). It is clearly distinct from list_meetings and get_meeting by resource, though it never explicitly names those siblings or contrasts itself with them.

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

Usage Guidelines2/5

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

There is no when-to-use guidance, no prerequisites, and no mention of alternatives. The schema note that documentId comes 'from a meeting's attachments' hints at context, but the description itself gives the agent no routing or exclusion criteria.

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

get_meetingGet an iBabs meetingA

Get one meeting by id, including its agenda items with their number, title, confidentiality flag and attachments with name and size. Also includes meeting-level attachments that are not tied to an agenda item.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesThe meeting id returned by list_meetings.

TDQS

A3.9/5.0
Behavior4/5

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

No annotations are provided, so the description carries the full behavioral burden. It does a good job disclosing the return shape, enumerating agenda items (number, title, confidentiality flag, attachments) and meeting-level attachments, which partially compensates for the missing output schema. It stops short of stating this is a read operation, auth requirements, or error behavior for an unknown id.

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?

Two tightly written sentences, front-loaded with the core action ('Get one meeting by id'). The second sentence adds genuinely useful detail about meeting-level attachments rather than repeating the schema.

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 one-parameter read tool with no output schema, the description supplies the return structure an agent needs to interpret results, including the two attachment scopes. It omits error handling and permissions, but nothing essential to invoking the tool correctly is missing.

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?

There is a single parameter with 100% schema description coverage; the schema already explains that the id is returned by list_meetings. The description adds no syntax, format, or edge-case meaning beyond the schema, so the baseline 3 applies.

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?

States a specific verb ('Get') and resource ('one meeting by id') and immediately differentiates itself from the list_meetings sibling by stressing a single meeting retrieved by id. The description of the returned content (agenda items, attachments) further pins down what the resource contains.

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

Usage Guidelines3/5

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

Usage is implied: the tool is for retrieving a specific meeting once you have an id (schema notes the id comes from list_meetings). There is no explicit when-to-use vs when-not, nor a pointer to alternatives like list_meetings or get_attachment for related needs.

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

list_meetingsList iBabs meetingsA

List your iBabs meetings in a date range, in chronological order. Defaults to the next 30 days. Use type 'council' to only get council/committee meetings.

ParametersJSON Schema
NameRequiredDescriptionDefault
toNoEnd of the range as an ISO date/time. Defaults to 30 days from now.
fromNoStart of the range as an ISO date/time. Defaults to now.
typeNoRestrict to council/committee meetings ('council') or everything else ('other').

TDQS

A3.6/5.0
Behavior3/5

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

With no annotations, the description carries the full burden. It usefully discloses the default window (next 30 days) and result ordering (chronological), which are real behavioral facts. However, it says nothing about pagination, result caps, or permission/auth requirements for a listing endpoint, leaving meaningful gaps.

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

Conciseness5/5

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

Two sentences, zero waste, with the core scope ('meetings in a date range') and the default window front-loaded before the optional filter tip. Every clause earns its place.

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 zero-required-parameter list tool with full schema coverage and no output schema, the description covers scope, defaults, and ordering adequately. It is only slightly short on pagination/volume behavior, which an agent might still need.

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 the schema already documents 'from', 'to', and the 'council'/'other' enum, making the baseline 3 correct. The description's council/committee note largely restates the enum semantics rather than adding format or edge-case detail.

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

Purpose4/5

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

States a specific verb and resource ('List your iBabs meetings') plus its scoping dimension (date range) and ordering guarantee. It does not name a sibling or explicitly contrast itself with get_meeting, so it stops short of the 5 benchmark for sibling differentiation.

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

Usage Guidelines3/5

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

The sentence 'Use type 'council' to only get council/committee meetings' gives concrete guidance for the enum parameter, but there is no when-to-use-this-vs-get_meeting guidance and no stated prerequisites or exclusions. Usage is implied rather than prescribed.

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.

  1. 3 tool updatesv0.2.0
    • First observedget_attachment
    • First observedget_meeting
    • First observedlist_meetings

TDQS

A3.8/5.0

Scored across 3 tools

Disambiguation5/5

list_meetings lists meetings, get_meeting retrieves one meeting's full details, and get_attachment downloads a specific attachment. Each tool targets a distinct resource and action with no overlap.

Naming Consistency5/5

All three tools follow a consistent snake_case verb_noun pattern: list_meetings, get_meeting, get_attachment. The convention is predictable and readable.

Tool Count4/5

Three tools is minimal but well-suited for a read-only API focused on meetings and attachments. Each tool earns its place, though the surface is slightly thin for the broader domain.

Completeness4/5

The set covers listing meetings, retrieving a meeting with agenda items and attachments, and downloading attachments. Minor gaps include no search or filtering beyond date and type, but core read-only workflows are covered.

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    A
    maintenance
    Enables listing and downloading scanned letters from the Swiss ePost digital letterbox through browser automation, requiring manual SwissID login for session establishment.
    21
    16 npm
    1
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Safely downloads and extracts public tender documents from PDFs, Office files, and ZIP archives into text with structured signals, while also supporting document comparison and base64 extraction.
    MIT