bmlt-mcp-server
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 |
| Suche Meetings nach Tag, Format, Ort, Name oder Geokoordinaten |
| Rufe alle Details für ein bestimmtes Meeting per ID ab |
| Liste alle Meeting-Format-Codes und Beschreibungen auf (O, C, VM, BT, etc.) |
| Liste alle Service-Gremien (Gebiete/Regionen) auf dem Root-Server auf |
| Ü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 buildVerwendung
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.jsHTTP-Modus (für Remote-/Multi-Client-Nutzung)
TRANSPORT=http PORT=3000 node dist/index.js
# Server listens on http://localhost:3000/mcpEntwicklung
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 startZum Testen mit dem MCP Inspector:
npx @modelcontextprotocol/inspector node dist/index.jsUmgebungsvariablen
Variable | Standard | Beschreibung |
|
| Transportmodus: |
|
| HTTP-Port (wird nur verwendet, wenn |
Ä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 NADann 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) |
|
NA World Services (Aggregator) |
|
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 toolsbmlt_get_formatsGet Meeting FormatsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| root_server_url | No | BMLT root server URL (default: "https://bmlt.wszf.org/main_server") | |
| response_format | No | Output format: 'markdown' or 'json' | markdown |
TDQS
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.
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.
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.
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.
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.
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 DetailsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| meeting_id | Yes | The BMLT meeting ID (id_bigint field from search results) | |
| root_server_url | No | BMLT root server URL (default: "https://bmlt.wszf.org/main_server") | |
| service_body_ids | No | Service body IDs (default: [26] = Portland NA) | |
| response_format | No | Output format: 'markdown' or 'json' | markdown |
TDQS
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.
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.
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.
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.
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.
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 InfoARead-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:
root_server_url (string, optional): BMLT root server URL. Defaults to "https://bmlt.wszf.org/main_server"
Returns: Server version, center lat/lng, default zoom level, and region bias.
| Name | Required | Description | Default |
|---|---|---|---|
| root_server_url | No | BMLT root server URL (default: "https://bmlt.wszf.org/main_server") |
TDQS
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.
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.
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.
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.
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.
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 BodiesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| root_server_url | No | BMLT root server URL (default: "https://bmlt.wszf.org/main_server") | |
| response_format | No | Output format: 'markdown' or 'json' | markdown |
TDQS
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.
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.
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.
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.
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.
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 MeetingsARead-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"
| Name | Required | Description | Default |
|---|---|---|---|
| root_server_url | No | BMLT root server URL (default: "https://bmlt.wszf.org/main_server") | |
| service_body_ids | No | Service body IDs to search (default: [26] = Portland NA) | |
| weekdays | No | Filter by day(s) of week | |
| formats | No | Format codes to filter by, e.g. ['O'] for Open, ['VM'] for Virtual | |
| meeting_name | No | Search meetings by name (partial match) | |
| lat | No | Latitude for geographic search | |
| lng | No | Longitude for geographic search | |
| radius_miles | No | Search radius in miles when using lat/lng (default: 10) | |
| start_time_min | No | Earliest start time filter, format HH:MM (24h), e.g. '08:00' | |
| start_time_max | No | Latest start time filter, format HH:MM (24h), e.g. '12:00' | |
| response_format | No | Output format: 'markdown' for human-readable or 'json' for structured data | markdown |
TDQS
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.
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.
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.
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.
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.
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.
5 tool updates
v1.0.0- First observed
bmlt_get_formats - First observed
bmlt_get_meeting_details - First observed
bmlt_get_server_info - First observed
bmlt_get_service_bodies - First observed
bmlt_search_meetings
TDQS
Scored across 5 tools
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.
All tool names follow the predictable pattern 'bmlt_verb_noun' (e.g., bmlt_get_formats, bmlt_search_meetings). The convention is consistent and readable.
Five tools is an appropriate number for a read-only meeting information server. Each tool serves a necessary function without being excessive or insufficient.
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
Related MCP Connectors
- ZapierOAuthcom.zapier
Hosted MCP server connecting AI assistants to 9,000+ apps and 40,000+ actions via Zapier.
One connector for 15,000+ MCP servers plus your team's private MCPs, from any AI client.
- UnifAPIOAuthcom.unifapi
Hosted MCP server for live public-data APIs and Skills for AI agents.
Hosted MCP server exposing US hospital procedure cost data to AI assistants
Related MCP Servers
- AlicenseAqualityCmaintenanceMCP server for accessing Sessionize event data. Query speakers, sessions, and schedules from any Sessionize-powered conference using natural language.64Apache 2.0
- AlicenseAqualityAmaintenanceUnified MCP server providing LLMs with reliable lookup access to ICD-11, LOINC, RxNorm, MeSH, ATC, CID-10, and (optionally) SNOMED CT.33133 npm13MIT
- AlicenseAqualityDmaintenanceMCP server for Mindbody, enabling AI agents to fetch client info, query class schedules, book classes/appointments (env-gated), and process checkout (payment-gated).5MIT
- AlicenseAqualityCmaintenanceMCP server that lets you talk to your GoHighLevel sub-account in plain English, offering six tools to search contacts, list calendars, check free slots, and book appointments with dry-run safety and explicit error messages.6MIT