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_timeout15 วินาที - body สูงสุด 2 MB, ทั้งคำขอ timeout 35 วินาที
- ห้ามแปะ token จริงลงแชท/โค้ด/git — เป็นความลับระดับรหัสผ่าน; รั่วให้เพิกถอนทันทีแล้วออกใหม่
- ข้อความ error ระดับ JSON-RPC ตอบ HTTP 200 (ดูรายละเอียดที่ API เซิร์ฟเวอร์ MCP แบบอ่านอย่างเดียว (MCP read-only gateway และการจัดการ token))
ดูเพิ่ม
- API เซิร์ฟเวอร์ MCP แบบอ่านอย่างเดียว (MCP read-only gateway และการจัดการ token)
- จัดการ MCP Token เชื่อมต่อ AI ภายนอก แบบอ่านอย่างเดียว (McpTokenScreen)
- sml_mcp_access_tokens / sml_mcp_token_databases / sml_mcp_token_audit — โทเคน MCP แบบอ่านอย่างเดียว
- เช็กลิสต์ความปลอดภัย API: ตัวตน สิทธิ์ และช่องโหว่เว็บ (Secure API Checklist)
- ทำไมถูกเด้งออกจากระบบ / ขึ้น "หมดเวลาใช้งาน" (token หมดอายุ, idle 30 นาที, logout) ทำงานอย่างไร
ที่มาในโค้ด
backend/internal/adapter/inbound/http/router.go:360route/mcp,/api/v1/mcpและกลุ่ม/api/v1/mcp/tokens(AdminAuth)backend/internal/adapter/inbound/http/mcp/token.go:27prefixsmlmcp_ro_(โหมดreadonlyบรรทัด 25)backend/internal/adapter/inbound/http/mcp/token.go:177mcpSchemaSQLสร้าง 3 ตารางbackend/internal/adapter/inbound/http/mcp/token.go:224ValidateCreateInputbackend/internal/adapter/inbound/http/mcp/gateway.go:254Authenticate(แฮช, revoked, expiry, cache 30 วินาทีบรรทัด 354)backend/internal/adapter/inbound/http/mcp/gateway.go:835ServeMCP(timeout 35 วินาที, body 2 MB)backend/internal/adapter/inbound/http/mcp/gateway.go:1110readOnlyToolsCatalogfrontend/account/admin/screens/McpTokenScreen.tsx:215handleCreateToken