Skip to main content
Glama
jbonjour

bmlt-mcp-server

by jbonjour

bmlt-mcp-server

Ein MCP (Model Context Protocol)-Server für die Basic Meeting List Toolbox (BMLT) — die Open-Source-Meeting-Datenbank, die von Narcotics Anonymous Service-Gremien weltweit genutzt wird.

Verbinde Claude (oder einen beliebigen MCP-kompatiblen KI-Client) mit einem BMLT-Root-Server und frage NA-Meeting-Daten in natürlicher Sprache ab.


Was er tut

Stellt vier Tools bereit:

Tool

Beschreibung

bmlt_search_meetings

Suche Meetings nach Tag, Format, Ort, Name oder Geokoordinaten

bmlt_get_meeting_details

Rufe alle Details für ein bestimmtes Meeting per ID ab

bmlt_get_formats

Liste alle Meeting-Format-Codes und Beschreibungen auf (O, C, VM, BT, etc.)

bmlt_get_service_bodies

Liste alle Service-Gremien (Gebiete/Regionen) auf dem Root-Server auf

bmlt_get_server_info

Überprüfe die Root-Server-Version und das geografische Zentrum

Beispiel-Prompts nach der Verbindung

  • "Welche NA-Meetings finden heute Abend in Portland statt?"

  • "Finde offene virtuelle Meetings am Dienstag"

  • "Zeige mir alle Meetings im Umkreis von 5 Meilen um die Innenstadt von Portland"

  • "Was bedeutet der Format-Code 'BT'?"

  • "Liste alle Service-Gremien auf dem WSZF-Server auf"


Related MCP server: Medical Terminologies MCP

Standardeinstellungen

Standardmäßig verweist der Server auf:

  • Root-Server: https://bmlt.wszf.org/main_server (WSZF-Netzwerk)

  • Standard-Service-Gremium: 26 (Portland Area NA)

Alle Tools akzeptieren einen root_server_url-Parameter, um auf jeden beliebigen BMLT-Root-Server zu verweisen, sowie service_body_ids, um Suchen auf andere Gebiete einzugrenzen.


Installation

git clone https://github.com/jbonjour/bmlt-mcp-server.git
cd bmlt-mcp-server
npm install
npm run build

Verwendung

Mit Claude Desktop (stdio — empfohlen)

Füge dies zur Claude Desktop-Konfiguration hinzu (~/Library/Application Support/Claude/claude_desktop_config.json unter macOS):

{
  "mcpServers": {
    "bmlt": {
      "command": "node",
      "args": ["/absolute/path/to/bmlt-mcp-server/dist/index.js"]
    }
  }
}

Starte Claude Desktop neu. Du wirst die BMLT-Tools in deinem Chat verfügbar sehen.

Mit Claude Code

claude mcp add bmlt node /absolute/path/to/bmlt-mcp-server/dist/index.js

HTTP-Modus (für Remote-/Multi-Client-Nutzung)

TRANSPORT=http PORT=3000 node dist/index.js
# Server listens on http://localhost:3000/mcp

Entwicklung

npm install
npm run build      # compile TypeScript → dist/
npm start          # run compiled server (stdio)

# Or run via HTTP for testing:
TRANSPORT=http PORT=3000 npm start

Zum Testen mit dem MCP Inspector:

npx @modelcontextprotocol/inspector node dist/index.js

Umgebungsvariablen

Variable

Standard

Beschreibung

TRANSPORT

stdio

Transportmodus: stdio oder http

PORT

3000

HTTP-Port (wird nur verwendet, wenn TRANSPORT=http)


Ändern des Standard-Root-Servers oder Service-Gremiums

Bearbeite src/constants.ts:

export const DEFAULT_ROOT_SERVER = "https://bmlt.wszf.org/main_server";
export const DEFAULT_SERVICE_BODY_ID = 26; // Portland NA

Dann neu erstellen: npm run build


BMLT-Root-Server

Jedes NA-Service-Gremium, das BMLT betreibt, kann abgefragt werden. Gängige Root-Server:

Netzwerk

URL

WSZF (Pacific Northwest)

https://bmlt.wszf.org/main_server

NA World Services (Aggregator)

https://na.org/main_server

Finde den Root-Server deiner Region unter bmlt.app.


Mitwirken

PRs sind willkommen. Dies wurde entwickelt, um das Website-Modernisierungsprojekt der Portland Area NA zu unterstützen, und wurde für die breitere NA-Tech-Community als Open Source veröffentlicht.


Lizenz

MIT — frei zu verwenden, zu teilen und zu verändern. Alle Arbeiten wurden von und für die NA-Community durchgeführt.

Available Tools

5 tools
bmlt_get_formatsGet Meeting FormatsA
Read-onlyIdempotent

Retrieve all meeting format codes and their descriptions from a BMLT root server.

Formats describe the type of meeting — e.g. "O" = Open, "C" = Closed, "VM" = Virtual Meeting, "BT" = Book Study, "D" = Discussion, "SP" = Speaker, "WC" = Wheelchair Accessible.

Use this to:

  • Discover what format codes are available before filtering a meeting search

  • Explain what a format code means to a user

  • List all available meeting types on the server

Args:

  • root_server_url (string, optional): BMLT root server URL. Defaults to "https://bmlt.wszf.org/main_server"

  • response_format (string, optional): "markdown" (default) or "json"

Returns: List of format codes, names, and descriptions.

ParametersJSON Schema
NameRequiredDescriptionDefault
root_server_urlNoBMLT root server URL (default: "https://bmlt.wszf.org/main_server")
response_formatNoOutput format: 'markdown' or 'json'markdown

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already indicate read-only and idempotent behavior; the description adds context on default URL and response format options (markdown or json), slightly exceeding what annotations provide.

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?

The description is brief and well-organized with a clear statement, bullet points for use cases, and an Args list. Every sentence adds value without redundancy.

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?

The tool is simple, and annotations cover safety. The description explains the return value as a list of codes, names, and descriptions, which is sufficient for understanding the output. No output schema exists, but the description fills the gap adequately.

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 coverage is 100% with descriptions for both parameters. The description repeats parameter details but adds the default URL value and format options, providing minimal additional 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 retrieves all meeting format codes and descriptions, with specific examples like 'O' for Open. It distinguishes from sibling tools by focusing on formats rather than meetings, servers, or service bodies.

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?

Explicit usage scenarios are provided: discovering format codes before filtering, explaining codes to users, and listing all meeting types. No exclusions or comparisons to alternatives are given, but context is clear.

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

bmlt_get_meeting_detailsGet Meeting DetailsA
Read-onlyIdempotent

Retrieve full details for a specific NA meeting by its BMLT meeting ID.

Use this after bmlt_search_meetings to get the complete record for a specific meeting.

Args:

  • meeting_id (number): The BMLT meeting ID (the "id_bigint" field from search results)

  • root_server_url (string, optional): BMLT root server URL. Defaults to "https://bmlt.wszf.org/main_server"

  • service_body_ids (number[], optional): Service body IDs to scope the search. Defaults to [26]

  • response_format (string, optional): "markdown" (default) or "json"

Returns: Full meeting record including name, day, time, location, formats, virtual links, and all metadata fields.

ParametersJSON Schema
NameRequiredDescriptionDefault
meeting_idYesThe BMLT meeting ID (id_bigint field from search results)
root_server_urlNoBMLT root server URL (default: "https://bmlt.wszf.org/main_server")
service_body_idsNoService body IDs (default: [26] = Portland NA)
response_formatNoOutput format: 'markdown' or 'json'markdown

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false. Description adds that it returns full meeting record with specific fields (name, day, time, etc.), which is useful 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.

Conciseness5/5

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

Very concise: 4 sentences total. Front-loaded with purpose, then usage hint, then args/returns. Every sentence adds value with no waste.

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 low complexity, rich annotations, 100% schema coverage, and no output schema needed, the description fully covers purpose, usage, parameters, and return content. No gaps.

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. Description adds meaning by explaining meeting_id comes from search results, and provides default values and purpose for root_server_url and service_body_ids.

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 'Retrieve full details for a specific NA meeting by its BMLT meeting ID'. It distinguishes from sibling tools like bmlt_search_meetings by specifying this is for getting a complete record after search.

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?

Explicitly says 'Use this after bmlt_search_meetings to get the complete record for a specific meeting', providing clear context. However, no explicit when-not-to-use or alternatives, but usage is well implied.

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

bmlt_get_server_infoGet Server InfoA
Read-onlyIdempotent

Retrieve metadata about a BMLT root server, including version and geographic center.

Use this to verify a server is reachable, check its version, or get its default center coordinates.

Args:

Returns: Server version, center lat/lng, default zoom level, and region bias.

ParametersJSON Schema
NameRequiredDescriptionDefault
root_server_urlNoBMLT root server URL (default: "https://bmlt.wszf.org/main_server")

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true. The description adds context about network call behavior and return data, which is consistent and non-contradictory.

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 concise with a front-loaded purpose, followed by usage, args, and returns. Efficient, though could use clearer section separation.

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 simple tool with one optional param and no output schema, the description adequately covers purpose, usage, parameters, and returns, making it complete for its complexity.

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% for the single parameter, so the description adds minimal new info beyond restating the default URL. It does provide usage context, but baseline 3 is appropriate.

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 retrieves metadata about a BMLT root server, specifically version and geographic center. This distinguishes it from sibling tools which handle formats, meeting details, service bodies, and search.

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?

The description explicitly lists use cases: verifying reachability, checking version, or getting coordinates. It does not explicitly exclude other uses, but the context and sibling tools provide reasonable differentiation.

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

bmlt_get_service_bodiesGet Service BodiesA
Read-onlyIdempotent

Retrieve all service bodies (NA regions, areas, districts) from a BMLT root server.

Service bodies are the organizational units that manage meeting data in BMLT. Knowing the ID of a service body lets you filter meeting searches to a specific area.

Use this to:

  • Discover service body IDs for use in bmlt_search_meetings

  • See the hierarchy of areas served by a root server

  • Find a specific area's helpline or website

Args:

  • root_server_url (string, optional): BMLT root server URL. Defaults to "https://bmlt.wszf.org/main_server"

  • response_format (string, optional): "markdown" (default) or "json"

Returns: List of service bodies with IDs, names, types, URLs, and helplines.

Example: Portland NA has service body ID 26 on the WSZF root server.

ParametersJSON Schema
NameRequiredDescriptionDefault
root_server_urlNoBMLT root server URL (default: "https://bmlt.wszf.org/main_server")
response_formatNoOutput format: 'markdown' or 'json'markdown

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already indicate read-only, non-destructive, idempotent behavior. The description adds value by specifying return fields (IDs, names, types, URLs, helplines) and providing an example. No contradiction 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.

Conciseness5/5

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

The description is well-structured with clear sections, bullet points, and an example. Every sentence adds value without redundancy. It is appropriately concise.

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 no output schema, the description adequately explains the return list and includes an example. 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.

Parameters4/5

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

Schema coverage is 100%, so the schema already describes parameters. The description adds practical guidance by showing defaults and an example (root_server_url). This enhances 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 clearly states 'Retrieve all service bodies' and explains their role as organizational units in BMLT. It distinguishes from sibling tools by explicitly mentioning their use in filtering meeting searches via bmlt_search_meetings.

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?

The description explicitly lists use cases: discovering service body IDs, viewing hierarchy, and finding helpline/website. It provides good context for when to use this tool, though it lacks explicit exclusions or when-not scenarios.

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

bmlt_search_meetingsSearch NA MeetingsA
Read-onlyIdempotent

Search for Narcotics Anonymous meetings in the BMLT database.

Returns a list of meetings matching the given filters. All filters are optional — omitting them returns all meetings for the default service body.

Args:

  • root_server_url (string, optional): BMLT root server URL. Defaults to "https://bmlt.wszf.org/main_server"

  • service_body_ids (number[], optional): Filter by service body IDs. Defaults to [26] (Portland NA)

  • weekdays (string[], optional): Filter by day(s) of week. Accepts day names like "Monday", "tuesday", or numbers 1–7 (1=Sunday)

  • formats (string[], optional): Filter by format codes, e.g. ["O"] for Open, ["VM"] for Virtual, ["C"] for Closed

  • meeting_name (string, optional): Search meetings by name (partial match)

  • lat (number, optional): Latitude for geo search. Requires lng.

  • lng (number, optional): Longitude for geo search. Requires lat.

  • radius_miles (number, optional): Search radius in miles when using lat/lng. Default: 10

  • start_time_min (string, optional): Only meetings starting at or after this time, format "HH:MM" (24h)

  • start_time_max (string, optional): Only meetings starting at or before this time, format "HH:MM" (24h)

  • response_format (string, optional): "markdown" (default) or "json"

Returns: Formatted list of meetings with name, day, time, location, formats, and links.

Examples:

  • "Show all Portland NA meetings on Friday" → weekdays: ["Friday"]

  • "Find open meetings near downtown Portland" → formats: ["O"], lat: 45.5231, lng: -122.6765

  • "Virtual meetings this week" → formats: ["VM"]

  • "Morning meetings" → start_time_max: "12:00"

ParametersJSON Schema
NameRequiredDescriptionDefault
root_server_urlNoBMLT root server URL (default: "https://bmlt.wszf.org/main_server")
service_body_idsNoService body IDs to search (default: [26] = Portland NA)
weekdaysNoFilter by day(s) of week
formatsNoFormat codes to filter by, e.g. ['O'] for Open, ['VM'] for Virtual
meeting_nameNoSearch meetings by name (partial match)
latNoLatitude for geographic search
lngNoLongitude for geographic search
radius_milesNoSearch radius in miles when using lat/lng (default: 10)
start_time_minNoEarliest start time filter, format HH:MM (24h), e.g. '08:00'
start_time_maxNoLatest start time filter, format HH:MM (24h), e.g. '12:00'
response_formatNoOutput format: 'markdown' for human-readable or 'json' for structured datamarkdown

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true, openWorldHint=true. The description adds value by explaining the return format ('Formatted list of meetings with name, day, time, location, formats, and links') and query behavior without contradicting 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 with a clear opening, list of parameters, and examples. It is slightly long due to detailed parameter descriptions, but every sentence adds value. It could be more concise, but it remains clear.

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?

With 11 optional parameters and no output schema, the description covers all parameters with defaults, formats, and examples. It explains the return format and provides multiple usage examples, making it complete for an AI agent to decide when and how to use the tool.

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?

Input schema has 100% coverage, but the description adds significant value by providing default values (root_server_url, service_body_ids, radius_miles) and clarifying accepted formats (weekdays as names or numbers, start_time as HH:MM, format codes like 'O', 'VM'). Examples tie parameters to real queries.

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 'Search for Narcotics Anonymous meetings in the BMLT database' and 'Returns a list of meetings matching the given filters.' It distinguishes from sibling tools which focus on getting formats, details, server info, or service bodies.

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?

The description provides examples like showing Portland meetings, finding open meetings near downtown, virtual meetings, and morning meetings. It notes that all filters are optional and omitting them returns all meetings for the default service body. It does not explicitly state when not to use or compare to alternatives, but the context is clear.

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. 5 tool updatesv1.0.0
    • First observedbmlt_get_formats
    • First observedbmlt_get_meeting_details
    • First observedbmlt_get_server_info
    • First observedbmlt_get_service_bodies
    • First observedbmlt_search_meetings

TDQS

A4.5/5.0

Scored across 5 tools

Disambiguation5/5

Each tool has a clearly distinct purpose: formats, meeting details, server info, service bodies, and search. There is no overlap, and an agent can easily select the right tool for a given task.

Naming Consistency5/5

All tool names follow the predictable pattern 'bmlt_verb_noun' (e.g., bmlt_get_formats, bmlt_search_meetings). The convention is consistent and readable.

Tool Count5/5

Five tools is an appropriate number for a read-only meeting information server. Each tool serves a necessary function without being excessive or insufficient.

Completeness5/5

The tool set covers all primary operations for querying BMLT meeting data: retrieving metadata (server info, service bodies, formats), searching meetings, and getting detailed records. No obvious gaps exist for the intended read-only use case.

Maintenance

ActivityInactive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers