[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6CV46ST35TDKC3163ZSF08J":3,"skill-same:01M6CV46ST35TDKC3163ZSF08J":109},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":28,"publishedAt":48,"linkOnly":49,"markdownContent":50,"markdownBody":51,"frontMatter":52,"refName":53,"commitSha":54,"skillDirectory":55,"forksCount":56,"repositoryHtmlUrl":57,"repositoryHomepageUrl":57,"ownerHtmlUrl":58,"ownerBlogUrl":6,"ownerDescription":59,"updatedAt":60,"install":61,"resources":74},"01M6CV46ST35TDKC3163ZSF08J","odoo-rpc-api",null,"Expert on Odoo's external JSON-RPC and XML-RPC APIs. Covers authentication, model calls, record CRUD, and real-world integration examples in Python, JavaScript, and curl.","Sam-06060\u002Fjarvis-assistant","Sam-06060","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F208600848?v=4","01M6CRKT7C7FXD21V6HXF293S0","Samson Frank Ganta","01M6CRKTBEKYFD8YX5Z1GT99EE",6,"Apache-2.0","https:\u002F\u002Fgithub.com\u002FSam-06060\u002Fjarvis-assistant\u002Fblob\u002Fmain\u002Fmodules\u002Fagent_skills\u002Fawesome-skills\u002Fplaybooks\u002Fodoo-rpc-api\u002FSKILL.md",[18,23],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000010","后端与接口","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":26,"taxonomyTypeDesc":27},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47],"odoo rpc api","rpc","odoo","api","json","self","record","world","expert","curl","model","crud","safe","integration","examples","xml","authentication","javascript","python","2026-11-10 10:12:30",false,"---\nname: odoo-rpc-api\ndescription: \"Expert on Odoo's external JSON-RPC and XML-RPC APIs. Covers authentication, model calls, record CRUD, and real-world integration examples in Python, JavaScript, and curl.\"\nrisk: safe\nsource: \"self\"\n---\n\n# Odoo RPC API\n\n## Overview\n\nOdoo exposes a powerful external API via JSON-RPC and XML-RPC, allowing any external application to read, create, update, and delete records. This skill guides you through authenticating, calling models, and building robust integrations.\n\n## When to Use This Skill\n\n- Connecting an external app (e.g., Django, Node.js, a mobile app) to Odoo.\n- Running automated scripts to import\u002Fexport data from Odoo.\n- Building a middleware layer between Odoo and a third-party platform.\n- Debugging API authentication or permission errors.\n\n## How It Works\n\n1. **Activate**: Mention `@odoo-rpc-api` and describe the integration you need.\n2. **Generate**: Get copy-paste ready RPC call code in Python, JavaScript, or curl.\n3. **Debug**: Paste an error and get a diagnosis with a corrected call.\n\n## Examples\n\n### Example 1: Authenticate and Read Records (Python)\n\n```python\nimport xmlrpc.client\n\nurl = 'https:\u002F\u002Fmyodoo.example.com'\ndb = 'my_database'\nusername = 'admin'\npassword = 'my_api_key'  # Use API keys, not passwords, in production\n\n# Step 1: Authenticate\ncommon = xmlrpc.client.ServerProxy(f'{url}\u002Fxmlrpc\u002F2\u002Fcommon')\nuid = common.authenticate(db, username, password, {})\nprint(f\"Authenticated as UID: {uid}\")\n\n# Step 2: Call models\nmodels = xmlrpc.client.ServerProxy(f'{url}\u002Fxmlrpc\u002F2\u002Fobject')\n\n# Search confirmed sale orders\norders = models.execute_kw(db, uid, password,\n    'sale.order', 'search_read',\n    [[['state', '=', 'sale']]],\n    {'fields': ['name', 'partner_id', 'amount_total'], 'limit': 10}\n)\nfor order in orders:\n    print(order)\n```\n\n### Example 2: Create a Record (Python)\n\n```python\nnew_partner_id = models.execute_kw(db, uid, password,\n    'res.partner', 'create',\n    [{'name': 'Acme Corp', 'email': 'info@acme.com', 'is_company': True}]\n)\nprint(f\"Created partner ID: {new_partner_id}\")\n```\n\n### Example 3: JSON-RPC via curl\n\n```bash\ncurl -X POST https:\u002F\u002Fmyodoo.example.com\u002Fweb\u002Fdataset\u002Fcall_kw \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"jsonrpc\": \"2.0\",\n    \"method\": \"call\",\n    \"id\": 1,\n    \"params\": {\n      \"model\": \"res.partner\",\n      \"method\": \"search_read\",\n      \"args\": [[[\"is_company\", \"=\", true]]],\n      \"kwargs\": {\"fields\": [\"name\", \"email\"], \"limit\": 5}\n    }\n  }'\n# Note: \"id\" is required by the JSON-RPC 2.0 spec to correlate responses.\n# Odoo 16+ also supports the \u002Fweb\u002Fdataset\u002Fcall_kw endpoint but\n# prefer \u002Fweb\u002Fdataset\u002Fcall_kw for model method calls.\n```\n\n## Best Practices\n\n- ✅ **Do:** Use **API Keys** (Settings → Technical → API Keys) instead of passwords — available from Odoo 14+.\n- ✅ **Do:** Use `search_read` instead of `search` + `read` to reduce network round trips.\n- ✅ **Do:** Always handle connection errors and implement retry logic with exponential backoff in production.\n- ✅ **Do:** Store credentials in environment variables or a secrets manager (e.g., AWS Secrets Manager, `.env` file).\n- ❌ **Don't:** Hardcode passwords or API keys directly in scripts — rotate them and use env vars.\n- ❌ **Don't:** Call the API in a tight loop without batching — bulk operations reduce server load significantly.\n- ❌ **Don't:** Use the master admin password for API integrations — create a dedicated integration user with minimum required permissions.\n\n## Limitations\n\n- Does not cover **OAuth2 or session-cookie-based authentication** — the examples use API key (token) auth only.\n- **Rate limiting** is not built into the Odoo XMLRPC layer; you must implement throttling client-side.\n- The XML-RPC endpoint (`\u002Fxmlrpc\u002F2\u002F`) does not support file uploads — use the REST-based `ir.attachment` model via JSON-RPC for binary data.\n- Odoo.sh (SaaS) may block some API calls depending on plan; verify your subscription supports external API access.\n","# Odoo RPC API\n\n## Overview\n\nOdoo exposes a powerful external API via JSON-RPC and XML-RPC, allowing any external application to read, create, update, and delete records. This skill guides you through authenticating, calling models, and building robust integrations.\n\n## When to Use This Skill\n\n- Connecting an external app (e.g., Django, Node.js, a mobile app) to Odoo.\n- Running automated scripts to import\u002Fexport data from Odoo.\n- Building a middleware layer between Odoo and a third-party platform.\n- Debugging API authentication or permission errors.\n\n## How It Works\n\n1. **Activate**: Mention `@odoo-rpc-api` and describe the integration you need.\n2. **Generate**: Get copy-paste ready RPC call code in Python, JavaScript, or curl.\n3. **Debug**: Paste an error and get a diagnosis with a corrected call.\n\n## Examples\n\n### Example 1: Authenticate and Read Records (Python)\n\n```python\nimport xmlrpc.client\n\nurl = 'https:\u002F\u002Fmyodoo.example.com'\ndb = 'my_database'\nusername = 'admin'\npassword = 'my_api_key'  # Use API keys, not passwords, in production\n\n# Step 1: Authenticate\ncommon = xmlrpc.client.ServerProxy(f'{url}\u002Fxmlrpc\u002F2\u002Fcommon')\nuid = common.authenticate(db, username, password, {})\nprint(f\"Authenticated as UID: {uid}\")\n\n# Step 2: Call models\nmodels = xmlrpc.client.ServerProxy(f'{url}\u002Fxmlrpc\u002F2\u002Fobject')\n\n# Search confirmed sale orders\norders = models.execute_kw(db, uid, password,\n    'sale.order', 'search_read',\n    [[['state', '=', 'sale']]],\n    {'fields': ['name', 'partner_id', 'amount_total'], 'limit': 10}\n)\nfor order in orders:\n    print(order)\n```\n\n### Example 2: Create a Record (Python)\n\n```python\nnew_partner_id = models.execute_kw(db, uid, password,\n    'res.partner', 'create',\n    [{'name': 'Acme Corp', 'email': 'info@acme.com', 'is_company': True}]\n)\nprint(f\"Created partner ID: {new_partner_id}\")\n```\n\n### Example 3: JSON-RPC via curl\n\n```bash\ncurl -X POST https:\u002F\u002Fmyodoo.example.com\u002Fweb\u002Fdataset\u002Fcall_kw \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"jsonrpc\": \"2.0\",\n    \"method\": \"call\",\n    \"id\": 1,\n    \"params\": {\n      \"model\": \"res.partner\",\n      \"method\": \"search_read\",\n      \"args\": [[[\"is_company\", \"=\", true]]],\n      \"kwargs\": {\"fields\": [\"name\", \"email\"], \"limit\": 5}\n    }\n  }'\n# Note: \"id\" is required by the JSON-RPC 2.0 spec to correlate responses.\n# Odoo 16+ also supports the \u002Fweb\u002Fdataset\u002Fcall_kw endpoint but\n# prefer \u002Fweb\u002Fdataset\u002Fcall_kw for model method calls.\n```\n\n## Best Practices\n\n- ✅ **Do:** Use **API Keys** (Settings → Technical → API Keys) instead of passwords — available from Odoo 14+.\n- ✅ **Do:** Use `search_read` instead of `search` + `read` to reduce network round trips.\n- ✅ **Do:** Always handle connection errors and implement retry logic with exponential backoff in production.\n- ✅ **Do:** Store credentials in environment variables or a secrets manager (e.g., AWS Secrets Manager, `.env` file).\n- ❌ **Don't:** Hardcode passwords or API keys directly in scripts — rotate them and use env vars.\n- ❌ **Don't:** Call the API in a tight loop without batching — bulk operations reduce server load significantly.\n- ❌ **Don't:** Use the master admin password for API integrations — create a dedicated integration user with minimum required permissions.\n\n## Limitations\n\n- Does not cover **OAuth2 or session-cookie-based authentication** — the examples use API key (token) auth only.\n- **Rate limiting** is not built into the Odoo XMLRPC layer; you must implement throttling client-side.\n- The XML-RPC endpoint (`\u002Fxmlrpc\u002F2\u002F`) does not support file uploads — use the REST-based `ir.attachment` model via JSON-RPC for binary data.\n- Odoo.sh (SaaS) may block some API calls depending on plan; verify your subscription supports external API access.\n",{"name":5,"risk":41,"source":34,"description":7},"main","a50a3aa6b39fb0e1b7db88bef1bfc9c93606e126","modules\u002Fagent_skills\u002Fawesome-skills\u002Fplaybooks\u002Fodoo-rpc-api",0,"https:\u002F\u002Fgithub.com\u002FSam-06060\u002Fjarvis-assistant","https:\u002F\u002Fgithub.com\u002FSam-06060","Mobile Application Developer | Kotlin | Flutter, KMP, Swfit, Android,Swift UI | Building at Saar It Resources | Creator of Jarvis (AI Assistant)","2026-06-23 05:13:38",{"source":8,"skillName":5,"commands":62,"prompt":72,"zipAvailable":73},[63,66,69],{"tool":64,"command":65},"npx","npx skills add Sam-06060\u002Fjarvis-assistant --skill odoo-rpc-api",{"tool":67,"command":68},"bunx","bunx skills add Sam-06060\u002Fjarvis-assistant --skill odoo-rpc-api",{"tool":70,"command":71},"pnpm","pnpm dlx skills add Sam-06060\u002Fjarvis-assistant --skill odoo-rpc-api","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FSam-06060\u002Fjarvis-assistant\u002Fblob\u002Fmain\u002Fmodules\u002Fagent_skills\u002Fawesome-skills\u002Fplaybooks\u002Fodoo-rpc-api\u002FSKILL.md",true,[75,81,85,89,93,97,101,105],{"path":76,"resourceType":77,"resourceTypeDesc":78,"sizeBytes":79,"sourceHtmlUrl":80},"references\u002Falgorithms.md","REFERENCE","参考文档",14456,"https:\u002F\u002Fgithub.com\u002FMishit18\u002Fclaude-code-templates\u002Fblob\u002Fmain\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fscientific\u002Fqiskit\u002Freferences\u002Falgorithms.md",{"path":82,"resourceType":77,"resourceTypeDesc":78,"sizeBytes":83,"sourceHtmlUrl":84},"references\u002Fbackends.md",9552,"https:\u002F\u002Fgithub.com\u002FMishit18\u002Fclaude-code-templates\u002Fblob\u002Fmain\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fscientific\u002Fqiskit\u002Freferences\u002Fbackends.md",{"path":86,"resourceType":77,"resourceTypeDesc":78,"sizeBytes":87,"sourceHtmlUrl":88},"references\u002Fcircuits.md",3452,"https:\u002F\u002Fgithub.com\u002FMishit18\u002Fclaude-code-templates\u002Fblob\u002Fmain\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fscientific\u002Fqiskit\u002Freferences\u002Fcircuits.md",{"path":90,"resourceType":77,"resourceTypeDesc":78,"sizeBytes":91,"sourceHtmlUrl":92},"references\u002Fpatterns.md",13530,"https:\u002F\u002Fgithub.com\u002FMishit18\u002Fclaude-code-templates\u002Fblob\u002Fmain\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fscientific\u002Fqiskit\u002Freferences\u002Fpatterns.md",{"path":94,"resourceType":77,"resourceTypeDesc":78,"sizeBytes":95,"sourceHtmlUrl":96},"references\u002Fprimitives.md",6056,"https:\u002F\u002Fgithub.com\u002FMishit18\u002Fclaude-code-templates\u002Fblob\u002Fmain\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fscientific\u002Fqiskit\u002Freferences\u002Fprimitives.md",{"path":98,"resourceType":77,"resourceTypeDesc":78,"sizeBytes":99,"sourceHtmlUrl":100},"references\u002Fsetup.md",2042,"https:\u002F\u002Fgithub.com\u002FMishit18\u002Fclaude-code-templates\u002Fblob\u002Fmain\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fscientific\u002Fqiskit\u002Freferences\u002Fsetup.md",{"path":102,"resourceType":77,"resourceTypeDesc":78,"sizeBytes":103,"sourceHtmlUrl":104},"references\u002Ftranspilation.md",7373,"https:\u002F\u002Fgithub.com\u002FMishit18\u002Fclaude-code-templates\u002Fblob\u002Fmain\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fscientific\u002Fqiskit\u002Freferences\u002Ftranspilation.md",{"path":106,"resourceType":77,"resourceTypeDesc":78,"sizeBytes":107,"sourceHtmlUrl":108},"references\u002Fvisualization.md",7894,"https:\u002F\u002Fgithub.com\u002FMishit18\u002Fclaude-code-templates\u002Fblob\u002Fmain\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fscientific\u002Fqiskit\u002Freferences\u002Fvisualization.md",[110,121,138,165,184,209],{"skillNo":111,"name":112,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":113,"categories":114,"keywords":118,"publishedAt":48},"01M6GDRVS6FXX3ESH0C9DW01C0","test_skill","https:\u002F\u002Fgithub.com\u002FSam-06060\u002Fjarvis-assistant\u002Fblob\u002Fmain\u002Fscratch\u002Ftest_skill\u002FSKILL.md",[115],{"categoryNo":116,"categoryName":117,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000008","测试与质量",[119,120],"Test Skill","test",{"skillNo":122,"name":123,"nameZh":6,"description":124,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":125,"categories":126,"keywords":127,"publishedAt":48},"01M6GDRQ40HX22MA6XWC31RHHK","zustand-store-ts","Create Zustand stores following established patterns with proper TypeScript types and middleware.","https:\u002F\u002Fgithub.com\u002FSam-06060\u002Fjarvis-assistant\u002Fblob\u002Fmain\u002Fmodules\u002Fagent_skills\u002Fawesome-skills\u002Fplaybooks\u002Fzustand-store-ts\u002FSKILL.md",[],[128,129,130,131,132,133,134,135,136,137],"zustand store ts","zustand","store","with","types","middleware","patterns","community","create","typescript",{"skillNo":139,"name":140,"nameZh":6,"description":141,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":142,"categories":143,"keywords":147,"publishedAt":48},"01M6GDRKEA0WE670SPFWX5GKCN","zoom-automation","Automate Zoom meeting creation, management, recordings, webinars, and participant tracking via Rube MCP (Composio). Always search tools first for current schemas.","https:\u002F\u002Fgithub.com\u002FSam-06060\u002Fjarvis-assistant\u002Fblob\u002Fmain\u002Fmodules\u002Fagent_skills\u002Fawesome-skills\u002Fplaybooks\u002Fzoom-automation\u002FSKILL.md",[144],{"categoryNo":145,"categoryName":146,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",[148,149,150,151,152,153,154,155,156,157,158,159,160,161,135,162,163,164],"automation","zoom automation","zoom","first","Tools","search","MCP","via","meeting","automate","critical","creation","webinars","composio","recordings","management","tracking",{"skillNo":166,"name":167,"nameZh":6,"description":168,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":169,"categories":170,"keywords":172,"publishedAt":48},"01M6GDRFS1452PC71JQ38S24HR","zoho-crm-automation","Automate Zoho CRM tasks via Rube MCP (Composio): create\u002Fupdate records, search contacts, manage leads, and convert leads. Always search tools first for current schemas.","https:\u002F\u002Fgithub.com\u002FSam-06060\u002Fjarvis-assistant\u002Fblob\u002Fmain\u002Fmodules\u002Fagent_skills\u002Fawesome-skills\u002Fplaybooks\u002Fzoho-crm-automation\u002FSKILL.md",[171],{"categoryNo":145,"categoryName":146,"taxonomyType":21,"taxonomyTypeDesc":22},[173,148,174,175,176,177,178,135,153,179,161,180,158,157,152,181,136,182,154,183],"crm automation","zoho crm","crm","zoho crm automation","zoho","leads","contacts","records","update","tasks","manage",{"skillNo":185,"name":186,"nameZh":6,"description":187,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":188,"categories":189,"keywords":193,"publishedAt":48},"01M6GDRCKQBAVTGHX5XBH26KPZ","zod-validation-expert","Expert in Zod — TypeScript-first schema validation. Covers parsing, custom errors, refinements, type inference, and integration with React Hook Form, Next.js, and tRPC.","https:\u002F\u002Fgithub.com\u002FSam-06060\u002Fjarvis-assistant\u002Fblob\u002Fmain\u002Fmodules\u002Fagent_skills\u002Fawesome-skills\u002Fplaybooks\u002Fzod-validation-expert\u002FSKILL.md",[190],{"categoryNo":191,"categoryName":192,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000009","前端开发",[37,194,195,196,197,137,41,198,199,200,201,202,131,203,204,205,206,135,207,208],"zod","zod validation expert","validation","react","parsing","errors","schema validation","react hook form","hook","trpc","form","type","next","schema","Next.js",{"skillNo":210,"name":211,"nameZh":6,"description":212,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":213,"categories":214,"keywords":216,"publishedAt":48},"01M6GDR658B08K4MY0RWD4A6EH","zeroize-audit","Detects missing zeroization of sensitive data in source code and identifies zeroization removed by compiler optimizations, with assembly-level analysis, and control-flow verification. Use for auditing C\u002FC++\u002FRust code handling secrets, keys, passwords, or other sensitive data.","https:\u002F\u002Fgithub.com\u002FSam-06060\u002Fjarvis-assistant\u002Fblob\u002Fmain\u002Fmodules\u002Fagent_skills\u002Fawesome-skills\u002Fplaybooks\u002Fzeroize-audit\u002FSKILL.md",[215],{"categoryNo":145,"categoryName":146,"taxonomyType":21,"taxonomyTypeDesc":22},[217,218,219,220,221,222,223,224,135,225,226,227,228,229,230,231,232,233,234,154],"zeroize audit","audit","write","passwords","get","project","c++","activate","assembly","read","Bash","secrets","analysis","data","flow","verification","code","rust"]