Metabase

ทางการ

เซิร์ฟเวอร์ MCP อย่างเป็นทางการของ Metabase สำหรับค้นหาข้อมูล สร้างคำค้นหาบนเลเยอร์ความหมาย และแสดงผลลัพธ์ผ่านไคลเอนต์ MCP

คุณทำอะไรได้บ้างด้วย Metabase MCP?

  • ค้นหาและดึงข้อมูลเนื้อหา — ให้ผู้ช่วยของคุณค้นหาคำถาม แดชบอร์ด หรือโมเดลต่างๆ ทั่ว Metabase โดยใช้เครื่องมือ search จากนั้นดึงรายละเอียดด้วย get_content
  • รันคิวรีและแสดงผลลัพธ์เป็นภาพ — ให้ผู้ช่วยของคุณดำเนินการคิวรีแบบมีโครงสร้างผ่าน execute_query หรือ SQL ดิบด้วย execute_sql จากนั้นแสดงผลลัพธ์เป็นแผนภูมิแบบโต้ตอบโดยใช้ visualize_query
  • สร้างและจัดการแดชบอร์ด — สั่งให้ผู้ช่วยของคุณสร้างหรืออัปเดตแดชบอร์ดและเลย์เอาต์ด้วย dashboard_write หรือทำสำเนาเนื้อหาที่มีอยู่ลงในคอลเลกชันผ่าน duplicate_content
  • ตั้งค่าการแจ้งเตือนและการสมัครรับข้อมูล — ขอให้ผู้ช่วยของคุณสร้างการแจ้งเตือนตามกำหนดเวลาสำหรับคำถามที่บันทึกไว้ด้วย alert_write หรือกำหนดค่าการสมัครรับอีเมลของแดชบอร์ดโดยใช้ subscription_write
  • สำรวจลำดับชั้นของข้อมูล — สั่งให้ผู้ช่วยของคุณเรียกดูฐานข้อมูล สคีมา ตาราง และฟิลด์ต่างๆ ผ่าน browse_data หรือนำทางคอลเลกชันตามโครงสร้างด้วย browse_collection

เอกสาร

เซิร์ฟเวอร์ MCP ของ Metabase

Metabase มีเซิร์ฟเวอร์ Model Context Protocol (MCP) ในตัวที่ให้ ไคลเอนต์ AI เชื่อมต่อโดยตรงกับอินสแตนซ์ Metabase โดยใช้ Streamable HTTP transport และสร้างบน Agent API ของ Metabase เพื่อเปิดเผยเครื่องมือสำหรับการค้นหา นำทาง สืบค้น แสดงภาพ และ สร้าง/อัปเดตเนื้อหา - ทั้งหมดจำกัดอยู่ที่สิทธิ์ของผู้ใช้ที่เชื่อมต่อ

เอนด์พอยต์

เซิร์ฟเวอร์ MCP พร้อมใช้งานที่:

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

เส้นทาง /api/mcp แบบเดิมยังคงทำงานเป็นนามแฝงสำหรับไคลเอนต์ที่มีอยู่ แต่ /api/metabase-mcp คือ URL มาตรฐานที่ควรประกาศ

การเชื่อมต่อไคลเอนต์

ชี้ไคลเอนต์ที่รองรับ MCP ไปที่เอนด์พอยต์ /api/metabase-mcp ตัวอย่างเช่น กับ Claude Code:

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

สำหรับ Claude Desktop ให้สร้าง ตัวเชื่อมต่อแบบกำหนดเอง โดยใช้ URL เดียวกัน

สำหรับ Cursor ให้เปิด Settings > MCP และเพิ่มเซิร์ฟเวอร์ใหม่โดยตั้งค่าประเภทเป็น streamable-http และ URL:

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

การรับรองความถูกต้อง

ไคลเอนต์ MCP รับรองความถูกต้องผ่าน OAuth 2.0 Metabase ใช้เซิร์ฟเวอร์ OAuth ในตัวของตัวเอง - ไม่จำเป็นต้องมีผู้ให้บริการภายนอก

ขั้นตอนสำหรับการเชื่อมต่อครั้งแรก:

  1. ไคลเอนต์ค้นพบเอนด์พอยต์ OAuth ของ Metabase
  2. ไคลเอนต์ลงทะเบียนตัวเองกับ Metabase
  3. ผู้ใช้ถูกเปลี่ยนเส้นทางไปยัง Metabase เพื่อเข้าสู่ระบบและอนุมัติการเชื่อมต่อ
  4. ไคลเอนต์ได้รับโทเค็นการเข้าถึงที่จำกัดอยู่ที่สิทธิ์ Metabase ของผู้ใช้

เซสชันที่ใช้เบราว์เซอร์ (การรับรองความถูกต้องด้วยคุกกี้) คีย์ API และโทเค็น mb:full ไม่มีขอบเขต MCP ดังนั้นจึงเชื่อมต่อได้แต่ เรียกใช้เครื่องมือที่มีขอบเขตไม่ได้

ขอบเขต

โทเค็นการเข้าถึงถูกจำกัดขอบเขตเพื่อจำกัดว่าไคลเอนต์สามารถใช้เครื่องมือใดได้บ้าง:

ขอบเขตเครื่องมือที่ให้
agent:content:readbrowse_collection, browse_data, get_content, get_parameter_values, glossary, learn, search, และทรัพยากรข้อมูล catalog://metabase/fields (ดู ทรัพยากร)
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

เครื่องมือจะตรงกับขอบเขตที่แน่นอนในตารางเท่านั้น ไวลด์การ์ดเช่น * หรือ agent:* และเซนติเนล ::unrestricted ไม่ใช่ขอบเขต MCP ดังนั้นจึงไม่ให้สิทธิ์เครื่องมือใด

ขอบเขตเหล่านี้จำกัดเฉพาะพื้นผิว MCP เท่านั้น ไม่มีเอนด์พอยต์ REST ใดที่ประกาศขอบเขตเหล่านี้เป็น :scope ดังนั้นโทเค็นใหม่ที่ออกให้ ไคลเอนต์ MCP จึงไม่ให้สิทธิ์ใดบน REST API

scopes_supported ของเมตาดาทาทรัพยากรที่ได้รับการป้องกันและ scope ของความท้าทาย 401 ต่างก็แสดงรายการทุกขอบเขตใน ตาราง ดังนั้นการเชื่อมต่อใหม่จึงขอขอบเขตทั้งหมด ไคลเอนต์บางตัวไม่เพิ่มระดับหลัง 403: การเชื่อมต่อใหม่ด้วยตนเอง จากการตั้งค่าตัวเชื่อมต่อของ Claude จะลงทะเบียนไคลเอนต์ใหม่และขอเฉพาะสิ่งที่รายการเหล่านี้แสดง เมื่อรายการแสดงเพียง ขอบเขตพื้นฐาน การเชื่อมต่อใหม่นั้นไม่เคยเสนอการเขียน SQL ดิบ หรือการส่งมอบ และผู้ใช้ไม่มีวิธีให้สิทธิ์เหล่านั้น (ENG-11089) เมตาดาทาของเซิร์ฟเวอร์อนุญาตก็ประกาศขอบเขตทั้งหมดเช่นกัน

ขอบเขตพื้นฐาน (agent:content:read agent:query:run) ถูกล็อกบนหน้าอนุมัติ: เมื่อไคลเอนต์ขอขอบเขตใดขอบเขตหนึ่ง ผู้ใช้ไม่สามารถยกเลิกการเลือกได้ agent:query:run อยู่ในขอบเขตพื้นฐานเพื่อให้แผนภูมิไม่ต้องเพิ่มระดับ Claude Desktop จะลองเครื่องมือใหม่หลังเพิ่มระดับผ่านเซสชันที่ไม่ประกาศการรองรับ MCP Apps ดังนั้น visualize_query ที่เพิ่มระดับแล้วจะถูกปฏิเสธและแผนภูมิของมันไม่ถูกฝัง

การเรียกเครื่องมือหรือการอ่านทรัพยากรข้อมูลที่โทเค็นขาดขอบเขตจะถูกปฏิเสธด้วย HTTP 403 และ ความท้าทาย WWW-Authenticate: Bearer error="insufficient_scope" ซึ่ง scope แสดงรายการขอบเขต v2 ที่โทเค็นถืออยู่แล้ว บวกกับขอบเขตที่จำเป็น เพื่อให้ไคลเอนต์สามารถเพิ่มระดับได้ แต่ละเครื่องมือยังประกาศขอบเขตของตนใน securitySchemes ซึ่งเป็น SEP-1488 ฉบับร่าง ที่รองรับโดย ChatGPT ไม่ใช่ ส่วนหนึ่งของ MCP 2025-03-26 (เวอร์ชันที่เซิร์ฟเวอร์นี้รายงาน) หรือสเปกเครื่องมือ 2026-07-28 ฉบับสุดท้าย ดังนั้นไคลเอนต์อื่น จึงค้นพบขอบเขตที่ขาดหายไปจาก 403 แทน ภายในแบตช์ JSON-RPC การปฏิเสธเป็นข้อผิดพลาด -32600 ในแบนด์ แทน การอ่านเชลล์ UI ไม่ถูกท้าทาย: ดู ทรัพยากร

เมตาดาทาทรัพยากรที่ได้รับการป้องกัน OAuth พร้อมใช้งานที่:

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

บนหน้าอนุมัติ ทุกขอบเขตที่ไคลเอนต์ขอเริ่มต้นด้วยการเลือก และขอบเขตพื้นฐานถูกล็อกด้วย เฉพาะ ขอบเขตที่ยังคงเลือกอยู่เท่านั้นที่ถูกให้ และเฉพาะสำหรับโทเค็นที่การอนุญาตนี้สร้างขึ้น การยกเลิกการเลือกไม่เคยแตะต้องโทเค็น ที่แอปมีอยู่แล้ว ขอบเขตที่ไม่ได้เลือกจะไม่ถูกจดจำโดย Metabase 403 ในภายหลังสามารถกระตุ้นการเพิ่มระดับอีกครั้งใน ไคลเอนต์ที่รองรับ ไคลเอนต์อื่นอาจต้องอนุญาตใหม่ด้วยตนเอง error_description ของแต่ละความท้าทาย จบลงด้วยหมายเหตุว่าผู้ใช้ต้องให้สิทธิ์บนหน้าอนุมัติ

ไคลเอนต์หลายตัวแทนที่ error_description ของ 403 ด้วยข้อความของตัวเอง ดังนั้น instructions ของผลลัพธ์ initialize จึงอธิบายความล้มเหลวของขอบเขตให้โมเดลด้วย: ข้อผิดพลาดการรับรองความถูกต้องมักหมายถึงสิทธิ์ที่ขาดหายไปมากกว่าการเข้าสู่ระบบ ที่หมดอายุ โมเดลควรระบุเครื่องมือหรือทรัพยากรที่ล้มเหลวและสิทธิ์ที่ต้องการ และผู้ใช้ให้สิทธิ์โดย เชื่อมต่อใหม่และปล่อยให้สิทธิ์ถูกเลือกบนหน้าอนุมัติ คำแนะนำเป็นสตริงคงที่หนึ่งชุด เหมือนกัน สำหรับทุกผู้เรียก: ไม่มีรายการสิทธิ์ต่อการเชื่อมต่อ

การเข้าถึงเครื่องมือต่อกลุ่ม

บนอินสแตนซ์ Enterprise ที่มีฟีเจอร์ ai_controls ผู้ดูแลระบบสามารถจำกัดพื้นผิวต่อกลุ่มสิทธิ์ได้ที่ Admin > AI > Usage controls > MCP tools access (แสดงเมื่อเซิร์ฟเวอร์ MCP เปิดอยู่ โดยมีหรือไม่มีผู้ให้บริการ LLM) แต่ละกลุ่มมีแถวใน mcp_group_permission ระบุว่าสมาชิกสามารถเชื่อมต่อได้หรือไม่ และต่อชื่อเครื่องมือ การตั้งค่า "yes" หรือ "no" ที่ชัดเจนของผู้ดูแลระบบ; เครื่องมือที่ไม่มีรายการจะใช้ค่าเริ่มต้นที่ผู้เขียนประกาศ ดังนั้นทุก deftool จึงมี :default-access ที่จำเป็นเป็น :allowed หรือ :denied และเครื่องมือที่เผยแพร่ทีหลังจะได้ค่าเริ่มต้นนั้นในทุกกลุ่มจนกว่าผู้ดูแลระบบจะแทนที่ รายการถูกคีย์ด้วยชื่อเครื่องมือ ดังนั้นการเปลี่ยนชื่อเครื่องมือต้องใช้ :renamed-from กับชื่อเดิม (รายการที่เก็บภายใต้ชื่อเดิมยังคงใช้และ API ผู้ดูแลระบบแสดงภายใต้ชื่อปัจจุบัน) หรือผู้เขียนยอมรับว่าการเลือกของผู้ดูแลระบบทุกคนสำหรับมันถูกทิ้ง; metabase.mcp.v2.tool-names-test ปักหมุดชื่อที่ใช้งานอยู่เพื่อไม่ให้เกิดเหตุการณ์ใดโดยบังเอิญ นโยบายที่มีผลของผู้ใช้คือ tool_access ของแต่ละกลุ่มของพวกเขาที่แถวเปิดใช้งาน MCP: MCP เปิดเมื่อมีกลุ่มดังกล่าว และเครื่องมือได้รับอนุญาตเมื่อกลุ่มใดกลุ่มหนึ่งแก้ไขเป็นใช่ แถวเพียงอย่างเดียวตัดสินใจ และยังบันทึกโหมดสิทธิ์: โหมดง่าย (Administrators, All Users, และ All tenant users) หรือโหมดระดับกลุ่ม (ทุกกลุ่มอื่น) ซึ่งเป็นสถานะที่ All Users ไม่มีแถว สวิตช์ลบแถวของกลุ่มที่โหมดใหม่ซ่อนและเพาะกลุ่มที่เปิดใช้งานเมื่อเข้าที่ไม่มีแถว (Data Analysts เมื่อเข้าสู่โหมดระดับกลุ่ม, All Users และ All tenant users เมื่อออกจากโหมดนั้น) และ PUT ปฏิเสธกลุ่มที่โหมดปัจจุบันซ่อน ดังนั้นไม่มีคำขออ่านโหมดแคช นโยบายถูกใช้บนขอบเขต OAuth ใน tools/list และ tools/call (v2/registry.clj) และผู้ใช้ที่กลุ่มไม่ให้การเข้าถึงถูกปฏิเสธที่ initialize และที่ resources/read (สำหรับเซสชันที่เปิดก่อนปิด MCP) ด้วยข้อผิดพลาดที่ระบุวิธีแก้ไข เครื่องมือเฉพาะแอป (_meta {:ui {:visibility ["app"]}} เช่น refresh_ui_credential) ไม่ได้อยู่บนหน้าผู้ดูแลระบบ: อนุญาตในขณะที่นโยบายอนุญาตเครื่องมือ MCP Apps ใด ๆ ซูเปอร์ยูเซอร์และการเรียกภายในไม่ถูกจำกัด; OSS อนุญาตทุกอย่าง บน Enterprise แถวที่เก็บถูกบังคับใช้แม้ไม่มีฟีเจอร์ ai_controls (โทเค็นที่หมดอายุหรือไม่สามารถตรวจสอบได้ยังคงรักษาข้อจำกัดที่ผู้ดูแลระบบกำหนด); ฟีเจอร์เพียงควบคุมหน้าผู้ดูแลระบบและ API ตัวแก้ไขคือ permissions.clj (defenterprise, การใช้งาน EE ใน metabase-enterprise.mcp.permissions) และ API ผู้ดูแลระบบคือ /api/ee/ai-controls/mcp-permissions

เครื่องมือที่มีอยู่

สร้างจากรีจิสทรี v2 (deftool) ขอบเขตที่ระบุที่นี่คือสิ่งที่รีจิสทรีตรวจสอบก่อนที่เครื่องมือ จะทำงาน; ตัวจัดการบางตัวตรวจสอบขอบเขตเพิ่มเติมเมื่อรู้ว่าการเรียกทำอะไร - agent:sql:run เมื่อแหล่งที่มา แก้ไขเป็น SQL ดั้งเดิม (question_write) และ agent:query:run สำหรับการดำเนินการที่การแจ้งเตือนหรือการสมัครสมาชิกเลื่อนออกไป (alert_write, subscription_write) การปฏิเสธเหล่านั้นมีความท้าทาย 403 insufficient_scope เดียวกัน tools/list แสดงทุกเครื่องมือไม่ว่าโทเค็นจะถืออะไร และโทเค็นที่ขาดขอบเขตอาจไม่เรียกมัน

เครื่องมือขอบเขตคำอธิบาย
alert_writeagent:delivery:writeสร้างหรืออัปเดตการแจ้งเตือน: การแจ้งเตือนที่ส่งตามกำหนดการเมื่อผลลัพธ์ของคำถามที่บันทึกไว้ตรงตามเงื่อนไข
bookmark_contentagent:content:writeเพิ่มหรือลบบุ๊กมาร์กบนเนื้อหาสำหรับผู้ใช้ที่เรียก — รายการดาว/รายการโปรดเดียวกันกับที่แถบด้านข้างของ Metabase แสดง
browse_collectionagent:content:readเรียกดูคอลเลกชันตามโครงสร้าง — id เดียวที่สม่ำเสมอเหนือทุกพาร์ติชัน: id ตัวเลข, entity_id 21 อักขระ, "root" (จัดรากใหม่ตามเนมสเปซ), หรือ "trash" (เนื้อหาที่เก็บถาวร, เฉพาะโหมดรายการ)
browse_dataagent:content:readเรียกดูลำดับชั้นข้อมูล: ฐานข้อมูล → สคีมา → ตาราง → ฟิลด์
collection_writeagent:content:writeสร้าง เปลี่ยนชื่อ ย้าย เก็บถาวร หรือกู้คืนคอลเลกชัน — โฟลเดอร์ที่เก็บคำถาม แดชบอร์ด โมเดล และเอกสาร
dashboard_writeagent:content:writeสร้างหรืออัปเดตแดชบอร์ดและแก้ไขเลย์เอาต์ด้วยการดำเนินการแบบเรียงลำดับ
document_writeagent:content:writeสร้างหรืออัปเดตเอกสาร
duplicate_contentagent:content:writeคัดลอกคำถาม แดชบอร์ด หรือเอกสารลงในคอลเลกชัน — ถูกกว่าและปลอดภัยกว่าการอ่านต้นฉบับแล้วสร้างใหม่ และรักษาทุกสิ่งที่โปรเจกชันการอ่านละเว้นไว้
execute_queryagent:query:runวิธีเริ่มต้นในการตอบคำถามจากข้อมูล: ตรวจสอบและดำเนินการคิวรีแบบมีโครงสร้าง (MBQL) ส่งคืนแถวพร้อม query_handle
execute_sqlagent:sql:runช่องทางหลบหนี: ดำเนินการสตริง SQL ดิบกับฐานข้อมูล ส่งคืนแถวพร้อม query_handle
get_contentagent:content:readดึงเนื้อหาตาม {type, id} — การอ่านแบบกำหนดประเภทสำหรับสิ่งที่พบผ่านการค้นหาหรือ browse_collection
get_parameter_valuesagent:content:readดึงค่าที่ถูกต้องสำหรับตัวกรองหนึ่งตัวบนแดชบอร์ดหรือคำถามที่บันทึกไว้ เพื่อให้คุณกรองด้วยค่าจริงแทนการเดา
glossaryagent:content:readค้นหาคำศัพท์ทางธุรกิจตามที่อินสแตนซ์ Metabase นี้กำหนดไว้ ชื่อคำศัพท์ที่กำหนดจะอยู่ในคำอธิบายของเครื่องมือเอง
learnagent:content:readอ่านเอกสารงาน (ทักษะ) ของเซิร์ฟเวอร์นี้สำหรับรูปแบบการเขียนที่สคีมาไม่สามารถอธิบายได้ครบถ้วน
measure_writeagent:content:writeสร้างหรืออัปเดต measure: การรวม MBQL ที่มีชื่อและนำกลับมาใช้ใหม่ได้ซึ่งแนบกับตารางเดียว อ้างอิงภายใน aggregation ของคิวรีอื่นเป็น ["measure", id]
metric_writeagent:content:writeสร้างหรืออัปเดต metric: การรวมที่บันทึกไว้และนำกลับมาใช้ใหม่ได้ซึ่งอยู่ในคอลเลกชันและสามารถสอบถามได้ด้วยตัวเองหรืออ้างอิงจากคิวรีอื่น
question_writeagent:content:writeสร้าง อัปเดต หรือเก็บถาวรคำถามหรือโมเดลที่บันทึกไว้
refresh_ui_credentialagent:query:runรีเฟรชข้อมูลประจำตัวที่กำหนดขอบเขตที่ใช้โดย Metabase MCP App
render_drill_throughagent:query:runเรนเดอร์การแสดงภาพแบบ drill-through ที่ผู้ใช้เพิ่งนำทางเข้าไป
run_saved_questionagent:query:runรันคำถามที่บันทึกไว้ (การ์ด) ด้วย id ตัวเลขหรือ entity_id ส่งคืนแถวแบบอินไลน์
searchagent:content:readค้นหาเนื้อหาทั่วอินสแตนซ์ Metabase ตามความเกี่ยวข้อง
segment_writeagent:content:writeสร้างหรืออัปเดต segment: ตัวกรอง MBQL ที่มีชื่อและนำกลับมาใช้ใหม่ได้ซึ่งแนบกับตารางเดียว อ้างอิงจากตัวกรองของคิวรีอื่น
subscription_writeagent:delivery:writeสร้างหรืออัปเดตการสมัครรับแดชบอร์ด — การส่งแดชบอร์ดทั้งหมดตามกำหนดการ เช่น
visualize_queryagent:query:runแสดงภาพคิวรีเป็นแผนภูมิหรือตารางแบบโต้ตอบ เรนเดอร์แบบอินไลน์ในการสนทนา

execute_query ส่งคืน row_limit แถวต่อการเรียก (ค่าเริ่มต้น 100, สูงสุด 2000) — ขนาดหน้า ไม่ใช่ขีดจำกัดของผลลัพธ์ หน้าที่ถูกตัดทอนรายงาน truncated: true และเมื่อคิวรีมีการเรียงลำดับทั้งหมด จะมี next_cursor เพื่อส่งกลับเป็น cursor สำหรับหน้าถัดไป จนกว่าหน้าจะมาถึงพร้อม truncated: false คิวรีที่ต้องการเพียง N แถวแรก มี limit: N ในสเตจของมัน (พร้อม order-by); เซิร์ฟเวอร์ใช้ขีดจำกัดนั้นลดลงตามหน้า ดังนั้นหน้า สุดท้ายจะกลับมาครบถ้วนโดยไม่มีเคอร์เซอร์และการแบ่งหน้าจะสิ้นสุดโดยอัตโนมัติ

ทรัพยากร

เซิร์ฟเวอร์เปิดเผย MCP resources เพื่อให้ ไคลเอนต์สามารถดึงเนื้อหาเสริมตาม URI โดยไม่ทำให้คำอธิบายเครื่องมือใหญ่เกินไป

Resource URIขอบเขตคำอธิบาย
ui://metabase/visualize-query.htmlagent:query:run (เฉพาะข้อมูลประจำตัว UI)เชลล์ iframe ของ MCP Apps ที่ visualize_query ชี้ให้ไคลเอนต์ที่รองรับ
ui://metabase/render-drill-through.htmlagent:query:run (เฉพาะข้อมูลประจำตัว UI)เชลล์ที่ render_drill_through ชี้ไป
catalog://metabase/fieldsagent:content:readเส้นทางแบบจุดที่แต่ละประเภทเนื้อหายอมรับในอาร์กิวเมนต์ fields

ทุกทรัพยากรถูกแสดงรายการไม่ว่าขอบเขตของโทเค็นจะเป็นอะไร ทรัพยากรข้อมูล เช่น แคตตาล็อกฟิลด์ จะถูกอ่านโดย โทเค็นที่ถือขอบเขตของมันเท่านั้น มิฉะนั้นการอ่านจะได้รับความท้าทาย 403 insufficient_scope ตามที่อธิบายไว้ภายใต้ Scopes เชลล์ UI ถูกอ่านโดยโทเค็นใดก็ได้ เพราะโฮสต์ MCP Apps อ่านเชลล์ของเครื่องมือ พร้อมกับการเรียกเครื่องมือ และหากการอ่านนั้นถูกปฏิเสธ โฮสต์จะไม่ก้าวขึ้นมาหลังจากการเรียกเครื่องมือได้รับ 403 เชลล์ ไม่มีข้อมูล เชลล์ที่อ่านโดยโทเค็นที่ไม่มีขอบเขตของเชลล์จะไม่สร้างข้อมูลประจำตัว UI ข้อมูลแผนภูมิถูก ควบคุมโดยการเรียกเครื่องมือและโดย refresh_ui_credential (ทั้ง agent:query:run) ซึ่ง iframe ต้องการก่อนที่จะ สอบถามอะไรได้ URI ที่ไม่รู้จักคือข้อผิดพลาด -32602 "Resource not found"

ชุดทักษะถูกส่งผ่านเครื่องมือ learn แทนที่จะเป็นทรัพยากร

การนำทางเอนทิตีทำด้วยเครื่องมือ get_content และ browse_* แทนรูปแบบ URI; ทรัพยากร ui:// ข้างต้นมีอยู่เพื่อให้ไคลเอนต์ที่สามารถเรนเดอร์ iframe มีสิ่งที่ต้องเมานต์เท่านั้น

วิธีการ JSON-RPC ที่รองรับ

Methodคำอธิบาย
initializeเริ่มต้นการเชื่อมต่อ MCP ส่งคืนความสามารถของเซิร์ฟเวอร์และ ID เซสชัน
notifications/initializedการแจ้งเตือนจากไคลเอนต์ว่าการเริ่มต้นเสร็จสมบูรณ์
tools/listแสดงรายการเครื่องมือที่มีอยู่ ไม่ว่าขอบเขตของโทเค็นจะเป็นอะไร
tools/callเรียกเครื่องมือพร้อมอาร์กิวเมนต์
resources/listแสดงรายการทรัพยากรที่มีอยู่ ไม่ว่าขอบเขตของโทเค็นจะเป็นอะไร
resources/readอ่านทรัพยากรตาม URI; ทรัพยากรข้อมูลต้องมีขอบเขตของมัน ต้องมีเซสชัน
pingPing เพื่อรักษาการเชื่อมต่อ

คำขอสามารถส่งทีละรายการหรือเป็นชุด JSON-RPC เซิร์ฟเวอร์ตอบสนองด้วย JSON หรือ SSE ขึ้นอยู่กับ ส่วนหัว Accept

สถาปัตยกรรม

การใช้งานอยู่ในไฟล์เหล่านี้:

  • transport.clj - การขนส่ง HTTP แยกวิเคราะห์คำขอ JSON-RPC ตรวจสอบการรับรองความถูกต้องและ ส่วนหัวเซสชัน บังคับการตรวจสอบต้นทาง (การป้องกัน DNS rebinding) และส่งต่อไปยังวิธีการที่เหมาะสม รองรับทั้งรูปแบบการตอบสนอง JSON และ SSE

  • v2/api.clj - ตัวจัดการพื้นผิวเครื่องมือ เชื่อมต่อการขนส่งกับรีจิสทรีเครื่องมือและทรัพยากร v2 และกำหนดการส่งวิธีการ (tools/list, tools/call, resources/list, resources/read, ping)

  • v2/registry.clj - รีจิสทรีเครื่องมือ v2 เครื่องมือลงทะเบียนตัวเองผ่าน deftool; รีจิสทรี ตรวจสอบขอบเขต ตรวจสอบอาร์กิวเมนต์ ส่งการเรียก และบันทึกการใช้งาน

  • scope.clj - ตรรกะการจับคู่ขอบเขต เฉพาะการจับคู่แบบตรงทั้งหมด: ไวลด์การ์ด ขอบเขต nil และ sentinel ::unrestricted ไม่ตรงกับอะไรเลย

ขั้นตอนการร้องขอ

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

อ่านเพิ่มเติม