关于 Na Meetings
Na Meetings 是一个通过 BMLT 目录查找全球匿名戒毒会(NA)会议的 MCP 服务,适用于需要检索会议的用户和 AI 客户端。它提供只读查询,可按地点、时间、形式和服务区域筛选。
主要功能
- 01按地址或坐标搜索会议
- 02按日期、时间、形式和场地筛选
- 03获取单场会议详情
- 04列出会议形式与服务区域
- 05查询根服务器信息
适用场景
- 01查找附近特定日期和形式的 NA 会议
- 02按线上、线下或混合场地筛选会议
- 03查询会议格式代码或服务区域
MCP 相关
该服务通过 Streamable HTTP 向 MCP 客户端提供只读、幂等工具,可访问 BMLT 会议目录。默认后端使用聚合器汇集公开 BMLT 根服务器。
配置
远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。
https://mcp.bmlt.app/mcpclaude mcp add --transport http bmlt-server https://mcp.bmlt.app/mcp{"mcpServers":{"bmlt-server":{"type":"http","url":"https://mcp.bmlt.app/mcp"}}}在 Cursor 中打开{"servers":{"bmlt-server":{"type":"http","url":"https://mcp.bmlt.app/mcp"}}}在 VS Code 中打开{"mcpServers":{"bmlt-server":{"type":"http","url":"https://mcp.bmlt.app/mcp"}}}{"mcpServers":{"bmlt-server":{"serverUrl":"https://mcp.bmlt.app/mcp"}}}命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。
工具
6| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| page | integer | 否 | 页码(从 1 开始)。与 page_size 配合使用。 |
| address | string | 否 | 用于搜索附近地点的自由格式地址(由服务器端进行地理编码)。如果提供了 latitude 和 longitude,则忽略此项。 |
| language | string | 否 | 格式名称所用的语言代码(例如 "en"、"es"、"de"、"fr")。 |
| latitude | number | 否 | 十进制度数表示的纬度。与 longitude 配对可进行精确坐标搜索。 |
| weekdays | array | 否 | 星期筛选条件。1=星期日,2=星期一,……,7=星期六。示例:[2,4,6] 表示星期一/三/五。 |
| longitude | number | 否 | 十进制度数表示的经度。与 latitude 配对可进行精确坐标搜索。 |
| page_size | integer | 否 | 每页结果数。省略此项可返回所有匹配项。 |
| radius_km | number | 否 | 以千米为单位的搜索半径。如果同时提供 radius_miles,则优先使用此项。如果未提供坐标,则忽略此项。 |
| format_ids | array | 否 | 需要匹配的 BMLT 格式 ID。使用 list_formats 查找 ID(例如 Open、Closed、Speaker、Beginners)。 |
| data_format | enum | 否 | "summary" 返回经过整理的字段子集(默认值)。"full" 返回原始 BMLT 响应。summary | full |
| search_text | string | 否 | 在会议名称、地点和备注中进行全文搜索。 |
| venue_types | array | 否 | 场地类型筛选条件。1=线下,2=虚拟,3=混合。 |
| radius_miles | number | 否 | 以英里为单位的搜索半径。默认值为 10。如果提供了 radius_km 或未提供坐标,则忽略此项。 |
| starts_after | string | 否 | 最早开始时间,采用 24 小时制 "HH:MM"(例如 "18:00")。 |
| starts_before | string | 否 | 最晚开始时间,采用 24 小时制 "HH:MM"(例如 "21:30")。 |
| root_server_url | string | 否 | 覆盖已配置的 BMLT 根服务器 URL。除非 BMLT_ALLOW_ANY_ROOT=true,否则该 URL 必须在允许列表中。 |
| service_body_ids | array | 否 | 限制为特定服务实体(区域/分区)。使用 list_service_bodies 查找 ID。 |
| recursive_services | boolean | 否 | 设置 service_body_ids 后,同时包括其子项。默认值为 true。 |
详细介绍
bmlt-server-mcp
一个采用 可流式传输的 HTTP 的 模型上下文协议服务,可将 BMLT(Basic Meeting List Toolbox——匿名戒毒互助会会议目录)作为一组只读工具提供,让 AI 助手可以直接调用。
BMLT 收录了全球约 85% 的匿名戒毒互助会会议;默认后端是 BMLT aggregator,它将所有公开的 BMLT 根服务(服务列表)联合起来,提供统一的搜索入口——实际上,它是查找匿名戒毒互助会会议时权威且可供 AI 访问的数据源。
MCP 是开放协议,因此任何兼容的客户端均可使用:Claude(Code、Desktop、网页)、ChatGPT(Connectors 和 Responses API)、Google Gemini、Cursor、Windsurf、Zed、Cline、Continue 等。
与 npm bmlt-mcp-server(仅支持 stdio,以本地子进程运行)不同,本服务通过 HTTP 提供 MCP,旨在部署一次并供远程使用。
基于 Laravel + PHP 8.2+ 构建,使用官方 laravel/mcp 软件包。
线上部署地址为 https://mcp.bmlt.app/(落地页),工具参考文档见 https://mcp.bmlt.app/reference。
工具
所有工具均为只读且幂等。所有工具都接受可选的 root_server_url 参数;若省略,则使用配置的 BMLT_ROOT_SERVER_URL。
| 工具 | 功能 |
|---|---|
search_meetings | 按地址(由服务端进行地理编码)或经纬度 + 半径搜索会议,并可按星期、时间、形式、场地类型(线下 / 虚拟 / 混合)、服务机构和自由文本筛选。默认返回精简摘要(使用 data_format=full 可获取原始 BMLT 响应)。 |
get_meeting | 按 BMLT id_bigint 获取单场会议。 |
list_formats | 列出会议形式代码(开放、封闭、主讲人、初学者、语言标签等),以便调用方将名称映射为 ID,供 search_meetings 使用。 |
list_service_bodies | 列出分区 / 地区 / 区域 / 小组,以便调用方将名称映射为 ID,供 search_meetings 使用。 |
get_server_info | 获取已配置根服务的功能、版本、语言和默认坐标。 |
list_root_servers | 列出 aggregator 所知的公开 BMLT 根服务。调用方需要切换根服务时可使用。 |
快速开始
Docker(推荐)
cp .env.example .env
docker compose up --build
随后,MCP 端点将在 http://localhost:8080/mcp 上通过 Streamable HTTP 传输提供服务。
本地 PHP
composer install
cp .env.example .env
php artisan key:generate
php artisan serve # http://localhost:8000/mcp
使用 MCP Inspector 验证
php artisan mcp:inspector
然后连接到 http://localhost:8000/mcp(Docker 使用 :8080),并列出工具。
配置
所有配置均位于 .env 中(参见 .env.example)。重要配置如下:
| 变量 | 用途 |
|---|---|
BMLT_ROOT_SERVER_URL | 必需。 默认 BMLT 根服务,须包含 /main_server 路径。 |
BMLT_ALLOWED_ROOTS | 以逗号分隔的允许列表,用于可选的 root_server_url 工具参数。默认根服务始终隐式允许。 |
BMLT_ALLOW_ANY_ROOT | true 允许通过 root_server_url 使用任意 URL——生产环境中不建议这样设置(可能导致 SSRF 类查询)。默认关闭。 |
BMLT_AGGREGATOR_URL | list_root_servers 查询的 Aggregator。默认使用公共 aggregator。 |
GEOCODER | nominatim(默认)、google 或 null。null 会拒绝地址输入,要求提供经纬度。 |
NOMINATIM_USER_AGENT | 用于向 OSM 标识你的部署——Nominatim 的服务条款要求设置。生产环境中务必设置。 |
GOOGLE_GEOCODER_API_KEY | 使用 GEOCODER=google 时必需。 |
为什么使用允许列表?
可选的 root_server_url 工具参数可让单个部署服务任意 BMLT 根服务器,但接受任意 URL 会让调用方将服务器用作针对你网络的 SSRF 探测工具。默认情况下使用严格的允许列表(已配置的默认根服务器,以及你在 BMLT_ALLOWED_ROOTS 中添加的任何根服务器)。只有在服务器与任何敏感内容隔离时,才设置 BMLT_ALLOW_ANY_ROOT=true。
连接 AI 客户端
已部署实例的端点为 https://your-host.example.com/mcp。将下方内容中的主机替换为你自己的主机(或使用 https://mcp.bmlt.app/mcp 试用公共实例)。
Claude Code(CLI)
claude mcp add --transport http bmlt https://your-host.example.com/mcp
Claude Desktop — 自定义连接器(较新版本)
设置 → 连接器 → 添加自定义连接器 → 粘贴 URL。
Claude Desktop — 配置文件(任意版本,需要 Node.js)
{
"mcpServers": {
"bmlt": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://your-host.example.com/mcp"]
}
}
}
ChatGPT / OpenAI Responses API
{
"tools": [
{
"type": "mcp",
"server_label": "bmlt",
"server_url": "https://your-host.example.com/mcp"
}
]
}
在 ChatGPT 中(Pro/Business/Enterprise):设置 → 连接器 → 添加,并使用相同的 URL。
Cursor / Windsurf / Zed / Cline / Continue
这些客户端都读取 mcpServers 块。对于 Cursor,请编辑 ~/.cursor/mcp.json(或项目本地的 .cursor/mcp.json);其他客户端使用类似的配置文件。
{
"mcpServers": {
"bmlt": {
"url": "https://your-host.example.com/mcp"
}
}
}
有关每个工具的参数文档和 BMLT-API 映射,请参阅在线参考页面。有关已部署实例的日常命令(日志尾随、用量摘要、清除缓存、升级),请参阅 docs/operations.md。
添加身份验证
默认配置不包含身份验证——任何能够访问 /mcp 的人都可以调用这些工具。若要限制访问:
// routes/ai.php
use Laravel\Mcp\Facades\Mcp;
Mcp::oauthRoutes(); // OAuth 2.1 (Laravel Passport)
Mcp::web('/mcp', BmltServer::class)
->middleware('auth:api');
或者通过自定义中间件添加简单的 bearer 令牌检查。完整选项请参阅 Laravel MCP 文档。
架构
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 knobs
routes/ai.php # Mcp::web('/mcp', BmltServer::class)
BmltClient 封装的 HTTP API 由 BMLT Semantic OpenAPI 文档(OpenAPI 3.1)正式定义——对于 BMLT 本身支持的所有参数、响应结构和字段定义,请参考该文档,即使此 MCP 服务尚未将其作为工具参数公开。
许可证
MIT
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。