@iress-oss/ids-mcp-server 6.0.0-alpha.3 → 6.0.0-alpha.30

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (118) hide show
  1. package/README.md +182 -6
  2. package/dist/componentHandlers.js +162 -2
  3. package/dist/componentHandlers.test.js +275 -0
  4. package/dist/iressHandlers.js +6 -0
  5. package/dist/iressHandlers.test.js +4 -0
  6. package/dist/searchHandlers.js +40 -59
  7. package/dist/searchHandlers.test.js +63 -96
  8. package/dist/stylingHandlers.integration.test.js +453 -0
  9. package/dist/stylingHandlers.js +161 -0
  10. package/dist/stylingHandlers.test.js +195 -0
  11. package/dist/tokenHandlers.js +323 -0
  12. package/dist/tokenHandlers.test.js +462 -0
  13. package/dist/toolHandler.js +7 -1
  14. package/dist/toolHandler.test.js +8 -4
  15. package/dist/tools.js +56 -5
  16. package/dist/utils.js +90 -4
  17. package/dist/utils.test.js +154 -1
  18. package/package.json +16 -12
  19. package/generated/docs/components_components-alert-docs.md +0 -1054
  20. package/generated/docs/components_components-autocomplete-docs.md +0 -3304
  21. package/generated/docs/components_components-autocomplete-recipes-docs.md +0 -105
  22. package/generated/docs/components_components-badge-docs.md +0 -312
  23. package/generated/docs/components_components-button-docs.md +0 -2341
  24. package/generated/docs/components_components-buttongroup-docs.md +0 -980
  25. package/generated/docs/components_components-card-docs.md +0 -1985
  26. package/generated/docs/components_components-checkbox-docs.md +0 -1083
  27. package/generated/docs/components_components-checkboxgroup-docs.md +0 -1597
  28. package/generated/docs/components_components-checkboxgroup-recipes-docs.md +0 -209
  29. package/generated/docs/components_components-col-docs.md +0 -755
  30. package/generated/docs/components_components-container-docs.md +0 -172
  31. package/generated/docs/components_components-divider-docs.md +0 -235
  32. package/generated/docs/components_components-expander-docs.md +0 -430
  33. package/generated/docs/components_components-field-docs.md +0 -3345
  34. package/generated/docs/components_components-filter-docs.md +0 -4091
  35. package/generated/docs/components_components-hide-docs.md +0 -450
  36. package/generated/docs/components_components-icon-docs.md +0 -1017
  37. package/generated/docs/components_components-image-docs.md +0 -168
  38. package/generated/docs/components_components-inline-docs.md +0 -1650
  39. package/generated/docs/components_components-input-docs.md +0 -1388
  40. package/generated/docs/components_components-input-recipes-docs.md +0 -349
  41. package/generated/docs/components_components-inputcurrency-docs.md +0 -636
  42. package/generated/docs/components_components-inputcurrency-recipes-docs.md +0 -211
  43. package/generated/docs/components_components-introduction-docs.md +0 -448
  44. package/generated/docs/components_components-label-docs.md +0 -229
  45. package/generated/docs/components_components-link-docs.md +0 -456
  46. package/generated/docs/components_components-menu-docs.md +0 -2219
  47. package/generated/docs/components_components-menu-menuitem-docs.md +0 -1455
  48. package/generated/docs/components_components-modal-docs.md +0 -2021
  49. package/generated/docs/components_components-panel-docs.md +0 -342
  50. package/generated/docs/components_components-placeholder-docs.md +0 -98
  51. package/generated/docs/components_components-popover-docs.md +0 -1633
  52. package/generated/docs/components_components-popover-recipes-docs.md +0 -539
  53. package/generated/docs/components_components-progress-docs.md +0 -128
  54. package/generated/docs/components_components-provider-docs.md +0 -123
  55. package/generated/docs/components_components-radio-docs.md +0 -499
  56. package/generated/docs/components_components-radiogroup-docs.md +0 -1573
  57. package/generated/docs/components_components-readonly-docs.md +0 -277
  58. package/generated/docs/components_components-richselect-docs.md +0 -6142
  59. package/generated/docs/components_components-row-docs.md +0 -1740
  60. package/generated/docs/components_components-select-docs.md +0 -1110
  61. package/generated/docs/components_components-skeleton-docs.md +0 -467
  62. package/generated/docs/components_components-skeleton-recipes-docs.md +0 -110
  63. package/generated/docs/components_components-skiplink-docs.md +0 -220
  64. package/generated/docs/components_components-slideout-docs.md +0 -1931
  65. package/generated/docs/components_components-slider-docs.md +0 -1284
  66. package/generated/docs/components_components-spinner-docs.md +0 -90
  67. package/generated/docs/components_components-stack-docs.md +0 -618
  68. package/generated/docs/components_components-table-docs.md +0 -4045
  69. package/generated/docs/components_components-tabset-docs.md +0 -955
  70. package/generated/docs/components_components-tabset-tab-docs.md +0 -342
  71. package/generated/docs/components_components-tag-docs.md +0 -419
  72. package/generated/docs/components_components-text-docs.md +0 -605
  73. package/generated/docs/components_components-toaster-docs.md +0 -451
  74. package/generated/docs/components_components-toggle-docs.md +0 -513
  75. package/generated/docs/components_components-tooltip-docs.md +0 -564
  76. package/generated/docs/components_components-validationmessage-docs.md +0 -608
  77. package/generated/docs/components_contact-us-docs.md +0 -9
  78. package/generated/docs/components_foundations-accessibility-docs.md +0 -33
  79. package/generated/docs/components_foundations-consistency-docs.md +0 -44
  80. package/generated/docs/components_foundations-content-docs.md +0 -18
  81. package/generated/docs/components_foundations-introduction-docs.md +0 -17
  82. package/generated/docs/components_foundations-principles-docs.md +0 -60
  83. package/generated/docs/components_foundations-responsive-layout-docs.md +0 -2693
  84. package/generated/docs/components_foundations-user-experience-docs.md +0 -53
  85. package/generated/docs/components_foundations-visual-design-docs.md +0 -39
  86. package/generated/docs/components_foundations-z-index-stacking-docs.md +0 -288
  87. package/generated/docs/components_frequently-asked-questions-docs.md +0 -44
  88. package/generated/docs/components_get-started-develop-docs.md +0 -47
  89. package/generated/docs/components_get-started-using-storybook-docs.md +0 -55
  90. package/generated/docs/components_introduction-docs.md +0 -85
  91. package/generated/docs/components_patterns-form-docs.md +0 -2493
  92. package/generated/docs/components_patterns-form-recipes-docs.md +0 -1722
  93. package/generated/docs/components_patterns-introduction-docs.md +0 -31
  94. package/generated/docs/components_patterns-loading-docs.md +0 -1989
  95. package/generated/docs/components_patterns-shadow-docs.md +0 -195
  96. package/generated/docs/components_resources-code-katas-docs.md +0 -25
  97. package/generated/docs/components_resources-introduction-docs.md +0 -28
  98. package/generated/docs/components_resources-mcp-server-docs.md +0 -23
  99. package/generated/docs/components_resources-migration-guides-from-v4-to-v5-docs.md +0 -250
  100. package/generated/docs/components_sandbox-docs.md +0 -226
  101. package/generated/docs/components_styling-props-colour-docs.md +0 -91
  102. package/generated/docs/components_styling-props-elevation-docs.md +0 -69
  103. package/generated/docs/components_styling-props-radius-docs.md +0 -63
  104. package/generated/docs/components_styling-props-reference-docs.md +0 -160
  105. package/generated/docs/components_styling-props-screen-readers-docs.md +0 -66
  106. package/generated/docs/components_styling-props-sizing-docs.md +0 -217
  107. package/generated/docs/components_styling-props-spacing-docs.md +0 -545
  108. package/generated/docs/components_styling-props-typography-docs.md +0 -66
  109. package/generated/docs/components_versions-docs.md +0 -14
  110. package/generated/docs/guidelines.md +0 -3084
  111. package/generated/docs/introduction-docs.md +0 -37
  112. package/generated/docs/tokens_colour-docs.md +0 -551
  113. package/generated/docs/tokens_elevation-docs.md +0 -39
  114. package/generated/docs/tokens_introduction-docs.md +0 -147
  115. package/generated/docs/tokens_radius-docs.md +0 -67
  116. package/generated/docs/tokens_sandbox-docs.md +0 -1
  117. package/generated/docs/tokens_spacing-docs.md +0 -57
  118. package/generated/docs/tokens_typography-docs.md +0 -347
package/README.md CHANGED
@@ -1,15 +1,17 @@
1
1
  # IDS Component Library MCP Server
2
2
 
3
+ > **āš ļø DEPRECATED** — This package is deprecated. AI context is now provided via static `.ai/` folders and `.agents/skills/` files in the repository. These deliver the same information without runtime dependencies, Playwright, or Storybook. See `packages/components/.ai/`, `packages/tokens/.ai/`, and `.agents/skills/` for the replacement.
4
+
3
5
  A Model Context Protocol (MCP) server specifically designed for the **Iress Design System (IDS)** component library. This server provides AI assistants and MCP clients with contextual information about IDS components, design tokens, usage patterns, and implementation details to help engineers build consistent user interfaces.
4
6
 
5
7
  ## Features
6
8
 
7
- - **Component Discovery**: Find IDS components by name or functionality
9
+ - **Component Discovery**: Find IDS components and patterns by name or functionality
8
10
  - **Props & API Reference**: Get detailed component prop information and usage examples
9
11
  - **Usage Examples**: Real-world React code examples and implementation patterns
10
12
  - **Design Tokens**: Access to IDS design tokens (colors, spacing, typography)
11
13
  - **Smart Search**: Search across all IDS documentation with context-aware results
12
- - **Categorized Resources**: Organized by Components, Foundations, and Resources
14
+ - **Categorized Resources**: Organized by Components, Patterns, Foundations, and Resources
13
15
  - **Engineer-Focused**: Tools designed specifically for UI development workflows
14
16
 
15
17
  ## Installation
@@ -54,18 +56,187 @@ For other MCP clients or manual configuration, use this server configuration:
54
56
 
55
57
  ## Available Tools
56
58
 
57
- 1. **find_component**: Find IDS components by name or functionality - perfect for component discovery
59
+ ### Component Discovery & Implementation
60
+
61
+ 1. **find_component**: Find IDS components and patterns by name or functionality - supports both components and patterns (e.g., IressForm, IressButton)
58
62
  2. **get_component_props**: Get detailed prop information and API reference for specific components
59
63
  3. **get_usage_examples**: Get real-world React code examples and implementation patterns
60
- 4. **search_ids_docs**: Search across all IDS documentation with context-aware results
61
- 5. **list_components**: List all available components organized by category
62
- 6. **get_design_tokens**: Access IDS design tokens (colors, spacing, typography, etc.)
64
+ 4. **get_iress_component_info**: Get comprehensive information about Iress components mentioned by their full name (e.g., IressButton, IressInput)
65
+ 5. **analyze_component_mentions**: Analyze text to find all Iress component mentions and provide information about each one
66
+
67
+ ### Design Tokens & Styling
68
+
69
+ 6. **get_design_tokens**: Access IDS design tokens (colors, spacing, typography, etc.) with token definitions and values
70
+ 7. **get_design_tokens_usage**: Get token usage examples, best practices, and anti-patterns with āœ… DO / āŒ DON'T examples
71
+ - Shows when to use tokens vs hardcoded values
72
+ - Demonstrates proper styling prop usage
73
+ - Includes accessibility guidelines for colors
74
+ - Covers spacing scale and directional props
75
+ - Explains IressText vs textStyle prop for typography
76
+ 8. **get_styling_props_reference**: Get comprehensive reference for IDS styling props including spacing, colors, typography, visual effects, and sizing
77
+ - Shows available props by category (spacing, colors, typography, visual, sizing, utility)
78
+ - Includes usage examples and token values
79
+ - Explains when to use style props vs iressCss() vs CSS-in-JS
80
+ - Provides component-specific styling guidance
81
+
82
+ ### Documentation & Guidelines
83
+
84
+ 9. **search_ids_docs**: Search across all IDS documentation with context-aware results
85
+ 10. **list_components**: List all available components organized by category
86
+ 11. **get_design_guidelines**: Get IDS design guidelines covering core principles, visual standards, and accessibility requirements
87
+
88
+ ## Design Token Usage Quick Start
89
+
90
+ The IDS MCP Server provides comprehensive guidance on using design tokens correctly:
91
+
92
+ ### Using `get_design_tokens_usage`
93
+
94
+ ```typescript
95
+ // Get color token usage examples
96
+ get_design_tokens_usage({ category: 'colors' });
97
+ // Returns: Semantic color tokens, āœ… DO/āŒ DON'T examples, accessibility guidelines
98
+
99
+ // Get spacing token usage examples
100
+ get_design_tokens_usage({ category: 'spacing' });
101
+ // Returns: Spacing scale (xs, sm, md, lg, xl), directional props, responsive patterns
102
+
103
+ // Get typography usage examples
104
+ get_design_tokens_usage({ category: 'typography' });
105
+ // Returns: IressText component usage, textStyle prop examples
106
+
107
+ // Get best practices and anti-patterns
108
+ get_design_tokens_usage({ category: 'best-practices' });
109
+ // Returns: When to use styling props vs iressCss() vs custom CSS, common mistakes
110
+
111
+ // Get all usage guidance
112
+ get_design_tokens_usage({ category: 'all' });
113
+ // Returns: Complete guide with all categories
114
+ ```
115
+
116
+ ### Best Practices for AI Code Generation
117
+
118
+ When generating code with the IDS component library:
119
+
120
+ 1. **Always use design tokens** instead of hardcoded values:
121
+ - āœ… `<IressPanel p="md" bg="colour.primary.fill">`
122
+ - āŒ `<IressPanel style={{ padding: '16px', backgroundColor: '#13213F' }}>`
123
+
124
+ 2. **Prefer styling props** over inline styles or custom CSS:
125
+ - āœ… `<IressPanel p="lg" color="colour.primary.text">`
126
+ - āŒ `<div className="custom-padding" style={{ color: '#000' }}>`
127
+
128
+ 3. **Use IressText** for text content (preferred over textStyle prop):
129
+ - āœ… `<IressText element="h1">Heading</IressText>`
130
+ - āŒ `<h1 style={{ fontSize: '24px' }}>Heading</h1>`
131
+
132
+ 4. **Pair bg and color props** for accessibility:
133
+ - āœ… `<IressPanel bg="colour.primary.fill" color="colour.primary.onFill">`
134
+ - āŒ `<IressPanel bg="colour.primary.fill">` (missing color)
135
+
136
+ 5. **For CSS-in-JS, use cssVars from @iress-oss/ids-tokens**:
137
+ - āœ… `background: ${cssVars.colour.primary.fill}; padding: ${cssVars.spacing[400]};`
138
+ - āŒ `background: '#13213F'; padding: '16px';`
139
+
140
+ Use `get_design_tokens_usage` to see practical examples and anti-patterns for each category.
141
+
142
+ ## Styling Props Quick Start
143
+
144
+ The IDS MCP Server provides comprehensive reference for using styling props across all components:
145
+
146
+ ### Using `get_styling_props_reference`
147
+
148
+ ```typescript
149
+ // Get all styling props documentation
150
+ get_styling_props_reference({ category: 'all' });
151
+ // Returns: Complete reference + styling approach decision guide
152
+
153
+ // Get spacing props (padding, margin, textAlign, stretch)
154
+ get_styling_props_reference({ category: 'spacing' });
155
+ // Returns: p, px, py, m, mx, my + token values
156
+
157
+ // Get color props
158
+ get_styling_props_reference({ category: 'colors' });
159
+ // Returns: bg, color props with semantic color tokens
160
+
161
+ // Get typography props
162
+ get_styling_props_reference({ category: 'typography' });
163
+ // Returns: textStyle prop usage
164
+
165
+ // Get visual props (elevation, radius)
166
+ get_styling_props_reference({ category: 'visual' });
167
+ // Returns: layerStyle, borderRadius, focusable props
168
+
169
+ // Get sizing props
170
+ get_styling_props_reference({ category: 'sizing' });
171
+ // Returns: width, maxWidth props
172
+
173
+ // Get utility props (screen readers, scrollable, responsive)
174
+ get_styling_props_reference({ category: 'utility' });
175
+ // Returns: hideFrom, hideBelow, srOnly, scrollable, noGutter props
176
+
177
+ // Get component-specific styling info
178
+ get_styling_props_reference({ component: 'IressButton' });
179
+ // Returns: Which styling props IressButton supports
180
+ ```
181
+
182
+ ### When to Use Different Styling Approaches
183
+
184
+ The `get_styling_props_reference` tool includes comprehensive best practices from the IDS documentation (see the "Best Practices" section in the reference docs):
185
+
186
+ 1. **Style Props (Recommended)**: Use on IDS components for type-safe, theme-compatible inline styles
187
+ - `<IressButton p="md" bg="colour.primary.fill">`
188
+
189
+ 2. **iressCss() Function**: Use on non-IDS elements to apply styling props anywhere
190
+ - `<div className={iressCss({ p: 'xs', bg: 'neutral.alt' })}>`
191
+
192
+ 3. **IressStyled Component**: Use when you need styled wrapper without creating a component
193
+ - `<IressStyled p="md" bg="alt"><YourContent /></IressStyled>`
194
+
195
+ 4. **CSS-in-JS with cssVars**: Use with CSS-in-JS libraries (styled-components, emotion, etc.)
196
+ - `background: ${cssVars.colour.primary.fill};`
197
+
198
+ 5. **Custom CSS**: Use for complex styling, animations, pseudo-selectors
199
+ - When styling props aren't sufficient
200
+
201
+ Use `get_styling_props_reference({ category: 'all' })` to see the complete reference including detailed best practices, decision guide with flowchart, common anti-patterns, and when to use each approach.
202
+
203
+ ### CSS-in-JS Usage
204
+
205
+ When using CSS-in-JS libraries (styled-components, emotion, vanilla-extract, etc.), always use the `cssVars` object from `@iress-oss/ids-tokens`:
206
+
207
+ ```typescript
208
+ import { cssVars } from '@iress-oss/ids-tokens';
209
+ import styled from 'styled-components';
210
+
211
+ // āœ… CORRECT - Using cssVars in CSS-in-JS
212
+ const StyledComponent = styled.div`
213
+ padding: ${cssVars.spacing[400]}; /* md - 16px */
214
+ background-color: ${cssVars.colour.primary.fill};
215
+ color: ${cssVars.colour.primary.onFill};
216
+ font-family: ${cssVars.typography.fontFamily.body};
217
+ `;
218
+
219
+ // āŒ INCORRECT - Hardcoded values
220
+ const BadComponent = styled.div`
221
+ padding: 16px;
222
+ background-color: #13213f;
223
+ `;
224
+ ```
225
+
226
+ **Available cssVars categories:**
227
+
228
+ - `cssVars.colour.*` - All color tokens (primary, neutral, system)
229
+ - `cssVars.spacing[*]` - Spacing scale (100, 200, 400, 600, 1200, etc.)
230
+ - `cssVars.typography.*` - Font families, sizes, weights, line heights
231
+ - `cssVars.radius[*]` - Border radius tokens
232
+ - `cssVars.elevation.*` - Shadow and elevation tokens
63
233
 
64
234
  ## Available Resources
65
235
 
66
236
  All IDS component documentation files are exposed as categorized resources:
67
237
 
68
238
  - **Components**: Button, Input, Table, Modal, etc. (`components-*-docs.md`)
239
+ - **Patterns**: Form, HookForm, etc. (`patterns-*-docs.md`)
69
240
  - **Foundations**: Colors, Typography, Spacing, etc. (`foundations-*-docs.md`)
70
241
  - **Resources**: Changelog, Guidelines, etc. (`resources-*-docs.md`)
71
242
 
@@ -81,6 +252,11 @@ The server works with the IDS component library documentation in the `generated/
81
252
  - `components-modal-docs.md` - IressModal component
82
253
  - `components-*-recipes-docs.md` - Usage patterns and recipes
83
254
 
255
+ **Patterns** (Composite patterns and workflows):
256
+
257
+ - `patterns-form-docs.md` - IressForm pattern
258
+ - `patterns-hookform-docs.md` - IressHookForm pattern
259
+
84
260
  **Foundations** (Guidelines and tokens):
85
261
 
86
262
  - `foundations-colours-docs.md` - Color palette and usage
@@ -3,7 +3,7 @@
3
3
  */
4
4
  import { z } from 'zod';
5
5
  import * as path from 'path';
6
- import { getMarkdownFiles, mapIressComponentToFile, extractIressComponents, readFileContent, } from './utils.js';
6
+ import { getMarkdownFiles, mapIressComponentToFile, extractIressComponents, readFileContent, parseMultiComponentQuery, } from './utils.js';
7
7
  import { DOCS_DIR } from './config.js';
8
8
  function checkIressComponentMatch(query) {
9
9
  if (query.startsWith('Iress')) {
@@ -44,6 +44,10 @@ function calculateRelevanceScore(file, content, query, lines) {
44
44
  // Lower relevance for content matches
45
45
  const contentMatches = content.toLowerCase().split(queryLower).length - 1;
46
46
  relevanceScore += contentMatches * 2;
47
+ // Boost pattern-based files as they're often searched for
48
+ if (file.startsWith('patterns-')) {
49
+ relevanceScore += 25;
50
+ }
47
51
  return relevanceScore;
48
52
  }
49
53
  function createSearchResult(file, relevanceScore, lines) {
@@ -60,12 +64,154 @@ function createSearchResult(file, relevanceScore, lines) {
60
64
  description: `${componentName}: ${description}`,
61
65
  };
62
66
  }
67
+ /**
68
+ * Categorize file as component, pattern, or foundation
69
+ */
70
+ function categorizeFile(filename) {
71
+ // New naming convention with namespace prefix
72
+ if (filename.startsWith('components_patterns-'))
73
+ return 'pattern';
74
+ if (filename.startsWith('components_foundations-'))
75
+ return 'foundation';
76
+ if (filename.startsWith('components_components-'))
77
+ return 'component';
78
+ // Legacy naming convention (without namespace prefix)
79
+ if (filename.startsWith('patterns-'))
80
+ return 'pattern';
81
+ if (filename.startsWith('foundations-'))
82
+ return 'foundation';
83
+ return 'component';
84
+ }
85
+ /**
86
+ * Extract description from documentation content
87
+ */
88
+ function extractDescription(lines) {
89
+ // Look for first paragraph after title
90
+ const descriptionStart = lines.findIndex((line) => (line.startsWith('##') && !line.startsWith('###')) ||
91
+ (line.trim().length > 50 && !line.startsWith('#')));
92
+ if (descriptionStart === -1)
93
+ return '';
94
+ return lines[descriptionStart]
95
+ .replace(/^#+\s*/, '')
96
+ .trim()
97
+ .slice(0, 200);
98
+ }
99
+ /**
100
+ * Format individual component summary
101
+ */
102
+ function formatComponentSummary(result) {
103
+ const typeEmoji = {
104
+ component: '🧩',
105
+ pattern: 'šŸ“',
106
+ foundation: 'šŸ—ļø',
107
+ };
108
+ const emoji = result.type ? typeEmoji[result.type] : 'šŸ“¦';
109
+ const typeLabel = result.type
110
+ ? result.type.charAt(0).toUpperCase() + result.type.slice(1)
111
+ : 'Unknown';
112
+ let output = `${emoji} **${result.component}**\n`;
113
+ output += `Type: ${typeLabel}\n`;
114
+ if (result.file) {
115
+ output += `File: ${result.file}\n`;
116
+ }
117
+ output += `\n${result.description}\n`;
118
+ if (result.content) {
119
+ const contentPreview = result.content.slice(0, 500);
120
+ output += `\n\`\`\`\n${contentPreview}${result.content.length > 500 ? '...' : ''}\n\`\`\`\n`;
121
+ }
122
+ return output;
123
+ }
124
+ /**
125
+ * Format search results for multiple components
126
+ */
127
+ function formatMultiComponentResults(results) {
128
+ const foundResults = results.filter((r) => r.found);
129
+ const notFoundResults = results.filter((r) => !r.found);
130
+ let output = '';
131
+ // Header summary
132
+ if (foundResults.length > 0) {
133
+ output += `Found ${foundResults.length} component${foundResults.length !== 1 ? 's' : ''}:\n\n`;
134
+ }
135
+ // Found components
136
+ for (const result of foundResults) {
137
+ output += formatComponentSummary(result);
138
+ output += '\n---\n\n';
139
+ }
140
+ // Not found components
141
+ if (notFoundResults.length > 0) {
142
+ output += `\nāŒ Not found (${notFoundResults.length}):\n`;
143
+ for (const result of notFoundResults) {
144
+ output += `- ${result.component}\n`;
145
+ }
146
+ }
147
+ return output.trim();
148
+ }
149
+ /**
150
+ * Search for multiple components and return combined results
151
+ */
152
+ function handleMultiComponentSearch(componentNames, category) {
153
+ const results = [];
154
+ for (const componentName of componentNames) {
155
+ // Map component to documentation file
156
+ const file = mapIressComponentToFile(componentName);
157
+ if (file) {
158
+ // Read and extract content
159
+ const filePath = path.join(DOCS_DIR, file);
160
+ const content = readFileContent(filePath);
161
+ const lines = content.split('\n');
162
+ // Extract metadata
163
+ const description = extractDescription(lines);
164
+ const type = categorizeFile(file);
165
+ // Apply category filter if provided
166
+ // Note: category uses plural form ('components'), type uses singular ('component')
167
+ const categoryMatchesType = (category === 'components' && type === 'component') ||
168
+ (category === 'foundations' && type === 'foundation') ||
169
+ (category === 'resources' && type === 'pattern'); // Patterns aren't in resources typically
170
+ if (category && !categoryMatchesType) {
171
+ // Skip components that don't match the category filter
172
+ continue;
173
+ }
174
+ results.push({
175
+ component: componentName,
176
+ found: true,
177
+ file,
178
+ type,
179
+ description,
180
+ content: content.slice(0, 1000), // First 1000 chars
181
+ });
182
+ }
183
+ else {
184
+ // Only add not-found components if no category filter, or always add them
185
+ results.push({
186
+ component: componentName,
187
+ found: false,
188
+ file: null,
189
+ type: null,
190
+ description: 'Component not found in documentation',
191
+ });
192
+ }
193
+ }
194
+ return {
195
+ content: [
196
+ {
197
+ type: 'text',
198
+ text: formatMultiComponentResults(results),
199
+ },
200
+ ],
201
+ };
202
+ }
63
203
  export function handleFindComponent(args) {
64
204
  const schema = z.object({
65
205
  query: z.string(),
66
206
  category: z.enum(['components', 'foundations', 'resources']).optional(),
67
207
  });
68
208
  const { query, category } = schema.parse(args);
209
+ // ENHANCEMENT: Detect multiple components
210
+ const componentNames = parseMultiComponentQuery(query);
211
+ if (componentNames.length > 1) {
212
+ // Multi-component search
213
+ return handleMultiComponentSearch(componentNames, category);
214
+ }
69
215
  // Check if query is an Iress component name
70
216
  const iressMatch = checkIressComponentMatch(query);
71
217
  if (iressMatch) {
@@ -179,11 +325,25 @@ export function handleGetComponentProps(args) {
179
325
  const filePath = path.join(DOCS_DIR, componentFile);
180
326
  const content = readFileContent(filePath);
181
327
  const propSections = extractPropSections(content);
328
+ // Most IDS components support styling props - add helpful token usage guidance
329
+ // We include the hint for all components since even components without full styling props
330
+ // often accept margin/padding props, and the guidance is beneficial for AI code generation
331
+ const tokenUsageHint = '\n\n---\n\n**šŸ’” Token Usage Tip**\n\n' +
332
+ 'Most IDS components support styling props that accept design tokens. ' +
333
+ 'Always prefer tokens over hardcoded values for consistency and theming support.\n\n' +
334
+ '**Common styling props:**\n' +
335
+ '- Spacing: `p="md"`, `m="lg"`, `px="sm"`, `py="xl"`\n' +
336
+ '- Colors: `bg="colour.primary.fill"`, `color="colour.primary.text"`\n' +
337
+ '- Typography: `textStyle="typography.heading.4"`\n' +
338
+ '- Layout: `maxWidth`, `width`, `textAlign`\n\n' +
339
+ 'āœ… **DO**: Use design tokens for consistency and theming\n' +
340
+ 'āŒ **DON\'T**: Use `style={{ padding: "16px" }}` or hardcoded colors\n\n' +
341
+ '*Use `get_design_tokens_usage` tool for complete token usage guidelines and best practices.*';
182
342
  return {
183
343
  content: [
184
344
  {
185
345
  type: 'text',
186
- text: `**${component} Component Props & API**\n\n${formatPropsResponse(propSections, content, componentFile)}`,
346
+ text: `**${component} Component Props & API**\n\n${formatPropsResponse(propSections, content, componentFile)}${tokenUsageHint}`,
187
347
  },
188
348
  ],
189
349
  };