סיכום מספרים ליום שני
Every Monday at 8:00, query my DuckDB database for last week's orders and write me a short summary with the total revenue, the number of orders, the five best selling products, and how each number compares with the week before.
שרת MCP מאומת: DuckDB
התשובה הקצרה
אומת לאחרונה 2026-08-03
שרת ה-MCP של DuckDB מאפשר לעוזר AI להריץ SQL על קובץ מסד נתונים של DuckDB שיושב על ה-Mac שלכם. החבילה היא mcp-server-motherduck, שמפרסמת MotherDuck, החברה שמאחורי שירות ה-DuckDB המתארח, והיא עולה עם uvx, כך שמה שרץ בפועל הוא תוכנית Python קטנה שמדברת עם אפליקציית ה-AI שלכם על גבי stdio. כשהוא מכוון לקובץ מסד נתונים הוא אינו מבקש חשבון, מפתח API או אסימון; אסימון של MotherDuck נדרש רק למצב הענן md:, והשגיאה המדויקת שמחזיר אסימון שגוי מודפסת בהמשך העמוד. לא הסתפקנו במה שכתוב ב-README: הרצנו את השרת, דיברנו איתו בפרוטוקול, ספרנו את כל ארבעת הכלים, הרצנו שאילתה אמיתית שחזרה עם שורה, ושמרנו את הפלט הגולמי, כולל השגיאות שהוא מחזיר כשמשהו משתבש. הכל נמצא בעמוד הזה. [1][3][5]
אימות
השיטה
הרצנו את השרת עם uvx על גבי stdio, כשהוא מכוון לקובץ DuckDB זמני באמצעות --db-path ו---read-write, השלמנו את לחיצת היד של MCP, קראנו ל-tools/list והרצנו קריאת כלי אמיתית אחת: execute_query עם השאילתה SELECT 42 AS answer, שחזרה עם שורה. לא הוגדר שום אישור גישה, כי קובץ מסד נתונים על ה-Mac שלכם אינו זקוק לאחד. ה-JSON הגולמי נלכד ישירות מהחיבור, וטבלת הכלים למטה היא הלכידה הזו, מילה במילה. על ה-Mac הזה רצה uvx 0.10.2; גרסת ה-Node ברצועה למעלה שייכת ללקוח הבדיקה שלנו, כי השרת עצמו כתוב ב-Python ואינו זקוק ל-Node. ארבע ריצות נוספות נעשו בכוונה כדי לשבור דברים, וכל שגיאה שהן החזירו מודפסת בהמשך.
הודעת הפתיחה של השרת
[motherduck] INFO - 🦆 MotherDuck MCP Server v1.0.7
[motherduck] INFO - Ready to execute SQL queries via DuckDB/MotherDuck
[motherduck] INFO - Database mode: read-write
[motherduck] INFO - Query result limits: 1024 rows, 50,000 characters
[motherduck] INFO - Query timeout: disabled
[motherduck] INFO - Database client initialized in `duckdb` mode
[motherduck] INFO - FastMCP server created
[motherduck] INFO - MCP server initialized in [32mstdio[0m mode
[motherduck] INFO - Waiting for client connection
╭──────────────────────────────────────────────────────────────────────────────╮
│ │
│ │
│ ▄▀▀ ▄▀█ █▀▀ ▀█▀ █▀▄▀█ █▀▀ █▀█ │
│ █▀ █▀█ ▄▄█ █ █ ▀ █ █▄▄ █▀▀ │
│ │
│ │
│ │
│ FastMCP 3.4.5 │
│ https://gofastmcp.com │
│ │
│ 🖥 Server: mcp-server-motherduck, 1.0.7 │
│ 🚀 Deploy free: https://horizon.prefect.io │
│ │
╰──────────────────────────────────────────────────────────────────────────────╯
[08/03/26 23:58:50] INFO Starting MCP server transport.py:241
'mcp-server-motherduck' with
transport 'stdio'
[motherduck] INFO - Processing request of type ListToolsRequest
[motherduck] INFO - Processing request of type CallToolRequest
[motherduck] INFO - 🔌 Connecting to duckdb database
[motherduck] INFO - ✅ Successfully connected to duckdb database
קריאת כלי אמיתית אחת
tools/call execute_query {"sql": "SELECT 42 AS answer"}{
"success": true,
"columns": [
"answer"
],
"columnTypes": [
"INTEGER"
],
"rows": [
[
42
]
],
"rowCount": 1
}שורות אמיתיות מהתוצאה שנלכדה: מספיק כדי להוכיח שהקריאה נענתה.
כלים
השרת ענה ל-tools/list עם 4 כלים בתאריך 2026-08-03. השמות, התיאורים והפרמטרים למטה הם המילים שלו עצמו, מועתקים מהתשובה הזו וללא עריכה.
| כלי | מה הוא עושה |
|---|---|
| execute_querysql* | Execute a SQL query on the DuckDB or MotherDuck database. Unqualified table names resolve to current_database() and current_schema() automatically. Fully qualified names (database.schema.table) are only needed when multiple DuckDB databases are attached or when connected to MotherDuck. |
| list_databases | List all databases available in the connection. Useful when multiple DuckDB databases are attached or when connected to MotherDuck. |
| list_tablesdatabaseschema | List all tables and views in a database with their comments. If database is not specified, uses the current database. |
| list_columnstable*databaseschema | List all columns of a table or view with their types and comments. If database/schema are not specified, uses the current database/schema. |
פרמטרים המסומנים ב-* הם חובה.
התקנה
העתיקו את הבלוק של האפליקציה שלכם. כל אחד מהם הוא ההגדרה המדויקת שאיתה אימתנו את השרת.
פתחו את הקובץ ~/Library/Application Support/Claude/claude_desktop_config.json (בתוך Claude Desktop: Settings, אחר כך Developer, אחר כך Edit Config) והוסיפו:
{
"mcpServers": {
"duckdb": {
"command": "uvx",
"args": [
"mcp-server-motherduck",
"--db-path",
"/Users/yourname/Documents/analytics.duckdb",
"--read-write"
]
}
}
}החליפו את נתיב מסד הנתונים בנתיב המלא של קובץ DuckDB משלכם, ואז סגרו ופתחו מחדש את Claude Desktop. הקובץ עצמו לא חייב להתקיים מראש, אבל התיקיה שסביבו כן. מחקו את שורת --read-write כדי להשאיר את העוזר במצב קריאה בלבד, וכך השרת מתנהג כשהדגל חסר. עבור MotherDuck בענן במקום קובץ, כתבו md: במקום הנתיב והוסיפו לאותה רשימה את --motherduck-token ואת האסימון שלכם. [3][6]
פקודה אחת בטרמינל:
claude mcp add --transport stdio duckdb -- uvx mcp-server-motherduck --db-path /Users/yourname/Documents/analytics.duckdb --read-write
כל מה שאחרי המקף הכפול הוא הפקודה המדויקת ש-Claude Code יריץ, לכן החליפו את הנתיב בקובץ DuckDB משלכם. עבור MotherDuck בענן, הוסיפו --env motherduck_token=YOUR_MOTHERDUCK_TOKEN לפני המקף הכפול והשתמשו ב---db-path md: במקום בנתיב לקובץ. [7][3]
הוסיפו ל-~/.cursor/mcp.json עבור כל הפרויקטים, או ל-.cursor/mcp.json בתוך פרויקט אחד:
{
"mcpServers": {
"duckdb": {
"command": "uvx",
"args": [
"mcp-server-motherduck",
"--db-path",
"/Users/yourname/Documents/analytics.duckdb",
"--read-write"
]
}
}
}Cursor קורא את הקובץ מחדש אחרי הפעלה מחדש. אם תעברו למצב הענן של MotherDuck ותדביקו לשם אסימון, השאירו את כל הבלוק בקובץ האישי ~/.cursor/mcp.json, כי קובץ בתוך פרויקט משותף לכל מי שיש לו את המאגר. [8][3]
בלי קובץ JSON ובלי טרמינל. ב-Routines: Settings, אחר כך Assistant, אחר כך Connections, אחר כך Add MCP Server. העבירו את הטופס ל-Command (stdio) והזינו:
Name DuckDB Command uvx Arguments mcp-server-motherduck --db-path /Users/yourname/Documents/analytics.duckdb --read-write
הערך בשדה ה-Arguments מתפצל לפי רווחים, לכן השתמשו בנתיב מלא בלי רווחים, שמתחיל ב-/Users. השאירו את Environment Variables ריק עבור קובץ על ה-Mac שלכם; רק מצב הענן של MotherDuck דורש שם שורה אחת, motherduck_token עם האסימון שלכם. לחצו קודם על Test Connection: שרת תקין עונה עם מספר הכלים שלו, ארבעה עבור השרת הזה. [9][3]
בלי טרמינל
אם מעולם לא פתחתם את הטרמינל ואתם מעדיפים שכך יישאר, זה כמעט המסלול שלכם: התקנה אחת עומדת בדרך, ואחריה אין מה להקליד. Routines היא אפליקציית Mac שמריצה שרתי MCP בשבילכם: ממלאים שלושה שדות פעם אחת, והכלים של השרת זמינים ל-AI שלכם בצ׳אט ובשגרות מתוזמנות.
01
הורידו את האפליקציה מ-getroutines.ai/download, גררו אותה ל-Applications והתחברו. השרת הזה הוא חבילת Python, ולכן הוא זקוק גם ל-uv, הכלי שמספק את הפקודה uvx. התקינו אותה מ-astral.sh/uv, או בשורת טרמינל אחת אם כבר יש לכם Homebrew: brew install uv.
02
לחצו על החשבון שלכם בתחתית סרגל הצד ובחרו Settings. פתחו את הקטע Assistant, אחר כך את הלשונית Connections, גללו אל MCP Servers ולחצו על Add MCP Server.
03
העבירו את הטופס ל-Command (stdio): השרת הזה הוא פקודה שרצה על ה-Mac שלכם, לא כתובת אינטרנט. Name: DuckDB. Command: uvx.
04
Arguments: mcp-server-motherduck --db-path, אחריו רווח והנתיב המלא של קובץ ה-DuckDB שלכם, למשל /Users/yourname/Documents/analytics.duckdb, ואז --read-write אם העוזר אמור לקבל רשות ליצור ולשנות טבלאות. כתבו את הנתיב במלואו, מתחיל ב-/Users, בלי רווחים. הקובץ לא חייב להתקיים מראש, אבל התיקיה שסביבו כן.
05
השאירו את Environment Variables ריק: קובץ מסד נתונים על ה-Mac שלכם אינו זקוק לאישור גישה, וזה החלק שהעמוד הזה מוכיח ולא רק מצטט. היוצא מן הכלל הוא מצב הענן של MotherDuck, שדורש כאן שורה אחת, motherduck_token. לחצו Test Connection: Routines מפעילה את השרת ומדווחת כמה כלים היא מצאה, ארבעה עבור השרת הזה. אחר כך לחצו Add Server.
06
הכלים עובדים בצ׳אט מיד: שאלו את השאלה שלכם במילים רגילות ותנו לעוזר לכתוב את ה-SQL. כדי לתת לשגרה מתוזמנת להשתמש בהם, פתחו את השגרה, מצאו את הכרטיס Tools & connections וסמנו את השרת תחת Apps.
רעיונות לשגרות
אחרי שהשרת מחובר, שגרה מתוזמנת יכולה להשתמש בכלים שלו גם כשאתם לא מול המסך. העתיקו פרומפט, הדביקו אותו ב-Routines ובחרו שעה. הפרומפטים כתובים באנגלית בכוונה, מדביקים אותם בדיוק כפי שהם.
Every Monday at 8:00, query my DuckDB database for last week's orders and write me a short summary with the total revenue, the number of orders, the five best selling products, and how each number compares with the week before.
Every weekday at 7:30, check my DuckDB database for rows that look wrong: customers with no email address, orders with no customer, and prices below zero. List what you find with a count for each problem, and say nothing if everything is clean.
Every Friday at 17:00, list the tables in my DuckDB database with their row counts, point out any table or column that was not there last week, and give me the whole thing as a one-page summary I can skim.
פתרון תקלות
שגיאות אמיתיות שנלכדו בריצת האימות, מודפסות בדיוק כפי שהשרת החזיר אותן.
מה רואים
1 validation error for call[execute_query]
sql
Missing required argument [type=missing_argument, input_value={}, input_type=dict]
For further information visit https://errors.pydantic.dev/2.13/v/missing_argumentהפתרון
שם הארגומנט הוא sql, לא query, טעות שעשינו בעצמנו בניסיון הראשון של הריצה שהעמוד הזה מתוארך לפיה. ההודעה למעלה היא מה שהשרת מחזיר כשהארגומנט sql חסר לגמרי, כפי שנלכד בריצת בדיקה שהרצנו בכוונה. עוזר AI בדרך כלל קורא את השם הנכון מתוך סכמת הכלי, ולכן זו השגיאה שתפגשו כשאתם מפעילים את השרת מסקריפט משלכם: שלחו את השאילתה תחת המפתח sql וזה עובד.
מה רואים
Error calling tool 'execute_query': {
"success": false,
"error": "Parser Error: syntax error at or near \"SELEKT\"\n\nLINE 1: SELEKT this is not valid sql\n ^",
"errorType": "ParserException"
}הפתרון
שגיאת פרסור אמיתית של DuckDB, שמועברת כמו שהיא לעוזר. גרמנו לה בכוונה כשכתבנו SELEKT במקום SELECT, והסימן בשורה האחרונה מצביע על המילה שבה מסד הנתונים נתקע. בפועל רוב השגיאות האלה נובעות משם טבלה או עמודה שנכתב אחרת ממה שציפיתם, לכן בקשו מהעוזר להריץ קודם list_tables ו-list_columns במקום לנחש שמות.
מה רואים
Unknown tool: 'execute_qeury'
הפתרון
שם הכלי נכתב בשגיאה, אצלנו בכוונה. השרת הזה עונה לארבעה שמות בדיוק, execute_query, list_databases, list_tables ו-list_columns, וכל דבר אחר חוזר כך בלי הסבר נוסף. העתיקו את השם מהטבלה שבעמוד הזה.
מה רואים
Error calling tool 'execute_query': {
"success": false,
"error": "Invalid Input Error: Initialization function \"motherduck_duckdb_cpp_init\" from file \"/Users/[REDACTED]/.duckdb/extensions/v1.5.3/osx_amd64/motherduck.duckdb_extension\" threw an exception: \"Invalid Error: Request failed: Your request is not authenticated. Please check your MotherDuck token. (Jwt is not in the form of Header.Payload.Signature with two dots and 3 sections, request id: '819fc96d-2d4a-4040-a6c7-f9f492433eb3')\"",
"errorType": "InvalidInputException"
}הפתרון
זהו מסלול הענן md:, לא המסלול של קובץ מקומי. השרת מקבל את האסימון בלי לבדוק אותו בהפעלה, ולכן גם לחיצת היד וגם רשימת הכלים מצליחות, והכשל נוחת רק על השאילתה הראשונה שנוגעת ב-MotherDuck, מה שגורם לחיבור להיראות תקין עד שאתם שואלים משהו. השורה על כך ש-Jwt אינו בצורת Header.Payload.Signature אומרת שהערך אינו אסימון של MotherDuck בכלל, וזה בדיוק מה ששלחנו: מחרוזת מציין מקום. הדביקו אסימון אמיתי מהחשבון שלכם ב-MotherDuck, או ותרו על הענן וכוונו את --db-path לקובץ על ה-Mac שלכם, שאינו דורש אסימון. תיקיית הבית בנתיב שלמעלה מוסתרת; שום דבר אחר בהודעה לא נערך.
מה רואים
Error calling tool 'execute_query': {
"success": false,
"error": "IO Error: Cannot open file \"/definitely/not/a/real/directory/nope.duckdb\": No such file or directory",
"errorType": "IOException"
}הפתרון
קובץ מסד הנתונים לא חייב להתקיים מראש, אבל התיקיה שסביבו כן. כיוונו את --db-path לתוך תיקיה שאינה קיימת, ושוב השרת עלה ורשם את הכלים שלו כרגיל, כי הוא פותח את מסד הנתונים רק כשמגיעה שאילתה. תקנו את הנתיב או צרו קודם את התיקיה, וכתבו את הנתיב במלואו מ-/Users ולא בקיצור של סימן הטילדה.
הפתרון
הפקודה uvx שייכת ל-uv, מריצת חבילות ה-Python. אם uv לא מותקנת על ה-Mac, כל לקוח בעמוד הזה ייכשל בשלב ההפעלה עוד לפני שהשרת מספיק לומר משהו. התקינו אותה מ-astral.sh/uv, ואז הריצו which uvx בטרמינל: אם מודפס נתיב ובכל זאת אפליקציית Mac לא מצליחה להפעיל את השרת, הדביקו את הנתיב המלא בשדה הפקודה, כי אפליקציה שנפתחת מה-Dock לא תמיד יורשת את ה-PATH של המעטפת שלכם.
שאלות נפוצות
זו תוכנית קטנה שמחברת עוזר AI כמו Claude ל-DuckDB, מסד הנתונים האנליטי שחי בקובץ אחד. אחרי החיבור אתם שואלים שאלה בשפה רגילה, העוזר כותב את ה-SQL, השרת מריץ אותו ומחזיר את השורות. החבילה היא mcp-server-motherduck, שמפרסמת MotherDuck, והיא רצה כתהליך מקומי על ה-Mac שלכם שמדבר עם אפליקציית ה-AI על גבי stdio. אותו שרת מגיע גם למסדי נתונים בענן של MotherDuck, וזה המצב היחיד שדורש אסימון. [3][1]
ארבעה, וספרנו אותם בריצה חיה: execute_query, שמקבל פרמטר sql יחיד ומריץ אותו, ולצדו list_databases, list_tables ו-list_columns כדי להתמצא לפני כתיבת שאילתה. הטבלה למעלה היא פלט ה-tools/list החי, מילה במילה. כמעט הכל קורה דרך execute_query, ולכן מה שהעוזר יודע על SQL חשוב כאן יותר מאורך רשימת הכלים.
הוא במצב קריאה בלבד עד שתבקשו יותר. הדגל --read-write הוא שפותח כתיבה, והשרת מדפיס בעצמו את מצב מסד הנתונים בהפעלה: read-write בריצה המרכזית שלנו, שהשתמשה בדגל, ו-read-only בריצת הבדיקה שוויתרה עליו. במצב כתיבה execute_query יכול ליצור, לשנות ולמחוק טבלאות, ולכן השרת מסמן את הכלי הזה כהרסני כשהוא מתאר את עצמו לעוזר. הסיכון האמיתי הוא היקף, כי כלי אחד שמקבל כל SQL רואה את כל מה שיש בקובץ שאליו כיוונתם אותו. כוונו אותו לעותק ולא לגרסה היחידה של משהו שחשוב לכם, והשאירו את --read-write כבוי עד שמשימה באמת דורשת אותו.
לא עבור קובץ מסד נתונים על ה-Mac שלכם. אין למה להירשם ואין אישור גישה להדביק, ולכן קריאת הדוגמה בעמוד הזה חזרה עם שורות אמיתיות ולא עם שגיאת אימות. אסימון של MotherDuck נדרש רק אם מכוונים את --db-path ל-md:, מצב הענן המתארח, והשגיאה שמחזיר אסימון שגוי מודפסת בקטע פתרון התקלות למעלה. הפקודה uvx מורידה את החבילה ממאגר PyPI הציבורי בריצה הראשונה, כך שההפעלה הראשונה צריכה חיבור לאינטרנט; אחריה החבילה שמורה על ה-Mac. [1]
פעם אחת, כדי להתקין את uv, הכלי שמספק את הפקודה uvx, כי השרת הזה הוא חבילת Python. אחרי זה לא: ב-Routines ממלאים שלושה שדות בהגדרות ולוחצים Test Connection, והמדריך למעלה מראה כל לחיצה. Claude Desktop ו-Cursor דורשים עריכה חד-פעמית של קובץ JSON קטן. רק Claude Code הוא כלי טרמינל מטבעו. [9][6]
כי MotherDuck, החברה שמפעילה שירות DuckDB מתארח, היא שמפרסמת אותה, וחבילה אחת מכסה את שני המקרים: קובץ DuckDB על הדיסק שלכם והענן שלהם. PulseMCP מציגה אותה כשרת ה-MCP הרשמי של MotherDuck ו-DuckDB, המאגר יושב בארגון motherduckdb ב-GitHub עם 506 כוכבים ורישיון MIT, והדחיפה האחרונה אליו היא מ-2026-07-27. שום דבר במצב הקובץ המקומי אינו מגיע ל-MotherDuck: ריצת האימות שלנו השתמשה בקובץ רגיל על ה-Mac ולא הגדירה שום אסימון. [5][3][4]
כל לקוח MCP שמסוגל להפעיל שרת stdio מקומי: Claude Desktop, Claude Code, Cursor ו-Routines כולם יכולים, וההגדרה המדויקת לכל אחד נמצאת למעלה. השרת עצמו זהה בכל לקוח; רק המקום שבו מדביקים את ההגדרה משתנה. פרט אחד מבדיל אותו מרוב השרתים במדריך הזה: הוא מופץ ב-PyPI, ולכן הפקודה היא uvx בכל מקום ולעולם לא npx. [6][7][8][9][1]
מקורות
כל מה שבעמוד הזה שלא ראינו בעצמנו בריצה מקושר כאן, עם התאריך שבו קראנו אותו. לגבי השאר, הריצה עצמה היא הקבלה.
[1]
Latest version 1.0.7, published 2026-06-09. Requires Python 3.10 or newer. Published to PyPI, with no npm package of this name.
[2]
9,555 downloads in the last seven days at access time, and 43,674 in the last thirty.
[3]
506 stars, an MIT license, not archived, and a push dated 2026-07-27 per the GitHub API. Its README publishes the uvx command, the JSON config block and the stdio transport.
[4]
MotherDuck Corporation, the company behind the hosted DuckDB service, owns the package.
[5]
Lists this package as the official MotherDuck and DuckDB MCP server.
[6]
Where the Claude Desktop config file lives and the mcpServers command and args shape.
[7]
The claude mcp add [options] <name> -- <command> [args...] syntax, including --transport and --env.
[8]
[9]
How Routines runs one-click OAuth connectors and any MCP server.
העמוד הזה מתאר את DuckDB כפי שהתנהג בריצה מתוארכת אחת על Mac אחד. גרסאות משתנות: אם משהו כאן כבר לא תואם למה שאתם רואים, תאריך הלכידה בראש העמוד אומר בן כמה הצילום.
מאחורי המדריך הזה
Routines, האפליקציה שמאחורי המדריך הזה, מריצה שרתי MCP כמו זה בלי טרמינל: כך עובדים המחברים. הפתקים שלכם נשארים קובצי markdown על ה-Mac שלכם, אין חשבון ענן לשלם, והיא עובדת גם בלי אינטרנט. להורדת Routines