{"_id":"@1thang1k/odoo-mcp-server","_rev":"2-b9fadf058f72e61e94d9bdfdaeeabd24","name":"@1thang1k/odoo-mcp-server","dist-tags":{"latest":"1.2.0"},"versions":{"1.1.1":{"name":"@1thang1k/odoo-mcp-server","version":"1.1.1","keywords":["odoo","mcp","xml-rpc","claude","cursor"],"author":"","license":"MIT","_id":"@1thang1k/odoo-mcp-server@1.1.1","maintainers":[{"name":"1thang1k","email":"1thang1k@gmail.com"}],"bin":{"odoo-mcp-server":"dist/index.js"},"dist":{"shasum":"f57176d2224bd54944a166b4e1e45a5b7a372a23","tarball":"https://registry.npmjs.org/@1thang1k/odoo-mcp-server/-/odoo-mcp-server-1.1.1.tgz","fileCount":7,"integrity":"sha512-TW4ZZa/xXk/hKMhouZrYG75Vv366uRDcmfPXLH5h17YiLtVbC1vH2eKJ7xQYfEQjBdt39pe2xxnWynkf7WDcQQ==","signatures":[{"sig":"MEUCIGpO74dXT0K+TtzmtVGvNc3mZ1nc2O4UPRzwXlCFJefJAiEA9OZ4wL21F0iSCLWJK/QVsT/OFkGMiUR3nuhXlwZcMkE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":30582},"main":"dist/index.js","type":"module","gitHead":"e5b90b35a57fe04a82e821f9610579c77fa48c9b","scripts":{"dev":"tsx src/index.ts","build":"tsc -p tsconfig.json","start":"node dist/index.js","verify":"tsx src/verify.ts"},"_npmUser":{"name":"1thang1k","email":"1thang1k@gmail.com"},"repository":{"url":"","type":"git"},"_npmVersion":"11.11.0","description":"Standalone MCP server for any Odoo instance via XML-RPC","directories":{},"_nodeVersion":"25.8.1","dependencies":{"zod":"^3.23.8","dotenv":"^16.6.1","xmlrpc":"^1.3.2","@modelcontextprotocol/sdk":"^1.17.4"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.6","typescript":"^5.7.2","@types/node":"^22.10.2","@types/xmlrpc":"^1.3.10"},"_npmOperationalInternal":{"tmp":"tmp/odoo-mcp-server_1.1.1_1775896787850_0.5903455447267516","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@1thang1k/odoo-mcp-server","version":"1.2.0","type":"module","description":"Standalone MCP server for any Odoo instance via XML-RPC","main":"dist/index.js","bin":{"odoo-mcp-server":"dist/index.js"},"keywords":["odoo","mcp","xml-rpc","claude","cursor"],"author":"","license":"MIT","repository":{"type":"git","url":""},"scripts":{"build":"tsc -p tsconfig.json","start":"node dist/index.js","dev":"tsx src/index.ts","verify":"tsx src/verify.ts"},"dependencies":{"@modelcontextprotocol/sdk":"^1.17.4","dotenv":"^16.6.1","xmlrpc":"^1.3.2","zod":"^3.23.8"},"devDependencies":{"@types/node":"^22.10.2","@types/xmlrpc":"^1.3.10","tsx":"^4.20.6","typescript":"^5.7.2"},"gitHead":"e204566729f480b01eac4d5585292694402c8d6a","_id":"@1thang1k/odoo-mcp-server@1.2.0","_nodeVersion":"25.8.1","_npmVersion":"11.11.0","dist":{"integrity":"sha512-9gAUGq8kWq88aORSnHAOXvFYPWZdMnwmJnBYk0ihmU8LQeV390ATt+Kc/F12bsMtfeUgr2CACQMMp7xh/YHgCQ==","shasum":"ffd921185160bf7ecde3cd8dd0c66d101f600a85","tarball":"https://registry.npmjs.org/@1thang1k/odoo-mcp-server/-/odoo-mcp-server-1.2.0.tgz","fileCount":8,"unpackedSize":49746,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCA5dRgsE5vNuz6A5/jaTK74WNwXPwsfzxjrXmHmmrr2wIgPkNFANjicTiQ2bdnfO3Nex2rTZybBRi8nzP/7og0hs8="}]},"_npmUser":{"name":"1thang1k","email":"1thang1k@gmail.com"},"directories":{},"maintainers":[{"name":"1thang1k","email":"1thang1k@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/odoo-mcp-server_1.2.0_1775901095185_0.9622021852067653"},"_hasShrinkwrap":false}},"time":{"created":"2026-04-11T08:39:47.734Z","modified":"2026-04-11T09:51:35.459Z","1.1.1":"2026-04-11T08:39:47.980Z","1.2.0":"2026-04-11T09:51:35.345Z"},"license":"MIT","keywords":["odoo","mcp","xml-rpc","claude","cursor"],"repository":{"type":"git","url":""},"description":"Standalone MCP server for any Odoo instance via XML-RPC","maintainers":[{"name":"1thang1k","email":"1thang1k@gmail.com"}],"readme":"# Odoo MCP Server (Standalone)\n\nMCP server độc lập cho phép kết nối với **bất kỳ Odoo instance nào** qua XML-RPC.\n\n## Tính năng\n\n- **Multiple Odoo instances** - Kết nối động đến nhiều Odoo instances khác nhau\n- **Connection params per tool call** - Truyền thông tin kết nối (URL, DB, credentials) khi gọi tool\n- **Backward compatible** - Vẫn hỗ trợ cấu hình qua .env cho người dùng cũ\n- **Guardrails** - Validate input schema, timeout/retry, allowlist models\n\n## Tools\n\n| Tool | Mô tả |\n|------|-------|\n| `odoo_auth_test` | Kiểm tra kết nối và xác thực với connection params |\n| `odoo_search_read` | search_read với connection, domain, fields, limit, offset, order |\n| `odoo_read` | read bản ghi theo ids |\n| `odoo_create` | create bản ghi mới |\n| `odoo_write` | write (cập nhật) bản ghi |\n| `odoo_call_method` | Gọi method bất kỳ trên model |\n| `odoo_execute_kw_raw` | Low-level execute_kw (cần xác nhận rủi ro) |\n\n## Cách sử dụng\n\n### Mode 1: Truyền connection params khi gọi tool (Khuyến nghị)\n\nMỗi tool call sẽ truyền thông tin kết nối:\n\n```json\n{\n  \"odooUrl\": \"http://localhost:8069\",\n  \"db\": \"odoo19\",\n  \"username\": \"admin\",\n  \"password\": \"admin\"\n  // hoặc dùng \"apiKey\" thay cho \"password\"\n}\n```\n\n**Ví dụ gọi `odoo_search_read`:**\n\n```json\n{\n  \"connection\": {\n    \"odooUrl\": \"http://localhost:8069\",\n    \"db\": \"odoo19\",\n    \"username\": \"admin\",\n    \"password\": \"admin\",\n    \"allowedModels\": \"res.partner,project.task\",\n    \"timeoutMs\": 10000,\n    \"retryCount\": 1\n  },\n  \"model\": \"project.task\",\n  \"domain\": [[\"active\", \"=\", true]],\n  \"fields\": [\"id\", \"name\", \"stage_id\"],\n  \"limit\": 20,\n  \"order\": \"id desc\"\n}\n```\n\n### Mode 2: Cấu hình qua .env (Backward compatible)\n\n1) Copy file env mẫu:\n\n```bash\ncp .env.example .env\n```\n\n2) Điền các biến bắt buộc:\n\n```env\nODOO_URL=http://localhost:8069\nODOO_DB=odoo19\nODOO_USERNAME=admin\nODOO_PASSWORD=admin\n# Hoặc dùng API key:\n# ODOO_API_KEY=your_api_key\n\n# Optional: giới hạn model được phép thao tác\n# ODOO_ALLOWED_MODELS=res.partner,project.task,project.project\n\n# Optional guardrails\nODOO_RPC_TIMEOUT_MS=10000\nODOO_RPC_RETRY_COUNT=1\n```\n\n## Yêu cầu\n\n- Node.js 20+\n- Odoo instance hỗ trợ XML-RPC (`/xmlrpc/2/common`, `/xmlrpc/2/object`)\n\n## Cài đặt & Chạy\n\n```bash\n# Install dependencies\nnpm install\n\n# Build\nnpm run build\n\n# Start server\nnpm start\n\n# Dev mode (với hot reload)\nnpm run dev\n\n# Verify kết nối với .env config\nnpm run verify\n```\n\n## MCP Client Config\n\n### Cursor / Claude Desktop\n\n```json\n{\n  \"mcpServers\": {\n    \"odoo\": {\n      \"command\": \"node\",\n      \"args\": [\"/ABS_PATH/tools/odoo-mcp-server/dist/index.js\"],\n      \"env\": {}\n    }\n  }\n}\n```\n\n**Lưu ý:** Không cần truyền env credentials nữa - mỗi tool call sẽ truyền `connection` params.\n\n## Ví dụ gọi tools\n\n### 1. `odoo_auth_test` - Test kết nối\n\n```json\n{\n  \"odooUrl\": \"http://localhost:8069\",\n  \"db\": \"odoo19\",\n  \"username\": \"admin\",\n  \"password\": \"admin\"\n}\n```\n\nResponse:\n```json\n{\n  \"ok\": true,\n  \"message\": \"Kết nối thành công\",\n  \"connection\": {\n    \"odooUrl\": \"http://localhost:8069\",\n    \"db\": \"odoo19\",\n    \"username\": \"admin\"\n  },\n  \"uid\": 2\n}\n```\n\n### 2. `odoo_search_read`\n\n```json\n{\n  \"connection\": {\n    \"odooUrl\": \"http://localhost:8069\",\n    \"db\": \"odoo19\",\n    \"username\": \"admin\",\n    \"password\": \"admin\"\n  },\n  \"model\": \"project.task\",\n  \"domain\": [[\"active\", \"=\", true]],\n  \"fields\": [\"id\", \"name\", \"stage_id\"],\n  \"limit\": 20,\n  \"offset\": 0,\n  \"order\": \"id desc\"\n}\n```\n\n### 3. `odoo_read`\n\n```json\n{\n  \"connection\": {\n    \"odooUrl\": \"http://localhost:8069\",\n    \"db\": \"odoo19\",\n    \"username\": \"admin\",\n    \"password\": \"admin\"\n  },\n  \"model\": \"project.task\",\n  \"ids\": [1, 2, 3],\n  \"fields\": [\"id\", \"name\", \"user_ids\"]\n}\n```\n\n### 4. `odoo_create`\n\n```json\n{\n  \"connection\": {\n    \"odooUrl\": \"http://localhost:8069\",\n    \"db\": \"odoo19\",\n    \"username\": \"admin\",\n    \"password\": \"admin\"\n  },\n  \"model\": \"project.task\",\n  \"values\": {\n    \"name\": \"Task from MCP\"\n  }\n}\n```\n\n### 5. `odoo_write`\n\n```json\n{\n  \"connection\": {\n    \"odooUrl\": \"http://localhost:8069\",\n    \"db\": \"odoo19\",\n    \"username\": \"admin\",\n    \"password\": \"admin\"\n  },\n  \"model\": \"project.task\",\n  \"ids\": [10],\n  \"values\": {\n    \"name\": \"Renamed by MCP\"\n  }\n}\n```\n\n### 6. `odoo_call_method`\n\n```json\n{\n  \"connection\": {\n    \"odooUrl\": \"http://localhost:8069\",\n    \"db\": \"odoo19\",\n    \"username\": \"admin\",\n    \"password\": \"admin\"\n  },\n  \"model\": \"project.task\",\n  \"method\": \"action_archive\",\n  \"ids\": [10]\n}\n```\n\n### 7. `odoo_execute_kw_raw` (cẩn trọng)\n\n```json\n{\n  \"connection\": {\n    \"odooUrl\": \"http://localhost:8069\",\n    \"db\": \"odoo19\",\n    \"username\": \"admin\",\n    \"password\": \"admin\"\n  },\n  \"warning_acknowledged\": true,\n  \"model\": \"res.partner\",\n  \"method\": \"search_read\",\n  \"args\": [[[\"is_company\", \"=\", true]]],\n  \"kwargs\": {\n    \"fields\": [\"id\", \"name\"],\n    \"limit\": 5\n  }\n}\n```\n\n## Kết nối nhiều Odoo instances\n\nServer hỗ trợ kết nối đến bất kỳ Odoo instance nào. Chỉ cần truyền `connection` params khác nhau:\n\n```json\n// Instance 1: Odoo 19 local\n{\n  \"connection\": {\n    \"odooUrl\": \"http://localhost:8069\",\n    \"db\": \"odoo19\",\n    \"username\": \"admin\",\n    \"password\": \"admin\"\n  },\n  ...\n}\n\n// Instance 2: Odoo 17 production\n{\n  \"connection\": {\n    \"odooUrl\": \"https://odoo.company.com\",\n    \"db\": \"prod_db\",\n    \"username\": \"api_user\",\n    \"apiKey\": \"xxx_api_key_xxx\"\n  },\n  ...\n}\n\n// Instance 3: Odoo.sh\n{\n  \"connection\": {\n    \"odooUrl\": \"https://my-project.odoo.sh\",\n    \"db\": \"odoo\",\n    \"username\": \"admin\",\n    \"password\": \"admin\"\n  },\n  ...\n}\n```\n\n## Connection Params Schema\n\n```typescript\n{\n  odooUrl: string;              // URL Odoo instance (bắt buộc)\n  db: string;                   // Database name (bắt buộc)\n  username: string;             // Username/email (bắt buộc)\n  password?: string;            // Mật khẩu (1 trong 2: password hoặc apiKey)\n  apiKey?: string;              // API Key (1 trong 2: password hoặc apiKey)\n  allowedModels?: string;       // Comma-separated list (optional)\n  timeoutMs?: number;           // RPC timeout, default 10000\n  retryCount?: number;          // Retry count, default 1\n}\n```\n\n## Bảo mật\n\n- **Khuyến nghị dùng API Key** thay vì mật khẩu\n- **Bật `allowedModels`** để giới hạn models được phép thao tác\n- **`odoo_execute_kw_raw`** có thể thực thi thao tác mạnh; chỉ dùng khi cần\n- Secrets được mask trong logs\n\n## Guardrails\n\n- Validate input schema bằng `zod` cho từng tool\n- Timeout/retry configurable qua params\n- Allowlist model qua `allowedModels` (optional)\n- Mask secrets trong logs (password, apiKey, token...)\n\n## Kiến trúc\n\n```\n┌─────────────────┐\n│  MCP Client     │\n│  (Cursor/Claude)│\n└────────┬────────┘\n         │\n         │  Tool call với connection params\n         ▼\n┌─────────────────────────────────────────┐\n│  odoo-mcp-server (Standalone)           │\n│  - Nhận connection params từ client     │\n│  - Tạo OdooClient cho mỗi instance      │\n│  - Validate & Execute RPC               │\n└────────┬────────────────────────────────┘\n         │\n         │  XML-RPC\n         ▼\n┌─────────────────────────────────────────┐\n│  Odoo Instance (bất kỳ version nào)     │\n│  - Odoo 15, 16, 17, 18, 19...           │\n│  - Local, Production, Odoo.sh...        │\n└─────────────────────────────────────────┘\n```\n\n## Troubleshooting\n\n### Lỗi \"Authenticate thất bại\"\n- Kiểm tra lại username/password hoặc API key\n- Đảm bảo user có quyền access database\n\n### Lỗi \"RPC timeout\"\n- Tăng `timeoutMs` trong connection params\n- Kiểm tra kết nối mạng đến Odoo instance\n\n### Lỗi \"Model không nằm trong allowedModels\"\n- Thêm model vào `allowedModels` (comma-separated)\n- Hoặc bỏ qua params `allowedModels` để allow tất cả\n","readmeFilename":"README.md"}