GHL Multi-Account MCP Proxy
by goni-b
README.md
# GHL Multi-Account MCP Proxy
### חיבור כל חשבונות ה-JONSON לקלוד דרך MCP אחד
---
## מה זה עושה
במקום חיבור MCP נפרד לכל לקוח — שרת אחד שמנתב לפי שם הלקוח:
```
קלוד → [שרת זה] → JONSON של חופית וגוני
→ JONSON של Futures Finance
→ JONSON של לקוח 3
→ ...
```
קלוד קורא לכלי: `ghl_create_post(client="hofit_goni", ...)` — השרת יודע לאיזה JONSON לשלוח.
---
## 🎛️ עמוד ניהול הטוקנים (מקומי)
הדרך הקלה להזין ולנהל את הטוקנים — עמוד מעוצב שרץ על המחשב שלך:
```bash
npm install
npm start
```
פתחי בדפדפן: **http://localhost:3000**
בעמוד אפשר:
- ➕ **להוסיף לקוח** — שם, מפתח (key), Private Integration Token, ו-User ID
- ✏️ **לערוך** / 🗑️ **למחוק** לקוח קיים
- ✅ **"בדיקה"** — בודק מול JONSON שהטוקן תקין ומחזיר כמה חשבונות מחוברים
- 📋 **להעתיק** את כתובת ה-MCP לחיבור בקלוד
הטוקנים נשמרים בקובץ `clients.json` (מקומי בלבד — לא נכנס ל-Git). כל לקוח שמתווסף בעמוד נראה לקלוד **אוטומטית** (אין צורך לערוך קוד).
> 🔒 **סיסמת ניהול:** אם תגדירי `ADMIN_PASSWORD` ב-`.env`, העמוד וה-API ידרשו סיסמה.
> **מומלץ מאוד להגדיר לפני פריסה חיה** כדי שהעמוד לא יהיה פתוח לכולם.
> ☁️ **בפריסה חיה (Railway):** מערכת הקבצים של Railway זמנית — לכן לפריסה יציבה הזיני את
> הטוקנים כ-**Environment Variables** (`TOKEN_HOFIT_GONI` וכו'), והם ייטענו אוטומטית לצד `clients.json`.
---
## הגדרה ראשונית — 3 שלבים
### שלב 1: קבל Token + Location ID לכל לקוח
**Token (Private Integration):**
```
JONSON → Settings → Integrations → Private Integrations
→ Create New Integration
→ שם: "Claude MCP" → סמן את כל ההרשאות
→ העתק את ה-Token (pit-xxxx...)
```
**Location ID:**
```
פתח את הסאב-אקאונט של הלקוח ב-JONSON
→ ה-URL יראה: .../location/ABC123.../... ← ABC123 זה ה-Location ID
```
> ה-Token כבר משויך ל-Location, אז יחד הם מזהים את החשבון.
> (User ID נדרש רק לתזמון פוסטים — נטען אוטומטית, או נוסף ידנית בהגדרות מתקדמות.)
### שלב 2: פרוס ל-Railway (חינמי)
הפריסה דרך GitHub — Railway מושך את הקוד מהריפו ומריץ אוטומטית:
```
1. railway.com → Login with GitHub
2. New Project → Deploy from GitHub repo → goni-b/jonson-mcp-connector
3. Railway מזהה Node.js, מריץ npm install + npm start אוטומטית
```
**הגדר Environment Variables (לשונית Variables):**
```
ADMIN_PASSWORD = סיסמה-חזקה-לעמוד-הניהול ← מגן על עמוד הניהול
MCP_KEY = מחרוזת-אקראית-ארוכה-32-תווים ← מגן על חיבור ה-MCP (חובה!)
DATA_DIR = /data ← שומר clients.json על ה-Volume
```
> ⚠️ אל תגדיר `PORT` — Railway מזריק אותו לבד.
**הוסף Volume (כדי שהלקוחות יישמרו לצמיתות):**
```
Service → Settings → Volumes → New Volume
Mount path: /data
```
**צור כתובת ציבורית:**
```
Service → Settings → Networking → Generate Domain
לדוגמה: https://jonson-mcp-connector-production.up.railway.app
```
### שלב 3: הוסף לקוחות דרך עמוד הניהול
פתח בדפדפן את הכתובת מה-Railway (עמוד הניהול), הזן את `ADMIN_PASSWORD`,
והוסף כל לקוח עם המפתח, השם, ה-Token וה-Location ID. הכל נשמר ב-Volume ושורד פריסות.
### שלב 4: חבר עובדים ל-MCP
כל עובד מוסיף את ה-connector מה-Claude שלו. **חובה לכלול את מפתח הגישה:**
**ב-Claude Code (טרמינל):**
```bash
claude mcp add jonson --transport http https://[railway-url]/mcp \
--header "Authorization: Bearer <MCP_KEY>"
```
**ב-Claude Desktop** (`claude_desktop_config.json`):
```json
{
"mcpServers": {
"jonson": {
"type": "http",
"url": "https://[railway-url]/mcp",
"headers": { "Authorization": "Bearer <MCP_KEY>" }
}
}
}
```
> 🔑 תן את ה-`MCP_KEY` רק לעובדים שאתה רוצה שיהיו להם גישה. אם עובד עוזב —
> החלף את `MCP_KEY` ב-Railway ועדכן את הנותרים.
**זהו. חיבור אחד מאובטח לכל הלקוחות, לכל העובדים.**
---
## הוספת לקוח חדש
אין צורך לגעת בקוד! פשוט פתח את עמוד הניהול (הכתובת מה-Railway), הזן את הסיסמה,
ולחץ ➕ להוספת לקוח. הכלים בקלוד יתעדכנו **אוטומטית** עבור כל העובדים.
---
## כלים שקלוד מקבל
| כלי | תיאור |
|-----|-------|
| `ghl_list_clients` | רשימת כל הלקוחות המחוברים |
| `ghl_get_accounts` | חשבונות סושיאל של לקוח |
| `ghl_create_post` | תזמון Reel/Post/Story ללקוח |
| `ghl_get_posts` | פוסטים מתוזמנים של לקוח |
---
## דוגמת שימוש בקלוד
```
"תתזמן את הרילס של חופית וגוני ל-1 ביולי 19:00"
קלוד קורא:
1. ghl_get_accounts(client="hofit_goni") → מוצא accountId
2. ghl_create_post(
client="hofit_goni",
account_id="...",
type="reel",
summary="Caption...",
media_url="https://drive.google.com/...",
schedule_date="2026-07-01T19:00:00+03:00",
status="scheduled"
)
```
---
## בדיקה שהשרת עובד
```bash
# Health check
curl https://[railway-url]/
# MCP initialize (עם מפתח הגישה)
curl -X POST https://[railway-url]/mcp \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <MCP_KEY>" \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{}}'
# רשימת כלים
curl -X POST https://[railway-url]/mcp \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <MCP_KEY>" \
-d '{"jsonrpc":"2.0","id":2,"method":"tools/list","params":{}}'
```
---
## אבטחה
- **`MCP_KEY`** — מפתח גישה ל-`/mcp`. בלעדיו כל אחד באינטרנט עם הכתובת יקבל גישה
לכל לקוחות ה-GHL. **חובה להגדיר בפריסה חיה.** העובדים שולחים אותו ככותרת `Authorization: Bearer`.
- **`ADMIN_PASSWORD`** — מגן על עמוד הניהול וה-API שלו.
- הטוקנים של הלקוחות נשמרים ב-`clients.json` על ה-**Volume** (לא בקוד, לא ב-Git).
- אל תשמור `.env` או `clients.json` ב-Git — רק `.env.example`.
- אל תשתף את `MCP_KEY` או טוקנים בצ'אט. אם מפתח דלף — החלף אותו ב-Railway.
---
## מבנה הפרויקט
```
ghl-multi-proxy/
├── server.js ← השרת הראשי + API לעמוד הניהול
├── public/
│ └── index.html ← עמוד ניהול הטוקנים (מעוצב)
├── clients.json ← הטוקנים שנשמרו (מקומי / Volume — לא ל-Git!)
├── package.json
├── .env ← הגדרות מקומיות (PORT, ADMIN_PASSWORD, MCP_KEY) — לא ל-Git!
├── .env.example ← תבנית
├── .gitignore ← מוודא ש-.env ו-clients.json לא נשמרים ב-Git
└── README.md
```
This server cannot be deployed
Maintenance
ActivityMaintained
ResponsivenessSyncing