Na Meetings について
Na Meetingsは、BMLTディレクトリからNarcotics Anonymousのミーティングを探す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 | いいえ | 10 進度数で表した緯度。longitude と組み合わせると、正確な座標で検索できます。 |
| weekdays | array | いいえ | 曜日フィルター。1=日曜日、2=月曜日、……、7=土曜日。例:[2,4,6] は月/水/金曜日です。 |
| longitude | number | いいえ | 10 進度数で表した経度。latitude と組み合わせると、正確な座標で検索できます。 |
| page_size | integer | いいえ | 1 ページあたりの結果数。省略すると、一致するすべての結果を返します。 |
| 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 でない限り、許可リストへの登録が必要です。 |
| service_body_ids | array | いいえ | 特定のサービス組織(地域/エリア)に限定します。list_service_bodies を使って ID を確認してください。 |
| recursive_services | boolean | いいえ | service_body_ids が設定されている場合、その子要素も含めます。デフォルトは true です。 |
詳細
bmlt-server-mcp
BMLT(Basic Meeting List Toolbox — Narcotics Anonymous のミーティングディレクトリ)を、AI アシスタントが直接呼び出せる読み取り専用ツールとして提供する、ストリーミング可能な HTTP Model Context Protocol サーバーです。
BMLT は、世界中の Narcotics Anonymous ミーティングの約 85%を掲載しています。デフォルトのバックエンドは BMLT aggregator で、すべての公開 BMLT ルートサーバー(サーバー一覧)を統合し、単一の検索画面を提供します。つまり、NA ミーティングを探すための、AI がアクセスできる信頼性の高い情報源です。
MCP はオープンプロトコルであるため、互換性のあるクライアントであればどれでも利用できます:Claude(Code、Desktop、Web)、ChatGPT(Connectors と Responses API)、Google Gemini、Cursor、Windsurf、Zed、Cline、Continue などです。
ローカルのサブプロセスとして実行される、stdio のみ対応の npm bmlt-mcp-server とは異なり、このサーバーは HTTP 経由で MCP を通信し、一度ホストしてリモートから利用することを想定しています。
公式の laravel/mcp パッケージを使い、Laravel + PHP 8.2+ で構築されています。
https://mcp.bmlt.app/(ランディングページ)で稼働中のデプロイを利用でき、ツールのリファレンスは https://mcp.bmlt.app/reference にあります。
ツール
すべてのツールは読み取り専用で、冪等です。すべてのツールは省略可能な root_server_url 引数を受け取ります。省略した場合は、設定された BMLT_ROOT_SERVER_URL が使用されます。
| ツール | 機能 |
|---|---|
search_meetings | 住所(サーバー側でジオコーディング)または緯度・経度と半径でミーティングを検索します。曜日、時間、形式、会場タイプ(対面/バーチャル/ハイブリッド)、サービス組織、フリーテキストで絞り込めます。デフォルトでは整理された概要を返します(生の BMLT レスポンスを取得するには data_format=full を指定します)。 |
get_meeting | BMLT の id_bigint で単一のミーティングを取得します。 |
list_formats | ミーティング形式コード(Open、Closed、Speaker、Beginners、言語タグなど)を一覧表示し、呼び出し側が search_meetings で使用する名前を ID に対応付けられるようにします。 |
list_service_bodies | ゾーン/地域/エリア/グループを一覧表示し、呼び出し側が search_meetings で使用する名前を ID に対応付けられるようにします。 |
get_server_info | 設定されたルートサーバーの機能、バージョン、言語、デフォルト座標を返します。 |
list_root_servers | アグリゲーターが認識している公開 BMLT ルートサーバーを一覧表示します。呼び出し側がルートを切り替えたい場合に便利です。 |
クイックスタート
Docker(推奨)
cp .env.example .env
docker compose up --build
その後、Streamable HTTP トランスポート経由で http://localhost:8080/mcp に MCP エンドポイントが公開されます。
ローカル 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 ツール引数で許可する URL のカンマ区切りリストです。デフォルトのルートは常に暗黙的に許可されます。 |
BMLT_ALLOW_ANY_ROOT | true にすると、root_server_url で任意の URL を指定できます。本番環境では推奨されません(SSRF のようなクエリが可能になります)。デフォルトでは無効です。 |
BMLT_AGGREGATOR_URL | list_root_servers がクエリするアグリゲーターです。デフォルトでは公開アグリゲーターを使用します。 |
GEOCODER | nominatim(デフォルト)、google、または null を指定します。null の場合、住所入力は拒否され、緯度・経度が必須になります。 |
NOMINATIM_USER_AGENT | OSM にデプロイ環境を識別させるための値です。Nominatim の利用規約により必須です。本番環境では必ず設定してください。 |
GOOGLE_GEOCODER_API_KEY | GEOCODER=google の場合に必須です。 |
なぜ許可リストが必要なのか?
任意の root_server_url ツール引数を指定すると、1つのデプロイ環境で任意の 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 — カスタムコネクター(新しいビルド)
Settings → Connectors → Add custom connector → 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):Settings → Connectors → Add で、同じ 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');
または、カスタムミドルウェアを使ってシンプルなベアラートークンチェックを追加してください。すべてのオプションについては、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)で正式に仕様化されています。この MCP サーバーがまだツール引数として公開していない場合でも、BMLT 自体がサポートするすべてのパラメーター、レスポンス形式、フィールド定義については、このドキュメントを参照してください。
ライセンス
MIT
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。