{"ok":true,"service":"smlaidashboard-mcp","serverName":"sml_dashboard","version":"0.3.0","protocol":"json-rpc-2.0","protocolVersion":"2024-11-05","endpoint":"/api/brain/mcp","transport":"streamable-http-json-rpc","router":{"serverName":"sml_dashboard","endpoint":"/api/brain/mcp","routerEndpoint":"/api/brain/mcp/router","transport":"streamable-http-json-rpc","auth":{"required":true,"header":"Authorization: Bearer <SML_MCP_TOKEN>","tokenConfigured":true},"toolNameRules":{"protocolName":"ใช้ชื่อจาก tools/list เช่น system_status เมื่อเป็น MCP protocol call","exposedName":"Namespaced clients แสดง sml_dashboard__<tool>","directHttpCall":"tools/call รับได้ทั้ง system_status และ sml_dashboard__system_status"},"methods":["initialize","ping","notifications/initialized","tools/list","tools/call"],"routes":{"discovery":{"method":"GET","path":"/api/brain/mcp","purpose":"Human/AI-readable manifest with router, tools, examples, and metadata.","auth":"none; never returns secrets"},"jsonRpc":{"method":"POST","path":"/api/brain/mcp","purpose":"MCP JSON-RPC endpoint for initialize, ping, tools/list, tools/call.","auth":"Authorization: Bearer <SML_MCP_TOKEN>"},"router":{"method":"GET","path":"/api/brain/mcp/router","purpose":"Light route map for AI clients · ครั้งแรกควรเรียกตัวนี้ก่อน","auth":"none; never returns secrets"}},"flowHint":"ลำดับเรียก tool เพื่อประหยัด token / context:\n1. system_status — เช็ค vault/DB/embedder/gateway (cheap, <1s)\n2. brain_vault_search — ค้น vault ด้วย ripgrep (cheap, <100ms)\n3. alerts_summary หรือ brain_semantic_search — drill-down ระดับกลาง (medium)\n4. brain_ask — ReAct agent loop · เรียกท้ายสุดเท่านั้น (expensive, 2-30s)\nดู field `_meta.cost` + `_meta.precedingTools` ใน tools/list เพื่อรู้ลำดับที่แนะนำ"},"methods":["initialize","ping","notifications/initialized","tools/list","tools/call"],"flowHint":"ลำดับเรียก tool เพื่อประหยัด token / context:\n1. system_status — เช็ค vault/DB/embedder/gateway (cheap, <1s)\n2. brain_vault_search — ค้น vault ด้วย ripgrep (cheap, <100ms)\n3. alerts_summary หรือ brain_semantic_search — drill-down ระดับกลาง (medium)\n4. brain_ask — ReAct agent loop · เรียกท้ายสุดเท่านั้น (expensive, 2-30s)\nดู field `_meta.cost` + `_meta.precedingTools` ใน tools/list เพื่อรู้ลำดับที่แนะนำ","toolCount":19,"tools":[{"name":"system_status","exposedName":"sml_dashboard__system_status","mcpName":"sml_dashboard__system_status","directCallAliases":["system_status","sml_dashboard__system_status"],"description":"ตรวจสุขภาพ Brain OS · vault path / Postgres / Ollama embedder / LLM gateway · ใช้เรียกก่อนเริ่ม session เพื่อรู้ว่า component ไหนพร้อม","inputSchema":{"type":"object","properties":{}},"_meta":{"category":"agent","cost":"cheap","freshness":"realtime","readOnly":true,"timeoutMs":5000,"recommendedUse":"เรียกครั้งแรกก่อนใช้ tool อื่นๆ · บอก AI ว่า vault/DB/embedder/gateway ตัวไหนใช้ได้","tags":["health","diag","first-call"]}},{"name":"brain_vault_search","exposedName":"sml_dashboard__brain_vault_search","mcpName":"sml_dashboard__brain_vault_search","directCallAliases":["brain_vault_search","sml_dashboard__brain_vault_search"],"description":"ค้น Markdown vault ด้วย ripgrep · ส่งคืน list ของไฟล์ที่ตรง keyword พร้อม folder · เร็วมาก ไม่ใช้ LLM ไม่ใช้ embedding","inputSchema":{"type":"object","properties":{"query":{"type":"string","description":"คำค้น (ไทยหรืออังกฤษ · code/name/keyword)"},"limit":{"type":"number","description":"max results · default 10, max 50","default":10},"folder":{"type":"string","description":"(optional) จำกัด folder เช่น 'products' 'customers'"}},"required":["query"]},"_meta":{"category":"vault","cost":"cheap","freshness":"cached","readOnly":true,"timeoutMs":5000,"recommendedUse":"ค้น vault ก่อนเป็นด่านแรก · ถ้าพบ ค่อยตัดสินใจว่าจะ read หรือ semantic ต่อ · ก่อน brain_ask","precedingTools":["system_status"],"tags":["vault","grep","fast"]}},{"name":"brain_semantic_search","exposedName":"sml_dashboard__brain_semantic_search","mcpName":"sml_dashboard__brain_semantic_search","directCallAliases":["brain_semantic_search","sml_dashboard__brain_semantic_search"],"description":"Semantic search ด้วย bge-m3 embeddings (1024 dim) + pgvector cosine · hybrid mode รวม trgm keyword · เหมาะกับคำถามที่ตรงคำในไฟล์ไม่เจอ","inputSchema":{"type":"object","properties":{"query":{"type":"string","description":"คำถามภาษาไทยหรืออังกฤษ · เป็นประโยคได้"},"k":{"type":"number","description":"top K · default 15, max 100","default":15},"type":{"type":"string","description":"(optional) entity type filter","enum":["product","customer","supplier","brand","category","unit"]},"hybrid":{"type":"string","description":"ใช้ hybrid (semantic + trgm) · default true"},"minSim":{"type":"number","description":"threshold 0-1 · default 0.3","default":0.3}},"required":["query"]},"_meta":{"category":"vault","cost":"medium","freshness":"cached","readOnly":true,"timeoutMs":20000,"recommendedUse":"ค้นเชิงความหมายเมื่อ brain_vault_search ไม่พบ · แพงกว่า grep เพราะต้อง embed + pgvector","precedingTools":["brain_vault_search"],"tags":["vault","embedding","pgvector"]}},{"name":"alerts_summary","exposedName":"sml_dashboard__alerts_summary","mcpName":"sml_dashboard__alerts_summary","directCallAliases":["alerts_summary","sml_dashboard__alerts_summary"],"description":"Summary ของ alert groups บน dashboard · stock/stockout/dead_stock/ar/ap/sales · ใช้รู้ภาพรวมก่อน drill-down","inputSchema":{"type":"object","properties":{}},"_meta":{"category":"alerts","cost":"medium","freshness":"realtime","readOnly":true,"timeoutMs":10000,"recommendedUse":"ดูภาพรวม alerts ของวันนี้ · จะรู้ว่าควรเจาะหมวดไหน (เช่น AR ค้างเยอะ → drill ด้วย alert_detail)","tags":["alerts","dashboard"]}},{"name":"alert_detail","exposedName":"sml_dashboard__alert_detail","mcpName":"sml_dashboard__alert_detail","directCallAliases":["alert_detail","sml_dashboard__alert_detail"],"description":"รายละเอียดของ alert ประเภทเดียว · stock / stockout / dead_stock / ar / ap / sales / sales_trend","inputSchema":{"type":"object","properties":{"type":{"type":"string","description":"alert type","enum":["stock","stockout","dead_stock","ar","ap","sales","sales_trend"]},"limit":{"type":"number","description":"max items · default 50, max 200","default":50}},"required":["type"]},"_meta":{"category":"alerts","cost":"medium","freshness":"realtime","readOnly":true,"timeoutMs":15000,"recommendedUse":"เจาะลึก alert group หลังจาก alerts_summary · ใช้ตามภาพรวมว่าด้านไหนต้องดู","precedingTools":["alerts_summary"],"tags":["alerts","drill-down","dashboard"]}},{"name":"top_sellers","exposedName":"sml_dashboard__top_sellers","mcpName":"sml_dashboard__top_sellers","directCallAliases":["top_sellers","sml_dashboard__top_sellers"],"description":"Top-selling products + sales-pace alerts (alerts_feed source · enriched with anomaly flags)","inputSchema":{"type":"object","properties":{"limit":{"type":"number","description":"max items · default 20, max 100","default":20}}},"_meta":{"category":"alerts","cost":"medium","freshness":"realtime","readOnly":true,"timeoutMs":15000,"recommendedUse":"ดูสินค้าขายดีจากมุม dashboard alerts · มี context anomaly · ต่างจาก brain_top_sellers ที่ direct DB rank","tags":["alerts","sales"]}},{"name":"aging","exposedName":"sml_dashboard__aging","mcpName":"sml_dashboard__aging","directCallAliases":["aging","sml_dashboard__aging"],"description":"AR/AP aging buckets จาก dashboard alerts feed · side=ar (default) หรือ side=ap","inputSchema":{"type":"object","properties":{"side":{"type":"string","description":"ar = ลูกหนี้, ap = เจ้าหนี้","enum":["ar","ap"],"default":"ar"},"limit":{"type":"number","description":"max items · default 50, max 200","default":50}}},"_meta":{"category":"alerts","cost":"medium","freshness":"realtime","readOnly":true,"timeoutMs":15000,"recommendedUse":"ดูลูกหนี้/เจ้าหนี้ค้างชำระจากมุม dashboard · ต่างจาก brain_aging ที่ direct-DB","tags":["alerts","ar","ap"]}},{"name":"object_storage_status","exposedName":"sml_dashboard__object_storage_status","mcpName":"sml_dashboard__object_storage_status","directCallAliases":["object_storage_status","sml_dashboard__object_storage_status"],"description":"MinIO/S3 object storage status + bucket names · ใช้เมื่อต้องอัปโหลด/ดึงไฟล์ artifacts","inputSchema":{"type":"object","properties":{}},"_meta":{"category":"alerts","cost":"cheap","freshness":"cached","readOnly":true,"timeoutMs":5000,"recommendedUse":"ตรวจสถานะ object storage ก่อนแนะนำให้ผู้ใช้แนบไฟล์/รายงาน","tags":["storage","minio","s3"]}},{"name":"brain_calculator","exposedName":"sml_dashboard__brain_calculator","mcpName":"sml_dashboard__brain_calculator","directCallAliases":["brain_calculator","sml_dashboard__brain_calculator"],"description":"คำนวณนิพจน์ทางคณิตศาสตร์ (บวก ลบ คูณ หาร ยกกำลัง วงเล็บ). ตัวอย่าง: '125 * 1.07', '(1500-900)*30'.","inputSchema":{"type":"object","properties":{"expression":{"type":"string","description":"นิพจน์ · รองรับ + - * / % ( ) และตัวเลขทศนิยม"}},"required":["expression"]},"_meta":{"category":"util","cost":"cheap","freshness":"static","readOnly":true,"timeoutMs":500,"recommendedUse":"คำนวณตัวเลขก่อนสรุปผลให้ผู้ใช้ — กำไร, ส่วนลด, ภาษี","tags":["math","compute"]}},{"name":"brain_unit_convert","exposedName":"sml_dashboard__brain_unit_convert","mcpName":"sml_dashboard__brain_unit_convert","directCallAliases":["brain_unit_convert","sml_dashboard__brain_unit_convert"],"description":"แปลงหน่วยวัด ความยาว/มวล/ปริมาตร/พื้นที่ · รองรับไทย+อังกฤษ (นิ้ว/ซม/ม · กก/กรัม/ตัน · ลิตร/มล · ไร่/ตร.ม.)","inputSchema":{"type":"object","properties":{"value":{"type":"number","description":"ค่าที่จะแปลง"},"from":{"type":"string","description":"หน่วยต้นทาง (เช่น นิ้ว, cm, kg, ไร่)"},"to":{"type":"string","description":"หน่วยปลายทาง"}},"required":["value","from","to"]},"_meta":{"category":"util","cost":"cheap","freshness":"static","readOnly":true,"timeoutMs":500,"recommendedUse":"แปลงหน่วยก่อนเทียบราคา/ปริมาณ — เช่น นิ้ว→ซม, ไร่→ตร.ม.","tags":["convert","thai","unit"]}},{"name":"brain_date_info","exposedName":"sml_dashboard__brain_date_info","mcpName":"sml_dashboard__brain_date_info","directCallAliases":["brain_date_info","sml_dashboard__brain_date_info"],"description":"ข้อมูลวันที่ · วันในสัปดาห์ · วันที่พุทธศักราช · ห่างจากวันนี้กี่วัน · รับ ISO date หรือปล่อยว่างใช้วันนี้","inputSchema":{"type":"object","properties":{"date":{"type":"string","description":"ISO date 'YYYY-MM-DD' · ถ้าไม่ส่งใช้วันนี้"}}},"_meta":{"category":"util","cost":"cheap","freshness":"realtime","readOnly":true,"timeoutMs":200,"recommendedUse":"ต้องการรู้วันที่/วันในสัปดาห์/ปี พ.ศ. ก่อนตอบคำถามเกี่ยวกับเวลา","tags":["thai","date"]}},{"name":"brain_weather","exposedName":"sml_dashboard__brain_weather","mcpName":"sml_dashboard__brain_weather","directCallAliases":["brain_weather","sml_dashboard__brain_weather"],"description":"พยากรณ์อากาศจังหวัด/อำเภอไทย · Open-Meteo (ฟรี ไม่ต้อง key). ใช้วางแผนสต็อกตามฤดู หรือเช็คสภาพอากาศสำหรับการขนส่ง.","inputSchema":{"type":"object","properties":{"location":{"type":"string","description":"ชื่อจังหวัด/อำเภอ (ไทยหรืออังกฤษ) เช่น 'เชียงใหม่' 'Bangkok'"},"days":{"type":"number","description":"จำนวนวันพยากรณ์ล่วงหน้า (1-14) default 3","default":3}},"required":["location"]},"_meta":{"category":"external","cost":"medium","freshness":"realtime","readOnly":true,"timeoutMs":15000,"recommendedUse":"พยากรณ์อากาศตามจังหวัด/อำเภอ · วางแผนสต็อกตามฤดูหรือเช็คสภาพอากาศการขนส่ง","tags":["weather","thai","external-api"]}},{"name":"brain_exchange_rate","exposedName":"sml_dashboard__brain_exchange_rate","mcpName":"sml_dashboard__brain_exchange_rate","directCallAliases":["brain_exchange_rate","sml_dashboard__brain_exchange_rate"],"description":"อัตราแลกเปลี่ยน · ฐาน THB หรือ USD · แปลงจำนวนเงินระหว่างสกุลเงิน · ใช้เทียบราคาสินค้านำเข้า","inputSchema":{"type":"object","properties":{"from":{"type":"string","description":"สกุลเงินต้นทาง (USD, THB, EUR, JPY, CNY ฯลฯ)"},"to":{"type":"string","description":"สกุลเงินปลายทาง · ถ้าไม่ส่ง · คืนตาราง rate ทั้งหมด"},"amount":{"type":"number","description":"จำนวนเงินที่จะแปลง","default":1}},"required":["from"]},"_meta":{"category":"external","cost":"medium","freshness":"cached","readOnly":true,"timeoutMs":12000,"recommendedUse":"แปลงสกุลเงิน เช่น เทียบราคาสินค้านำเข้าก่อนตั้งราคา","tags":["currency","external-api"]}},{"name":"brain_web_search","exposedName":"sml_dashboard__brain_web_search","mcpName":"sml_dashboard__brain_web_search","directCallAliases":["brain_web_search","sml_dashboard__brain_web_search"],"description":"ค้นข้อมูลจากอินเทอร์เน็ต · Wikipedia (ไทย+อังกฤษ) + DuckDuckGo · ใช้เมื่อข้อมูลที่ถามไม่มีใน vault ของร้าน","inputSchema":{"type":"object","properties":{"query":{"type":"string","description":"คำค้น (ไทยหรืออังกฤษ · เช่น 'โปรแกรมบัญชี' 'ราคาน้ำมันวันนี้')"}},"required":["query"]},"_meta":{"category":"external","cost":"medium","freshness":"realtime","readOnly":true,"timeoutMs":20000,"recommendedUse":"ค้นเว็บเมื่อคำถามไม่มีใน vault/DB ของร้าน — ใช้หลัง brain_vault_search ไม่พบ","precedingTools":["brain_vault_search"],"tags":["web","external-api","fallback"]}},{"name":"brain_thai_holidays","exposedName":"sml_dashboard__brain_thai_holidays","mcpName":"sml_dashboard__brain_thai_holidays","directCallAliases":["brain_thai_holidays","sml_dashboard__brain_thai_holidays"],"description":"วันหยุดนักขัตฤกษ์ไทย · ปีที่ระบุ (default ปีปัจจุบัน) · วันหยุดทางพระพุทธศาสนาต้องเช็คประกาศจริงเพราะคำนวณตามจันทรคติ","inputSchema":{"type":"object","properties":{"year":{"type":"number","description":"ปี ค.ศ. (default ปีปัจจุบัน)"}}},"_meta":{"category":"external","cost":"cheap","freshness":"static","readOnly":true,"timeoutMs":200,"recommendedUse":"ตรวจวันหยุดราชการไทยก่อนวางแผนการขายหรือขนส่ง","tags":["thai","holiday"]}},{"name":"brain_sales_history","exposedName":"sml_dashboard__brain_sales_history","mcpName":"sml_dashboard__brain_sales_history","directCallAliases":["brain_sales_history","sml_dashboard__brain_sales_history"],"description":"ประวัติการขายของสินค้ารหัสหนึ่งในช่วง N วันล่าสุด · สรุปรายวัน + top 5 วันที่ขายดีที่สุด","inputSchema":{"type":"object","properties":{"code":{"type":"string","description":"รหัสสินค้าจากคำถาม"},"days":{"type":"number","description":"จำนวนวันย้อนหลัง · default 30","default":30}},"required":["code"]},"_meta":{"category":"internal","cost":"medium","freshness":"realtime","readOnly":true,"timeoutMs":10000,"recommendedUse":"ตรวจประวัติขายรายวันของสินค้ารหัสหนึ่ง · ใช้ก่อนตัดสินใจสั่งของหรือลดราคา","precedingTools":["brain_vault_search"],"tags":["erp","sales","pg"]}},{"name":"brain_top_sellers","exposedName":"sml_dashboard__brain_top_sellers","mcpName":"sml_dashboard__brain_top_sellers","directCallAliases":["brain_top_sellers","sml_dashboard__brain_top_sellers"],"description":"สินค้าขายดีในช่วง N วัน · ranking ตามจำนวน · กรอง category/brand ได้","inputSchema":{"type":"object","properties":{"days":{"type":"number","description":"ย้อนหลังกี่วัน · default 30","default":30},"limit":{"type":"number","description":"top N · default 10","default":10},"category":{"type":"string","description":"กรองตามรหัสหมวดหมู่ (placeholder: <category_code>)"},"brand":{"type":"string","description":"กรองตามรหัสยี่ห้อ (placeholder: <brand_code>)"}}},"_meta":{"category":"internal","cost":"medium","freshness":"realtime","readOnly":true,"timeoutMs":15000,"recommendedUse":"หาสินค้าขายดี top N · รองรับกรองตามหมวด/ยี่ห้อ · ใช้สรุปยอดให้ผู้ใช้","tags":["erp","sales","ranking","pg"]}},{"name":"brain_aging","exposedName":"sml_dashboard__brain_aging","mcpName":"sml_dashboard__brain_aging","directCallAliases":["brain_aging","sml_dashboard__brain_aging"],"description":"รายงาน Aging ของลูกหนี้ (AR) หรือเจ้าหนี้ (AP) · แบ่งเป็น bucket ปัจจุบัน/1-30/31-60/61-90/>90 วัน · กรองตาม customer/supplier code ได้","inputSchema":{"type":"object","properties":{"type":{"type":"string","enum":["ar","ap"],"description":"ar = ลูกหนี้ · ap = เจ้าหนี้"},"code":{"type":"string","description":"(optional) รหัสลูกค้า/ซัพพลายเออร์ (placeholder: <entity_code>)"}},"required":["type"]},"_meta":{"category":"internal","cost":"medium","freshness":"realtime","readOnly":true,"timeoutMs":15000,"recommendedUse":"วิเคราะห์ลูกหนี้/เจ้าหนี้ค้างชำระ — เลือก type='ar' หรือ 'ap'","tags":["erp","ar","ap","pg"]}},{"name":"brain_ask","exposedName":"sml_dashboard__brain_ask","mcpName":"sml_dashboard__brain_ask","directCallAliases":["brain_ask","sml_dashboard__brain_ask"],"description":"ReAct agent loop (runConvAgent) · ค้น vault + query Postgres + LLM สังเคราะห์ · ใช้สำหรับคำถามซับซ้อนเท่านั้นเพราะแพง (LLM หลายรอบ · maxIter=5)","inputSchema":{"type":"object","properties":{"question":{"type":"string","description":"คำถามภาษาไทยหรืออังกฤษ"},"history":{"type":"string","description":"(optional) ประวัติ JSON: [{q,a}, ...] (เก็บแค่ 6 ตัวล่าสุดอัตโนมัติ)"}},"required":["question"]},"_meta":{"category":"agent","cost":"expensive","freshness":"realtime","readOnly":true,"timeoutMs":60000,"recommendedUse":"ใช้เป็นด่านสุดท้ายเมื่อ vault/semantic ไม่พอ · ห้ามเรียกก่อน brain_vault_search/system_status","precedingTools":["system_status","brain_vault_search"],"tags":["agent","react","llm","expensive"]}}],"clientInstructions":["1. GET /api/brain/mcp/router ก่อนเพื่อ minimal route map (เบาที่สุด · ไม่มี schema)","2. ต้องการรายละเอียดเต็ม → GET /api/brain/mcp (manifest + tool schemas + metadata)","3. MCP client → POST /api/brain/mcp JSON-RPC พร้อม Bearer token","4. initialize → tools/list (ดู _meta.cost + _meta.precedingTools) → tools/call","5. tools/call รับทั้งชื่อสั้น (system_status) และ namespaced (sml_dashboard__system_status)","6. ใส่ `_verbose: true` ใน params ถ้าต้องการ pretty JSON ใน content[0].text","7. เครื่องมือทั้งหมด read-only · ไม่สร้าง/แก้/ลบเอกสารธุรกิจ"],"examples":{"initialize":{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"example-client","version":"0.1.0"}}},"listTools":{"jsonrpc":"2.0","id":2,"method":"tools/list"},"callToolProtocolName":{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"system_status","arguments":{}}},"callToolNamespacedAlias":{"jsonrpc":"2.0","id":4,"method":"tools/call","params":{"name":"sml_dashboard__system_status","arguments":{}}},"callToolVerbose":{"jsonrpc":"2.0","id":5,"method":"tools/call","params":{"name":"brain_calculator","arguments":{"expression":"2+2"},"_verbose":true}}},"note":"POST JSON-RPC ต้องส่ง Authorization header · GET นี้เป็น manifest สาธารณะ","at":"2026-06-03T22:30:18.209Z"}