B2match (unofficial)

io.github.barzoj由 GitHub 帳號 barzoj 發布v0.2.1更新於 Oct 30, 2026

Unofficial read-only B2match events: agenda, participants, meetings, schedule, conversations

概覽

AI 產生的概覽

非官方的 B2match 活動唯讀 MCP 伺服器,讓助理瀏覽議程、參與者、組織、會議與訊息。

可以做什麼
  • 取得公開活動資訊、議程、場次、場次參與者與講者
  • 搜尋並讀取參與者資料、組織頁面與市場機會
  • 列出已加入的活動、自身參與狀態與個人行程
  • 查看會議、空閒時間與共同空檔,並取得會議推薦
  • 列出對話與通知,完整訊息紀錄需明確開啟後才可用
適用情境
適合參加或籌辦 B2match 媒合活動時使用:讓助理查詢議程、尋找參與者或組織、查看個人行程與會議,或依對話內容草擬後續聯繫訊息。
執行需求
透過 npx 在本機執行,需要 Node.js 22 或更新版本。公開活動資料可匿名存取;個人資料需要 B2match 工作階段權杖,可透過 CLI 登入流程(專用 Chromium 設定檔完成 Google 登入)或 B2MATCH_TOKEN 環境變數提供。權杖存放於系統鑰匙圈或權限為 0600 的設定檔。需要連線至 B2match API 的網路。
安裝前請注意
使用 B2match 未公開的 GraphQL API,欄位可能隨時變動;本專案非官方,未獲 B2match 認可。參與者資料屬於他人個人資料,應僅在本機保存並遵守可見性規則。部分查詢仍會改變伺服器端狀態:取得對話訊息會將其標示為已讀,完整通知清單會重設未讀計數;兩者都需設定 B2MATCH_ALLOW_SIDE_EFFECT_READS 並明確確認參數。不要在命令列傳遞權杖。

安裝

在 SourceWeft 中

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

Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。

其他 MCP 客戶端

參照 儲存庫 中的啟動說明。

README

b2match-mcp

[CI] [Coverage] [npm version] [License: MIT] [Node.js] [ToolSDK MCP Registry]

Read-only MCP server for the B2match event and matchmaking platform.

This package is designed to be run locally by the user via npx and stdio MCP transport.

Disclaimer: This project is unofficial and is not affiliated with, endorsed by, or supported by B2match. It uses B2match's undocumented web GraphQL API, so field availability can change without notice. Use it in accordance with B2match's Terms of Service and GDPR. Participant profiles can be other people's personal data — keep exports local, respect each event's visibility rules, and do not harvest or republish personal data.

Read-only and privacy guarantees

  • The MCP server sends only GraphQL query operations. Mutations and subscriptions are parsed and rejected before any network call.
  • Known "read-looking" write operations are explicitly blocked, including profile-view, mark-as-read, session-attendance, and bookmark mutations.
  • B2match can still update its own read/seen counters when certain query fields are selected. See Server-side side effects.
  • It never calls Plausible, Sentry, Google Analytics, HubSpot, LinkedIn pixel, or any non-B2match analytics endpoint.
  • It makes no external calls other than https://api.b2match.com/v4/query and the B2match Google login URL opened by the CLI.
  • No telemetry or analytics are collected by this package.
  • Tokens are never printed by tools or status commands.
  • Tokens are stored in the OS keychain when available, otherwise in a 0600 config file.

Install / run

Requires Node.js 22 or newer. On macOS with Apple Silicon, the recommended install path is npx; no native build step is required for the auth storage path.

bash
npx -y b2match-mcp

From a checkout:

bash
npm installnpm run buildnode dist/cli.js

MCP client config

Claude Desktop

json
{  "mcpServers": {    "b2match": {      "command": "npx",      "args": ["-y", "b2match-mcp"]    }  }}

Cursor

json
{  "mcpServers": {    "b2match": {      "command": "npx",      "args": ["-y", "b2match-mcp"]    }  }}

VS Code

Add to .vscode/mcp.json or user MCP settings:

json
{  "servers": {    "b2match": {      "type": "stdio",      "command": "npx",      "args": ["-y", "b2match-mcp"]    }  }}

For local development from this checkout:

json
{  "mcpServers": {    "b2match": {      "command": "node",      "args": ["/absolute/path/to/b2match-mcp/dist/cli.js"]    }  }}

Authentication

Public event data works anonymously. Personal data such as viewer profile, active events, meetings, schedule, conversations, notifications, and availability requires a locally stored B2match session token.

macOS / Linux login

bash
b2match-mcp login https://www.b2match.com/e/<event-slug># or: npx b2match-mcp login https://www.b2match.com/e/<event-slug>

The default command:

  1. Resolves the event anonymously and asks B2match for its Google login URL.
  2. Launches your installed Chrome, Chromium, Edge, or Brave as a separate process.
  3. Uses a dedicated persistent profile under the tool config directory, not your everyday browser profile.
  4. Opens a remote-debugging port on 127.0.0.1 for that dedicated profile only (not your everyday browser). The port is closed when login finishes or times out.
  5. Lets you complete Google sign-in and 2FA by hand. The CLI does not fill any form.
  6. Waits for a JWT on the event tab URL (www.b2match.com/e/<slug>?token=…) or the event session cookie, validates it with a cheap viewer query, stores it, and closes that browser window. Chrome can 404 the post-Google event page before a cookie is set; the URL token is the path that works in that case.

Repeat logins are usually one click because the dedicated profile keeps the Google session.

macOS may show a Keychain access prompt the first time the CLI stores or reads the token. Approve access for b2match-mcp/your terminal if you want Keychain storage. If access is denied or Keychain is unavailable, the CLI falls back to a private config file.

Paste-only / environment token

Use these only when the dedicated browser flow cannot run:

bash
b2match-mcp login --paste# or: npx b2match-mcp login --pasteB2MATCH_TOKEN='<session-cookie-value>' b2match-mcp

B2MATCH_TOKEN is used in memory and is not persisted. Do not pass tokens on the command line; that leaks them into shell history.

Status / logout

bash
b2match-mcp statusb2match-mcp logoutb2match-mcp logout --all

logout removes the stored B2match token only. logout --all also deletes the dedicated browser profile.

Dedicated browser profile

Login uses a dedicated Chromium profile at ~/.config/b2match-mcp/browser-profile (or $B2MATCH_MCP_CONFIG_DIR/browser-profile / $XDG_CONFIG_HOME/b2match-mcp/browser-profile). That profile keeps the Google session, so a later login is usually one click.

To wipe the Google session as well as the stored B2match token:

bash
b2match-mcp logout --all

To delete only the profile and keep the stored token:

bash
rm -rf ~/.config/b2match-mcp/browser-profile

logout without --all keeps the profile so the next login can reuse Google.

Storage locations

  • macOS: login Keychain via /usr/bin/security (b2match-mcp service, default account). After each save the CLI reads the item back; if the secret is missing or wrong it falls back to the private file and prints keychain read-back failed, stored in file.
  • Linux: secret-tool / libsecret when installed and unlocked.
  • Windows: private fallback file.
  • Fallback file: $B2MATCH_MCP_CONFIG_DIR/auth.json, $XDG_CONFIG_HOME/b2match-mcp/auth.json, or ~/.config/b2match-mcp/auth.json, written with 0600 permissions.
  • b2match-mcp status reports source: "keychain-unreadable" (with a re-login hint) when a Keychain item exists but is empty or unreadable, instead of pretending you are logged out with source: "none".
  • Dedicated browser profile: ~/.config/b2match-mcp/browser-profile (same config directory).

If a token is a JWT, the CLI records its exp claim as expiresAt. B2match also has opaque tokens, in which case lifetime cannot be known locally. A 401 on an authenticated viewer check is reported as invalid/expired and remembered for the process. Public tools then continue anonymously without deleting the stored token.

Troubleshooting login

  • No supported browser found: install Chrome, Chromium, Edge, or Brave, or use b2match-mcp login --paste.
  • Google blocks the window: finish sign-in in the dedicated window if possible; otherwise use --paste.
  • Timeout / 404 after Google: the CLI also reads a JWT from the event tab URL if Chrome 404s before a cookie is set. Finish sign-in and wait; or use --paste.
  • Keychain prompt denied: run b2match-mcp logout, then login again and approve the prompt; or set B2MATCH_MCP_DISABLE_KEYCHAIN=1 to use the private file fallback.
  • status shows keychain-unreadable: the Keychain item is empty or corrupt and no usable auth.json was found. Run b2match-mcp logout then login again. If a file token still works, status uses source: "file" and sets a warning about the Keychain item instead.
  • Wrong/expired token: run b2match-mcp logout, sign in again, and repeat login.

Tools

Public/anonymous:

  • get_event - event metadata, dates, registration window, login methods, and navigation. Numeric ids and slugs return the same fields.
  • list_participants - compact participant summaries with pagination and optional search. Set detail=true for the fuller list payload.
  • get_participant - one participant profile, without firing profile-view tracking.
  • list_organisations, get_organisation - organisation/participation pages. Menu paths such as /components/<id> are resolved automatically.
  • list_opportunities, get_opportunity - marketplace entries. Menu paths are resolved automatically; unknown opportunities return an MCP not-found error.
  • get_agenda, get_session, list_session_attendees, list_speakers.

Authenticated:

  • auth_status
  • list_my_events
  • my_participation
  • my_schedule
  • my_meetings - meetings by status; unfiltered responses use a compact availability summary unless detail=true
  • my_availability - merged free ranges per day by default; detail=true for the full timeslot grid
  • find_meeting_slots
  • meeting_recommendations
  • list_conversations - last-message previews; does not mark conversations as read
  • get_conversation - disabled by default because fetching messages marks the conversation as read; see side effects
  • list_notifications - unread/unseen counters by default; the full list resets unseen

Optional raw query:

  • graphql_read is registered only when B2MATCH_ALLOW_RAW=1. It still rejects non-query operations and, unless B2MATCH_ALLOW_SIDE_EFFECT_READS=1, queries that select messagesV2 or the notification list.

Server-side side effects

This client never sends B2match mutations such as MarkConversationAsSeen or ReadNotification. B2match can still mutate its own read/seen state when a query selects certain fields:

  • get_conversation (messagesV2) marks that conversation as read (unread-conversations count decreases).
  • list_notifications with the notifications(...) list field resets the unseen counter (unseen → 0). The unread counter is unchanged. Fetching notificationsCounter alone does not reset unseen.
  • list_conversations (including lastMessageV2) has no known side effects.

Gating:

  • Default list_notifications returns only unread/unseen counters.
  • get_conversation and the full notification list require B2MATCH_ALLOW_SIDE_EFFECT_READS=1 and an explicit tool argument (acknowledge_marks_read / acknowledge_marks_seen).
  • graphql_read rejects queries that select messagesV2 or the notifications list unless the same env var is set.

Use list_conversations when you only need the last message.

Each event-scoped tool accepts a current event URL (https://www.b2match.com/e/<slug>), a legacy event URL (https://<slug>.b2match.io), a bare slug, or a numeric event id.

Authenticated tools return an MCP error when no token is stored, with instructions to log in. They say the token is invalid or expired only after a stored token receives HTTP 401.

Development

bash
npm installnpm run buildnpm test

See CONTRIBUTING.md for lint, format, coverage, Conventional Commits, and the read-only guard.

Live smoke test against a public event (opt-in, not run in CI):

bash
B2MATCH_LIVE_SMOKE=1 B2MATCH_SMOKE_EVENT='https://www.b2match.com/e/<event-slug>' npm test -- tests/live-smoke.test.ts

The smoke test is skipped unless both environment variables are set.

Publishing

Releases are cut by Release Please from Conventional Commits on main. The same workflow (.github/workflows/release-please.yml) publishes with npm publish --provenance --access public when a release is created (OIDC trusted publishing only — no NODE_AUTH_TOKEN). Provenance requires a public repo. Configure npm trusted publishing against workflow release-please.yml. To republish an existing tag: gh workflow run release-please.yml -f publish_tag=vX.Y.Z. .github/workflows/publish.yml is a tip-of-branch manual republish only.

Verification status

Verified in this repo:

  • TypeScript build and unit tests.
  • Query-only enforcement, event identifier parsing, cookie-name helpers, dedicated-browser launch args, section-path resolution, compact participant summaries, and 401/auth-error policy.
  • Packed CLI --help / status.
  • Opt-in anonymous live smoke that exercises every public tool when B2MATCH_SMOKE_EVENT is provided.

Requires a real login on a real machine:

  • Dedicated-profile Google login, Keychain prompt, URL-token or cookie capture.
  • Authenticated tools: list_my_events, my_participation, schedule, meetings, availability, meeting slots, recommendations, conversations, and notifications.

License

MIT.

來源:README.md,提交 7ad311c

工具

22

auth_status

B2match auth status

Show whether a local B2match token is available and, when valid, who it belongs to. Never returns the token. Call this first when an authenticated tool (my_*, list_my_events, conversations, notifications) reports a login error; public tools work without a token.

無需輸入參數。

list_my_events

List my B2match events

List events the logged-in viewer has joined, with ids/slugs usable as the event argument elsewhere. Requires login; use get_event for any single public event instead.

無需輸入參數。

get_event

Get B2match event

Fetch public event metadata, dates, registration window, login methods, and navigation menu paths. Start here to resolve an event before calling the other event tools; use list_my_events to find events you joined. Works without login.

輸入參數event必填

my_participation

Get my event participation

Fetch the logged-in viewer's own participant status, activation, permissions, organisation pages, and opportunities for one event. Use get_participant for someone else's public profile.

輸入參數event必填

list_participants

List B2match participants

List public participants as a compact summary. Set detail=true for the fuller record; use get_participant for one profile.

輸入參數afterevent必填firstquerydetail

get_participant

Get B2match participant

Fetch one participant's full public profile without sending B2match's profile-view tracking mutation. Use list_participants to search or find ids; use my_participation for your own status.

輸入參數event必填participant_id必填

list_organisations

List B2match organisations

List organisation pages (participations) of an event, paginated. Use get_organisation for one page, list_participants for people. Resolves the menu path automatically; pass path to override.

輸入參數pathafterevent必填first

get_organisation

Get B2match organisation

Fetch one organisation page (a participation: organisation details plus its representatives). Use list_organisations to find participation ids; use get_participant for a single person. Resolves the menu path automatically; pass path to override.

輸入參數pathevent必填participation_id必填

list_opportunities

List B2match opportunities

List published marketplace opportunities (offers/requests) of an event, paginated. Use get_opportunity for one entry's full details. Resolves the menu path automatically; pass path to override.

輸入參數pathafterevent必填first

get_opportunity

Get B2match opportunity

Fetch a marketplace opportunity. Use the id or url from list_opportunities (published marketplace ids differ from opportunity ids on my_participation). Resolves the marketplace menu path automatically; pass path to override.

輸入參數pathevent必填opportunity_id必填

get_agenda

Get B2match agenda

Fetch the event agenda: sessions and networking blocks with times. Use get_session for one session's details and my_schedule for your personal schedule. Resolves the menu path automatically; pass path to override.

輸入參數pathevent必填

get_session

Get B2match session

Fetch one agenda session with its details and a first page of attendees. Provide session_id, or path to a session URL; path alone is enough. Use list_session_attendees to page through attendees only, get_agenda to find sessions.

輸入參數pathevent必填session_idattendees_afterattendees_first

list_session_attendees

List B2match session attendees

Page through the attendees of one agenda session. Returns only the attendee list with a cursor, not the session details; use get_session for those. Provide session_id or path (from get_agenda).

輸入參數pathafterevent必填firstsession_id

list_speakers

List B2match speakers

List the speakers shown on the event's speakers page, paginated. Use list_participants for all registered participants. Resolves the menu path automatically; pass path to override.

輸入參數pathafterevent必填first

my_schedule

Get my B2match schedule

Fetch the logged-in viewer's personal event schedule (booked sessions and meetings). Use get_agenda for the full public agenda and my_meetings for meeting requests by status. The PDF agenda URL is omitted unless include_pdf_link is true.

輸入參數event必填include_pdf_link

my_meetings

Get my B2match meetings

Fetch the logged-in viewer's meetings and meeting requests, optionally one status bucket. Unfiltered responses include a compact availability summary (merged free ranges per day) unless detail=true. Use my_schedule for the overall timetable and find_meeting_slots to find free times with others.

輸入參數event必填detailstatus

my_availability

Get my B2match availability

Fetch the logged-in viewer's own meeting availability. Default is merged free ranges per day; set detail=true for the full timeslot grid. Use find_meeting_slots for slots shared with specific participants.

輸入參數event必填detail

find_meeting_slots

Find B2match meeting slots

Find free meeting slots shared by the logged-in viewer and selected participants on one day. Read-only: does not book or request a meeting. Use my_availability for your own free time only.

輸入參數dayevent必填durationparticipant_ids必填is_long_term_networking

meeting_recommendations

Get B2match meeting recommendations

Fetch B2match's recommended and newest participants for the logged-in viewer to meet. Use list_participants to search all participants and find_meeting_slots to check shared free time.

輸入參數event必填

list_conversations

List B2match conversations

List the logged-in viewer's conversations with last-message previews, paginated. Does not mark conversations as read; prefer it over get_conversation unless full message history is needed.

輸入參數afterevent必填first

get_conversation

Get B2match conversation

Fetch conversation messages. B2match marks that conversation as read when messagesV2 is fetched, even though this client never sends MarkConversationAsSeen. Disabled unless B2MATCH_ALLOW_SIDE_EFFECT_READS=1 and acknowledge_marks_read is true. Use list_conversations for last-message previews. Unknown ids return a not-found error.

輸入參數conversation_id必填acknowledge_marks_read

list_notifications

List B2match notifications

Returns unread/unseen notification counters by default. Fetching the notification list resets B2match's unseen counter (unseen goes to 0) even though this client never sends ReadNotification. The unread counter is unchanged. The full list requires B2MATCH_ALLOW_SIDE_EFFECT_READS=1 and acknowledge_marks_seen=true.

輸入參數afterevent必填firstacknowledge_marks_seen

版本歷史

1
  1. v0.2.1最新Oct 23, 2026

評分

已滿足適用檢查項的 90%

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

  • 近 30 天內可連通25 分
  • 已宣告認證方式10 分

    請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。

  • 已列出工具必需15 分
  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分