สมอง SML

คลังความรู้ / ถาม-ตอบ

#faq#mcp#token#security#admin

MCP ของ SML Ai Account ใช้ทำอะไร และใช้ token อย่างไร

ตอบสั้น: เป็นช่องทางให้โปรแกรม AI ภายนอก (Claude, Cursor ฯลฯ) อ่านข้อมูลบัญชีอย่างเดียว ผ่านโปรโตคอล MCP (JSON-RPC 2.0) ที่ /mcp โดยใช้ token เฉพาะรูปแบบ smlmcp_ro_... ที่ผู้ดูแลออกให้จากหน้า "จัดการ MCP Token" — เขียน/แก้ข้อมูลไม่ได้เลย (โหมดเดียวในโค้ดคือ readonly)

รายละเอียด

ออก token: เมนู 1023 (McpTokenScreen) ส่งไป POST /api/v1/mcp/tokens/ (ต้องมี admin API key) กฎใน ValidateCreateInput (token.go:224): ชื่อ 1-100 ตัวอักษร, โหมด readonly, เลือกฐานข้อมูลบริษัท 1-50 ฐานไม่ซ้ำ (ห้ามเป็นฐานหลักของระบบที่ขึ้นต้น smlerpmain), วันหมดอายุอยู่ในอนาคตและไม่เกินประมาณ 1 ปี ค่าเริ่มต้น 90 วัน สูงสุด 365 วัน (gateway.go:548-553) ค่า token เต็มแสดง ครั้งเดียว หลังสร้าง ฐานข้อมูลเก็บเฉพาะค่าแฮช SHA-256 (จัดการ MCP Token เชื่อมต่อ AI ภายนอก แบบอ่านอย่างเดียว (McpTokenScreen))

ตาราง (โค้ดสร้างเองด้วย mcpSchemaSQL ใน Main Database ของ provider): sml_mcp_access_tokens (ตัว token: แฮช, วันหมดอายุ, revoked_at, last_used_at), sml_mcp_token_databases (token เข้าฐานบริษัทไหนได้), sml_mcp_token_audit (create/revoke/use) — ดู sml_mcp_access_tokens / sml_mcp_token_databases / sml_mcp_token_audit — โทเคน MCP แบบอ่านอย่างเดียว (ไม่มีตารางชื่อ sml_mcp_tokens ในโค้ด)

ใช้ token: ส่ง Authorization: Bearer <token> หรือ header X-MCP-Token ไปที่ POST /mcp (หรือ /api/v1/mcp) — Authenticate (gateway.go:254) ตรวจแฮชแบบ constant-time, ไม่ถูกเพิกถอน, ยังไม่หมดอายุ, มีฐานข้อมูลที่อนุญาต และตรวจซ้ำว่าผู้ออก token ยังมีสิทธิ์ฐานนั้น ล้มเหลวตอบ 401 (ผล auth ถูก cache 30 วินาที)

เครื่องมือ (tools) 11 ตัว ใน readOnlyToolsCatalog (gateway.go:1110) เช่น sml_list_databases, sml_list_tables, sml_describe_table, sml_query_readonly (SELECT/WITH เดียว), sml_batch_readonly, sml_document_lookup, sml_financial_summary, sml_run_report

เพิกถอน: POST /api/v1/mcp/tokens/{id}/revoke หรือปุ่มเพิกถอนในหน้าจอ → token ใช้ไม่ได้ทันที (ล้าง cache)

ข้อควรระวัง

  • SQL ผ่าน domainquery.NewStatement (SELECT/WITH เท่านั้น) และบล็อกการอ่าน sml_user_list, ตาราง sml_mcp_*, sml_google_account; query รันใน transaction read-only + statement_timeout 15 วินาที
  • body สูงสุด 2 MB, ทั้งคำขอ timeout 35 วินาที
  • ห้ามแปะ token จริงลงแชท/โค้ด/git — เป็นความลับระดับรหัสผ่าน; รั่วให้เพิกถอนทันทีแล้วออกใหม่
  • ข้อความ error ระดับ JSON-RPC ตอบ HTTP 200 (ดูรายละเอียดที่ API เซิร์ฟเวอร์ MCP แบบอ่านอย่างเดียว (MCP read-only gateway และการจัดการ token))

ดูเพิ่ม

ที่มาในโค้ด

  • backend/internal/adapter/inbound/http/router.go:360 route /mcp, /api/v1/mcp และกลุ่ม /api/v1/mcp/tokens (AdminAuth)
  • backend/internal/adapter/inbound/http/mcp/token.go:27 prefix smlmcp_ro_ (โหมด readonly บรรทัด 25)
  • backend/internal/adapter/inbound/http/mcp/token.go:177 mcpSchemaSQL สร้าง 3 ตาราง
  • backend/internal/adapter/inbound/http/mcp/token.go:224 ValidateCreateInput
  • backend/internal/adapter/inbound/http/mcp/gateway.go:254 Authenticate (แฮช, revoked, expiry, cache 30 วินาทีบรรทัด 354)
  • backend/internal/adapter/inbound/http/mcp/gateway.go:835 ServeMCP (timeout 35 วินาที, body 2 MB)
  • backend/internal/adapter/inbound/http/mcp/gateway.go:1110 readOnlyToolsCatalog
  • frontend/account/admin/screens/McpTokenScreen.tsx:215 handleCreateToken