adobe-xd-mcp
Version:
Model Context Protocol server for Adobe XD that enables AI-powered design capabilities
384 lines (358 loc) • 11.2 kB
JavaScript
/**
* Tools handler for Adobe XD MCP Server
* Provides AI-powered design tools for Adobe XD
*/
// Available design tools
const designTools = [
{
name: 'generate_website_design',
description: 'Generate a website design based on provided description',
parameters: {
type: 'object',
properties: {
description: {
type: 'string',
description: 'Detailed description of the website to generate'
},
style: {
type: 'string',
description: 'Design style (e.g., minimalist, corporate, creative)'
},
industry: {
type: 'string',
description: 'Target industry for the website'
},
colorScheme: {
type: 'string',
description: 'Preferred color scheme'
}
},
required: ['description']
}
},
{
name: 'create_logo',
description: 'Generate a logo design based on provided description',
parameters: {
type: 'object',
properties: {
companyName: {
type: 'string',
description: 'Name of the company or brand'
},
industry: {
type: 'string',
description: 'Industry or niche of the company'
},
description: {
type: 'string',
description: 'Description of the desired logo'
},
style: {
type: 'string',
description: 'Logo style (e.g., minimalist, vintage, modern)'
},
colorScheme: {
type: 'string',
description: 'Preferred color scheme'
}
},
required: ['companyName', 'description']
}
},
{
name: 'design_ui_component',
description: 'Generate a UI component based on provided specification',
parameters: {
type: 'object',
properties: {
componentType: {
type: 'string',
description: 'Type of component (e.g., button, card, navbar, form)'
},
description: {
type: 'string',
description: 'Detailed description of the component'
},
style: {
type: 'string',
description: 'Component style'
}
},
required: ['componentType', 'description']
}
},
{
name: 'suggest_color_palette',
description: 'Generate a harmonious color palette based on provided criteria',
parameters: {
type: 'object',
properties: {
baseColor: {
type: 'string',
description: 'Base color (hex, rgb, or name)'
},
mood: {
type: 'string',
description: 'Desired mood (e.g., energetic, calm, professional)'
},
numberOfColors: {
type: 'integer',
description: 'Number of colors in the palette'
}
},
required: ['mood']
}
},
{
name: 'create_design_system',
description: 'Generate a comprehensive design system',
parameters: {
type: 'object',
properties: {
brandName: {
type: 'string',
description: 'Name of the brand'
},
industry: {
type: 'string',
description: 'Industry or sector'
},
description: {
type: 'string',
description: 'Description of the brand and design goals'
},
style: {
type: 'string',
description: 'Preferred style'
}
},
required: ['brandName', 'description']
}
}
];
/**
* List all available design tools
* @returns {Array} Array of tool definitions
*/
async function listTools() {
return designTools;
}
/**
* Execute a specific design tool
* @param {string} name - Name of the tool to execute
* @param {Object} parameters - Tool parameters
* @returns {Object} Tool execution result
*/
async function executeTool(name, parameters) {
switch (name) {
case 'generate_website_design':
return await generateWebsiteDesign(parameters);
case 'create_logo':
return await createLogo(parameters);
case 'design_ui_component':
return await designUIComponent(parameters);
case 'suggest_color_palette':
return await suggestColorPalette(parameters);
case 'create_design_system':
return await createDesignSystem(parameters);
default:
throw new Error(`Unknown tool: ${name}`);
}
}
/**
* Generate a website design
* @param {Object} parameters - Website design parameters
* @returns {Object} Generated design data
*/
async function generateWebsiteDesign(parameters) {
try {
// Return a structured object with specifications that the client-side AI agent
// from Windsurf/Cursor can use to generate the actual design
const designRequest = {
type: 'website_design',
description: parameters.description,
style: parameters.style || 'Not specified',
industry: parameters.industry || 'Not specified',
colorScheme: parameters.colorScheme || 'Not specified',
timestamp: new Date().toISOString()
};
return {
design: {
designRequest: designRequest,
instructions: `
Please generate a website design based on the following specifications:
Description: ${parameters.description}
Style: ${parameters.style || 'Not specified'}
Industry: ${parameters.industry || 'Not specified'}
Color Scheme: ${parameters.colorScheme || 'Not specified'}
The design should include:
- Layout structure
- Color palette (with specific hex codes)
- Typography recommendations
- Component styles
- Visual elements
- Key interactions
`
}
};
} catch (error) {
console.error('Error generating website design:', error);
throw new Error(`Failed to generate website design: ${error.message}`);
}
}
/**
* Create a logo design
* @param {Object} parameters - Logo design parameters
* @returns {Object} Generated logo data
*/
async function createLogo(parameters) {
try {
const designRequest = {
type: 'logo_design',
companyName: parameters.companyName,
industry: parameters.industry || 'Not specified',
description: parameters.description,
style: parameters.style || 'Not specified',
colorScheme: parameters.colorScheme || 'Not specified',
timestamp: new Date().toISOString()
};
return {
logo: {
designRequest: designRequest,
instructions: `
Please generate a logo design for:
Company Name: ${parameters.companyName}
Industry: ${parameters.industry || 'Not specified'}
Description: ${parameters.description}
Style: ${parameters.style || 'Not specified'}
Color Scheme: ${parameters.colorScheme || 'Not specified'}
The logo design should include:
- Visual elements
- Typography
- Color palette (with specific hex codes)
- Symbolism and meaning
- Variations (if applicable)
`
}
};
} catch (error) {
console.error('Error creating logo:', error);
throw new Error(`Failed to create logo: ${error.message}`);
}
}
/**
* Design a UI component
* @param {Object} parameters - UI component parameters
* @returns {Object} Generated component data
*/
async function designUIComponent(parameters) {
try {
const designRequest = {
type: 'ui_component',
componentType: parameters.componentType,
description: parameters.description,
style: parameters.style || 'Not specified',
timestamp: new Date().toISOString()
};
return {
component: {
type: parameters.componentType,
designRequest: designRequest,
instructions: `
Please design a ${parameters.componentType} UI component with:
Description: ${parameters.description}
Style: ${parameters.style || 'Not specified'}
The component design should include:
- Visual appearance
- Interactions and states
- Colors and typography
- Dimensions and spacing
- Accessibility considerations
`
}
};
} catch (error) {
console.error('Error designing UI component:', error);
throw new Error(`Failed to design UI component: ${error.message}`);
}
}
/**
* Generate a color palette
* @param {Object} parameters - Color palette parameters
* @returns {Object} Generated color palette
*/
async function suggestColorPalette(parameters) {
try {
const designRequest = {
type: 'color_palette',
baseColor: parameters.baseColor || 'Not specified',
mood: parameters.mood,
numberOfColors: parameters.numberOfColors || 5,
timestamp: new Date().toISOString()
};
return {
colorPalette: {
designRequest: designRequest,
instructions: `
Please generate a harmonious color palette with:
Base Color: ${parameters.baseColor || 'Not specified, please select an appropriate starting color'}
Mood: ${parameters.mood}
Number of Colors: ${parameters.numberOfColors || 5}
For each color, please provide:
- Hex color code
- A description of the color
- How it should be used in a design system
- Accessibility notes (contrast considerations)
`
}
};
} catch (error) {
console.error('Error suggesting color palette:', error);
throw new Error(`Failed to suggest color palette: ${error.message}`);
}
}
/**
* Create a design system
* @param {Object} parameters - Design system parameters
* @returns {Object} Generated design system data
*/
async function createDesignSystem(parameters) {
try {
const designRequest = {
type: 'design_system',
brandName: parameters.brandName,
industry: parameters.industry || 'Not specified',
description: parameters.description,
style: parameters.style || 'Not specified',
timestamp: new Date().toISOString()
};
return {
designSystem: {
designRequest: designRequest,
instructions: `
Please generate a comprehensive design system for:
Brand Name: ${parameters.brandName}
Industry: ${parameters.industry || 'Not specified'}
Description: ${parameters.description}
Style: ${parameters.style || 'Not specified'}
The design system should include:
- Color palette (primary, secondary, accent colors with hex codes)
- Typography (font families, sizes, weights)
- Spacing system
- Component styles (buttons, inputs, cards, etc.)
- Iconography approach
- Grid system
- Design principles
`
}
};
} catch (error) {
console.error('Error creating design system:', error);
throw new Error(`Failed to create design system: ${error.message}`);
}
}
module.exports = {
listTools,
executeTool
};