Supabase
server ทางการของ Supabase ให้ AI สร้างตาราง ถามข้อมูล และดูการตั้งค่าโปรเจกต์ในฐานข้อมูล Supabase ของคุณ
คำอธิบายจากผู้ทำ (ภาษาอังกฤษตามต้นฉบับ)
Declarative synthetic data: multi-table data that holds the facts you declare, checked by DuckDB.
สามเรื่องนี้ไม่รวมเป็นคะแนนเดียว เพราะความเห็น การวัด และความนิยม เป็นคนละเรื่องกัน
ตัวนี้ยังไม่ได้เรียบเรียงเป็นภาษาไทย ด้านล่างคือข้อเท็จจริงที่เราอ่านจาก registry
เลือกโปรแกรม AI ที่คุณใช้ แล้วคัดลอกค่าตั้งไปวาง
ต้องเตรียมก่อน
คุณใช้แอปไหน
เลือกแอปด้านบน เราจำไว้ให้ ครั้งหน้าปุ่มจะขึ้นว่า “ติดตั้งลง …”
เปิด Claude Desktop → Settings → Developer → Edit Config แล้ววางค่านี้ในไฟล์ claude_desktop_config.json
{
"mcpServers": {
"misata": {
"command": "uvx",
"args": [
"misata"
]
}
}
}พิมพ์คำสั่งนี้ใน Terminal
claude mcp add misata -- uvx misataวางในไฟล์ .cursor/mcp.json ของโปรเจกต์ หรือ ~/.cursor/mcp.json
{
"mcpServers": {
"misata": {
"command": "uvx",
"args": [
"misata"
]
}
}
}เบราว์เซอร์จะถามก่อนเปิดแอป จากนั้นแอปแสดงค่าตั้งให้ตรวจแล้วกดยืนยัน ช่อง key เว้นว่างไว้ให้คุณใส่เอง
วางในไฟล์ .vscode/mcp.json ของโปรเจกต์
{
"servers": {
"misata": {
"type": "stdio",
"command": "uvx",
"args": [
"misata"
]
}
}
}เบราว์เซอร์จะถามก่อนเปิดแอป จากนั้นแอปแสดงค่าตั้งให้ตรวจแล้วกดยืนยัน ช่อง key เว้นว่างไว้ให้คุณใส่เอง
ตัวนี้รันในเครื่องคุณ แต่ ChatGPT ต่อได้เฉพาะ server บนอินเทอร์เน็ต ลองเลือกแอปอื่น
ตัวเลือกเก็บในคุกกี้บนเครื่องนี้ ไม่ต้องมีบัญชี
ค่าตั้งนี้สร้างจากข้อมูลใน registry ของผู้ทำ ถ้าไม่ตรงกับ README ให้เชื่อ README
รันในเครื่องคุณ รายการเครื่องมือจะขึ้นในแอป AI หลังติดตั้ง
เราตรวจจากข้อมูลที่ใครก็เปิดดูได้ ยังไม่ได้อ่านโค้ด ข้อที่ไม่เกี่ยวกับตัวนี้ไม่นับในตัวหาร · ตรวจเมื่อ 7 พ.ย. 2569
ชื่อใน registry ยืนยันด้วยบัญชี GitHub rasinmuhammed ซึ่งเป็นเจ้าของ repo
ยังไม่ได้อ่านข้อมูล repo จาก GitHub
ยังไม่ได้อ่านข้อมูล repo จาก GitHub
ตัวนี้รันบนเครื่องคุณ ไม่มี endpoint บนอินเทอร์เน็ต
ตัวนี้รันบนเครื่อง ใช้ค่าที่ตั้งในเครื่องแทน
รันในเครื่องคุณ เราอ่านรายการเครื่องมือได้เฉพาะตัวที่มี endpoint บนอินเทอร์เน็ต
เทียบกับทุก server ที่ยังใช้งานในหมวดนี้ทั้งทะเบียน ดาวนับเฉพาะเมื่อผู้ลงทะเบียนเป็นเจ้าของ repo
จากการตรวจเบื้องต้นของเรา ผ่าน 1 จาก 1 ข้อที่ตรวจได้ เรายังไม่ได้อ่านโค้ด ก่อนใส่กุญแจหรือ token ให้ดูว่า server ขอสิทธิ์อะไร และเลือกกุญแจที่ทำได้เท่าที่จำเป็น
registry ไม่ได้ระบุว่าต้องใช้กุญแจ แต่บางตัวจะขอให้ล็อกอินตอนใช้ครั้งแรก
รันบนเครื่องของคุณ โปรแกรม AI จะเปิด server ขึ้นมาเองเมื่อใช้ ข้อมูลไม่ต้องผ่านเซิร์ฟเวอร์ของผู้ทำ (ยกเว้นตัวที่ไปเรียกบริการออนไลน์ต่อ)
repo บน GitHub มีการแก้โค้ดล่าสุด – และส่งรุ่นล่าสุด (0.9.8) เข้า registry 12 วันที่ผ่านมา
โปรแกรมที่รองรับ MCP เช่น Claude Desktop, Claude Code, Cursor และ VS Code ตัวนี้ต้องมี Python (uv) ในเครื่องด้วย
ในหมวดเดียวกันมี Supabase, MongoDB MCP Server, Elasticsearch MCP Server
server หมวดเดียวกันจากผู้ทำคนอื่น เรียงตามดาว
อ่านการ์ด:★ ดาว GitHubiสามเสา: รีวิว · ผลตรวจ · การใช้งานiอัปเดต = วันที่ส่งรุ่นล่าสุดเข้า registryi
server ทางการของ Supabase ให้ AI สร้างตาราง ถามข้อมูล และดูการตั้งค่าโปรเจกต์ในฐานข้อมูล Supabase ของคุณ
MongoDB Model Context Protocol Server
MCP server for interacting with Elasticsearch
ส่วนนี้คัดจาก repo ของผู้ทำตามต้นฉบับ PopNx MCP ไม่ได้ตรวจหรือรับรองเนื้อหา ตัด HTML รูปภาพ และสคริปต์ออกแล้ว ลิงก์จะพาออกนอกเว็บ
Misata is a declarative synthetic data generator for Python. You write down the facts a dataset has to satisfy, from a monthly revenue curve to a balanced ledger to a foreign key that must never dangle, and the engine builds multi-table data that satisfies all of them at once. Then DuckDB checks the files on disk and writes a certificate anyone can re-run.
Docs · Use cases · The language · Limitations · Studio · Changelog
pip install "misata[duckdb]"
# misata.yaml
seed: 7 tables: customers: rows: 2000 columns: customer_id: {type: int, unique: true, min: 1, max: 2000} name: {type: text, text_type: name} signed_up: {type: date, start: "2024-01-01", end: "2024-12-31"} orders: rows: 40000 columns: order_id: {type: int, unique: true, min: 1, max: 1000000} customer_id: {type: foreign_key} channel: {type: categorical, choices: [web, app, store]} amount: {type: float, min: 5, max: 900} ordered_at: {type: date, start: "2025-01-01", end: "2025-12-31"} relationships:
outcome_curves:
group_shares:
misata generate -c misata.yaml -o data --attest
python data/verify.py
Attestation: data
result: PASSED files pinned: 2 invariants held: 69 of 69
ok 2 file(s) match their attested sha256 ok 69 of 69 invariant(s) hold
The 69 are derived from the YAML before a row exists: twelve monthly revenue totals (180,000.00 in January, 240,000.00 in June, 310,000.00 in December, straight lines between), the channel split inside every one of those months, the planned row count per month, zero orphaned customer_ids and unique keys. verify.py needs only the standard library and duckdb, and it shares no code with the generator.
The YAML above, generated and summed by month and channel. Each bar is a month of generated revenue split by channel; the cap is the total the YAML declares. Drawn by readme_charts.py from a fresh run of this README's own YAML.
Change one cent in one row and it says so:
FAIL orders.csv: sha256 301165f9dc4e does not match the attested 670f89195826
FAIL orders.amount.month:1.outcome_curve_period: expected 180000.00, observed 180000.01 FAIL orders.amount.outcome_curve_total: expected 2945000.00, observed 2945000.01 FAIL orders.amount.web.2025-01.group_share_period: expected 90000.00, observed 90000.01 FAIL orders.amount.web.group_share_total: expected 1472500.00, observed 1472500.01 FAIL 65 of 69 invariant(s) hold
Every test fixture has an oracle problem. To check a dbt model, a Spark job, a dashboard tile or a data agent you need input data and an answer you know independently of the code under test. Copying production gives you data without an answer. Hand-written fixtures give you an answer that rots. Random generators give you data whose answer you have to compute with the code you are testing.
Misata turns it around. The specification is the ground truth and the rows are derived from it. "January revenue is 180,000" is true before a single row exists, so your pipeline either returns 180,000.00 or it has a bug.
flowchart LR
A["Declare curves, shares, ledgers, keys, lifecycles"] --> B{"Can they all hold?"} B -- "no" --> R["Refused, with the arithmetic and a fix"] B -- "yes" --> C["Build rows closed form where it can, by construction elsewhere"] C --> D["Write CSV, Parquet, JSONL, DuckDB, Postgres"] D --> E["Attest DuckDB re-runs every derived invariant"] E --> F["Certificate in-toto Statement plus verify.py"]
Three properties make this different from a generator with options:
Misata's aim is that nobody writes a Python script to make a dataset, of any kind. You say what has to be true; the engine works out the rows, refuses what cannot hold, and proves what it built.
It is not there yet, and it is getting there brick by brick. Each release adds things you can declare instead of programming, and a brick is laid only when it passes three tests: it can be declared in a few lines of YAML, it is refused before generation when it contradicts another declaration, and it is re-checked on the rows afterwards by code that did not write them.
Every brick is something you declare instead of code. Drawn from misata/registry.py , the list a contract test holds the code to, so the wall cannot claim a brick the engine does not have.
One fact, two ways. What a script has to do to make a fact true, and what you write instead:
| The fact | In a generator script | In Misata |
|---|---|---|
| January revenue is 180,000.00 | draw amounts, sum them, rescale, round, chase the last cent | {month: 1, target_value: 180000} |
| web is half of every month's revenue | rescale inside each month and channel, then repair the monthly totals you just broke | shares: {web: 0.5, app: 0.3, store: 0.2} |
| every order has a real customer | sample ids from the parent table and keep both in step | customers.customer_id -> orders.customer_id |
| some churned customers were active first | branch on status, write timestamps in order, null the rest, count by hand | transitions: [[trialing, active], [active, churned]] |
| 1% of transfers form laundering patterns, in a set mix | build each ring and fan by hand, then prove the background has no cycle of its own | rate: 0.01 and shares: {cycle: 0.4, fan_in: 0.25, ...} |
| the trial balance is zero | post both legs of every entry and reconcile at the end | a balanced_ledger constraint on the journal lines |
What still takes code, and where each one stands:
| Still scripted by hand | Where it stands |
|---|---|
| The expected output of logic Misata cannot invert: window functions, custom SQL, business rules | misata solve drives your real dbt, SQL or Python pipeline to a declared number within a stated tolerance; past that, you write the expected value |
| Correlations you can only describe by example | misata.mimic fits them from real rows, and its output is not anonymous |
| Free text with a voice of its own | text is generated from grammars and agrees with its row; prose that reads as written is not declarable yet |
| Version histories (SCD2) and inventory trajectories | generated to balance, not yet declared step by step |
| Documents, images and audio | not started |
LIMITATIONS.md keeps the full list. When a line leaves this table, it is because the brick that replaces it has passed all three tests.
The Gauntlet: 13 tables and 136 SQL assertions run by DuckDB. The Faker script ties wherever a fact is about one column at a time and loses wherever columns, rows or tables have to agree. Source , rerun with python -m benchmarks.gauntlet .
<img src="https://raw.githubusercontent.com/rasinmuhammed/misata/main/docs/assets/readme/detection-light.svg" width="680" alt="Detection AUC, lower is better, 0.5 means a classifier cannot tell generated rows from real ones. Olist orders: Misata from a declared schema 0.63, Misata from a sentence 0.73, Faker script 0.78, SDV fitted to the real data 0.71, Misata mimic 0.54. NYC taxi trips: 0.
ตัดมาแค่ช่วงต้น อ่านต่อใน repo