כזה ניסיתי: ה mcp של val town הוא הדרך הכי מהירה לשתף ניסויים מקלוד קוד
כשאנשים מתלבטים אם כדאי לכתוב את פרויקט ה Vibe הבא בלאבבל או בקלוד קוד (מקומי) אחד השיקולים לבחור בסביבת אונליין זה שפשוט לא צריך להתקין כלום. אתה אומר ל AI מה אתה רוצה, ה AI בונה ויש לך את זה באוויר, כולל קוד צד שרת ואפשרות להריץ שירותים ברקע.
ה mcp של val.town מאפשר לנו לעבוד מקומית בתוך קלוד קוד ולהתחבר ל val.town כדי לפרסם את האפליקציה שלנו וכך לקבל במתנה את כל יכולות הפלטפורמה. קוד שרץ על val.town מקבל (בחינם) מהם:
- ניהול משתמשים דרך מערכת אימות של val.town.
- בסיס נתונים SQLite פנימי שלכם.
- ניהול Storage עם אפשרות לשמירת blob-ים.
- חיבור לאימיילים נכנסים ושליחת אימיילים.
- חיבור ל ChatGPT (הטוקנים עליהם).
- יצירת cron jobs שירוצו מהענן שלהם.
בשביל המשחק נתתי לקלוד קוד שלי (מודל פתוח glm-5.1 רץ על הענן של ollama, רק 20$ בחודש כמעט בלי הגבלת טוקנים) להריץ שני ניסויים. בפרומפט הראשון ביקשתי משחק סנייק שירוץ על val.town:
find val town docs here
https://docs.val.town/
create a snake game val and return to me its address
הוא יצר את המשחק והעלה אותו לאוויר אוטומטית בקישור הזה:
https://ynonp--734c4bca341c11f1b3c142b51c65c3df.web.val.run/
אבל זה רק פרונטאנד אז המשכתי לניסוי שני יותר רציני וביקשתי אפליקציית כרטיסיות שגם מתרגמת מילים מאנגלית לספרדית וחזרה וגם מאפשרת למשתמשים לשמור כרטיסיות ולתרגל אותן, זה הפרומפט:
Create a Spanish flashcards app on val.town using the MCP server:
1. user will sign in via val town https://docs.val.town/guides/auth/#sign-in-with-val-town
2. user can type a word in English or Spanish and get the translation in the opposite language (use openai to translate
https://docs.val.town/reference/std/openai/)
3. user can save cards (use their sqlite db to save https://docs.val.town/reference/std/sqlite/)
4. user can "practice" their saved words
אחרי כמה דקות קיבלתי את המערכת בקישור הזה:
https://ynonp--b97610c0341e11f1851b42b51c65c3df.web.val.run/
הפעם הקוד מחולק לקוד צד שרת וצד לקוח, קוד צד לקוח JavaScript נקי ללא פריימוורק, קוד צד שרת משתמש ב Hono, יוצר טבלה בבסיס הנתונים מנהל משתמשים ויודע לשמור ולהחזיר מילים שמורות לכל משתמש. בגלל שזה glm וקלוד קוד אז הקוד יוצא מאוד קריא ואפילו ידידותי למתחילים ואני חייב להודות שזה הפתיע אותי לטובה, הנה דוגמה מאוד קריאה לקוד שמחזיר את רשימת המילים של משתמש מסוים:
// Get all cards for user
app.get("/api/cards", async (c) => {
const session = await getOAuthUserData(c.req.raw);
if (!session?.user) {
return c.json({ error: "Not authenticated" }, 401);
}
const result = await sqlite.execute({
sql: "SELECT * FROM flashcards WHERE user_id = ? ORDER BY created_at DESC",
args: [session.user.id],
});
return c.json(result.rows);
});
עכשיו אתם יכולים להגיד שזה בסיסי מדי, שזה לא מתאים לפרודקשן, שבמערכת אמיתית למשתמש יכולות להיות המון מילים והחלק הקשה בחיים זה להבין איזה מילים לתרגל ומה להחזיר ומה פתאום מעמיסים על הזכרון של השרת את כל המילים בלי LIMIT. אבל אני חושב שבדיוק פה היופי בחיבור הזה - קוד פשוט, בסיסי, מתחיל מאפס, בלי boilerplate זה קוד שהרבה יותר קל לקרוא אותו וללמוד ממנו. הנה עוד דוגמה באותו נושא:
// Initialize database
await sqlite.execute(`
CREATE TABLE IF NOT EXISTS flashcards (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id TEXT NOT NULL,
english TEXT NOT NULL,
spanish TEXT NOT NULL,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
)
`);
ברור שחסרים אינדקסים וכמו שאומרים זה לא באג זה פיצ'ר. קוד פשוט, עובד וקריא שמצד אחד עלה לאוויר על מכונה של מישהו אחר ומצד שני מספיק פשוט כדי שאוכל ללמוד ממנו.
נ.ב. בהנחה שהפסקת האש תמשך ובאמת נכנס לשגרה אני מתכנן לחזור לשגרת הוובינרים של ימי חמישי בשבוע הבא. בחמישי הבא צפוי מפגש מאוד מעניין על איך לארגן את הפרויקט כדי שיהיה ל AI קל לעבוד עליו. אם הכל ימשיך טוב אשלח הזמנה מסודרת ביום ראשון עם כל הפרטים.