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 分

    请在仓库或注册中心条目中声明许可证。