{"_id":"@domoinc/domo-app-wiring-mcp","_rev":"9-2a891b016579ebe2c90ec49237f7740a","name":"@domoinc/domo-app-wiring-mcp","dist-tags":{"latest":"1.0.3"},"versions":{"1.0.0":{"name":"@domoinc/domo-app-wiring-mcp","version":"1.0.0","keywords":["mcp","domo","code-generation","typescript","redux","crud","dataset","api"],"author":{"name":"Your Name"},"license":"MIT","_id":"@domoinc/domo-app-wiring-mcp@1.0.0","maintainers":[{"name":"ttingey","email":"trevor.tingey@domo.com"},{"name":"morganjohn12","email":"morganjohn12@gmail.com"},{"name":"jeff.smith","email":"jeff.smith@domo.com"},{"name":"cameronnokes","email":"ccnokes@gmail.com"},{"name":"congrieb","email":"cgrieb9@gmail.com"},{"name":"diazd2","email":"biancodd@gmail.com"},{"name":"statianzo","email":"code.npm@jxs.me"},{"name":"mountain01","email":"edwardsjm01@gmail.com"},{"name":"th3uiguy","email":"spencer@myweb-host.net"},{"name":"jasonleehodges","email":"jasonleehodges@outlook.com"},{"name":"jmnemelka","email":"john.morgan.nemelka@gmail.com"},{"name":"jontiritilli-domo","email":"jon.tiritilli@domo.com"}],"homepage":"https://github.com/your-username/domo-app-wiring-mcp#readme","bugs":{"url":"https://github.com/your-username/domo-app-wiring-mcp/issues"},"dist":{"shasum":"9173bd924c46b4f52aaf859d43d27c9cdb7ee460","tarball":"https://registry.npmjs.org/@domoinc/domo-app-wiring-mcp/-/domo-app-wiring-mcp-1.0.0.tgz","fileCount":108,"integrity":"sha512-vzRI0yWDx2jirJV9T9qvPDxGUjIxWq56xUL/+7/K3VAM/oN/rW6YbkeZfmNBAHqn2NepmMyOyEEVS4fH+S+o1Q==","signatures":[{"sig":"MEQCIDiHqWtHV28hUf4E6gY0c6HZoJYgakQziHyM/ac0q7XjAiBp0mHxRZXdHBHU4essxAbwfCOjVawewBXOZcZoUdNTkQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":485044},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"eff840b069f60a3bf55f5ce65c42a9cb71062849","scripts":{"dev":"tsx watch src/index.ts","lint":"eslint src/**/*.ts --ignore-pattern 'src/templates/**/*'","test":"jest","build":"npm run generate-templates && tsc","clean":"rm -rf dist","start":"node dist/index.js","format":"prettier --write src/**/*.ts --ignore-path .eslintignore","lint:fix":"eslint src/**/*.ts --ignore-pattern 'src/templates/**/*' --fix","prebuild":"npm run clean","test:all":"npm run test:workflow && npm run test:manifest && npm run test:crud","precommit":"npm run lint && npm run type-check && npm run test","test:crud":"node scripts/test-domo-crud.js","test:unit":"jest tests/unit","check-auth":"tsx src/cli/check-auth.ts","test:watch":"jest --watch","type-check":"tsc --noEmit","test-server":"node scripts/test-server.js","test:coverage":"jest --coverage","test:manifest":"npm run test:manifest-parsing && npm run test:manifest-workflow && npm run test:create-manifest","test:workflow":"node scripts/test-complete-workflow.js","test:templates":"tsx tests/templates/validate-templates.ts","watch-templates":"nodemon --watch src/templates --ext ts --exec 'npm run generate-templates'","test:integration":"jest tests/integration","generate-templates":"node scripts/generate-embedded-templates.js","test:workflow-tool":"node scripts/test-workflow-tool.js","test:create-manifest":"node scripts/test-create-manifest.js","test:manifest-parsing":"node scripts/test-manifest-parsing.js","test:manifest-workflow":"node scripts/test-manifest-workflow.js"},"_npmUser":{"name":"jontiritilli-domo","email":"jon.tiritilli@domo.com"},"repository":{"url":"git+https://github.com/your-username/domo-app-wiring-mcp.git","type":"git"},"_npmVersion":"10.8.2","description":"MCP server that automatically generates app code interfaces and CRUD services from Domo datasets for Redux integration","directories":{},"_nodeVersion":"20.19.4","dependencies":{"zod":"^3.22.4","axios":"^1.6.0","dotenv":"^17.2.3","winston":"^3.11.0","jsonwebtoken":"^9.0.2","@modelcontextprotocol/sdk":"^0.4.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.1.0","jest":"^29.7.0","eslint":"^8.54.0","ts-jest":"^29.1.1","prettier":"^3.1.0","typescript":"^5.2.2","@types/jest":"^29.5.8","@types/node":"^20.9.0","@types/jsonwebtoken":"^9.0.5","eslint-config-prettier":"^9.0.0","eslint-plugin-prettier":"^5.0.1","@typescript-eslint/parser":"^6.12.0","@typescript-eslint/eslint-plugin":"^6.12.0"},"_npmOperationalInternal":{"tmp":"tmp/domo-app-wiring-mcp_1.0.0_1759952090073_0.25552401003479286","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@domoinc/domo-app-wiring-mcp","version":"1.0.1","keywords":["mcp","domo","code-generation","typescript","redux","crud","dataset","api"],"author":{"name":"Your Name"},"license":"MIT","_id":"@domoinc/domo-app-wiring-mcp@1.0.1","maintainers":[{"name":"ttingey","email":"trevor.tingey@domo.com"},{"name":"morganjohn12","email":"morganjohn12@gmail.com"},{"name":"jeff.smith","email":"jeff.smith@domo.com"},{"name":"cameronnokes","email":"ccnokes@gmail.com"},{"name":"congrieb","email":"cgrieb9@gmail.com"},{"name":"diazd2","email":"biancodd@gmail.com"},{"name":"statianzo","email":"code.npm@jxs.me"},{"name":"mountain01","email":"edwardsjm01@gmail.com"},{"name":"th3uiguy","email":"spencer@myweb-host.net"},{"name":"jasonleehodges","email":"jasonleehodges@outlook.com"},{"name":"jmnemelka","email":"john.morgan.nemelka@gmail.com"},{"name":"jontiritilli-domo","email":"jon.tiritilli@domo.com"}],"bin":{"domo-app-wiring-mcp":"dist/server.js"},"dist":{"shasum":"1d87becadea2c4d6fdeb40dc00d8982f7fb10273","tarball":"https://registry.npmjs.org/@domoinc/domo-app-wiring-mcp/-/domo-app-wiring-mcp-1.0.1.tgz","fileCount":108,"integrity":"sha512-F2T0uYU+OlVwDn5jtywzJmvQPIAEXwveWp7QmERrxa1JrlzT3BDkj23quc2CNbtwyrO/3qMu8+pVP+rmsgZ6vg==","signatures":[{"sig":"MEYCIQCr7Qs14Wfy9ZZ9rSCLMg07J3WeQT+aBehWl+nmCOrbbQIhAPO6xlWWTjkVBAV2QhGIhTSc/9VHsajvZSfhwUTFQvBv","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":484826},"main":"dist/server.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"eff840b069f60a3bf55f5ce65c42a9cb71062849","scripts":{"dev":"tsx watch src/index.ts","lint":"eslint src/**/*.ts --ignore-pattern 'src/templates/**/*'","test":"jest","build":"npm run generate-templates && tsc","clean":"rm -rf dist","start":"node dist/index.js","format":"prettier --write src/**/*.ts --ignore-path .eslintignore","lint:fix":"eslint src/**/*.ts --ignore-pattern 'src/templates/**/*' --fix","prebuild":"npm run clean","test:all":"npm run test:workflow && npm run test:manifest && npm run test:crud","precommit":"npm run lint && npm run type-check && npm run test","test:crud":"node scripts/test-domo-crud.js","test:unit":"jest tests/unit","check-auth":"tsx src/cli/check-auth.ts","test:watch":"jest --watch","type-check":"tsc --noEmit","test-server":"node scripts/test-server.js","test:coverage":"jest --coverage","test:manifest":"npm run test:manifest-parsing && npm run test:manifest-workflow && npm run test:create-manifest","test:workflow":"node scripts/test-complete-workflow.js","test:templates":"tsx tests/templates/validate-templates.ts","watch-templates":"nodemon --watch src/templates --ext ts --exec 'npm run generate-templates'","test:integration":"jest tests/integration","generate-templates":"node scripts/generate-embedded-templates.js","test:workflow-tool":"node scripts/test-workflow-tool.js","test:create-manifest":"node scripts/test-create-manifest.js","test:manifest-parsing":"node scripts/test-manifest-parsing.js","test:manifest-workflow":"node scripts/test-manifest-workflow.js"},"_npmUser":{"name":"jontiritilli-domo","email":"jon.tiritilli@domo.com"},"_npmVersion":"10.8.2","description":"MCP server that automatically generates app code interfaces and CRUD services from Domo datasets for Redux integration","directories":{},"_nodeVersion":"20.19.4","dependencies":{"zod":"^3.22.4","axios":"^1.6.0","dotenv":"^17.2.3","winston":"^3.11.0","jsonwebtoken":"^9.0.2","@modelcontextprotocol/sdk":"^0.4.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.1.0","jest":"^29.7.0","eslint":"^8.54.0","ts-jest":"^29.1.1","prettier":"^3.1.0","typescript":"^5.2.2","@types/jest":"^29.5.8","@types/node":"^20.9.0","@types/jsonwebtoken":"^9.0.5","eslint-config-prettier":"^9.0.0","eslint-plugin-prettier":"^5.0.1","@typescript-eslint/parser":"^6.12.0","@typescript-eslint/eslint-plugin":"^6.12.0"},"_npmOperationalInternal":{"tmp":"tmp/domo-app-wiring-mcp_1.0.1_1759954482404_0.7672017991056963","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@domoinc/domo-app-wiring-mcp","version":"1.0.2","keywords":["mcp","domo","code-generation","typescript","redux","crud","dataset","api"],"author":{"name":"Jonathan Tiritilli"},"license":"MIT","_id":"@domoinc/domo-app-wiring-mcp@1.0.2","maintainers":[{"name":"ttingey","email":"trevor.tingey@domo.com"},{"name":"morganjohn12","email":"morganjohn12@gmail.com"},{"name":"jeff.smith","email":"jeff.smith@domo.com"},{"name":"cameronnokes","email":"ccnokes@gmail.com"},{"name":"congrieb","email":"cgrieb9@gmail.com"},{"name":"diazd2","email":"biancodd@gmail.com"},{"name":"statianzo","email":"code.npm@jxs.me"},{"name":"mountain01","email":"edwardsjm01@gmail.com"},{"name":"th3uiguy","email":"spencer@myweb-host.net"},{"name":"jasonleehodges","email":"jasonleehodges@outlook.com"},{"name":"jmnemelka","email":"john.morgan.nemelka@gmail.com"},{"name":"jontiritilli-domo","email":"jon.tiritilli@domo.com"}],"homepage":"https://github.com/your-org/domo-app-wiring-mcp#readme","bugs":{"url":"https://github.com/your-org/domo-app-wiring-mcp/issues"},"bin":{"domo-app-wiring-mcp":"dist/index.js"},"dist":{"shasum":"746030c9d553126c30eb3bce77b6c42570409d74","tarball":"https://registry.npmjs.org/@domoinc/domo-app-wiring-mcp/-/domo-app-wiring-mcp-1.0.2.tgz","fileCount":63,"integrity":"sha512-JXsupriYGS0QqbRxVYPHkUnnASDOXOKI9pALS2QEO2tXBfdt91jU2S3ySvKTM3925kCk4OHetGluvFXjZtIW3g==","signatures":[{"sig":"MEQCIBlmKO7Rd+eSxFuOQ5+J56c41v8iL8PRWbn2IJx4Y9ZFAiATs87GyIXgioIfTQQmLMmsmbPr1swCWcQKA9zBewPr5Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":257290},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"eff840b069f60a3bf55f5ce65c42a9cb71062849","scripts":{"dev":"tsx watch src/index.ts","lint":"eslint src/**/*.ts --ignore-pattern 'src/templates/**/*'","test":"jest","build":"npm run generate-templates && tsc","clean":"rm -rf dist","start":"node dist/index.js","format":"prettier --write src/**/*.ts --ignore-path .eslintignore","lint:fix":"eslint src/**/*.ts --ignore-pattern 'src/templates/**/*' --fix","prebuild":"npm run clean","test:all":"npm run test:workflow && npm run test:manifest && npm run test:crud","postbuild":"chmod +x dist/index.js","precommit":"npm run lint && npm run type-check && npm run test","test:unit":"jest tests/unit","check-auth":"tsx src/cli/check-auth.ts","test:watch":"jest --watch","type-check":"tsc --noEmit","test-server":"node scripts/test-server.js","test:coverage":"jest --coverage","test:templates":"tsx tests/templates/validate-templates.ts","watch-templates":"nodemon --watch src/templates --ext ts --exec 'npm run generate-templates'","test:integration":"jest tests/integration","generate-templates":"node scripts/generate-embedded-templates.js"},"_npmUser":{"name":"jontiritilli-domo","email":"jon.tiritilli@domo.com"},"repository":{"url":"git+https://github.com/your-org/domo-app-wiring-mcp.git","type":"git"},"_npmVersion":"10.8.2","description":"MCP server that automatically generates app code interfaces and CRUD services from Domo datasets for Redux integration","directories":{},"_nodeVersion":"20.19.4","dependencies":{"zod":"^3.22.4","axios":"^1.6.0","dotenv":"^17.2.3","winston":"^3.11.0","jsonwebtoken":"^9.0.2","@modelcontextprotocol/sdk":"^0.4.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.1.0","jest":"^29.7.0","eslint":"^8.54.0","ts-jest":"^29.1.1","prettier":"^3.1.0","typescript":"^5.2.2","@types/jest":"^29.5.8","@types/node":"^20.9.0","@types/jsonwebtoken":"^9.0.5","eslint-config-prettier":"^9.0.0","eslint-plugin-prettier":"^5.0.1","@typescript-eslint/parser":"^6.12.0","@typescript-eslint/eslint-plugin":"^6.12.0"},"_npmOperationalInternal":{"tmp":"tmp/domo-app-wiring-mcp_1.0.2_1759955526477_0.46835546507490977","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"@domoinc/domo-app-wiring-mcp","version":"1.0.3","keywords":["mcp","domo","code-generation","typescript","redux","crud","dataset","api"],"author":{"name":"Jonathan Tiritilli"},"license":"MIT","_id":"@domoinc/domo-app-wiring-mcp@1.0.3","maintainers":[{"name":"ttingey","email":"trevor.tingey@domo.com"},{"name":"morganjohn12","email":"morganjohn12@gmail.com"},{"name":"jeff.smith","email":"jeff.smith@domo.com"},{"name":"cameronnokes","email":"ccnokes@gmail.com"},{"name":"congrieb","email":"cgrieb9@gmail.com"},{"name":"diazd2","email":"biancodd@gmail.com"},{"name":"statianzo","email":"code.npm@jxs.me"},{"name":"mountain01","email":"edwardsjm01@gmail.com"},{"name":"th3uiguy","email":"spencer@myweb-host.net"},{"name":"jasonleehodges","email":"jasonleehodges@outlook.com"},{"name":"jmnemelka","email":"john.morgan.nemelka@gmail.com"},{"name":"jontiritilli-domo","email":"jon.tiritilli@domo.com"}],"bin":{"domo-app-wiring-mcp":"dist/index.js"},"dist":{"shasum":"08b1a04759a10df91322057497009b5523aca3c1","tarball":"https://registry.npmjs.org/@domoinc/domo-app-wiring-mcp/-/domo-app-wiring-mcp-1.0.3.tgz","fileCount":63,"integrity":"sha512-C1Q3fcawCXre1dphKV09CUEOcL9TkF8/84DtPpCCzNDhgqmbYzCiWzngVDn6V7wWeMv+twW4KGGTh/etmsUonA==","signatures":[{"sig":"MEUCIAWft+BcKFROcCQK3u+lCoT9V/0OGhSq6FjPJGax94L0AiEAnD1Mi7KiTxWHmeDTTTNP3umN+S87W7kd2/WtKLcJX8A=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":257026},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"eff840b069f60a3bf55f5ce65c42a9cb71062849","scripts":{"dev":"tsx watch src/index.ts","lint":"eslint src/**/*.ts --ignore-pattern 'src/templates/**/*'","test":"jest","build":"npm run generate-templates && tsc","clean":"rm -rf dist","start":"node dist/index.js","format":"prettier --write src/**/*.ts --ignore-path .eslintignore","lint:fix":"eslint src/**/*.ts --ignore-pattern 'src/templates/**/*' --fix","prebuild":"npm run clean","test:all":"npm run test:workflow && npm run test:manifest && npm run test:crud","postbuild":"chmod +x dist/index.js","precommit":"npm run lint && npm run type-check && npm run test","test:unit":"jest tests/unit","check-auth":"tsx src/cli/check-auth.ts","test:watch":"jest --watch","type-check":"tsc --noEmit","test-server":"node scripts/test-server.js","test:coverage":"jest --coverage","test:templates":"tsx tests/templates/validate-templates.ts","watch-templates":"nodemon --watch src/templates --ext ts --exec 'npm run generate-templates'","test:integration":"jest tests/integration","generate-templates":"node scripts/generate-embedded-templates.js"},"_npmUser":{"name":"jontiritilli-domo","email":"jon.tiritilli@domo.com"},"_npmVersion":"10.8.2","description":"MCP server that automatically generates app code interfaces and CRUD services from Domo datasets for Redux integration","directories":{},"_nodeVersion":"20.19.4","dependencies":{"zod":"^3.22.4","axios":"^1.6.0","dotenv":"^17.2.3","winston":"^3.11.0","jsonwebtoken":"^9.0.2","@modelcontextprotocol/sdk":"^0.4.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.1.0","jest":"^29.7.0","eslint":"^8.54.0","ts-jest":"^29.1.1","prettier":"^3.1.0","typescript":"^5.2.2","@types/jest":"^29.5.8","@types/node":"^20.9.0","@types/jsonwebtoken":"^9.0.5","eslint-config-prettier":"^9.0.0","eslint-plugin-prettier":"^5.0.1","@typescript-eslint/parser":"^6.12.0","@typescript-eslint/eslint-plugin":"^6.12.0"},"_npmOperationalInternal":{"tmp":"tmp/domo-app-wiring-mcp_1.0.3_1759955553138_0.06456129568841051","host":"s3://npm-registry-packages-npm-production"}}},"time":{"created":"2025-10-08T19:34:50.073Z","modified":"2026-02-27T17:24:04.750Z","1.0.0":"2025-10-08T19:34:50.265Z","1.0.1":"2025-10-08T20:14:42.700Z","1.0.2":"2025-10-08T20:32:06.695Z","1.0.3":"2025-10-08T20:32:33.330Z"},"author":{"name":"Jonathan Tiritilli"},"license":"MIT","keywords":["mcp","domo","code-generation","typescript","redux","crud","dataset","api"],"description":"MCP server that automatically generates app code interfaces and CRUD services from Domo datasets for Redux integration","maintainers":[{"email":"trevor.tingey@domo.com","name":"ttingey"},{"email":"morganjohn12@gmail.com","name":"morganjohn12"},{"email":"jeff.smith@domo.com","name":"jeff.smith"},{"email":"cgrieb9@gmail.com","name":"congrieb"},{"email":"spencer@myweb-host.net","name":"th3uiguy"},{"email":"jason.hansen@domo.com","name":"domo_json"},{"email":"jon.tiritilli@domo.com","name":"jontiritilli-domo"}],"readme":"# 🎯 **Domo App Wiring MCP Server**\n\nAn MCP (Model Context Protocol) server that automatically generates TypeScript interfaces, Redux services, and CRUD operations from Domo datasets for seamless app integration.\n\n## 🚀 **Features**\n\n- **Template-Based Architecture**: Modular, maintainable template system for easy updates\n- **Real Pagination Support**: Server-side pagination with Redux state management\n- **Intelligent Naming**: Auto-generates descriptive aliases based on dataset content\n- **Single Dataset Workflow**: Generate complete code from a single dataset ID\n- **Multi-Dataset Workflow**: Process multiple datasets from Domo app manifests\n- **Domo Data API Integration**: Uses proper Domo Data APIs with aliased format\n- **TypeScript Interfaces**: Auto-generated interfaces with validation\n- **Redux Services**: Complete Redux slices, actions, selectors, and hooks\n- **CRUD Operations**: Domo-specific CRUD with SQL and Data API support\n- **Manifest Support**: Create and process Domo app manifests\n- **Comprehensive Testing**: Template validation and integration tests\n\n## 📊 **Available Tools (4 Total)**\n\n### **Core Tools**\n\n- `analyze_dataset_schema` - Analyze dataset structure and schema\n- `generate_code` - **CONSOLIDATED** - Generate complete code with template-based architecture and pagination support\n\n### **Utility Tools**\n\n- `parse_domo_manifest` - Parse and validate Domo app manifests\n- `set_domo_instance` - Configure Domo instance\n\n## 🎯 **Quick Start**\n\n### **1. Installation**\n\n```bash\n# Clone the repository\ngit clone <repository-url>\ncd domo-app-wiring-mcp\n\n# Install dependencies\nnpm install\n\n# Build the project\nnpm run build\n```\n\n### **2. Configure Cursor MCP**\n\nAdd to your `~/.cursor/mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"domo-app-wiring\": {\n      \"command\": \"node\",\n      \"args\": [\"/path/to/domo-app-wiring-mcp/dist/index.js\"],\n      \"cwd\": \"/path/to/your/project\",\n      \"env\": {\n        \"NODE_ENV\": \"development\",\n        \"LOG_LEVEL\": \"info\",\n        \"DOMO_INSTANCE\": \"your-instance.domo.com\",\n        \"MCP_PROJECT_DIR\": \"${workspaceFolder}\"\n      }\n    }\n  }\n}\n```\n\n### **3. Set Up Domo Authentication**\n\n```bash\n# Check authentication\nnpm run check-auth\n\n# Build and test MCP server\nnpm run build\n```\n\n## 🎯 **MCP Server Configuration**\n\n### **For Cursor IDE**\n\nAdd to your `cursor-mcp-config.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"domo-app-wiring\": {\n      \"command\": \"npx\",\n      \"args\": [\"@domoinc/domo-app-wiring-mcp\"],\n      \"env\": {\n        \"DOMO_INSTANCE\": \"your-company.domo.com\",\n        \"MCP_PROJECT_DIR\": \"${workspaceFolder}\"\n      }\n    }\n  }\n}\n```\n\n### **For VS Code with MCP Extension**\n\nAdd to your VS Code settings:\n\n```json\n{\n  \"mcp.servers\": {\n    \"domo-app-wiring\": {\n      \"command\": \"npx\",\n      \"args\": [\"@domoinc/domo-app-wiring-mcp\"],\n      \"env\": {\n        \"DOMO_INSTANCE\": \"your-company.domo.com\",\n        \"MCP_PROJECT_DIR\": \"${workspaceFolder}\"\n      }\n    }\n  }\n}\n```\n\n### **Perfect Prompts for Cursor**\n\n> **💡 Pro Tip**: Always use the `@` symbol to reference MCP tools in your prompts. This ensures Cursor uses the MCP server instead of trying to generate code from scratch.\n\n### **How MCP Tools Work**\n\n1. **@parse_domo_manifest** - Parses your Domo app manifest to extract dataset information\n2. **@analyze_dataset_schema** - Analyzes dataset structure, types, and relationships\n3. **@generate_code** - Generates complete TypeScript code using intelligent templates\n\n### **Tool Usage Examples**\n\n### **Single Dataset**\n\n```text\nUse @analyze_dataset_schema to analyze dataset ID 'your-dataset-id', then use @generate_code to create a complete workflow with TypeScript interfaces, Redux services, React hooks, and components. Fix all ESLint and TSC errors.\n```\n\n### **Multiple Datasets from Manifest File**\n\n```text\nUse @parse_domo_manifest to parse 'public/manifest.json', then use @analyze_dataset_schema for each dataset, and finally use @generate_code to create complete workflows. Fix all ESLint and TSC errors.\n```\n\n### **With Domo Data APIs**\n\n```text\nUse @analyze_dataset_schema to analyze dataset ID 'your-dataset-id' with sample data, then use @generate_code to create a complete workflow with pagination, filtering, and Domo Data API integration. Fix all ESLint and TSC errors.\n```\n\n### **Advanced Workflow**\n\n```text\n1. Use @parse_domo_manifest to parse the manifest file\n2. Use @analyze_dataset_schema for each dataset with sample data\n3. Use @generate_code to generate complete TypeScript interfaces, Redux slices, API services, React hooks, and components\n4. Ensure all generated code passes ESLint and TypeScript compilation\n5. Include pagination, filtering, and error handling\n```\n\n## 🔧 **Troubleshooting**\n\n### **MCP Tools Not Working?**\n\nIf Cursor isn't using the MCP tools:\n\n1. **Check MCP Server Status**:\n\n   ```bash\n   npm run build\n   ```\n\n2. **Verify Authentication**:\n\n   ```bash\n   npm run check-auth\n   ```\n\n3. **Use Explicit Tool References**:\n   - Always use `@analyze_dataset_schema` instead of just \"analyze dataset\"\n   - Always use `@generate_code` instead of just \"generate code\"\n   - Always use `@parse_domo_manifest` instead of just \"parse manifest\"\n\n4. **Check MCP Configuration**:\n   - Ensure `cursor-mcp-config.json` is properly configured\n   - Verify `DOMO_INSTANCE` is set correctly\n   - Check that `MCP_PROJECT_DIR` points to your workspace\n\n### **Common Issues**\n\n- **\"Tool not found\"**: Make sure you're using the `@` symbol before tool names\n- **\"Authentication failed\"**: Run `npm run check-auth` and fix Domo CLI setup\n- **\"No data analysis\"**: Use `@analyze_dataset_schema` with `includeSampleData: true`\n- **\"Templates not working\"**: Use `@generate_code` after schema analysis\n- **\"MCP server not responding\"**: Check that Cursor is configured to use the MCP server\n- **\"No code generation\"**: Ensure you're using `@generate_code` with proper schema analysis results\n\n### **Why MCP Tools Might Not Work**\n\n1. **Cursor Not Using MCP Server**: Make sure your `cursor-mcp-config.json` is properly configured\n2. **Missing Tool References**: Always use `@analyze_dataset_schema` and `@generate_code` in your prompts\n3. **Authentication Issues**: Run `npm run check-auth` to verify Domo CLI setup\n4. **Build Issues**: Run `npm run build` to ensure the MCP server is properly compiled\n5. **Template Issues**: The MCP server uses embedded templates, so ensure `npm run generate-templates` has run\n\n## 📋 **What You Get**\n\n### **Generated Files**\n\n- **TypeScript Interfaces**: Main interface, Create/Update types, filters\n- **Redux Services**: Slices, actions, selectors, hooks, RTK Query\n- **CRUD Operations**: API services, query builders, validation, caching\n- **Domo Integration**: Proper Domo Data API endpoints and SQL support\n\n### **File Structure**\n\n```text\nsrc/\n├── types/\n│   └── {datasetName}-types.ts          # TypeScript interfaces\n├── reducers/\n│   └── {datasetName}/\n│       └── slice.ts                    # Redux slice with pagination\n├── services/\n│   └── {datasetName}-api.ts            # API service with pagination\n├── hooks/\n│   └── use{InterfaceName}.ts           # React hooks with pagination\n└── store/\n    └── store.ts                        # Redux store configuration\n```\n\n### **Template System**\n\nThe code generation uses a modular template system. Templates are located in the MCP server's source directory:\n\n```text\nsrc/templates/\n├── types/types.ts                      # TypeScript interface template\n├── redux/slice.ts                      # Redux slice template\n├── services/api.ts                     # API service template\n├── hooks/hooks.ts                      # React hooks template\n└── store/store.ts                      # Redux store template\n```\n\n**Note**: Templates are part of the MCP server installation, not your project. The server uses embedded templates for NPX compatibility.\n\n### **Template Development Workflow**\n\nTemplates are maintained as separate files for easy editing and automatically embedded during build:\n\n```bash\n# Generate embedded templates from individual files\nnpm run generate-templates\n\n# Watch for template changes during development\nnpm run watch-templates\n\n# Full build (includes template generation)\nnpm run build\n```\n\n**Template Files Structure:**\n\n- `src/templates/types/types.ts` - TypeScript interfaces\n- `src/templates/redux/slice.ts` - Redux slice with pagination\n- `src/templates/services/api.ts` - SQL API service with dataset parameter support\n- `src/templates/hooks/hooks.ts` - React hooks\n- `src/templates/store/store.ts` - Redux store configuration\n- `src/templates/constants/constants.ts` - Dataset constants and configuration\n- `src/templates/embedded-templates.ts` - **Auto-generated** embedded templates (do not edit directly)\n\n## 🔧 **Domo API Integration**\n\n### **MCP Server API Usage**\n\nThe MCP server uses Domo's official APIs for dataset analysis and schema extraction:\n\n| Feature         | MCP Server API Usage                       |\n| --------------- | ------------------------------------------ |\n| **Endpoints**   | `/api/query/v1/` and `/api/oauth2/`        |\n| **Use Case**    | Schema analysis and dataset metadata       |\n| **Features**    | SQL queries, schema analysis, data export  |\n| **Integration** | Native Domo authentication and data format |\n\n### **MCP Server Endpoints**\n\n| Operation          | Endpoint                                               | Method |\n| ------------------ | ------------------------------------------------------ | ------ |\n| **Authentication** | `/api/oauth2/token`                                    | POST   |\n| **Schema**         | `/api/query/v1/datasources/{datasetId}/schema/indexed` | GET    |\n| **Query**          | `/api/query/v1/execute/{datasetId}`                    | POST   |\n| **Export**         | `/api/query/v1/datasources/{datasetId}/export`         | POST   |\n\n### **Generated App Endpoints**\n\nThe generated code uses Domo's SQL API for runtime data access:\n\n| Operation     | Generated Endpoint | Method |\n| ------------- | ------------------ | ------ |\n| **Get All**   | `/sql/v1/{alias}`  | POST   |\n| **Get By ID** | `/sql/v1/{alias}`  | POST   |\n| **Create**    | `/sql/v1/{alias}`  | POST   |\n| **Update**    | `/sql/v1/{alias}`  | POST   |\n| **Delete**    | `/sql/v1/{alias}`  | POST   |\n\n**Note**:\n\n- The `{alias}` is the dataset alias defined in your Domo app manifest\n- All operations use SQL queries via the `/sql/v1/{alias}` endpoint\n- This follows Domo's [SQL API](https://developer.domo.com/portal/8s3y9eldnjq8d-data-api#sql-api) standard for data access\n\n### **Features**\n\n- **Schema Analysis**: Retrieves dataset structure and column information using Domo's official APIs\n- **SQL-Based CRUD**: All data operations use SQL queries via Domo's SQL API for maximum flexibility\n- **Pagination Support**: Built-in pagination for large datasets with configurable page sizes\n- **Data Export**: Export datasets in various formats using Domo's export APIs\n- **Authentication**: Secure OAuth2 token-based authentication\n- **Error Handling**: Comprehensive error handling and logging\n\n## 🧪 **Testing**\n\n```bash\n# Template validation\nnpm run test:templates          # Validate all template files\n\n# Unit tests\nnpm run test:unit               # Run unit tests\n\n# Integration tests\nnpm run test:integration        # Run integration tests\n\n# Legacy tests\nnpm run test-domo-crud          # Domo CRUD operations\nnpm run test-create-manifest    # Manifest creation\nnpm run test-manifest-parsing   # Manifest parsing\nnpm run test-workflow           # Complete workflow\nnpm run test-server             # MCP server\n\n# Run all tests\nnpm test\n```\n\n## 📁 **Project Structure**\n\n```text\ndomo-app-wiring-mcp/\n├── src/                        # MCP server source code\n│   ├── tools/                  # MCP tools\n│   │   ├── codegen/            # Code generation tools\n│   │   ├── schema/             # Schema analysis tools\n│   │   ├── manifest/           # Manifest tools\n│   │   └── config/             # Configuration tools\n│   ├── templates/              # Code generation templates\n│   │   ├── types/              # TypeScript templates\n│   │   ├── redux/              # Redux templates\n│   │   ├── services/           # Service templates\n│   │   ├── hooks/              # Hooks templates\n│   │   └── store/              # Store templates\n│   ├── utils/                  # Utilities\n│   └── core/                   # Core server logic\n├── tests/                      # Test suite\n│   ├── unit/                   # Unit tests\n│   ├── integration/            # Integration tests\n│   └── templates/              # Template validation\n├── public/                     # Standard Domo app location\n│   └── manifest.json          # Domo app manifest (your datasets)\n├── examples/                   # Usage examples\n├── scripts/                    # Test scripts\n└── docs/                      # Documentation\n```\n\n### **Standard Domo App Structure**\n\n```text\nyour-domo-app/\n├── public/\n│   └── manifest.json          # Your Domo app manifest\n├── src/                       # Your app source code\n└── package.json              # Your app dependencies\n```\n\n## 🎯 **Examples**\n\n### **Sample Manifest (Complete with Field Mappings)**\n\n```json\n{\n  \"name\": \"FABulous Trades\",\n  \"version\": \"0.0.1\",\n  \"size\": {\n    \"width\": 3,\n    \"height\": 3\n  },\n  \"mapping\": [\n    {\n      \"dataSetId\": \"46ce2528-2f3f-49fc-8f42-20f8f49f7240\",\n      \"alias\": \"pricingData\",\n      \"fields\": [\n        {\n          \"alias\": \"productId\",\n          \"columnName\": \"productId\"\n        },\n        {\n          \"alias\": \"lowPrice\",\n          \"columnName\": \"lowPrice\"\n        },\n        {\n          \"alias\": \"midPrice\",\n          \"columnName\": \"midPrice\"\n        }\n      ]\n    }\n  ]\n}\n```\n\n### **Initial Manifest (Minimal)**\n\n```json\n{\n  \"name\": \"Domo Vite React app\",\n  \"version\": \"0.0.1\",\n  \"size\": {\n    \"width\": 5,\n    \"height\": 3\n  },\n  \"fullpage\": true,\n  \"mapping\": [\n    {\n      \"dataSetId\": \"9c2b8f9d-0ae1-4ab6-9bf5-776099abb218\",\n      \"alias\": \"pricingData\"\n    }\n  ]\n}\n```\n\n### **Generated TypeScript Interface**\n\n```typescript\nexport interface PricingData {\n  productId: string;\n  lowPrice: number;\n  midPrice: number;\n  highPrice: number;\n  marketPrice: number;\n  directLowPrice: number;\n  cardType: string;\n  groupId: string;\n  groupName: string;\n  asOf: string;\n  cardName: string;\n  cleanName: string;\n  searchableName: string;\n  cardUrl: string;\n  imageUrl: string;\n  categoryId: string;\n}\n\nexport interface PricingDataCreate {\n  productId: string;\n  lowPrice: number;\n  midPrice: number;\n  highPrice: number;\n  marketPrice: number;\n  directLowPrice: number;\n  cardType: string;\n  groupId: string;\n  groupName: string;\n  asOf: string;\n  cardName: string;\n  cleanName: string;\n  searchableName: string;\n  cardUrl: string;\n  imageUrl: string;\n  categoryId: string;\n}\n\nexport interface PricingDataUpdate {\n  productId?: string;\n  lowPrice?: number;\n  midPrice?: number;\n  highPrice?: number;\n  marketPrice?: number;\n  directLowPrice?: number;\n  cardType?: string;\n  groupId?: string;\n  groupName?: string;\n  asOf?: string;\n  cardName?: string;\n  cleanName?: string;\n  searchableName?: string;\n  cardUrl?: string;\n  imageUrl?: string;\n  categoryId?: string;\n}\n```\n\n### **Generated Redux Slice with Pagination**\n\n```typescript\nexport const pricingDataSlice = createAppSlice({\n  name: 'pricingData',\n  initialState: {\n    items: [],\n    loading: false,\n    error: null,\n    selectedItem: null,\n    pagination: {\n      currentPage: 1,\n      pageSize: 10,\n      totalItems: 0,\n      totalPages: 0,\n    },\n  },\n  reducers: create => ({\n    setPage: create.reducer((state, action) => {\n      state.pagination.currentPage = action.payload;\n    }),\n    setPageSize: create.reducer((state, action) => {\n      state.pagination.pageSize = action.payload;\n      state.pagination.currentPage = 1;\n    }),\n    fetchPricingData: create.asyncThunk(\n      async ({ page = 1, pageSize = 10, filters }, { rejectWithValue }) => {\n        // Server-side pagination implementation\n        return { items: [], pagination: { totalItems: 0, totalPages: 0 } };\n      },\n      {\n        fulfilled: (state, { payload, meta }) => {\n          state.items = payload.items;\n          state.pagination = {\n            ...state.pagination,\n            currentPage: meta.arg.page || 1,\n            pageSize: meta.arg.pageSize || 10,\n            totalItems: payload.pagination.totalItems,\n            totalPages: payload.pagination.totalPages,\n          };\n        },\n      }\n    ),\n  }),\n});\n```\n\n### **Generated React Hooks with Pagination**\n\n```typescript\nexport const usePricingData = () => {\n  const dispatch = useAppDispatch();\n  const items = useAppSelector(selectPricingData);\n  const pagination = useAppSelector(selectPricingDataPagination);\n\n  const fetchAll = (page?: number, pageSize?: number, filters?: any) => {\n    dispatch(fetchPricingData({ page, pageSize, filters }));\n  };\n\n  const changePage = (page: number) => {\n    dispatch(setPage(page));\n    dispatch(fetchPricingData({ page, pageSize: pagination.pageSize }));\n  };\n\n  const changePageSize = (pageSize: number) => {\n    dispatch(setPageSize(pageSize));\n    dispatch(fetchPricingData({ page: 1, pageSize }));\n  };\n\n  return {\n    items,\n    pagination,\n    fetchAll,\n    changePage,\n    changePageSize,\n  };\n};\n```\n\n### **Configuration Examples**\n\n#### **Different Domo Instances**\n\n```json\n{\n  \"mcpServers\": {\n    \"domo-app-wiring\": {\n      \"command\": \"node\",\n      \"args\": [\"/path/to/domo-app-wiring-mcp/dist/index.js\"],\n      \"env\": {\n        \"NODE_ENV\": \"development\",\n        \"LOG_LEVEL\": \"info\",\n        \"MCP_PROJECT_DIR\": \"${workspaceFolder}\",\n        \"DOMO_INSTANCE\": \"your-company.domo.com\"\n      }\n    }\n  }\n}\n```\n\n#### **Development vs Production**\n\n```json\n{\n  \"mcpServers\": {\n    \"domo-app-wiring-dev\": {\n      \"command\": \"node\",\n      \"args\": [\"/path/to/domo-app-wiring-mcp/dist/index.js\"],\n      \"env\": {\n        \"NODE_ENV\": \"development\",\n        \"LOG_LEVEL\": \"debug\",\n        \"MCP_PROJECT_DIR\": \"${workspaceFolder}\",\n        \"DOMO_INSTANCE\": \"dev-instance.domo.com\"\n      }\n    },\n    \"domo-app-wiring-prod\": {\n      \"command\": \"node\",\n      \"args\": [\"/path/to/domo-app-wiring-mcp/dist/index.js\"],\n      \"env\": {\n        \"NODE_ENV\": \"production\",\n        \"LOG_LEVEL\": \"warn\",\n        \"MCP_PROJECT_DIR\": \"${workspaceFolder}\",\n        \"DOMO_INSTANCE\": \"your-company.domo.com\"\n      }\n    }\n  }\n}\n```\n\n## 🆕 **Recent Updates**\n\n### **Template-Based Architecture**\n\n- **Modular Templates**: Code generation now uses separate template files for easy maintenance\n- **Template Validation**: Comprehensive validation system ensures template correctness\n- **Easy Updates**: Templates can be updated independently without touching core logic\n\n### **Real Pagination Support**\n\n- **Server-Side Pagination**: Only loads current page data, not entire datasets\n- **Redux Integration**: Pagination state managed in Redux with actions and selectors\n- **Performance**: Handles large datasets efficiently with configurable page sizes\n- **User Experience**: Fast loading with responsive pagination controls\n\n### **Intelligent Naming**\n\n- **Content Analysis**: Analyzes dataset schema to generate descriptive aliases\n- **Pattern Recognition**: Identifies common patterns (users, products, orders, etc.)\n- **Fallback Logic**: Smart fallbacks for generic datasets\n- **Consistent Naming**: Uses aliases consistently across all generated files\n\n### **Enhanced Testing**\n\n- **Template Validation**: Validates all template files for correctness\n- **Unit Tests**: Comprehensive unit test coverage\n- **Integration Tests**: End-to-end testing of code generation\n- **CI/CD Ready**: Automated testing for continuous integration\n\n## 🔧 **Configuration**\n\n### **MCP Configuration (Recommended)**\n\nConfigure the server in your `cursor-mcp-config.json`. This approach is recommended because:\n\n- ✅ **Centralized Configuration**: All MCP server settings in one place\n- ✅ **Environment Isolation**: Each workspace can have different Domo instances\n- ✅ **No .env Files**: Eliminates the need for separate environment files\n- ✅ **Version Control Friendly**: Easy to share configuration across team members\n\n**⚠️ Important**: Use your company's Domo instance URL (e.g., `your-company.domo.com`), not `api.domo.com`. The public API uses different authentication methods.\n\n### **Authentication Methods**\n\n| Instance Type        | URL Format              | Authentication            | Use Case                                     |\n| -------------------- | ----------------------- | ------------------------- | -------------------------------------------- |\n| **Company Instance** | `your-company.domo.com` | Domo App Authentication   | ✅ **Use This** - For Domo apps and datasets |\n| **Public API**       | `api.domo.com`          | OAuth2 Client Credentials | ❌ **Don't Use** - Different auth method     |\n\n**Why Company Instance?**\n\n- ✅ Uses Domo's app authentication system\n- ✅ Access to your company's datasets and schemas\n- ✅ Compatible with Domo app development workflow\n- ✅ Supports the SQL API endpoints we use\n\n```json\n{\n  \"mcpServers\": {\n    \"domo-app-wiring\": {\n      \"command\": \"node\",\n      \"args\": [\"/path/to/domo-app-wiring-mcp/dist/index.js\"],\n      \"env\": {\n        \"NODE_ENV\": \"development\",\n        \"LOG_LEVEL\": \"info\",\n        \"MCP_PROJECT_DIR\": \"${workspaceFolder}\",\n        \"DOMO_INSTANCE\": \"your-company.domo.com\"\n      }\n    }\n  }\n}\n```\n\n### **Environment Variables**\n\n| Variable          | Description                           | Example                                      |\n| ----------------- | ------------------------------------- | -------------------------------------------- |\n| `DOMO_INSTANCE`   | Your Domo company instance URL        | `your-company.domo.com` (not `api.domo.com`) |\n| `LOG_LEVEL`       | Logging level                         | `debug`, `info`, `warn`, `error`             |\n| `MCP_PROJECT_DIR` | Project directory for generated files | `${workspaceFolder}`                         |\n| `NODE_ENV`        | Node environment                      | `development` or `production`                |\n\n### **Alternative: .env File**\n\nYou can also create a `.env` file in your project root:\n\n```bash\n# Domo instance\nDOMO_INSTANCE=your-instance.domo.com\n\n# Logging\nLOG_LEVEL=info\nNODE_ENV=development\n```\n\n## 📚 **Documentation**\n\n- [API Reference](docs/api-reference.md) - Complete API documentation\n- [Architecture](docs/architecture.md) - System architecture overview\n- [Development Guide](docs/development.md) - Development setup and guidelines\n- [Testing Guide](docs/testing-guide.md) - Testing strategies and examples\n- [Usage Examples](docs/usage-examples.md) - Real-world usage examples\n\n## 🤝 **Contributing**\n\n1. Fork the repository\n2. Create a feature branch\n3. Make your changes\n4. Add tests\n5. Submit a pull request\n\n## 📄 **License**\n\nMIT License - see [LICENSE](LICENSE) file for details.\n\n## 🆘 **Support**\n\n- **Issues**: [GitHub Issues](https://github.com/your-repo/issues)\n- **Documentation**: [docs/](docs/)\n- **Examples**: [examples/](examples/)\n\n---\n\n**_Built for Domo Apps with ❤️_**\n","readmeFilename":"README.md"}