@progress/kendo-react-mcp 1.1.2 → 1.1.4

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/LICENSE.md CHANGED
@@ -1,15 +1,11 @@
1
- This project has been released under the [Apache License, version 2.0](http://www.apache.org/licenses/LICENSE-2.0.html), the text of which is included below. This license applies ONLY to the source of this repository and does not extend to any other Kendo UI distribution or variant, or any other 3rd party libraries used in a repository. For licensing information about KendoReact, see the [License Agreements page](https://www.telerik.com/purchase/license-agreement/progress-kendoreact).
1
+ # KendoReact
2
2
 
3
- > Copyright © 2025 Progress Software Corporation and/or its subsidiaries or affiliates.
3
+ This package is part of the [KendoReact](https://www.telerik.com/kendo-react-ui) suite.
4
4
 
5
- > Licensed under the Apache License, Version 2.0 (the "License");
6
- > you may not use this file except in compliance with the License.
7
- > You may obtain a copy of the License at
5
+ ## License
8
6
 
9
- > [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0)
7
+ This is commercial software. To use it, you need to agree to the [**Telerik End User License Agreement for KendoReact**](https://www.telerik.com/purchase/license-agreement/progress-kendoreact). If you do not own a commercial license, this file shall be governed by the trial license terms.
10
8
 
11
- > Unless required by applicable law or agreed to in writing, software
12
- > distributed under the License is distributed on an "AS IS" BASIS,
13
- > WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
- > See the License for the specific language governing permissions and
15
- > limitations under the License.
9
+ All available Kendo UI commercial licenses may be obtained at https://www.telerik.com/kendo-react-ui/pricing.
10
+
11
+ *Copyright © 2025 Progress Software Corporation and/or one of its subsidiaries or affiliates. All rights reserved.*
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
- var R=Object.defineProperty;var P=(e,t,o)=>t in e?R(e,t,{enumerable:!0,configurable:!0,writable:!0,value:o}):e[t]=o;var f=(e,t,o)=>P(e,typeof t!="symbol"?t+"":t,o);import{McpServer as M}from"@modelcontextprotocol/sdk/server/mcp.js";import{StdioServerTransport as O}from"@modelcontextprotocol/sdk/server/stdio.js";import{z as A}from"zod";var C="Kendo UI for React",w="react",g=["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 _,join as N}from"path";import{fileURLToPath as B}from"url";import{readFileSync as L}from"node:fs";import s from"node:fs";import m from"node:path";import b from"@grpc/proto-loader";import u from"@grpc/grpc-js";var y=["TELERIK_LICENSE","KENDO_UI_LICENSE"],v="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||{}),S=!1,i=process.env.DEBUG_LOG_FILE,x=!!(i&&typeof i=="string");if(x){let e=m.resolve(i),t=m.dirname(e);if(t!=="."&&t!==process.cwd()&&!s.existsSync(t))try{s.mkdirSync(t,{recursive:!0})}catch(o){console.error("Error creating log directory:",o)}if(!s.existsSync(e))try{s.writeFileSync(e,"")}catch(o){console.error("Error creating log file:",o)}}S=x&&!!i&&s.existsSync(m.resolve(i));function n(...e){if(S&&i){let t=`${new Date().toISOString()}: ${e.join(" ")}
3
- `,o=m.resolve(i);s.appendFile(o,t,r=>{r&&console.error("Error writing to log file:",r)})}}var a=process.env[v],E=process.env[y[0]]||process.env[y[1]],h=class extends Error{constructor(e){super(e),this.name="LicenseError"}};function U(){if(!a&&!E)throw new h(`No license found. Please set one of the following environment variables: ${y.join(", ")} or ${v}`);let e;if(a)try{e=L(a,"utf8"),n("License key read from file: ",a)}catch{throw new h(`Error reading license file: ${a}. Please verify the file exists and is readable.`)}return E&&(e=E,n("License key read from environment variable.")),e}var k=class{constructor(e,t){f(this,"client");f(this,"isDev");this.contextApiUrl=e,this.protoPath=t;let o=b.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 r=u.loadPackageDefinition(o);this.client=new r.ContextQueryService(this.contextApiUrl||"contextapi.telerik.com:443",this.isDev?u.credentials.createInsecure():u.credentials.createSsl())}async query(e){let t=this.isDev?"fake_license":U(),o=new u.Metadata;if(t&&typeof t=="string"){t=t.replace(/^\uFEFF/,"");try{o.add("x-license-key",t)}catch(r){return n("Error adding license key to metadata:",r),Promise.reject(new Error(`Failed to use license key: ${r.message}`))}}return t&&typeof t=="string"&&o.add("x-license-key",t),new Promise((r,c)=>{this.client.query(e,o,(d,p)=>{d?c(d):r(p)})})}};var F=N(_(B(import.meta.url)),"../proto/service.proto"),G=new k("contextapi.telerik.com:443",F);async function T(e){return G.query(e)}import V from"fs";import I from"path";import{fileURLToPath as K}from"url";var q=K(import.meta.url),H=I.dirname(q),j=I.resolve(H,"../package.json"),$=JSON.parse(V.readFileSync(j,"utf-8")),D=new M({name:"kendo-and-kendo-resources",version:$.version});D.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,15 +12,15 @@ 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:A.string().describe("The query to search for."),component:A.enum(g).describe("The component to search for. If not specified, you can use General.")},async({query:e,component:t})=>{n("Calling tool: ",JSON.stringify({query:e,component:t})),t==="Grid"&&(t="DataGrid");try{let o=await T({query:e,component:t.toLocaleLowerCase(),lib_name:w,text_matches_count:3,code_matches_count:0,allowed_types:["documentation"]});n("Response from context API: ",JSON.stringify(o));let r=J(),c=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
- `),d=c.trim(),p=[{type:"text",text:c+(d?`
17
+ `),c=d.trim(),p=[{type:"text",text:d+(c?`
18
18
 
19
- `+r:"")}];return n("Response from tool: ",JSON.stringify(p)),{content:p}}catch(o){throw n("Error calling context API: ",JSON.stringify(o)),o?.code===l.UNAUTHENTICATED?new Error("Error: You are not authenticated. Please verify the Telerik License Key provided is valid."):o?.code===l.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===l.PERMISSION_DENIED?new Error(`Error: You do not have permission to access this resource. Please verify that you have a valid ${C} license key.`):o instanceof h?(n("License error: ",o.message),o):new Error(`Error: An error occurred while calling the service. Please try again later.
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
20
 
21
- Error Message: ${o.message}`)}});function J(){return`
21
+ Error Message: ${r.message}`)}});function J(){return`
22
22
  ## Available ReactComponent enum values:
23
- ${g.join(", ")}
23
+ ${f.join(", ")}
24
24
 
25
25
  ## Rules
26
26
  When generating code, explanations, or refactorings, always follow these rules:
@@ -28,7 +28,6 @@ When generating code, explanations, or refactorings, always follow these rules:
28
28
  1. Component Awareness
29
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
30
 
31
-
32
31
  Key points:
33
32
  - Match component names case-insensitively and robustly to minor variations
34
33
  - If someone refers to a component (e.g., "button", "BUTTON", "BuTtOn"), match it to the correct component (Button)
@@ -116,4 +115,38 @@ Key points:
116
115
  Example:
117
116
  \u274C Deprecated: selectedField="isSelected" editField="inEdit"
118
117
  \u2705 Modern: Use select and edit state properties with proper configuration
119
- `}async function z(){let e=new O;n("Starting server..."),await D.connect(e)}z();
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.2",
3
+ "version": "1.1.4",
4
4
  "type": "module",
5
5
  "bin": "./dist/index.js",
6
6
  "license": "See LICENSE.md",
@@ -23,15 +23,10 @@
23
23
  "LICENSE.md",
24
24
  "!**/*.tsbuildinfo"
25
25
  ],
26
- "scripts": {
27
- "build": "tsc",
28
- "test": "vitest",
29
- "test:run": "vitest run"
30
- },
31
26
  "dependencies": {
32
- "@grpc/grpc-js": "^1.13.3",
33
- "@grpc/proto-loader": "^0.7.15",
34
- "@modelcontextprotocol/sdk": "^1.8.0",
27
+ "@grpc/grpc-js": "^1.14.0",
28
+ "@grpc/proto-loader": "^0.8.0",
29
+ "@modelcontextprotocol/sdk": "^1.18.2",
35
30
  "tslib": "^2.3.0"
36
31
  },
37
32
  "devDependencies": {
@@ -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
+