# Directus CMS Plugin Design - Phase J > **MCP Plugin برای مدیریت Directus Self-Hosted روی Coolify** **Version**: v1.0.0 (طراحی) **Priority**: High (جایگزین Phase J) **Estimated Tools**: 85-95 --- ## Overview پلاگین Directus برای مدیریت **Directus Self-Hosted** روی Coolify طراحی شده است. Directus یک Headless CMS متنباز و قدرتمند است که به صورت خودکار REST و GraphQL API برای هر دیتابیس SQL ایجاد میکند. ### مقایسه با سایر پلاگینها ``` ┌─────────────────────────────────────────────────────────────────┐ │ Directus vs Appwrite vs Supabase │ ├─────────────────────────────────────────────────────────────────┤ │ │ │ Directus: │ │ ├── SQL-based (PostgreSQL, MySQL, SQLite, etc.) │ │ ├── Auto-generated REST + GraphQL APIs │ │ ├── Built-in Admin UI (Data Studio) │ │ ├── Flows & Operations (automation) │ │ ├── Version control for content │ │ ├── Granular permissions & policies │ │ ├── Dashboards & Insights │ │ └── Multi-language content (Translations) │ │ │ │ Appwrite: │ │ ├── Document-based (NoSQL-like) │ │ ├── Built-in Messaging (Email, SMS, Push) │ │ ├── Functions with 11+ runtimes │ │ └── Teams management │ │ │ │ Supabase: │ │ ├── PostgreSQL only │ │ ├── Realtime subscriptions │ │ ├── Edge Functions (Deno) │ │ └── Row Level Security (RLS) │ │ │ │ همه: Self-Hosted، Open Source، Coolify-compatible │ │ │ └─────────────────────────────────────────────────────────────────┘ ``` ### ویژگیهای Self-Hosted Directus ``` ✅ موجود در Self-Hosted: ├── Items API (CRUD for any collection) ├── Collections API (schema management) ├── Fields API (column definitions) ├── Relations API (foreign keys) ├── Files API (asset management) ├── Users API (user management) ├── Roles & Permissions API ├── Flows & Operations API (automation) ├── Webhooks API ├── Dashboards & Panels API ├── Activity & Revisions API ├── Settings API ├── Schema API ├── Server Info API ├── GraphQL API (alternative to REST) └── Extensions API ❌ محدودیتها: ├── Cloud-specific features (not applicable) ├── Rate limiting بستگی به تنظیمات سرور دارد └── بعضی features نیاز به extensions دارند ``` --- ## Authentication ### روشهای احراز هویت ``` ┌─────────────────────────────────────────────────────────────────┐ │ Directus Self-Hosted Authentication │ ├─────────────────────────────────────────────────────────────────┤ │ │ │ Static Token (Recommended for Server-to-Server): │ │ ├── Set in directus_users.token column │ │ ├── Never expires │ │ ├── Pass via Authorization: Bearer {token} │ │ ├── Or via ?access_token={token} query param │ │ └── Best for MCP integration │ │ │ │ JWT (Temporary Token): │ │ ├── POST /auth/login with email/password │ │ ├── Returns access_token + refresh_token │ │ ├── access_token expires (default 15m) │ │ ├── refresh_token expires (default 7d) │ │ └── Use for user-facing applications │ │ │ │ Session (Cookie-based): │ │ ├── POST /auth/login?mode=session │ │ ├── Cookie-based authentication │ │ └── For browser-based applications │ │ │ └─────────────────────────────────────────────────────────────────┘ ``` ### Environment Variables ```bash # Directus Self-Hosted Instance (Required) DIRECTUS_SITE1_URL=https://directus.example.com DIRECTUS_SITE1_TOKEN=your-static-admin-token DIRECTUS_SITE1_ALIAS=mycms # Multiple Instances DIRECTUS_SITE2_URL=https://directus-staging.example.com DIRECTUS_SITE2_TOKEN=staging-static-token DIRECTUS_SITE2_ALIAS=staging ``` ### Static Token Setup ```sql -- Set static token for admin user in database UPDATE directus_users SET token = 'your-secure-static-token' WHERE email = 'admin@example.com'; ``` Or via Directus Admin UI: 1. Go to User Directory 2. Select user 3. Scroll to Token field 4. Generate or set token --- ## API Endpoints ### Base URL Structure ``` Self-Hosted: https://[DIRECTUS_HOST] Items (Dynamic Collections): GET/POST /items/{collection} GET/PATCH/DEL /items/{collection}/{id} Collections (Schema): GET/POST /collections GET/PATCH/DEL /collections/{collection} Fields: GET/POST /fields GET/POST /fields/{collection} GET/PATCH/DEL /fields/{collection}/{field} Relations: GET/POST /relations GET/PATCH/DEL /relations/{id} Files & Folders: GET/POST /files GET/PATCH/DEL /files/{id} GET/POST /folders GET/PATCH/DEL /folders/{id} Users: GET/POST /users GET/PATCH/DEL /users/{id} GET /users/me Roles: GET/POST /roles GET/PATCH/DEL /roles/{id} Permissions: GET/POST /permissions GET/PATCH/DEL /permissions/{id} GET /permissions/me Policies: GET/POST /policies GET/PATCH/DEL /policies/{id} Flows: GET/POST /flows GET/PATCH/DEL /flows/{id} POST /flows/trigger/{flow_uuid} Operations: GET/POST /operations GET/PATCH/DEL /operations/{id} Webhooks: GET/POST /webhooks GET/PATCH/DEL /webhooks/{id} Activity: GET /activity GET /activity/{id} POST /activity/comment Revisions: GET /revisions GET /revisions/{id} Versions: GET/POST /versions GET/PATCH/DEL /versions/{id} POST /versions/{id}/promote Dashboards: GET/POST /dashboards GET/PATCH/DEL /dashboards/{id} Panels: GET/POST /panels GET/PATCH/DEL /panels/{id} Settings: GET/PATCH /settings Server: GET /server/info GET /server/health GET /server/specs/oas GET /server/specs/graphql Schema: GET /schema/snapshot POST /schema/diff POST /schema/apply Presets: GET/POST /presets GET/PATCH/DEL /presets/{id} Shares: GET/POST /shares GET/PATCH/DEL /shares/{id} POST /shares/info Notifications: GET/POST /notifications GET/PATCH/DEL /notifications/{id} Translations: GET/POST /translations GET/PATCH/DEL /translations/{id} Comments: GET/POST /comments GET/PATCH/DEL /comments/{id} Extensions: GET /extensions ``` --- ## Architecture ### Project Structure ``` plugins/directus/ ├── __init__.py # Export: DirectusPlugin, DirectusClient ├── plugin.py # کلاس اصلی DirectusPlugin ├── client.py # DirectusClient (REST client) └── handlers/ ├── __init__.py ├── items.py # Items CRUD (12 tools) ├── collections.py # Collections & Fields (14 tools) ├── files.py # Files & Folders (12 tools) ├── users.py # Users management (10 tools) ├── access.py # Roles, Permissions, Policies (12 tools) ├── automation.py # Flows, Operations, Webhooks (12 tools) ├── content.py # Revisions, Versions, Comments (10 tools) ├── dashboards.py # Dashboards & Panels (8 tools) └── system.py # Settings, Server, Schema, Activity (10 tools) ``` ### Client Architecture ```python class DirectusClient: """ REST API Client for Directus Self-Hosted Uses static token authentication for server-to-server communication. """ def __init__( self, base_url: str, # e.g., https://directus.example.com token: str, # Static admin token ): self.base_url = base_url.rstrip('/') self.token = token def _get_headers(self, additional_headers: Optional[Dict] = None) -> Dict[str, str]: """Get request headers with authentication.""" headers = { "Content-Type": "application/json", "Authorization": f"Bearer {self.token}", } if additional_headers: headers.update(additional_headers) return headers async def request( self, method: str, endpoint: str, params: Optional[Dict] = None, json_data: Optional[Dict] = None, headers_override: Optional[Dict] = None ) -> Any: """Make authenticated request to Directus API""" url = f"{self.base_url}{endpoint}" headers = self._get_headers(headers_override) # ... request logic ``` --- ## Tool Categories ### 1. Items Handler (12 tools) عملیات CRUD روی هر collection | Tool | Method | Scope | Description | |------|--------|-------|-------------| | `list_items` | GET | read | لیست items با فیلتر و pagination | | `get_item` | GET | read | دریافت یک item | | `create_item` | POST | write | ایجاد item جدید | | `create_items` | POST | write | ایجاد چندین item | | `update_item` | PATCH | write | بهروزرسانی item | | `update_items` | PATCH | write | بهروزرسانی چندین item | | `delete_item` | DELETE | write | حذف item | | `delete_items` | DELETE | write | حذف چندین item | | `search_items` | GET | read | جستجوی full-text | | `aggregate_items` | GET | read | محاسبات aggregate | | `export_items` | GET | read | خروجی JSON/CSV | | `import_items` | POST | write | وارد کردن items | ```python # List Items Example { "name": "list_items", "method_name": "list_items", "description": "List items from any collection with filters, sorting, and pagination", "schema": { "type": "object", "properties": { "collection": { "type": "string", "description": "Collection name (e.g., 'posts', 'products')" }, "fields": { "type": "array", "items": {"type": "string"}, "description": "Fields to return (e.g., ['id', 'title', 'author.*'])" }, "filter": { "type": "object", "description": "Filter object (e.g., {\"status\": {\"_eq\": \"published\"}})" }, "sort": { "type": "array", "items": {"type": "string"}, "description": "Sort fields (e.g., ['-date_created', 'title'])" }, "limit": { "type": "integer", "description": "Maximum items to return", "default": 100 }, "offset": { "type": "integer", "description": "Items to skip", "default": 0 }, "search": { "type": "string", "description": "Full-text search query" }, "deep": { "type": "object", "description": "Deep filter for relational fields" } }, "required": ["collection"] }, "scope": "read" } ``` ### 2. Collections & Fields Handler (14 tools) مدیریت schema | Tool | Method | Scope | Description | |------|--------|-------|-------------| | `list_collections` | GET | read | لیست collections | | `get_collection` | GET | read | جزئیات collection | | `create_collection` | POST | admin | ایجاد collection | | `update_collection` | PATCH | admin | بهروزرسانی collection | | `delete_collection` | DELETE | admin | حذف collection | | `list_fields` | GET | read | لیست fields | | `get_field` | GET | read | جزئیات field | | `create_field` | POST | admin | ایجاد field | | `update_field` | PATCH | admin | بهروزرسانی field | | `delete_field` | DELETE | admin | حذف field | | `list_relations` | GET | read | لیست relations | | `get_relation` | GET | read | جزئیات relation | | `create_relation` | POST | admin | ایجاد relation | | `delete_relation` | DELETE | admin | حذف relation | ```python # Create Collection Example { "name": "create_collection", "method_name": "create_collection", "description": "Create a new collection (table) in Directus", "schema": { "type": "object", "properties": { "collection": { "type": "string", "description": "Collection name (table name)" }, "meta": { "type": "object", "properties": { "icon": {"type": "string", "description": "Material icon name"}, "note": {"type": "string", "description": "Description"}, "hidden": {"type": "boolean", "default": False}, "singleton": {"type": "boolean", "default": False}, "translations": {"type": "array"}, "sort_field": {"type": "string"}, "archive_field": {"type": "string"}, "archive_value": {"type": "string"}, "unarchive_value": {"type": "string"} } }, "schema": { "type": "object", "properties": { "name": {"type": "string"}, "comment": {"type": "string"} } }, "fields": { "type": "array", "description": "Initial fields to create with collection", "items": { "type": "object", "properties": { "field": {"type": "string"}, "type": {"type": "string"}, "meta": {"type": "object"}, "schema": {"type": "object"} } } } }, "required": ["collection"] }, "scope": "admin" } ``` ### 3. Files & Folders Handler (12 tools) مدیریت assets | Tool | Method | Scope | Description | |------|--------|-------|-------------| | `list_files` | GET | read | لیست فایلها | | `get_file` | GET | read | جزئیات فایل | | `upload_file` | POST | write | آپلود فایل | | `update_file` | PATCH | write | بهروزرسانی metadata | | `delete_file` | DELETE | write | حذف فایل | | `delete_files` | DELETE | write | حذف چندین فایل | | `list_folders` | GET | read | لیست پوشهها | | `get_folder` | GET | read | جزئیات پوشه | | `create_folder` | POST | write | ایجاد پوشه | | `update_folder` | PATCH | write | بهروزرسانی پوشه | | `delete_folder` | DELETE | write | حذف پوشه | | `import_file_url` | POST | write | وارد کردن از URL | ```python # Upload File Example { "name": "upload_file", "method_name": "upload_file", "description": "Upload a file to Directus storage", "schema": { "type": "object", "properties": { "file_content_base64": { "type": "string", "description": "File content as base64 encoded string" }, "filename_download": { "type": "string", "description": "Download filename" }, "title": { "type": "string", "description": "File title" }, "description": { "type": "string", "description": "File description" }, "folder": { "type": "string", "description": "Folder UUID to upload to" }, "storage": { "type": "string", "description": "Storage adapter (default: local)", "default": "local" }, "tags": { "type": "array", "items": {"type": "string"}, "description": "File tags" } }, "required": ["file_content_base64", "filename_download"] }, "scope": "write" } ``` ### 4. Users Handler (10 tools) مدیریت کاربران | Tool | Method | Scope | Description | |------|--------|-------|-------------| | `list_users` | GET | read | لیست کاربران | | `get_user` | GET | read | جزئیات کاربر | | `get_current_user` | GET | read | کاربر فعلی | | `create_user` | POST | admin | ایجاد کاربر | | `update_user` | PATCH | admin | بهروزرسانی کاربر | | `delete_user` | DELETE | admin | حذف کاربر | | `delete_users` | DELETE | admin | حذف چندین کاربر | | `invite_user` | POST | admin | دعوت کاربر | | `accept_invite` | POST | write | پذیرش دعوت | | `update_current_user` | PATCH | write | بهروزرسانی پروفایل | ```python # Create User Example { "name": "create_user", "method_name": "create_user", "description": "Create a new user in Directus", "schema": { "type": "object", "properties": { "email": { "type": "string", "format": "email", "description": "User email address" }, "password": { "type": "string", "minLength": 8, "description": "User password" }, "first_name": { "type": "string", "description": "First name" }, "last_name": { "type": "string", "description": "Last name" }, "role": { "type": "string", "description": "Role UUID" }, "status": { "type": "string", "enum": ["draft", "invited", "active", "suspended", "archived"], "default": "active" }, "language": { "type": "string", "description": "User language preference" }, "token": { "type": "string", "description": "Static API token" } }, "required": ["email", "password", "role"] }, "scope": "admin" } ``` ### 5. Access Control Handler (12 tools) Roles, Permissions, Policies | Tool | Method | Scope | Description | |------|--------|-------|-------------| | `list_roles` | GET | read | لیست roles | | `get_role` | GET | read | جزئیات role | | `create_role` | POST | admin | ایجاد role | | `update_role` | PATCH | admin | بهروزرسانی role | | `delete_role` | DELETE | admin | حذف role | | `list_permissions` | GET | read | لیست permissions | | `get_permission` | GET | read | جزئیات permission | | `create_permission` | POST | admin | ایجاد permission | | `update_permission` | PATCH | admin | بهروزرسانی permission | | `delete_permission` | DELETE | admin | حذف permission | | `list_policies` | GET | read | لیست policies | | `get_my_permissions` | GET | read | permissions کاربر فعلی | ```python # Create Permission Example { "name": "create_permission", "method_name": "create_permission", "description": "Create a new permission rule", "schema": { "type": "object", "properties": { "role": { "type": "string", "description": "Role UUID (null for public)" }, "collection": { "type": "string", "description": "Collection name" }, "action": { "type": "string", "enum": ["create", "read", "update", "delete", "share"], "description": "Permission action" }, "permissions": { "type": "object", "description": "Filter rules (JSON filter)" }, "validation": { "type": "object", "description": "Validation rules for create/update" }, "presets": { "type": "object", "description": "Default values for create" }, "fields": { "type": "array", "items": {"type": "string"}, "description": "Allowed fields (* for all)" } }, "required": ["collection", "action"] }, "scope": "admin" } ``` ### 6. Automation Handler (12 tools) Flows, Operations, Webhooks | Tool | Method | Scope | Description | |------|--------|-------|-------------| | `list_flows` | GET | read | لیست flows | | `get_flow` | GET | read | جزئیات flow | | `create_flow` | POST | admin | ایجاد flow | | `update_flow` | PATCH | admin | بهروزرسانی flow | | `delete_flow` | DELETE | admin | حذف flow | | `trigger_flow` | POST | write | اجرای manual flow | | `list_operations` | GET | read | لیست operations | | `create_operation` | POST | admin | ایجاد operation | | `list_webhooks` | GET | read | لیست webhooks | | `create_webhook` | POST | admin | ایجاد webhook | | `update_webhook` | PATCH | admin | بهروزرسانی webhook | | `delete_webhook` | DELETE | admin | حذف webhook | ```python # Create Flow Example { "name": "create_flow", "method_name": "create_flow", "description": "Create a new automation flow", "schema": { "type": "object", "properties": { "name": { "type": "string", "description": "Flow name" }, "icon": { "type": "string", "description": "Material icon" }, "status": { "type": "string", "enum": ["active", "inactive"], "default": "active" }, "trigger": { "type": "string", "enum": ["event", "schedule", "operation", "webhook", "manual"], "description": "Trigger type" }, "options": { "type": "object", "description": "Trigger-specific options" }, "accountability": { "type": "string", "enum": ["all", "activity", null], "description": "Accountability tracking" }, "description": { "type": "string", "description": "Flow description" } }, "required": ["name", "trigger"] }, "scope": "admin" } ``` ### 7. Content Management Handler (10 tools) Revisions, Versions, Comments | Tool | Method | Scope | Description | |------|--------|-------|-------------| | `list_revisions` | GET | read | لیست revisions | | `get_revision` | GET | read | جزئیات revision | | `list_versions` | GET | read | لیست content versions | | `get_version` | GET | read | جزئیات version | | `create_version` | POST | write | ایجاد version | | `update_version` | PATCH | write | بهروزرسانی version | | `delete_version` | DELETE | write | حذف version | | `promote_version` | POST | write | ترویج version به main | | `list_comments` | GET | read | لیست comments | | `create_comment` | POST | write | ایجاد comment | ```python # Create Version Example { "name": "create_version", "method_name": "create_version", "description": "Create a new content version (draft)", "schema": { "type": "object", "properties": { "name": { "type": "string", "description": "Version name" }, "collection": { "type": "string", "description": "Collection name" }, "item": { "type": "string", "description": "Item ID" }, "key": { "type": "string", "description": "Version key (unique identifier)" }, "delta": { "type": "object", "description": "Changes from main content" } }, "required": ["name", "collection", "item"] }, "scope": "write" } ``` ### 8. Dashboards Handler (8 tools) Dashboards & Panels | Tool | Method | Scope | Description | |------|--------|-------|-------------| | `list_dashboards` | GET | read | لیست dashboards | | `get_dashboard` | GET | read | جزئیات dashboard | | `create_dashboard` | POST | write | ایجاد dashboard | | `update_dashboard` | PATCH | write | بهروزرسانی dashboard | | `delete_dashboard` | DELETE | write | حذف dashboard | | `list_panels` | GET | read | لیست panels | | `create_panel` | POST | write | ایجاد panel | | `delete_panel` | DELETE | write | حذف panel | ```python # Create Dashboard Example { "name": "create_dashboard", "method_name": "create_dashboard", "description": "Create a new insights dashboard", "schema": { "type": "object", "properties": { "name": { "type": "string", "description": "Dashboard name" }, "icon": { "type": "string", "description": "Material icon", "default": "dashboard" }, "note": { "type": "string", "description": "Dashboard description" }, "color": { "type": "string", "description": "Accent color" } }, "required": ["name"] }, "scope": "write" } ``` ### 9. System Handler (10 tools) Settings, Server, Schema, Activity | Tool | Method | Scope | Description | |------|--------|-------|-------------| | `get_settings` | GET | read | تنظیمات سیستم | | `update_settings` | PATCH | admin | بهروزرسانی تنظیمات | | `get_server_info` | GET | read | اطلاعات سرور | | `health_check` | GET | read | بررسی سلامت | | `get_schema_snapshot` | GET | admin | export schema | | `apply_schema_diff` | POST | admin | apply schema changes | | `list_activity` | GET | read | لیست activity log | | `get_activity` | GET | read | جزئیات activity | | `list_notifications` | GET | read | لیست اعلانها | | `list_presets` | GET | read | لیست presets | ```python # Health Check Example { "name": "health_check", "method_name": "health_check", "description": "Check Directus server health status", "schema": { "type": "object", "properties": {} }, "scope": "read" } # Get Schema Snapshot Example { "name": "get_schema_snapshot", "method_name": "get_schema_snapshot", "description": "Get complete schema snapshot for migration/backup", "schema": { "type": "object", "properties": { "format": { "type": "string", "enum": ["json", "yaml"], "default": "json" } } }, "scope": "admin" } ``` --- ## Query System ### Filter Operators Directus از filter operators قدرتمندی استفاده میکند: ```javascript // Comparison {"field": {"_eq": "value"}} // Equal {"field": {"_neq": "value"}} // Not equal {"field": {"_lt": 10}} // Less than {"field": {"_lte": 10}} // Less than or equal {"field": {"_gt": 10}} // Greater than {"field": {"_gte": 10}} // Greater than or equal // String {"field": {"_contains": "text"}} // Contains {"field": {"_ncontains": "text"}} // Not contains {"field": {"_starts_with": "text"}} // Starts with {"field": {"_nstarts_with": "text"}} // Not starts with {"field": {"_ends_with": "text"}} // Ends with {"field": {"_nends_with": "text"}} // Not ends with // Array {"field": {"_in": ["a", "b"]}} // In array {"field": {"_nin": ["a", "b"]}} // Not in array // Null {"field": {"_null": true}} // Is null {"field": {"_nnull": true}} // Is not null // Empty {"field": {"_empty": true}} // Is empty {"field": {"_nempty": true}} // Is not empty // Between {"field": {"_between": [1, 10]}} // Between {"field": {"_nbetween": [1, 10]}} // Not between // Logical {"_and": [{...}, {...}]} // AND {"_or": [{...}, {...}]} // OR // Relational {"author": {"name": {"_eq": "John"}}} // Related field ``` ### Deep Parameter (Relational Queries) ```javascript // Filter related items { "deep": { "translations": { "_filter": { "languages_code": {"_eq": "en-US"} } } } } ``` --- ## Tool Summary | Handler | Tools | Description | |---------|-------|-------------| | Items | 12 | CRUD برای همه collections | | Collections & Fields | 14 | مدیریت schema | | Files & Folders | 12 | مدیریت assets | | Users | 10 | مدیریت کاربران | | Access Control | 12 | Roles, Permissions, Policies | | Automation | 12 | Flows, Operations, Webhooks | | Content | 10 | Revisions, Versions, Comments | | Dashboards | 8 | Dashboards & Panels | | System | 10 | Settings, Server, Schema, Activity | | **Total** | **100** | | --- ## Implementation Phases ### Phase J.1: Core (Items + Schema) - 26 tools **هدف**: دسترسی اولیه به Directus Self-Hosted 1. **DirectusPlugin** class 2. **DirectusClient** (REST client) 3. **Items Handler** (12 tools) 4. **Collections & Fields Handler** (14 tools) ### Phase J.2: Assets & Users - 22 tools **هدف**: مدیریت فایلها و کاربران 1. **Files & Folders Handler** (12 tools) 2. **Users Handler** (10 tools) **جمع**: 48 tools ### Phase J.3: Access & Automation - 24 tools **هدف**: امنیت و اتوماسیون 1. **Access Control Handler** (12 tools) 2. **Automation Handler** (12 tools) **جمع**: 72 tools ### Phase J.4: Advanced - 28 tools **هدف**: قابلیتهای پیشرفته 1. **Content Handler** (10 tools) 2. **Dashboards Handler** (8 tools) 3. **System Handler** (10 tools) **جمع**: 100 tools --- ## Error Handling ### HTTP Status Codes ```python async def handle_directus_error(response): """Handle Directus API errors""" data = await response.json() errors = data.get("errors", []) message = errors[0].get("message", "Unknown error") if errors else "Unknown error" if response.status == 400: raise ValidationError(f"Bad Request: {message}") elif response.status == 401: raise AuthError("Invalid token or missing authentication") elif response.status == 403: raise PermissionError(f"Permission denied: {message}") elif response.status == 404: raise NotFoundError(f"Resource not found: {message}") elif response.status == 409: raise ConflictError(f"Conflict: {message}") elif response.status == 503: raise ServiceUnavailableError("Service temporarily unavailable") elif response.status >= 500: raise ServerError(f"Server error: {message}") else: raise DirectusError(f"Error: {message}") ``` ### Common Error Codes ``` FORBIDDEN - دسترسی غیرمجاز INVALID_CREDENTIALS - اطلاعات ورود نادرست INVALID_TOKEN - توکن نامعتبر TOKEN_EXPIRED - توکن منقضی شده RECORD_NOT_UNIQUE - رکورد تکراری FAILED_VALIDATION - خطای validation ILLEGAL_ASSET_TRANSFORMATION - تبدیل فایل غیرمجاز CONTENT_TOO_LARGE - فایل بزرگتر از حد مجاز ``` --- ## Security Considerations ### Token Security ``` ┌─────────────────────────────────────────────────────────────────┐ │ Token Best Practices │ ├─────────────────────────────────────────────────────────────────┤ │ │ │ ✅ Best Practices: │ │ ├── Use static tokens for server-to-server (MCP) │ │ ├── Store tokens in environment variables │ │ ├── Create dedicated service user with minimal permissions │ │ ├── Rotate tokens periodically │ │ └── Use HTTPS always │ │ │ │ ⚠️ Scope Recommendations: │ │ ├── Read operations: read-only role │ │ ├── Write operations: content editor role │ │ └── Admin operations: admin role (careful monitoring) │ │ │ │ ❌ Never Do: │ │ ├── Log tokens (even partially) │ │ ├── Commit tokens to version control │ │ ├── Use admin token for public operations │ │ └── Share tokens across different services │ │ │ └─────────────────────────────────────────────────────────────────┘ ``` ### Permission System ```python # Create restricted role for MCP role = { "name": "MCP Service", "icon": "smart_toy", "description": "Service role for MCP integration", "admin_access": False, "app_access": False } # Permission examples permissions = [ # Read all posts {"collection": "posts", "action": "read", "fields": ["*"]}, # Create/update own posts only {"collection": "posts", "action": "create", "fields": ["*"]}, {"collection": "posts", "action": "update", "permissions": {"user_created": {"_eq": "$CURRENT_USER"}}}, # Read published only {"collection": "articles", "action": "read", "permissions": {"status": {"_eq": "published"}}} ] ``` --- ## Example Usage ### Query Items with Filters ```json { "tool": "list_items", "args": { "site": "mycms", "collection": "posts", "fields": ["id", "title", "date_created", "author.email"], "filter": { "_and": [ {"status": {"_eq": "published"}}, {"date_created": {"_gte": "$NOW(-30 days)"}} ] }, "sort": ["-date_created"], "limit": 20 } } ``` ### Create Item ```json { "tool": "create_item", "args": { "site": "mycms", "collection": "posts", "data": { "title": "New Blog Post", "content": "
Hello World!
", "status": "draft", "tags": ["news", "featured"], "author": "user-uuid-here" } } } ``` ### Upload File ```json { "tool": "upload_file", "args": { "site": "mycms", "file_content_base64": "iVBORw0KGgoAAAANSUhEUgAA...", "filename_download": "cover-image.png", "title": "Blog Cover Image", "folder": "folder-uuid-here", "tags": ["blog", "cover"] } } ``` ### Create Automation Flow ```json { "tool": "create_flow", "args": { "site": "mycms", "name": "Send Welcome Email", "trigger": "event", "options": { "type": "action", "scope": ["items.create"], "collections": ["users"] }, "status": "active" } } ``` ### Trigger Manual Flow ```json { "tool": "trigger_flow", "args": { "site": "mycms", "flow_uuid": "flow-uuid-here", "data": { "email": "user@example.com", "template": "welcome" } } } ``` --- ## Coolify Deployment Notes ### Finding Directus Credentials در Coolify، بعد از deploy کردن Directus: 1. **URL**: از Coolify dashboard → Project → Directus → Domain - معمولاً: `https://directus.yourdomain.com` 2. **Admin Email/Password**: - در Environment Variables: - `ADMIN_EMAIL` - `ADMIN_PASSWORD` 3. **Static Token**: - Login به Directus Admin - Settings → User Directory → Admin User - Token field → Generate ### Docker Compose Environment ```yaml # Key Directus environment variables services: directus: environment: # Database DB_CLIENT: 'pg' # or mysql, sqlite, etc. DB_HOST: 'database' DB_PORT: '5432' DB_DATABASE: 'directus' DB_USER: 'directus' DB_PASSWORD: 'secure-password' # Auth SECRET: 'your-random-secret-key' ADMIN_EMAIL: 'admin@example.com' ADMIN_PASSWORD: 'secure-admin-password' # URLs PUBLIC_URL: 'https://directus.example.com' # Token settings ACCESS_TOKEN_TTL: '15m' REFRESH_TOKEN_TTL: '7d' # CORS CORS_ENABLED: 'true' CORS_ORIGIN: 'true' ``` ### Database Support ``` Directus supports: ├── PostgreSQL (recommended) ├── MySQL / MariaDB ├── SQLite (development only) ├── MS SQL Server ├── OracleDB └── CockroachDB ``` --- ## Endpoint Registration ### Endpoint Config ```python # core/endpoints/config.py EndpointType.DIRECTUS: EndpointConfig( path="/directus", name="Directus CMS", description="Directus Self-Hosted CMS management (items, collections, files, users, flows)", endpoint_type=EndpointType.DIRECTUS, plugin_types=["directus"], require_master_key=False, allowed_scopes={"read", "write", "admin"}, tool_blacklist={ "manage_api_keys_create", "manage_api_keys_delete", "manage_api_keys_rotate", "oauth_register_client", "oauth_revoke_client", }, max_tools=110, ), ``` --- ## Comparison: Directus vs Appwrite Tools | Feature | Directus | Appwrite | |---------|----------|----------| | Items/Documents Tools | 12 | 12 | | Schema Tools | 14 | 18 | | Files/Storage Tools | 12 | 14 | | Users Tools | 10 | 12 | | Access Control Tools | 12 | 10 (Teams) | | Automation Tools | 12 | 14 (Functions) | | Content Versioning | 10 | 0 | | Dashboards Tools | 8 | 0 | | System Tools | 10 | 8 | | Messaging Tools | 0 | 12 | | **Total** | **100** | **100** | **تفاوتهای کلیدی:** - Directus: Content versioning و Dashboards دارد - Appwrite: Built-in Messaging و Functions runtime دارد - Directus: SQL-based (flexible) - Appwrite: Document-based (NoSQL-like) --- ## Testing Checklist ### Unit Tests - [ ] DirectusClient authentication - [ ] Items CRUD operations - [ ] Filter operators - [ ] Relational queries (deep) - [ ] File upload/download - [ ] User management - [ ] Permission enforcement - [ ] Flow triggering - [ ] Error handling ### Integration Tests - [ ] Create collection with fields - [ ] CRUD items with relations - [ ] Upload and retrieve files - [ ] Create user with role - [ ] Set permissions and verify access - [ ] Create and trigger flow - [ ] Create content version and promote - [ ] Schema snapshot and restore - [ ] Health check --- ## Field Types Reference ### Supported Field Types | Type | Description | Interface | |------|-------------|-----------| | `string` | Single line text | Input | | `text` | Multi-line text | Textarea | | `integer` | Whole number | Input Numeric | | `bigInteger` | Large whole number | Input | | `float` | Decimal number | Input | | `decimal` | Precise decimal | Input | | `boolean` | True/False | Toggle | | `json` | JSON object | Code (JSON) | | `csv` | Comma-separated | Tags | | `uuid` | UUID | Input | | `hash` | Hashed value | Input Hash | | `date` | Date only | DateTime | | `time` | Time only | DateTime | | `dateTime` | Date and time | DateTime | | `timestamp` | Unix timestamp | DateTime | | `geometry` | GeoJSON | Map | | `alias` | Virtual field | Multiple | ### Special Field Types | Type | Description | |------|-------------| | `file` | Foreign key to files | | `files` | Many-to-many files | | `m2o` | Many-to-one relation | | `o2m` | One-to-many relation | | `m2m` | Many-to-many relation | | `m2a` | Many-to-any relation | | `translations` | Translation links | | `presentation` | UI-only (divider, notice) | | `group` | Field group | --- ## References - [Directus Documentation](https://docs.directus.io/) - [Directus REST API Reference](https://docs.directus.io/reference/introduction) - [Directus Self-Hosting Guide](https://docs.directus.io/self-hosted/quickstart) - [Directus SDK](https://docs.directus.io/guides/sdk/getting-started) - [Directus GitHub Repository](https://github.com/directus/directus) - [Directus Flows & Operations](https://docs.directus.io/configuration/flows) - [Directus Permissions](https://docs.directus.io/configuration/users-roles-permissions) --- **Sources:** - [Directus Docs](https://docs.directus.io/) - [Directus API Reference](https://directus.io/docs/api) - [Directus Authentication](https://directus.io/docs/api/authentication) - [Directus Token Authentication Guide](https://www.restack.io/docs/directus-knowledge-directus-token-authentication) --- **Created**: 2025-12-03 **Author**: Claude AI Assistant **Status**: Design Phase (Ready for Implementation)