@progress/kendo-react-mcp 1.1.1 → 1.1.3

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.
package/README.md CHANGED
@@ -85,24 +85,17 @@ To [enable the Kendo React MCP server in a specific workspace](https://code.visu
85
85
 
86
86
  ## Usage
87
87
 
88
- To use the Kendo React MCP server:
89
-
90
- 1. Start your prompt with one of the following:
91
- * `kendo`
92
- * `/kendo`
93
- * `@kendo`
94
- * `kendoreact`
95
- * `/kendoreact`
96
- * `@kendoreact`
97
-
98
- Or if you are using VSCode you can type `#kendo_react_assistant` to make sure the Copilot chat will call the Kendo React MCP server.
99
-
100
- 1. Confirm that the Kendo React MCP server is used, because this doesn't happen deterministically. Look for a statement in the output, which is similar to:
88
+ To use the KendoReact MCP server:
89
+
90
+ 1. Start your prompt with `#kendo-react-assistant` (the MCP server name configured in the mcp.json file).
91
+ 1. Inspect the output and verify that the KendoReact MCP Server is used. Look for a statement in the output, which is similar to:
101
92
  * `Running kendo-react-assistant` (in VS Code)
102
93
  * `Calling MCP tool kendo-react-assistant` (in Cursor)
103
94
 
104
- If the Kendo React MCP server is not used even though it's installed and enabled, then try rephrasing your prompt and use another trigger syntax from the list in step 1.
105
- 1. Grant the Kendo React MCP sewrver a permission to run for this session, workspace, or always.
106
- 1. If you want to prompt for information or code that are not related to your previous prompts, it is a good practice to start a new session in a new chat window, so that the context is not polluted by irrelevant old information.
95
+ If the KendoReact MCP server is not used even though it's installed and enabled, double-check the server name in your configuration and try rephrasing your prompt.
96
+ 1. If requested, grant the KendoReact MCP server a permission to run for this session, workspace, or always.
97
+
98
+ Also check the general [AI Coding Assistant Recommendations](slug:ai-overview#recommendations) for more usage tips.
99
+
100
+ To increase the probability of the KendoReact MCP Server being used, or to call it without the need to mention "kendo" explicitly, add custom idea instructions to your AI-powered tool. Here are examples for [GitHub Copilot](https://docs.github.com/en/copilot/customizing-copilot/adding-repository-custom-instructions-for-github-copilot#about-repository-custom-instructions-for-github-copilot-chat) and [Cursor](https://docs.cursor.com/context/rules).
107
101
 
108
- To increase the probability of the Kendo React MCP Server being used, or to call it without the need to mention "kendo" explicitly, add custom idea instructions to your AI-powered tool. Here are examples for [GitHub Copilot](https://docs.github.com/en/copilot/customizing-copilot/adding-repository-custom-instructions-for-github-copilot#about-repository-custom-instructions-for-github-copilot-chat) and [Cursor](https://docs.cursor.com/context/rules).
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
- var D=Object.defineProperty;var _=(e,r,o)=>r in e?D(e,r,{enumerable:!0,configurable:!0,writable:!0,value:o}):e[r]=o;var u=(e,r,o)=>_(e,typeof r!="symbol"?r+"":r,o);import{McpServer as M}from"@modelcontextprotocol/sdk/server/mcp.js";import{StdioServerTransport as O}from"@modelcontextprotocol/sdk/server/stdio.js";import{z as k}from"zod";var h="Kendo UI for React",g="react",S=["ActionSheet","AIPrompt","Animation","AppBar","ArcGauge","AutoComplete","Avatar","Badge","Barcode","BottomNavigation","Breadcrumb","Button","ButtonGroup","Calendar","Card","Chart","ChartWizard","Chat","Checkbox","Chip","ChipList","ChunkProgressBar","CircularGauge","ColorGradient","ColorPalette","ColorPicker","ComboBox","ContextMenu","ConversationalUI","DataGrid","Grid","DataQuery","DateMath","DateInput","DatePicker","DateRangePicker","DateTimePicker","Dialog","Drag&Drop","Drawer","Drawing","DropDownButton","DropDownList","DropDownTree","Editor","Error","ExcelExport","ExpansionPanel","ExternalDropZone","FileSaver","FileManager","Filter","FlatColorPicker","FloatingActionButton","FloatingLabel","FontIcon","Form","Gantt","Gauge","General","GridLayout","Hint","InlineAIPrompt","Input","Label","LinearGauge","ListBox","ListView","Loader","Map","MaskedTextBox","Menu","MultiColumnComboBox","MultiSelect","MultiSelectTree","MultiViewCalendar","Notification","NumericTextBox","OrgChart","PageTemplates/BuildingBlocks","Pager","PanelBar","PDFProcessing","PDFViewer","PivotGrid","Popover","Popup","ProgressBar","QRCode","RadialGauge","RadioButton","RadioGroup","RangeSlider","Rating","Ripple","Sankey","Scheduler","ScrollView","Signature","Skeleton","Slider","Sortable","Sparkline","SpeechToTextButton","SplitButton","Splitter","Spreadsheet","StackLayout","Stepper","StockChart","SVGIcon","Switch","TabStrip","TaskBoard","TextArea","TextBox","TileLayout","Timeline","TimePicker","Toolbar","Tooltip","TreeList","TreeView","Typography","Upload","VSCodeExtension","Window"];import{dirname as N,join as B}from"path";import{fileURLToPath as G}from"url";import{readFileSync as L}from"node:fs";import a from"node:fs";import p from"node:path";import U from"@grpc/proto-loader";import l from"@grpc/grpc-js";var E=["TELERIK_LICENSE","KENDO_UI_LICENSE"],y="TELERIK_LICENSE_PATH",c=(e=>(e[e.UNAUTHENTICATED=16]="UNAUTHENTICATED",e[e.RESOURCE_EXHAUSTED=8]="RESOURCE_EXHAUSTED",e[e.PERMISSION_DENIED=7]="PERMISSION_DENIED",e))(c||{}),v=!1,i=process.env.DEBUG_LOG_FILE,x=!!(i&&typeof i=="string");if(x){let e=p.resolve(i),r=p.dirname(e);if(r!=="."&&r!==process.cwd()&&!a.existsSync(r))try{a.mkdirSync(r,{recursive:!0})}catch(o){console.error("Error creating log directory:",o)}if(!a.existsSync(e))try{a.writeFileSync(e,"")}catch(o){console.error("Error creating log file:",o)}}v=x&&!!i&&a.existsSync(p.resolve(i));function n(...e){if(v&&i){let r=`${new Date().toISOString()}: ${e.join(" ")}
3
- `,o=p.resolve(i);a.appendFile(o,r,t=>{t&&console.error("Error writing to log file:",t)})}}var s=process.env[y],m=process.env[E[0]]||process.env[E[1]],d=class extends Error{constructor(e){super(e),this.name="LicenseError"}};function R(){if(!s&&!m)throw new d(`No license found. Please set one of the following environment variables: ${E.join(", ")} or ${y}`);let e;if(s)try{e=L(s,"utf8"),n("License key read from file: ",s)}catch{throw new d(`Error reading license file: ${s}. Please verify the file exists and is readable.`)}return m&&(e=m,n("License key read from environment variable.")),e}var C=class{constructor(e,r){u(this,"client");u(this,"isDev");this.contextApiUrl=e,this.protoPath=r;let o=U.loadSync(this.protoPath,{keepCase:!0,longs:String,enums:String,defaults:!0,oneofs:!0});this.isDev=this.contextApiUrl?.includes("localhost")||this.contextApiUrl?.includes("127.0.0.1"),n("Using ContextApi URl:",this.contextApiUrl);let t=l.loadPackageDefinition(o);this.client=new t.ContextQueryService(this.contextApiUrl||"contextapi.telerik.com:443",this.isDev?l.credentials.createInsecure():l.credentials.createSsl())}async query(e){let r=this.isDev?"fake_license":R(),o=new l.Metadata;if(r&&typeof r=="string"){r=r.replace(/^\uFEFF/,"");try{o.add("x-license-key",r)}catch(t){return n("Error adding license key to metadata:",t),Promise.reject(new Error(`Failed to use license key: ${t.message}`))}}return r&&typeof r=="string"&&o.add("x-license-key",r),new Promise((t,I)=>{this.client.query(e,o,(f,A)=>{f?I(f):t(A)})})}};var b=B(N(G(import.meta.url)),"../proto/service.proto"),F=new C("contextapi.telerik.com:443",b);async function T(e){return F.query(e)}import q from"fs";import w from"path";import{fileURLToPath as V}from"url";var H=V(import.meta.url),$=w.dirname(H),K=w.resolve($,"../package.json"),J=JSON.parse(q.readFileSync(K,"utf-8")),P=new M({name:"kendo-and-kendo-resources",version:J.version});P.tool("kendo_react_assistant",`Answers questions and retrieves documentation about Kendo UI for React.
2
+ var G=Object.defineProperty;var D=(e,t,r)=>t in e?G(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r;var h=(e,t,r)=>D(e,typeof t!="symbol"?t+"":t,r);import{McpServer as M}from"@modelcontextprotocol/sdk/server/mcp.js";import{StdioServerTransport as O}from"@modelcontextprotocol/sdk/server/stdio.js";import{z as k}from"zod";var A="Kendo UI for React",C="react",f=["ActionSheet","AIPrompt","Animation","AppBar","ArcGauge","AutoComplete","Avatar","Badge","Barcode","BottomNavigation","Breadcrumb","Button","ButtonGroup","Calendar","Card","Chart","ChartWizard","Chat","Checkbox","Chip","ChipList","ChunkProgressBar","CircularGauge","ColorGradient","ColorPalette","ColorPicker","ComboBox","ContextMenu","ConversationalUI","DataGrid","Grid","DataQuery","DateMath","DateInput","DatePicker","DateRangePicker","DateTimePicker","Dialog","Drag&Drop","Drawer","Drawing","DropDownButton","DropDownList","DropDownTree","Editor","Error","ExcelExport","ExpansionPanel","ExternalDropZone","FileSaver","FileManager","Filter","FlatColorPicker","FloatingActionButton","FloatingLabel","FontIcon","Form","Gantt","Gauge","General","GridLayout","Hint","InlineAIPrompt","Input","Label","LinearGauge","ListBox","ListView","Loader","Map","MaskedTextBox","Menu","MultiColumnComboBox","MultiSelect","MultiSelectTree","MultiViewCalendar","Notification","NumericTextBox","OrgChart","PageTemplates/BuildingBlocks","Pager","PanelBar","PDFProcessing","PDFViewer","PivotGrid","Popover","Popup","ProgressBar","QRCode","RadialGauge","RadioButton","RadioGroup","RangeSlider","Rating","Ripple","Sankey","Scheduler","ScrollView","Signature","Skeleton","Slider","Sortable","Sparkline","SpeechToTextButton","SplitButton","Splitter","Spreadsheet","StackLayout","Stepper","StockChart","SVGIcon","Switch","TabStrip","TaskBoard","TextArea","TextBox","TileLayout","Timeline","TimePicker","Toolbar","Tooltip","TreeList","TreeView","Typography","Upload","VSCodeExtension","Window"];import{dirname as L,join as U}from"path";import{fileURLToPath as F}from"url";import{readFileSync as R}from"node:fs";import a from"node:fs";import m from"node:path";import _ from"@grpc/proto-loader";import u from"@grpc/grpc-js";var w=["TELERIK_LICENSE","KENDO_UI_LICENSE"],I="TELERIK_LICENSE_PATH",l=(e=>(e[e.UNAUTHENTICATED=16]="UNAUTHENTICATED",e[e.RESOURCE_EXHAUSTED=8]="RESOURCE_EXHAUSTED",e[e.PERMISSION_DENIED=7]="PERMISSION_DENIED",e))(l||{}),E=!1,n=process.env.DEBUG_LOG_FILE,v=!!(n&&typeof n=="string");if(v){let e=m.resolve(n),t=m.dirname(e);if(t!=="."&&t!==process.cwd()&&!a.existsSync(t))try{a.mkdirSync(t,{recursive:!0})}catch(r){console.error("Error creating log directory:",r)}if(!a.existsSync(e))try{a.writeFileSync(e,"")}catch(r){console.error("Error creating log file:",r)}}else E=!1;E=v&&!!n&&a.existsSync(m.resolve(n));function i(...e){if(E&&n){let t=`${new Date().toISOString()}: ${e.join(" ")}
3
+ `,r=m.resolve(n);a.appendFile(r,t,o=>{o&&console.error("Error writing to log file:",o)})}}var s=process.env[I],y=process.env[w[0]]||process.env[w[1]],g=class extends Error{constructor(e){super(e),this.name="LicenseError"}};function P(){if(!s&&!y)throw new g(`No license found. Please set one of the following environment variables: ${w.join(", ")} or ${I}`);let e;if(s)try{e=R(s,"utf8"),i("License key read from file: ",s)}catch{throw new g(`Error reading license file: ${s}. Please verify the file exists and is readable.`)}return y&&(e=y,i("License key read from environment variable.")),e}var S=class{constructor(e,t){h(this,"client");h(this,"isDev");this.contextApiUrl=e,this.protoPath=t;let r=_.loadSync(this.protoPath,{keepCase:!0,longs:String,enums:String,defaults:!0,oneofs:!0});this.isDev=this.contextApiUrl?.includes("localhost")||this.contextApiUrl?.includes("127.0.0.1"),i("Using ContextApi URl:",this.contextApiUrl);let o=u.loadPackageDefinition(r);this.client=new o.ContextQueryService(this.contextApiUrl||"contextapi.telerik.com:443",this.isDev?u.credentials.createInsecure():u.credentials.createSsl())}async query(e){let t=this.isDev?"fake_license":P(),r=new u.Metadata;if(t&&typeof t=="string"){t=t.replace(/^\uFEFF/,"");try{r.add("x-license-key",t)}catch(o){return i("Error adding license key to metadata:",o),Promise.reject(new Error(`Failed to use license key: ${o.message}`))}}return t&&typeof t=="string"&&r.add("x-license-key",t),new Promise((o,d)=>{this.client.query(e,r,(c,p)=>{c?d(c):o(p)})})}};var N=U(L(F(import.meta.url)),"../proto/service.proto"),B=new S("contextapi.telerik.com:443",N);async function T(e){return B.query(e)}import V from"fs";import x from"path";import{fileURLToPath as q}from"url";var K=q(import.meta.url),H=x.dirname(K),j=x.resolve(H,"../package.json"),$=JSON.parse(V.readFileSync(j,"utf-8")),b=new M({name:"kendo-and-kendo-resources",version:$.version});b.tool("kendo_react_assistant",`Answers questions and retrieves documentation about Kendo UI for React.
4
4
  Use this tool when the user asks about Kendo UI for React features, specific components (e.g., Grid, Chart, Editor), implementation details, or general usage.
5
5
  Provide the user's detailed question as the 'query'. If the question pertains to a specific Kendo UI for React component,
6
6
  specify its name in the 'component' parameter. This tool can be automatically triggered when the following phrases are detected in the user's input/prompt:
@@ -12,8 +12,141 @@ specify its name in the 'component' parameter. This tool can be automatically tr
12
12
  - '@kendo';
13
13
  - '@kendoreact';
14
14
  - '@ask_kendo';
15
- - '@help_kendo'.`,{query:k.string().describe("The query to search for."),component:k.enum(S).describe("The component to search for. If not specified, you can use General.")},async({query:e,component:r})=>{n("Calling tool: ",JSON.stringify({query:e,component:r})),r==="Grid"&&(r="DataGrid");try{let o=await T({query:e,component:r.toLocaleLowerCase(),lib_name:g,text_matches_count:3,code_matches_count:0,allowed_types:["documentation"]});n("Response from context API: ",JSON.stringify(o));let t=[{type:"text",text:o.values.join(`
15
+ - '@help_kendo'.`,{query:k.string().describe("The query to search for."),component:k.enum(f).describe("The component to search for. If not specified, you can use General.")},async({query:e,component:t})=>{i("Calling tool: ",JSON.stringify({query:e,component:t})),t==="Grid"&&(t="DataGrid");try{let r=await T({query:e,component:t.toLocaleLowerCase(),lib_name:C,text_matches_count:3,code_matches_count:0,allowed_types:["documentation"]});i("Response from context API: ",JSON.stringify(r));let o=J(),d=r.values.join(`
16
16
 
17
- `)}];return n("Response from tool: ",JSON.stringify(t)),{content:t}}catch(o){throw n("Error calling context API: ",JSON.stringify(o)),o?.code===c.UNAUTHENTICATED?new Error("Error: You are not authenticated. Please verify the Telerik License Key provided is valid."):o?.code===c.RESOURCE_EXHAUSTED?new Error(`Error: You have exceeded the extension quota. Upgrade to subscription licensing in order to unlock full access. Message: ${o.message}.`):o?.code===c.PERMISSION_DENIED?new Error(`Error: You do not have permission to access this resource. Please verify that you have a valid ${h} license key.`):o instanceof d?(n("License error: ",o.message),o):new Error(`Error: An error occurred while calling the service. Please try again later.
17
+ `),c=d.trim(),p=[{type:"text",text:d+(c?`
18
18
 
19
- Error Message: ${o.message}`)}});async function j(){let e=new O;n("Starting server..."),await P.connect(e)}j();
19
+ `+o:"")}];return i("Response from tool: ",JSON.stringify(p)),{content:p}}catch(r){throw i("Error calling context API: ",JSON.stringify(r)),r?.code===l.UNAUTHENTICATED?new Error("Error: You are not authenticated. Please verify the Telerik License Key provided is valid."):r?.code===l.RESOURCE_EXHAUSTED?new Error(`Error: You have exceeded the extension quota. Upgrade to subscription licensing in order to unlock full access. Message: ${r.message}.`):r?.code===l.PERMISSION_DENIED?new Error(`Error: You do not have permission to access this resource. Please verify that you have a valid ${A} license key.`):r instanceof g?(i("License error: ",r.message),r):new Error(`Error: An error occurred while calling the service. Please try again later.
20
+
21
+ Error Message: ${r.message}`)}});function J(){return`
22
+ ## Available ReactComponent enum values:
23
+ ${f.join(", ")}
24
+
25
+ ## Rules
26
+ When generating code, explanations, or refactorings, always follow these rules:
27
+
28
+ 1. Component Awareness
29
+ Whenever a component name is mentioned\u2014regardless of how it's written (all lowercase, all uppercase, mixed case, separate words, or even with typos)\u2014you should always look up the correct example from the corresponding component.
30
+
31
+ Key points:
32
+ - Match component names case-insensitively and robustly to minor variations
33
+ - If someone refers to a component (e.g., "button", "BUTTON", "BuTtOn"), match it to the correct component (Button)
34
+ - After matching, use the example or information associated with that component
35
+ - The matching should be case-insensitive and robust to minor variations
36
+
37
+ Example: If someone asks about "grid", "GRID", or "GrId", you always refer to DataGrid for the example.
38
+
39
+ Gotcha:
40
+ Don't just use the word as given\u2014always normalize it and check the component to avoid mistakes or mismatches.
41
+
42
+ 2. Links Awareness
43
+ When providing links or references to documentation, always use links from the https://www.telerik.com/kendo-react-ui domain. Avoid using slug syntax like { slug overview } or any placeholder syntax. Instead, provide complete, direct URLs that users can immediately navigate to.
44
+
45
+ Key points:
46
+ - Use only https://www.telerik.com/kendo-react-ui domain for Kendo React UI documentation links
47
+ - Provide complete URLs, not slug placeholders
48
+ - Ensure links are directly accessible and functional
49
+ - Avoid any template or placeholder syntax in URLs
50
+
51
+ Example:
52
+ \u2705 Correct: https://www.telerik.com/kendo-react-ui/components/grid/
53
+ \u274C Incorrect: { slug overview } or /components/{component-name}/overview
54
+
55
+ 3. Editor Tools Awareness
56
+ For Editor component cases, always use the proper EditorTools import structure and never define tools as strings. Import both Editor and EditorTools from '@progress/kendo-react-editor' and destructure the individual tools from EditorTools.
57
+
58
+ Required pattern:
59
+ \`\`\`jsx
60
+ import { Editor, EditorTools } from '@progress/kendo-react-editor';
61
+
62
+ const {
63
+ Bold, Italic, Underline, Strikethrough,
64
+ Subscript, Superscript, ForeColor, BackColor,
65
+ CleanFormatting, AlignLeft, AlignCenter, AlignRight, AlignJustify,
66
+ Indent, Outdent, OrderedList, UnorderedList,
67
+ NumberedList, BulletedList, Undo, Redo,
68
+ FontSize, FontName, FormatBlock, Link, Unlink,
69
+ InsertImage, ViewHtml, InsertTable, InsertFile,
70
+ SelectAll, Print, Pdf, TableProperties, TableCellProperties,
71
+ AddRowBefore, AddRowAfter, AddColumnBefore, AddColumnAfter,
72
+ DeleteRow, DeleteColumn, DeleteTable, MergeCells, SplitCell
73
+ } = EditorTools;
74
+ \`\`\`
75
+
76
+ Key points:
77
+ - Always import both Editor and EditorTools from '@progress/kendo-react-editor'
78
+ - Destructure individual tools from EditorTools object
79
+ - Use the destructured tool references directly in the tools array
80
+ - Never define tools as strings (e.g., 'bold', 'italic')
81
+ - Group related tools in sub-arrays for better organization
82
+
83
+ Example:
84
+ \u2705 Correct: tools={[[Bold, Italic, Underline], [AlignLeft, AlignCenter]]}
85
+ \u274C Incorrect: tools={[['bold', 'italic', 'underline'], ['alignLeft', 'alignCenter']]}
86
+
87
+ 4. DataGrid Deprecated Properties Awareness
88
+ For DataGrid component cases, avoid using deprecated properties and always use their modern replacements. The following properties are deprecated and should not be used:
89
+
90
+ Deprecated properties and their modern replacements:
91
+ - selectedField \u2192 use the select state property
92
+ - editField \u2192 use the edit state property
93
+ - expandedField \u2192 use the detailExpand state property
94
+ - onExpandChange \u2192 use onDetailExpandChange for detail-row expansion or onGroupExpandChange for group expansion
95
+ - cellRender \u2192 use the cells={{ data: CustomCell }} prop
96
+ - rowRender \u2192 use the rows={{ data: CustomRow }} prop
97
+ - filterCellRender \u2192 use the cells={{ filterCell: CustomCell }} prop
98
+ - headerCellRender \u2192 use the cells={{ headerCell: CustomHeaderCell }} prop
99
+ - column.cell \u2192 use the column.cells={{ data: CustomCell }} prop
100
+ - column.headerCell \u2192 use the column.cells={{ headerCell: CustomHeaderCell }} prop
101
+ - column.filterCell \u2192 use the column.cells={{ filterCell: CustomCell }} prop
102
+ - column.footerCell \u2192 use the column.cells={{ footerCell: CustomFooterCell }} prop
103
+
104
+ Additional modern updates:
105
+ - Input component in Column Menu Filter has been replaced with Textbox
106
+ - scrollable prop now defaults to virtual
107
+ - Virtual scrolling no longer applies height by default
108
+
109
+ Key points:
110
+ - Never suggest or use these deprecated properties in DataGrid examples
111
+ - Always provide modern alternatives when users ask about these properties
112
+ - Explain that these properties are deprecated and provide the specific modern replacement
113
+ - Focus on current DataGrid API patterns using state properties and cells/rows props
114
+
115
+ Example:
116
+ \u274C Deprecated: selectedField="isSelected" editField="inEdit"
117
+ \u2705 Modern: Use select and edit state properties with proper configuration
118
+
119
+ 5. Smart Grid (AI-Enhanced Grid) Implementation Guidelines
120
+ **CRITICAL: When users ask about ANY of these AI grid terms, ALWAYS provide GridToolbarAIAssistant implementation (not basic Grid):**
121
+
122
+ **Primary AI Grid Trigger Terms (case-insensitive):**
123
+ - smart grid, smartgrid, smart-grid, smart_grid, SMART GRID, SmArt GrId
124
+ - ai grid, aigrid, ai-grid, ai_grid, AI GRID, aI-griD, AIGrid
125
+ - ai enhanced grid, ai-enhanced-grid, ai_enhanced_grid, AI Enhanced Grid
126
+ - ai powered grid, ai-powered-grid, ai_powered_grid, AI Powered Grid
127
+ - intelligent grid, intelligent-grid, intelligent_grid, Intelligent Grid
128
+ - grid with ai, grid-with-ai, grid_with_ai, Grid with AI
129
+ - grid ai assistant, gridaiassistant, grid-ai-assistant, Grid AI Assistant
130
+ - grid toolbar ai assistant, gridtoolbaraiassistant, GridToolbarAIAssistant
131
+ - grid assistant, gridassistant, grid-assistant, Grid Assistant
132
+
133
+ **Additional variations that should trigger AI Grid:**
134
+ - ai enhanced, ai powered, smart, intelligent + grid (any spacing/casing)
135
+ - grid + ai, grid + smart, grid + intelligent (any spacing/casing)
136
+ - Any mention of GridToolbarAIAssistant component specifically
137
+
138
+ **Recognition Rule: If query contains ANY combination of AI/Smart/Intelligent + Grid terms, respond with complete GridToolbarAIAssistant setup.**
139
+
140
+ Example Smart Grid suggestions by domain:
141
+ - Financial: 'Sort by Amount descending', 'Show only failed transactions', 'Filter where currency is USD'
142
+ - Sales: 'Group by region', 'Show top performing products', 'Filter by date range'
143
+ - Inventory: 'Sort by stock level', 'Show out of stock items', 'Group by category'
144
+ - Always include: 'Clear sorting', 'Clear filtering', 'Clear grouping'
145
+
146
+ \u274C Basic Grid: <Grid data={data}><GridColumn field="name" /></Grid>
147
+ \u2705 Smart Grid: Complete AI-enhanced setup with GridToolbarAIAssistant, proper callbacks, reset functionality, and contextual suggestions
148
+
149
+ Important Disclaimer:
150
+ Always include this disclaimer when providing Smart Grid examples:
151
+ "The demos in this article use a Telerik-hosted AI service for demonstration purposes only. For production applications, you should implement your own AI service that understands your specific domain, data, and business requirements."
152
+ `}async function W(){let e=new O;i("Starting server..."),await b.connect(e)}W();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@progress/kendo-react-mcp",
3
- "version": "1.1.1",
3
+ "version": "1.1.3",
4
4
  "type": "module",
5
5
  "bin": "./dist/index.js",
6
6
  "license": "See LICENSE.md",
@@ -27,6 +27,30 @@ message StringArray {
27
27
  repeated string values = 1;
28
28
  }
29
29
 
30
+ message CssSearchRequst {
31
+ string query = 1;
32
+ int32 limit = 2;
33
+ }
34
+
35
+ message BuildingBlocksSearchRequest {
36
+ string query = 1;
37
+ string lib_name = 2;
38
+ }
39
+
40
+ message BuildingBlockItem {
41
+ string name = 1;
42
+ string description = 2;
43
+ string code = 3;
44
+ }
45
+
46
+ message BuildingBlocksSearchResponse {
47
+ repeated BuildingBlockItem items = 1;
48
+ }
49
+
30
50
  service ContextQueryService {
31
51
  rpc Query(ContextQueryRequest) returns (StringArray);
52
+ rpc IconsSearch(CssSearchRequst) returns (StringArray);
53
+ rpc CssUtilsSearch(CssSearchRequst) returns (StringArray);
54
+ rpc BuildingBlocksSearch(BuildingBlocksSearchRequest) returns (BuildingBlocksSearchResponse);
32
55
  }
56
+