Skip to main content
Glama
jbonjour

bmlt-mcp-server

by jbonjour

bmlt-mcp-server

전 세계 Narcotics Anonymous(NA) 서비스 기관에서 사용하는 오픈 소스 모임 데이터베이스인 BMLT(Basic Meeting List Toolbox)를 위한 MCP(Model Context Protocol) 서버입니다.

Claude(또는 모든 MCP 호환 AI 클라이언트)를 BMLT 루트 서버에 연결하고 자연어를 사용하여 NA 모임 데이터를 쿼리하세요.


기능

네 가지 도구를 제공합니다:

도구

설명

bmlt_search_meetings

요일, 형식, 위치, 이름 또는 지리적 좌표로 모임 검색

bmlt_get_meeting_details

ID를 통해 특정 모임의 전체 세부 정보 가져오기

bmlt_get_formats

모든 모임 형식 코드 및 설명(O, C, VM, BT 등) 나열

bmlt_get_service_bodies

루트 서버의 모든 서비스 기관(지역/지구) 나열

bmlt_get_server_info

루트 서버 버전 및 지리적 중심 확인

연결 후 사용 가능한 프롬프트 예시

  • "오늘 밤 포틀랜드에서 열리는 NA 모임은 무엇인가요?"

  • "화요일에 열리는 오픈 가상 모임을 찾아줘"

  • "포틀랜드 시내 반경 5마일 이내의 모든 모임을 보여줘"

  • "형식 코드 'BT'는 무엇을 의미하나요?"

  • "WSZF 서버의 모든 서비스 기관을 나열해줘"


Related MCP server: Medical Terminologies MCP

기본값

기본적으로 서버는 다음을 가리킵니다:

  • 루트 서버: https://bmlt.wszf.org/main_server (WSZF 네트워크)

  • 기본 서비스 기관: 26 (포틀랜드 지역 NA)

모든 도구는 모든 BMLT 루트 서버를 가리키는 root_server_url 매개변수와 다른 지역으로 검색 범위를 지정하는 service_body_ids를 허용합니다.


설치

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

사용법

Claude Desktop 사용 시 (stdio — 권장)

Claude Desktop 설정(~/Library/Application Support/Claude/claude_desktop_config.json, macOS 기준)에 추가하세요:

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

Claude Desktop을 재시작하세요. 채팅에서 BMLT 도구를 사용할 수 있게 됩니다.

Claude Code 사용 시

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

HTTP 모드 (원격/다중 클라이언트 사용 시)

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

개발

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

MCP Inspector로 테스트하려면:

npx @modelcontextprotocol/inspector node dist/index.js

환경 변수

변수

기본값

설명

TRANSPORT

stdio

전송 모드: stdio 또는 http

PORT

3000

HTTP 포트 (TRANSPORT=http일 때만 사용)


기본 루트 서버 또는 서비스 기관 변경

src/constants.ts를 수정하세요:

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

그런 다음 다시 빌드하세요: npm run build


BMLT 루트 서버

BMLT를 실행하는 모든 NA 서비스 기관을 쿼리할 수 있습니다. 일반적인 루트 서버:

네트워크

URL

WSZF (태평양 북서부)

https://bmlt.wszf.org/main_server

NA World Services (애그리게이터)

https://na.org/main_server

bmlt.app에서 해당 지역의 루트 서버를 찾으세요.


기여

PR을 환영합니다. 이 프로젝트는 포틀랜드 지역 NA의 웹사이트 현대화 프로젝트를 지원하기 위해 구축되었으며, 더 넓은 NA 기술 커뮤니티를 위해 오픈 소스로 공개되었습니다.


라이선스

MIT — 자유롭게 사용, 공유 및 수정할 수 있습니다. 모든 작업은 NA 커뮤니티를 위해, 커뮤니티에 의해 수행되었습니다.

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