BMLT Meetings

io.github.bmlt-enabled由 GitHub 帳號 bmlt-enabled 發布v0.3.0更新於 Oct 24, 2026

Search Narcotics Anonymous meetings worldwide via the BMLT directory.

已驗證Streamable HTTP可網頁執行位置與生活網頁搜尋與抓取

概覽

AI 產生的概覽

唯讀 MCP 伺服器,可透過 BMLT 會議目錄搜尋全球匿名戒毒會(NA)會議。

可以做什麼
  • 依地址或經緯度加半徑搜尋會議,並可依星期、時段、形式、實體/線上/混合及服務團體篩選
  • 依 BMLT id 取得單場會議的完整紀錄
  • 列出會議形式與服務團體,方便把名稱對應成搜尋所需的 ID
  • 查看根伺服器的能力、版本、語言與預設座標
  • 列出聚合器已知的公開 BMLT 根伺服器,並查詢指定的其中一個
適用情境
適合讓助理依地點、日期或時間協助使用者尋找實體、線上或混合的 NA 會議,或查詢某場會議的詳細資訊。適用於會議目錄、熱線類助理與在地復原資源情境。
執行需求
公開執行個體是遠端 streamable HTTP 端點,不需帳號或金鑰。自行架設需 PHP 8.2+ 或 Docker,必須設定 BMLT_ROOT_SERVER_URL,可選配地理編碼(預設 Nominatim,或使用 Google API 金鑰)以及允許的根伺服器白名單。
安裝前請注意
所有工具皆為唯讀。公開部署沒有身分驗證,任何能連上該端點的人都能呼叫工具。地址搜尋會交由第三方地理編碼服務(Nominatim/OSM 或 Google)處理。自行架設時應保留根伺服器白名單,避免允許任意根 URL,README 指出這會帶來 SSRF 式查詢風險。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 BMLT Meetings,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Web executable,透過 Streamable HTTP。 遠端服務在工作區中設定後即可從網頁執行環境執行。

交給代理程式安裝

把這段提示詞貼上到 Claude Code、Codex、Cursor 等代理程式,或 SourceWeft 對話中。代理程式會讀取該伺服器的安裝指南,先向你展示發布者、端點和登入方式,經你同意後再把它新增到你的客戶端。金鑰不會寫進任何命令。

閱讀 https://sourceweft.com/mcp/io.github.bmlt-enabled%2Fbmlt-server-mcp/install.md,並按其中說明把這個 MCP 伺服器接入我的客戶端。修改任何設定之前,先告訴我它的發布者、端點和登入方式,等我確認。不要把 API 金鑰寫進命令或我會提交的檔案;問我金鑰應從哪裡取得。

檢視代理程式所依據的安裝指南

其他 MCP 客戶端

把它新增到你客戶端的 mcpServers 設定中。

{
  "mcpServers": {
    "bmlt-meetings": {
      "type": "http",
      "url": "https://mcp.bmlt.app/mcp"
    }
  }
}

README

bmlt-server-mcp

A streamable HTTP Model Context Protocol server that exposes BMLT (Basic Meeting List Toolbox — the Narcotics Anonymous meeting directory) as a set of read-only tools that AI assistants can call directly.

BMLT hosts approximately 85% of Narcotics Anonymous meetings worldwide; the default backend is the BMLT aggregator, which federates every public BMLT root server (server list) into a single search surface — effectively the authoritative AI-accessible source for finding NA meetings.

MCP is an open protocol, so any compatible client works: Claude (Code, Desktop, web), ChatGPT (Connectors and the Responses API), Google Gemini, Cursor, Windsurf, Zed, Cline, Continue, and others.

Unlike the npm bmlt-mcp-server (stdio-only, runs as a local subprocess), this server speaks MCP over HTTP and is meant to be hosted once and consumed remotely.

Built on Laravel + PHP 8.2+ using the official laravel/mcp package.

A live deployment runs at https://mcp.bmlt.app/ (landing page) with a tools reference at https://mcp.bmlt.app/reference.


Tools

All tools are read-only and idempotent. All tools accept an optional root_server_url argument; if omitted, the configured BMLT_ROOT_SERVER_URL is used.

ToolWhat it does
search_meetingsSearch meetings by address (geocoded server-side) or lat/lng + radius, filtered by weekday, time, format, venue type (in-person / virtual / hybrid), service body, and free text. Returns a curated summary by default (data_format=full for the raw BMLT response).
get_meetingFetch a single meeting by its BMLT id_bigint.
list_formatsList meeting format codes (Open, Closed, Speaker, Beginners, language tags, …) so callers can map names → IDs for search_meetings.
list_service_bodiesList zones / regions / areas / groups so callers can map names → IDs for search_meetings.
get_server_infoCapabilities, version, languages, and default coordinates for the configured root server.
list_root_serversPublic BMLT root servers known to the aggregator. Useful when the caller wants to switch roots.

Quick start

Docker (recommended)

bash
cp .env.example .envdocker compose up --build

The MCP endpoint is then live at http://localhost:8080/mcp over the Streamable HTTP transport.

Local PHP

bash
composer installcp .env.example .envphp artisan key:generatephp artisan serve     # http://localhost:8000/mcp

Verify with the MCP Inspector

bash
php artisan mcp:inspector

Then connect to http://localhost:8000/mcp (or :8080 for Docker) and list tools.


Configuration

All configuration lives in .env (see .env.example). The interesting bits:

VariablePurpose
BMLT_ROOT_SERVER_URLRequired. Default BMLT root server, including /main_server path.
BMLT_ALLOWED_ROOTSComma-separated allowlist for the optional root_server_url tool argument. The default root is always implicitly allowed.
BMLT_ALLOW_ANY_ROOTtrue allows any URL via root_server_url — not recommended in production (enables SSRF-style queries). Off by default.
BMLT_AGGREGATOR_URLAggregator queried by list_root_servers. Defaults to the public aggregator.
GEOCODERnominatim (default), google, or null. null rejects address inputs and requires lat/lng.
NOMINATIM_USER_AGENTIdentifies your deployment to OSM — required by Nominatim's ToS. Always set this in production.
GOOGLE_GEOCODER_API_KEYRequired when GEOCODER=google.

Why an allowlist?

The optional root_server_url tool argument lets a single deployment serve any BMLT root, but accepting arbitrary URLs would let callers turn the server into an SSRF probe against your network. The default is a strict allowlist (the configured default root, plus anything you add to BMLT_ALLOWED_ROOTS). Set BMLT_ALLOW_ANY_ROOT=true only when the server is isolated from anything sensitive.


Connecting AI clients

The endpoint of a deployed instance is https://your-host.example.com/mcp. Replace it below with your own host (or use https://mcp.bmlt.app/mcp to try the public instance).

Claude Code (CLI)

bash
claude mcp add --transport http bmlt https://your-host.example.com/mcp

Claude Desktop — Custom Connector (newer builds)

Settings → Connectors → Add custom connector → paste the URL.

Claude Desktop — Config file (any version, needs Node.js)

jsonc
{  "mcpServers": {    "bmlt": {      "command": "npx",      "args": ["-y", "mcp-remote", "https://your-host.example.com/mcp"]    }  }}

ChatGPT / OpenAI Responses API

json
{  "tools": [    {      "type": "mcp",      "server_label": "bmlt",      "server_url": "https://your-host.example.com/mcp"    }  ]}

In ChatGPT itself (Pro/Business/Enterprise): Settings → Connectors → Add, using the same URL.

Cursor / Windsurf / Zed / Cline / Continue

All of these read an mcpServers block. For Cursor, edit ~/.cursor/mcp.json (or the project-local .cursor/mcp.json); other clients use a similar config file.

json
{  "mcpServers": {    "bmlt": {      "url": "https://your-host.example.com/mcp"    }  }}

For per-tool parameter documentation and BMLT-API mappings, see the live reference page. For day-to-day commands on a deployed instance (log tailing, usage summaries, cache clears, upgrades), see docs/operations.md.


Adding authentication

The default config has no auth — anyone who can reach /mcp can call the tools. To gate it:

php
// routes/ai.phpuse Laravel\Mcp\Facades\Mcp;
Mcp::oauthRoutes();                          // OAuth 2.1 (Laravel Passport)Mcp::web('/mcp', BmltServer::class)    ->middleware('auth:api');

Or add a simple bearer-token check via custom middleware. See the Laravel MCP docs for the full options.


Architecture

app/├── Mcp/│   ├── Servers/BmltServer.php           # Registers the 6 tools│   └── Tools/│       ├── SearchMeetingsTool.php│       ├── GetMeetingTool.php│       ├── ListFormatsTool.php│       ├── ListServiceBodiesTool.php│       ├── GetServerInfoTool.php│       ├── ListRootServersTool.php│       └── Concerns/ResolvesBmltClient.php├── Services/│   ├── Bmlt/│   │   ├── BmltClient.php               # Wraps client_interface/json│   │   ├── BmltClientFactory.php        # Allowlist enforcement│   │   └── BmltException.php│   └── Geocoding/│       ├── Geocoder.php                 # Interface│       ├── GeocoderManager.php          # Driver resolver│       ├── NominatimGeocoder.php        # OSM (rate-limited, cached)│       ├── GoogleGeocoder.php           # Google Geocoding API│       ├── NullGeocoder.php             # Disabled│       ├── GeocodingResult.php│       └── GeocodingException.php└── Providers/BmltServiceProvider.php
config/bmlt.php                          # All knobsroutes/ai.php                            # Mcp::web('/mcp', BmltServer::class)

The HTTP API wrapped by BmltClient is formally specified by the BMLT Semantic OpenAPI document (OpenAPI 3.1) — refer to it for every parameter, response shape, and field definition that BMLT itself supports, even if this MCP server doesn't yet expose it as a tool argument.


License

MIT

來源:README.md,提交 1eb54ce

工具

6

search_meetings

Search Narcotics Anonymous meetings

Search Narcotics Anonymous meetings on a BMLT root server. Filter by location (address or lat/lng + radius), weekday, time of day, format, venue type (in-person / virtual / hybrid), and service body. Returns a trimmed summary by default; pass data_format='full' for the raw BMLT response.

輸入參數pageaddresslanguagelatitudeweekdayslongitudepage_sizeradius_kmformat_idsdata_formatsearch_textvenue_types另有 6 個

get_meeting

Get a single meeting by ID

Fetch the full record for a single meeting by its BMLT id_bigint.

輸入參數id必填root_server_url

list_formats

List meeting formats

List available meeting formats (Open, Closed, Speaker, Beginners, language tags, etc.) so the caller can map human-friendly format names to BMLT format IDs.

輸入參數languageformat_idskey_stringsinclude_unusedroot_server_url

list_service_bodies

List service bodies (regions / areas)

List BMLT service bodies (zones, regions, areas, groups). Useful for translating "Northern California Region" to a service body ID for use with search_meetings.

輸入參數include_parentsroot_server_urlinclude_childrenservice_body_ids

get_server_info

Get BMLT root server info

Return capabilities, version, languages, and default coordinates for a BMLT root server.

輸入參數root_server_url

list_root_servers

List known BMLT root servers

List public BMLT root servers known to the BMLT aggregator. Use the returned root_server_url values with other tools to query a specific server.

輸入參數name_contains

版本歷史

1
  1. v0.3.0最新Sep 16, 2026

評分

已滿足適用檢查項的 90%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通必需25 分
  • 已宣告認證方式必需10 分
  • 已列出工具必需15 分
  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分

    請在儲存庫或註冊中心條目中宣告授權條款。