Metabase

chính thức

Máy chủ MCP chính thức của Metabase dùng để tìm kiếm dữ liệu, xây dựng truy vấn trên lớp ngữ nghĩa và trực quan hóa kết quả thông qua các máy khách MCP.

Bạn có thể làm gì với Metabase MCP?

  • Tìm kiếm và truy xuất nội dung — Yêu cầu trợ lý của bạn tìm câu hỏi, bảng điều khiển hoặc mô hình trên Metabase bằng công cụ search, sau đó lấy chi tiết bằng get_content.
  • Chạy truy vấn và trực quan hóa kết quả — Nhờ trợ lý của bạn thực thi các truy vấn có cấu trúc qua execute_query hoặc SQL thô bằng execute_sql, sau đó hiển thị kết quả dưới dạng biểu đồ tương tác bằng visualize_query.
  • Tạo và quản lý bảng điều khiển — Hướng dẫn trợ lý của bạn xây dựng hoặc cập nhật bảng điều khiển và bố cục của chúng bằng dashboard_write, hoặc sao chép nội dung hiện có vào bộ sưu tập qua duplicate_content.
  • Thiết lập cảnh báo và đăng ký — Yêu cầu trợ lý của bạn tạo cảnh báo theo lịch trình cho các câu hỏi đã lưu bằng alert_write hoặc cấu hình đăng ký email bảng điều khiển bằng subscription_write.
  • Khám phá hệ thống phân cấp dữ liệu — Chỉ đạo trợ lý của bạn duyệt qua cơ sở dữ liệu, lược đồ, bảng và trường thông qua browse_data, hoặc điều hướng bộ sưu tập theo cấu trúc bằng browse_collection.

Tài liệu

Máy chủ MCP Metabase

Metabase bao gồm một máy chủ Model Context Protocol (MCP) tích hợp cho phép các ứng dụng AI kết nối trực tiếp đến một phiên bản Metabase. Nó sử dụng Streamable HTTP transport và được xây dựng dựa trên Agent API của Metabase để cung cấp các công cụ tìm kiếm, điều hướng, truy vấn, trực quan hóa và tạo/cập nhật nội dung - tất cả đều được giới hạn theo quyền của người dùng đang kết nối.

Điểm cuối

Máy chủ MCP có sẵn tại:

https://{your-metabase.example.com}/api/metabase-mcp

Đường dẫn /api/mcp cũ vẫn hoạt động như một bí danh cho các ứng dụng hiện có, nhưng /api/metabase-mcp là URL chuẩn để quảng bá.

Kết nối ứng dụng

Trỏ bất kỳ ứng dụng tương thích MCP nào đến điểm cuối /api/metabase-mcp. Ví dụ: với Claude Code:

claude mcp add metabase https://{your-metabase.example.com}/api/metabase-mcp --transport streamable-http

Đối với Claude Desktop, hãy tạo một trình kết nối tùy chỉnh sử dụng cùng URL đó.

Đối với Cursor, mở Settings > MCP và thêm một máy chủ mới với loại được đặt thành streamable-http và URL:

https://{your-metabase.example.com}/api/metabase-mcp

Xác thực

Các ứng dụng MCP xác thực qua OAuth 2.0. Metabase chạy máy chủ OAuth nhúng của riêng mình - không cần nhà cung cấp bên ngoài.

Quy trình cho lần kết nối đầu tiên:

  1. Ứng dụng khám phá các điểm cuối OAuth của Metabase.
  2. Ứng dụng tự đăng ký với Metabase.
  3. Người dùng được chuyển hướng đến Metabase để đăng nhập và phê duyệt kết nối.
  4. Ứng dụng nhận được mã thông báo truy cập được giới hạn theo quyền của người dùng trên Metabase.

Các phiên dựa trên trình duyệt (xác thực cookie), khóa API và mã thông báo mb:full không có phạm vi MCP, vì vậy chúng có thể kết nối nhưng không thể gọi công cụ nào được giới hạn.

Phạm vi

Mã thông báo truy cập được giới hạn để hạn chế những công cụ mà ứng dụng có thể sử dụng:

Phạm viCông cụ được cấp
agent:content:readbrowse_collection, browse_data, get_content, get_parameter_values, glossary, learn, search và tài nguyên dữ liệu catalog://metabase/fields (xem Resources)
agent:content:writebookmark_content, collection_write, dashboard_write, document_write, duplicate_content, measure_write, metric_write, question_write, segment_write
agent:delivery:writealert_write, subscription_write
agent:query:runexecute_query, refresh_ui_credential, render_drill_through, run_saved_question, visualize_query
agent:sql:runexecute_sql

Một công cụ chỉ khớp với phạm vi chính xác trong bảng. Ký tự đại diện như * hoặc agent:* và sentinel ::unrestricted không phải là phạm vi MCP, vì vậy chúng không cấp công cụ nào.

Các phạm vi này chỉ giới hạn bề mặt MCP. Không có điểm cuối REST nào có thể khai báo một trong số chúng là :scope của mình, vì vậy mã thông báo mới được cấp cho ứng dụng MCP không cấp quyền gì trên REST API.

scopes_supported của siêu dữ liệu tài nguyên được bảo vệ và scope của thử thách 401 đều liệt kê mọi phạm vi trong bảng, vì vậy kết nối mới yêu cầu tất cả chúng. Một số ứng dụng không nâng cấp sau 403: kết nối lại thủ công từ cài đặt trình kết nối của Claude đăng ký một ứng dụng mới và yêu cầu chính xác những gì các danh sách này liệt kê. Khi chúng chỉ liệt kê đường cơ sở, lần kết nối lại đó không bao giờ cung cấp ghi, SQL thô hoặc phân phối, và người dùng không có cách nào để cấp chúng (ENG-11089). Siêu dữ liệu máy chủ ủy quyền cũng quảng bá tất cả chúng.

Đường cơ sở (agent:content:read agent:query:run) bị khóa trên màn hình đồng ý: khi ứng dụng yêu cầu một trong các phạm vi này, người dùng không thể bỏ chọn nó. agent:query:run nằm trong đường cơ sở để biểu đồ không bao giờ cần nâng cấp. Claude Desktop thử lại một công cụ sau khi nâng cấp qua một phiên không khai báo hỗ trợ MCP Apps, vì vậy một visualize_query được nâng cấp bị từ chối và biểu đồ của nó không bao giờ được nhúng.

Một lời gọi công cụ hoặc đọc tài nguyên dữ liệu mà mã thông báo thiếu phạm vi sẽ bị từ chối với HTTP 403 và thử thách WWW-Authenticate: Bearer error="insufficient_scope" có scope liệt kê các phạm vi v2 mà mã thông báo đã giữ cộng với phạm vi cần thiết, để ứng dụng có thể nâng cấp. Mỗi công cụ cũng khai báo phạm vi của mình trong securitySchemes, là bản nháp SEP-1488, được ChatGPT hỗ trợ. Nó không phải là một phần của MCP 2025-03-26 (phiên bản mà máy chủ này báo cáo) hoặc đặc tả công cụ cuối cùng 2026-07-28, vì vậy các ứng dụng khác khám phá phạm vi bị thiếu từ 403. Bên trong một lô JSON-RPC, việc từ chối là lỗi -32600 trong băng tần thay vào đó. Các lần đọc vỏ giao diện không bao giờ bị thử thách: xem Resources.

Siêu dữ liệu tài nguyên được bảo vệ OAuth có sẵn tại:

/.well-known/oauth-protected-resource/api/metabase-mcp

Trên màn hình đồng ý, mọi phạm vi mà ứng dụng yêu cầu đều được chọn sẵn và các phạm vi đường cơ sở cũng bị khóa. Chỉ các phạm vi còn được chọn mới được cấp và chỉ cho mã thông báo mà ủy quyền này tạo ra. Việc bỏ chọn không bao giờ ảnh hưởng đến mã thông báo mà ứng dụng đã có. Một phạm vi bị bỏ chọn không được Metabase ghi nhớ. Một 403 sau đó có thể kích hoạt nâng cấp khác trong các ứng dụng hỗ trợ nó. Các ứng dụng khác có thể yêu cầu ủy quyền lại thủ công. error_description của mỗi thử thách kết thúc bằng ghi chú rằng người dùng phải cấp quyền trên màn hình đồng ý.

Một số ứng dụng thay thế error_description của 403 bằng văn bản của riêng họ, vì vậy instructions của kết quả initialize giải thích lỗi phạm vi cho mô hình: lỗi xác thực thường có nghĩa là thiếu quyền thay vì phiên đăng nhập hết hạn, mô hình nên nêu tên công cụ hoặc tài nguyên bị lỗi và quyền mà nó yêu cầu, và người dùng cấp quyền bằng cách kết nối lại và để quyền được chọn trên màn hình đồng ý. Các hướng dẫn là một chuỗi tĩnh, giống nhau cho mọi người gọi: không có danh sách quyền theo từng kết nối.

Truy cập công cụ theo nhóm

Trên các phiên bản Enterprise có tính năng ai_controls, quản trị viên có thể thu hẹp bề mặt theo nhóm quyền tại Admin > AI > Usage controls > MCP tools access (hiển thị bất cứ khi nào máy chủ MCP bật, có hoặc không có nhà cung cấp LLM). Mỗi nhóm có một hàng trong mcp_group_permission cho biết thành viên của nhóm đó có thể kết nối hay không và theo từng tên công cụ, "yes" hoặc "no" rõ ràng của quản trị viên; công cụ không có mục nhập sẽ nhận giá trị mặc định mà tác giả của nó khai báo, vì vậy mọi deftool đều mang :default-access bắt buộc là :allowed hoặc :denied và công cụ phát hành sau đó nhận chính xác giá trị mặc định đó trong mọi nhóm cho đến khi quản trị viên ghi đè. Các mục nhập được khóa theo tên công cụ, vì vậy việc đổi tên công cụ cần :renamed-from với các tên trước đây của nó (mục nhập được lưu dưới tên cũ vẫn áp dụng và API quản trị trình bày nó dưới tên hiện tại), hoặc tác giả chấp nhận rằng mọi lựa chọn của quản trị viên cho nó bị loại bỏ; metabase.mcp.v2.tool-names-test ghim các tên trực tiếp để không điều nào xảy ra do vô tình. Chính sách hiệu lực của người dùng là tool_access của mỗi nhóm của họ có hàng bật MCP: MCP bật khi bất kỳ nhóm nào như vậy tồn tại và công cụ được phép khi bất kỳ nhóm nào trong số đó phân giải nó thành có. Các hàng một mình quyết định điều đó và chúng cũng ghi lại chế độ quyền: chế độ đơn giản (Administrators, All Users và All tenant users) hoặc chế độ cấp nhóm (mọi nhóm khác), là trạng thái trong đó All Users không có hàng. Một công tắc xóa các hàng của các nhóm mà chế độ mới ẩn và gieo các nhóm mà nó bật khi vào mà không có hàng (Data Analysts khi vào chế độ cấp nhóm, All Users và All tenant users khi rời khỏi nó) và PUT từ chối một nhóm mà chế độ hiện tại ẩn, vì vậy không có yêu cầu nào đọc chế độ được lưu trong bộ nhớ cache. Chính sách được áp dụng trên các phạm vi OAuth trong tools/list và tools/call (v2/registry.clj) và người dùng có nhóm không cấp quyền truy cập bị từ chối tại initialize và tại resources/read (cho các phiên được mở trước khi MCP bị tắt) với lỗi nêu rõ cách khắc phục. Các công cụ chỉ dành cho ứng dụng (_meta {:ui {:visibility ["app"]}}, tức là refresh_ui_credential) không có trên trang quản trị: chúng được phép trong khi chính sách cho phép bất kỳ công cụ MCP Apps nào. Người siêu dùng và người gọi nội bộ không bao giờ bị thu hẹp; OSS cho phép mọi thứ. Trên Enterprise, các hàng được lưu trữ được thực thi ngay cả khi không có tính năng ai_controls (mã thông báo hết hạn hoặc không thể xác minh giữ các hạn chế mà quản trị viên đã cấu hình); tính năng này chỉ giới hạn trang quản trị và API. Trình phân giải là permissions.clj (defenterprise, triển khai EE trong metabase-enterprise.mcp.permissions) và API quản trị là /api/ee/ai-controls/mcp-permissions.

Các công cụ có sẵn

Được tạo từ sổ đăng ký v2 (deftool). Phạm vi được nêu ở đây là những gì sổ đăng ký kiểm tra trước khi công cụ chạy; một số trình xử lý kiểm tra phạm vi sâu hơn khi chúng biết lời gọi làm gì - agent:sql:run khi nguồn phân giải thành SQL gốc (question_write) và agent:query:run cho việc thực thi mà cảnh báo hoặc đăng ký trì hoãn (alert_write, subscription_write). Những từ chối đó mang cùng thử thách 403 insufficient_scope. tools/list hiển thị mọi công cụ bất kể mã thông báo giữ gì và mã thông báo thiếu phạm vi có thể không gọi nó.

Công cụPhạm viMô tả
alert_writeagent:delivery:writeTạo hoặc cập nhật một cảnh báo: một thông báo được gửi theo lịch trình khi kết quả của một câu hỏi đã lưu đáp ứng một điều kiện.
bookmark_contentagent:content:writeThêm hoặc xóa dấu trang trên nội dung cho người dùng đang gọi — cùng danh sách đánh dấu/yêu thích mà thanh bên Metabase hiển thị.
browse_collectionagent:content:readDuyệt các bộ sưu tập theo cấu trúc — một id thống nhất trên mọi phân vùng: một id số, một entity_id 21 ký tự, "root" (được đặt lại gốc theo từng không gian tên), hoặc "trash" (nội dung đã lưu trữ, chỉ ở chế độ mục).
browse_dataagent:content:readDuyệt hệ thống phân cấp dữ liệu: cơ sở dữ liệu → lược đồ → bảng → trường.
collection_writeagent:content:writeTạo, đổi tên, di chuyển, lưu trữ hoặc khôi phục một bộ sưu tập — các thư mục chứa câu hỏi, bảng điều khiển, mô hình và tài liệu.
dashboard_writeagent:content:writeTạo hoặc cập nhật một bảng điều khiển và chỉnh sửa bố cục của nó bằng các thao tác có thứ tự.
document_writeagent:content:writeTạo hoặc cập nhật một tài liệu.
duplicate_contentagent:content:writeSao chép một câu hỏi, bảng điều khiển hoặc tài liệu vào một bộ sưu tập — rẻ hơn và an toàn hơn so với việc đọc bản gốc và tạo lại, đồng thời bảo toàn mọi thứ mà các phép chiếu đọc bỏ sót.
execute_queryagent:query:runCách mặc định để trả lời một câu hỏi từ dữ liệu: xác thực và thực thi một truy vấn có cấu trúc (MBQL), trả về các hàng cùng với một query_handle.
execute_sqlagent:sql:runLối thoát: thực thi một chuỗi SQL thô trên một cơ sở dữ liệu, trả về các hàng cùng với một query_handle.
get_contentagent:content:readTìm nạp nội dung theo {type, id} — cách đọc có kiểu cho bất kỳ thứ gì tìm thấy qua tìm kiếm hoặc browse_collection.
get_parameter_valuesagent:content:readTìm nạp các giá trị hợp lệ cho một bộ lọc trên bảng điều khiển hoặc câu hỏi đã lưu, để bạn lọc bằng các giá trị thực thay vì đoán.
glossaryagent:content:readTra cứu một thuật ngữ kinh doanh theo cách phiên bản Metabase này định nghĩa; tên thuật ngữ được định nghĩa nằm trong mô tả của chính công cụ.
learnagent:content:readĐọc tài liệu nhiệm vụ (kỹ năng) của máy chủ này cho các phương ngữ ghi mà lược đồ không thể mô tả đầy đủ.
measure_writeagent:content:writeTạo hoặc cập nhật một thước đo: một phép tổng hợp MBQL có tên, tái sử dụng được, gắn vào một bảng, được tham chiếu bên trong phép tổng hợp của truy vấn khác dưới dạng ["measure", id].
metric_writeagent:content:writeTạo hoặc cập nhật một chỉ số: một phép tổng hợp đã lưu, tái sử dụng được, nằm trong một bộ sưu tập và có thể được truy vấn độc lập hoặc tham chiếu từ các truy vấn khác.
question_writeagent:content:writeTạo, cập nhật hoặc lưu trữ một câu hỏi hoặc mô hình đã lưu.
refresh_ui_credentialagent:query:runLàm mới thông tin xác thực có phạm vi được sử dụng bởi một Ứng dụng MCP Metabase.
render_drill_throughagent:query:runKết xuất trực quan hóa khoan xuống mà người dùng vừa điều hướng vào.
run_saved_questionagent:query:runChạy một câu hỏi đã lưu (thẻ) theo id số hoặc entity_id, trả về các hàng trực tiếp.
searchagent:content:readTìm nội dung trên toàn bộ phiên bản Metabase theo mức độ liên quan.
segment_writeagent:content:writeTạo hoặc cập nhật một phân đoạn: một bộ lọc MBQL có tên, tái sử dụng được, gắn vào một bảng, được tham chiếu từ các bộ lọc của truy vấn khác.
subscription_writeagent:delivery:writeTạo hoặc cập nhật một đăng ký bảng điều khiển — giao hàng theo lịch trình của toàn bộ bảng điều khiển, ví dụ:
visualize_queryagent:query:runTrực quan hóa một truy vấn dưới dạng biểu đồ hoặc bảng tương tác, được kết xuất trực tiếp trong cuộc trò chuyện.

execute_query trả về row_limit hàng mỗi lần gọi (mặc định 100, tối đa 2000) — một kích thước trang, không phải là giới hạn cho kết quả. Một trang bị cắt ngắn báo cáo truncated: true và, khi truy vấn có thứ tự tổng thể, một next_cursor để truyền lại dưới dạng cursor cho trang tiếp theo, cho đến khi một trang đến với truncated: false. Một truy vấn chỉ muốn N hàng đầu tiên mang limit: N trong giai đoạn của nó (với một order-by); máy chủ tiêu giảm giới hạn đó qua các trang, vì vậy trang cuối cùng trở về đầy đủ mà không có con trỏ và phân trang tự kết thúc.

Tài nguyên

Máy chủ hiển thị các tài nguyên MCP để các máy khách có thể tìm nạp nội dung bổ sung theo URI mà không làm phình to mô tả công cụ.

URI tài nguyênPhạm viMô tả
ui://metabase/visualize-query.htmlagent:query:run (chỉ thông tin xác thực UI)Vỏ iframe của Ứng dụng MCP mà visualize_query trỏ một máy khách có khả năng đến.
ui://metabase/render-drill-through.htmlagent:query:run (chỉ thông tin xác thực UI)Vỏ mà render_drill_through trỏ đến.
catalog://metabase/fieldsagent:content:readCác đường dẫn chấm mà mỗi loại nội dung chấp nhận trong các đối số fields.

Mọi tài nguyên đều được liệt kê bất kể phạm vi của mã thông báo. Một tài nguyên dữ liệu, chẳng hạn như danh mục trường, chỉ được đọc bởi một mã thông báo giữ phạm vi của nó; nếu không, việc đọc sẽ nhận được thử thách 403 insufficient_scope được mô tả trong Phạm vi. Một vỏ UI được đọc bởi bất kỳ mã thông báo nào, vì một máy chủ MCP Apps đọc vỏ của một công cụ cùng với lệnh gọi công cụ, và nếu việc đọc đó bị từ chối, máy chủ sẽ không nâng cấp sau lệnh gọi công cụ 403. Các vỏ không mang dữ liệu. Một vỏ được đọc bởi một mã thông báo không có phạm vi của vỏ không bao giờ tạo ra thông tin xác thực UI. Dữ liệu biểu đồ được kiểm soát bởi lệnh gọi công cụ và bởi refresh_ui_credential (cả hai agent:query:run), mà iframe cần trước khi nó có thể truy vấn bất cứ điều gì. Một URI không xác định là một lỗi -32602 "Resource not found".

Các gói kỹ năng được phân phối qua công cụ learn thay vì dưới dạng tài nguyên.

Điều hướng thực thể được thực hiện bằng các công cụ get_content và browse_* thay vì một lược đồ URI; các tài nguyên ui:// ở trên chỉ tồn tại để một máy khách có thể kết xuất iframe có thứ gì đó để gắn kết.

Các phương thức JSON-RPC được hỗ trợ

Phương thứcMô tả
initializeKhởi tạo kết nối MCP. Trả về khả năng của máy chủ và một ID phiên.
notifications/initializedThông báo của máy khách rằng quá trình khởi tạo đã hoàn tất.
tools/listLiệt kê các công cụ có sẵn, bất kể phạm vi của mã thông báo.
tools/callGọi một công cụ với các đối số.
resources/listLiệt kê các tài nguyên có sẵn, bất kể phạm vi của mã thông báo.
resources/readĐọc một tài nguyên theo URI; một tài nguyên dữ liệu cần phạm vi của nó. Yêu cầu một phiên.
pingPing giữ kết nối.

Các yêu cầu có thể được gửi riêng lẻ hoặc dưới dạng một lô JSON-RPC. Máy chủ phản hồi bằng JSON hoặc SSE tùy thuộc vào tiêu đề Accept.

Kiến trúc

Việc triển khai nằm trong các tệp sau:

  • transport.clj - Giao thức vận chuyển HTTP. Phân tích cú pháp các yêu cầu JSON-RPC, xác thực xác thực và tiêu đề phiên, thực thi kiểm tra nguồn gốc (bảo vệ chống rebinding DNS) và điều phối đến phương thức thích hợp. Hỗ trợ cả định dạng phản hồi JSON và SSE.

  • v2/api.clj - Trình xử lý bề mặt công cụ. Kết nối giao thức vận chuyển với các đăng ký công cụ + tài nguyên v2 và định nghĩa điều phối phương thức (tools/list, tools/call, resources/list, resources/read, ping).

  • v2/registry.clj - Đăng ký công cụ v2. Các công cụ tự đăng ký qua deftool; đăng ký kiểm tra phạm vi, xác thực đối số, điều phối lệnh gọi và ghi lại việc sử dụng.

  • scope.clj - Logic khớp phạm vi. Chỉ khớp chính xác: ký tự đại diện, phạm vi nil và sentinel ::unrestricted không khớp với bất cứ điều gì.

Luồng yêu cầu

MCP client
  -> POST /api/metabase-mcp (JSON-RPC)
  -> Origin + session validation
  -> Auth: OAuth bearer token or browser session
  -> Scope check against requested tool
  -> Synthetic request to Agent API endpoint
  -> Response materialized as MCP content
  -> JSON or SSE back to client

Đọc thêm