{"tools":[{"name":"sql_query","description":"Execute raw SQL query safely","input_schema":{"type":"object","properties":{"sql":{"type":"string","description":"SQL query to execute"}},"required":["sql"]},"output_schema":{"type":"object","description":"Query result rows"}},{"name":"read_schema_context","description":"Read ERP schema context and metadata","input_schema":{"type":"object","properties":{"full":{"type":"boolean","description":"Return full context if true"},"tableName":{"type":"string","description":"Filter by table name"},"section":{"type":"string","enum":["database_context","flows","tables","rules"],"description":"Return specific section"},"query":{"type":"string","description":"Search query in schema"}}},"output_schema":{"type":"object","description":"Schema context data"}},{"name":"read_prisma_schema","description":"Read and search Prisma schema","input_schema":{"type":"object","properties":{"full":{"type":"boolean","description":"Return full schema if true"},"model":{"type":"string","description":"Filter by model/enum name"},"search":{"type":"string","description":"Search query in schema"}}},"output_schema":{"type":"object","description":"Prisma schema content"}},{"name":"test_connection","description":"Test database connection","input_schema":{"type":"object","properties":{}},"output_schema":{"type":"object","properties":{"connected":{"type":"boolean"}}}},{"name":"s3_upload","description":"Upload file to S3 or S3-compatible service (MinIO, Cloudhost, etc.)","input_schema":{"type":"object","properties":{"key":{"type":"string","description":"File path/key in S3 (e.g., 'documents/report.pdf')"},"fileContent":{"type":"string","description":"File content (base64 encoded or raw text)"},"isBase64":{"type":"boolean","description":"Whether fileContent is base64 encoded (default: false)"},"contentType":{"type":"string","description":"MIME type (default: application/octet-stream)"},"acl":{"type":"string","enum":["public-read","private","public-read-write"],"description":"Access control (default: public-read)"},"metadata":{"type":"object","description":"Optional metadata key-value pairs"}},"required":["key","fileContent"]},"output_schema":{"type":"object","description":"Upload result with file URL"}},{"name":"s3_list","description":"List files in S3 bucket","input_schema":{"type":"object","properties":{"prefix":{"type":"string","description":"Optional prefix to filter files (e.g., 'documents/')"}}},"output_schema":{"type":"object","description":"List of files in S3 bucket"}},{"name":"s3_delete","description":"Delete file from S3 bucket","input_schema":{"type":"object","properties":{"key":{"type":"string","description":"File path/key to delete"}},"required":["key"]},"output_schema":{"type":"object","description":"Deletion result"}},{"name":"s3_url","description":"Generate S3 file URL","input_schema":{"type":"object","properties":{"key":{"type":"string","description":"File path/key in S3"},"signed":{"type":"boolean","description":"When true, also generate a temporary signed URL. Default false; public URL is returned by default."}},"required":["key"]},"output_schema":{"type":"object","description":"S3 file URL"}},{"name":"generate_report","description":"Generate dynamic HTML report with charts, tables, KPIs, filters, dynamic select filters, optional tabbed views, and optional S3 upload","input_schema":{"type":"object","properties":{"title":{"type":"string","description":"Report title (e.g., 'Laporan Penjualan 7 Produk Terlaris')"},"description":{"type":"string","description":"Report description/subtitle"},"queries":{"type":"array","description":"Array of SQL queries to execute","items":{"type":"object","properties":{"name":{"type":"string","description":"Query reference name (e.g., 'main_data')"},"sql":{"type":"string","description":"SQL query"}},"required":["name","sql"]}},"sections":{"type":"array","description":"Root/global report sections (header, filter, kpi, chart, table). Use root sections for global header/filter; use tabs[].sections for tabbed report pages.","items":{"type":"object","properties":{"type":{"type":"string","enum":["header","filter","kpi","chart","table"]},"title":{"type":"string"},"query":{"type":"string","description":"Reference to queries array"},"config":{"type":"object","description":"Section configuration"},"columns":{"type":"array","description":"For table: column definitions","items":{"type":"object","properties":{"key":{"type":"string"},"label":{"type":"string"},"format":{"type":"string","enum":["text","number","currency","date"]}}}}},"required":["type"]}},"tabs":{"type":"array","description":"Optional tabbed report groups for multi-view dashboards. Each tab has {id,title,description?,sections[]}. Use when user asks for multiple views/modules/pages, e.g. Overview, Penjualan, Kategori, Cabang, Detail.","items":{"type":"object","properties":{"id":{"type":"string","description":"Optional unique tab id"},"title":{"type":"string","description":"Tab title"},"description":{"type":"string","description":"Optional tab subtitle"},"sections":{"type":"array","description":"Sections rendered inside this tab. Supports header, filter, kpi, chart, table. Section query names must reference queries[].name.","items":{"type":"object","properties":{"type":{"type":"string","enum":["header","filter","kpi","chart","table"]},"title":{"type":"string"},"query":{"type":"string"},"config":{"type":"object"},"columns":{"type":"array"}},"required":["type"]}}},"required":["title","sections"]}},"queryTemplates":{"type":"array","description":"Optional original query templates (with {{token}} placeholders) for client-side re-filtering. Every KPI/chart/table query should include all report-wide filter tokens, e.g. AND ('{{branch_id}}' = '' OR t.BranchID = '{{branch_id}}').","items":{"type":"object","properties":{"name":{"type":"string"},"sql":{"type":"string"}},"required":["name","sql"]}},"activeFilters":{"type":"object","description":"Optional current filter values to prefill filter UI","additionalProperties":{"type":"string"}},"uploadToS3":{"type":"boolean","description":"Upload generated HTML to S3 and return URL (default: false)"},"s3Key":{"type":"string","description":"Base S3 path for upload (e.g., 'reports/sales-report.html'). generate_report automatically appends a timestamp before the extension to avoid browser/CDN cache collisions."}},"required":["title","queries"]},"output_schema":{"type":"object","description":"Generated report HTML or S3 URL"}}]}