{"id":46126108,"url":"https://github.com/elvatis/openclaw-inwx","last_synced_at":"2026-03-02T02:16:26.014Z","repository":{"id":340451886,"uuid":"1164706001","full_name":"elvatis/openclaw-inwx","owner":"elvatis","description":"OpenClaw plugin: Manage INWX domains and DNS records via natural language.","archived":false,"fork":false,"pushed_at":"2026-02-27T15:57:01.000Z","size":234,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-02-27T20:46:59.928Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/elvatis.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-02-23T11:46:41.000Z","updated_at":"2026-02-27T15:56:10.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/elvatis/openclaw-inwx","commit_stats":null,"previous_names":["homeofe/openclaw-inwx","elvatis/openclaw-inwx"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/elvatis/openclaw-inwx","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/elvatis%2Fopenclaw-inwx","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/elvatis%2Fopenclaw-inwx/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/elvatis%2Fopenclaw-inwx/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/elvatis%2Fopenclaw-inwx/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/elvatis","download_url":"https://codeload.github.com/elvatis/openclaw-inwx/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/elvatis%2Fopenclaw-inwx/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29987831,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-01T22:42:38.399Z","status":"ssl_error","status_checked_at":"2026-03-01T22:41:51.863Z","response_time":124,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-03-02T02:16:25.411Z","updated_at":"2026-03-02T02:16:26.009Z","avatar_url":"https://github.com/elvatis.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# openclaw-inwx\n\nOpenClaw plugin for INWX (InterNetworX) domain registrar automation.\n\nIt provides 23 tools for domain lifecycle operations, DNS management, DNSSEC, contact handling, WHOIS, and account checks.\n\n## Features\n\n- INWX DomRobot JSON-RPC integration via `domrobot-client`\n- Environment switch: `production` or `ote`\n- Optional 2FA login support (`otpSecret`)\n- Safety controls:\n  - `readOnly` blocks all write tools\n  - `allowedOperations` allowlist for tool-level policy\n- TypeScript strict mode\n\n## Installation\n\n```bash\nnpm install @elvatis_com/openclaw-inwx\n```\n\nFor local development:\n\n```bash\nnpm install\nnpm run build\nnpm test\n```\n\n## INWX Account Setup\n\n1. Create or use your INWX account.\n2. Enable API access in INWX account settings.\n3. If 2FA is enabled, provide a shared secret via `otpSecret`.\n4. For safe testing, use OTE environment (`ote.inwx.com`).\n\n## Plugin Config\n\n```json\n{\n  \"username\": \"your-inwx-user\",\n  \"password\": \"your-inwx-password\",\n  \"otpSecret\": \"optional-2fa-secret\",\n  \"environment\": \"ote\",\n  \"readOnly\": false,\n  \"allowedOperations\": []\n}\n```\n\n## Tool List\n\n### Read Tools\n\n1. `inwx_domain_check`\n   - INWX method: `domain.check`\n   - Params: `domain` (string)\n2. `inwx_domain_list`\n   - INWX method: `domain.list`\n   - Params: optional filters (object)\n3. `inwx_domain_info`\n   - INWX method: `domain.info`\n   - Params: `domain` (string)\n4. `inwx_domain_pricing`\n   - INWX method: `domain.check`\n   - Params: `domain` (string) or `domains` (string[])\n5. `inwx_nameserver_list`\n   - INWX method: `nameserver.list` or `domain.info`\n   - Params: optional `domain`\n6. `inwx_dns_record_list`\n   - INWX method: `nameserver.info`\n   - Params: `domain` (string)\n7. `inwx_dnssec_list`\n   - INWX method: `dnssec.info`\n   - Params: optional filters\n8. `inwx_contact_list`\n   - INWX method: `contact.list`\n   - Params: optional filters\n9. `inwx_whois`\n   - INWX method: `domain.whois`\n   - Params: `domain` (string)\n10. `inwx_account_info`\n    - INWX method: `account.info`\n    - Params: none\n\n### Write Tools\n\n11. `inwx_domain_register`\n    - INWX method: `domain.create`\n    - Params: `domain`, `period`, `contacts`, `ns`\n12. `inwx_domain_update`\n    - INWX method: `domain.update`\n    - Params: method payload\n13. `inwx_domain_delete`\n    - INWX method: `domain.delete`\n    - Params: method payload\n14. `inwx_domain_transfer`\n    - INWX method: `domain.transfer`\n    - Params: method payload\n15. `inwx_domain_renew`\n    - INWX method: `domain.renew`\n    - Params: method payload\n16. `inwx_nameserver_set`\n    - INWX method: `domain.update`\n    - Params: `domain`, `ns` (string[])\n17. `inwx_dns_record_add`\n    - INWX method: `nameserver.createRecord`\n    - Params: method payload\n18. `inwx_dns_record_update`\n    - INWX method: `nameserver.updateRecord`\n    - Params: method payload\n19. `inwx_dns_record_delete`\n    - INWX method: `nameserver.deleteRecord`\n    - Params: method payload\n20. `inwx_dnssec_enable`\n    - INWX method: `dnssec.create`\n    - Params: method payload\n21. `inwx_dnssec_disable`\n    - INWX method: `dnssec.delete`\n    - Params: method payload\n22. `inwx_contact_create`\n    - INWX method: `contact.create`\n    - Params: method payload\n23. `inwx_contact_update`\n    - INWX method: `contact.update`\n    - Params: method payload\n\n## OTE Test Environment\n\nSet:\n\n```json\n{ \"environment\": \"ote\" }\n```\n\nThis points the client to INWX OTE API endpoint and allows free integration testing without production costs.\n\n## Integration with openclaw-ispconfig\n\nThis plugin exports a `provisionDomainWithHosting` function that orchestrates both openclaw-inwx and openclaw-ispconfig into a single domain-to-hosting provisioning workflow. No hard npm dependency on openclaw-ispconfig is required - the function accepts both toolsets via dependency injection.\n\n### Provisioning workflow steps\n\n1. **Domain check** - verify availability via `inwx_domain_check`\n2. **Domain register** - register via `inwx_domain_register` (skipped if already taken or `skipRegistration=true`)\n3. **Nameserver set** - configure nameservers via `inwx_nameserver_set`\n4. **Hosting provision** - create site, DNS zone, mail, and database via `isp_provision_site`\n\n### Usage\n\n```typescript\nimport { buildToolset, provisionDomainWithHosting } from \"@elvatis_com/openclaw-inwx\";\nimport ispPlugin from \"@elvatis_com/openclaw-ispconfig\";\n\nconst inwxTools = buildToolset({\n  username: \"inwx-user\",\n  password: \"inwx-pass\",\n  environment: \"ote\",\n});\n\nconst ispTools = ispPlugin.buildToolset({\n  apiUrl: \"https://ispconfig.example.com:8080/remote/json.php\",\n  username: \"api-user\",\n  password: \"api-pass\",\n  serverId: 1,\n  defaultServerIp: \"1.2.3.4\",\n});\n\nconst result = await provisionDomainWithHosting(inwxTools, ispTools, {\n  domain: \"example.com\",\n  nameservers: [\"ns1.hosting.de\", \"ns2.hosting.de\"],\n  serverIp: \"1.2.3.4\",\n  clientName: \"Acme Corp\",\n  clientEmail: \"admin@acme.com\",\n  createMail: true,\n  createDb: true,\n});\n\nconsole.log(result.ok);     // true if all steps succeeded\nconsole.log(result.steps);  // per-step status tracking\nconsole.log(result.created); // summary of what was created\n```\n\n### Parameters\n\n| Parameter | Type | Required | Default | Description |\n| --- | --- | --- | --- | --- |\n| domain | string | yes | - | Domain to register and provision |\n| nameservers | string[] | yes | - | Nameservers to set on the domain |\n| serverIp | string | yes | - | Hosting server IP (for ISPConfig A record) |\n| clientName | string | yes | - | ISPConfig client name |\n| clientEmail | string | yes | - | ISPConfig client email |\n| createMail | boolean | no | true | Create mail domain and mailboxes |\n| createDb | boolean | no | true | Create database and user |\n| serverId | number | no | config default | ISPConfig server ID |\n| registrationPeriod | number | no | 1 | Domain registration period in years |\n| contacts | object | no | - | INWX contact IDs for registration |\n| skipRegistration | boolean | no | false | Skip domain registration step |\n\n### Result structure\n\n```typescript\n{\n  ok: boolean;            // true if all steps succeeded\n  domain: string;\n  steps: Array\u003c{\n    step: string;         // \"domain_check\" | \"domain_register\" | \"nameserver_set\" | \"isp_provision\"\n    status: \"ok\" | \"error\" | \"skipped\";\n    data?: unknown;\n    error?: string;\n  }\u003e;\n  created: {\n    domainRegistered?: boolean;\n    nameserversConfigured?: boolean;\n    hostingProvisioned?: boolean;\n    ispProvisionResult?: unknown;\n  };\n}\n```\n\n## Safety\n\n- `readOnly=true` allows only:\n  - domain check/list/info/pricing\n  - nameserver list\n  - dns record list\n  - dnssec list\n  - contact list\n  - whois\n  - account info\n- `allowedOperations` can restrict to explicit tool names.\n\n## Testing\n\n### Unit tests\n\n```bash\nnpm test\n```\n\nUnit tests use mocks only and require no credentials.\n\n### OTE integration tests\n\nIntegration tests run against the INWX OTE sandbox (`ote.inwx.com`). OTE is safe - no real billing, no production impact.\n\n```bash\n# Set OTE credentials\nexport INWX_OTE_USERNAME=\"your-ote-user\"\nexport INWX_OTE_PASSWORD=\"your-ote-pass\"\nexport INWX_OTE_OTP=\"optional-2fa-secret\"\n\n# Run OTE tests\nnpm run test:ote\n```\n\nWithout credentials set, the OTE suite is automatically skipped.\n\n**Test coverage:**\n- Client authentication and session management\n- All read tools (account info, domain check/list/pricing, contacts)\n- Guard enforcement (readOnly, allowedOperations) on live connection\n- Input validation (empty/missing required params)\n- API error handling (invalid credentials)\n- Full buildToolset round-trip against OTE\n\n## Shared Template\n\nFor automation that creates GitHub issues, use `src/templates/github-issue-helper.ts`.\nIt provides `isValidIssueRepoSlug()`, `resolveIssueRepo()`, and `buildGhIssueCreateCommand()`.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Felvatis%2Fopenclaw-inwx","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Felvatis%2Fopenclaw-inwx","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Felvatis%2Fopenclaw-inwx/lists"}