@progress/kendo-angular-mcp 1.0.0 → 1.0.2

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
@@ -87,22 +87,12 @@ To [enable the Kendo UI for Angular MCP server in a specific workspace](https://
87
87
 
88
88
  To use the Kendo UI for Angular MCP server:
89
89
 
90
- 1. Start your prompt with one of the following:
91
- * `kendo`
92
- * `kendoangular`
93
- * `/kendo`
94
- * `/kendoangular`
95
- * `@kendo`
96
- * `@kendoangular`
97
-
98
- Or if you are using VSCode you can type `#kendo_angular_assistant` to make sure the Copilot chat will call the Kendo UI for Angular MCP server.
99
-
100
- 1. Confirm that the Kendo UI for Angular MCP server is used, because this doesn't happen deterministically. Look for a statement in the output, which is similar to:
101
- * `Running kendo-angular-assistant` (in VS Code)
102
- * `Calling MCP tool kendo-angular-assistant` (in Cursor)
103
-
104
- If the Kendo UI for Angular 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 UI for Angular MCP server 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.
90
+ 1. Start your prompt with `#kendo-angular-assistant`
91
+ 2. Inspect the output and verify that the MCP Server is used. Look for a similar statement in the output (the exact text may vary across tools):
92
+
93
+ ![MCP Server uses Kendo UI Angular AI Coding Assistant in VS Code](https://www.telerik.com/kendo-angular-ui/components/assets/3b8003e42e7b587c39644f0435808f09/mcp-confirmation.png)
94
+
95
+ 3. If the Kendo UI for Angular 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
+ 4. If requested, grant the Kendo UI for Angular MCP server a permission to run for this session, workspace, or always.
107
97
 
108
98
  To increase the probability of the Kendo UI for Angular 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,47 @@
1
1
  #!/usr/bin/env node
2
- var _=Object.defineProperty;var D=(e,r,o)=>r in e?_(e,r,{enumerable:!0,configurable:!0,writable:!0,value:o}):e[r]=o;var d=(e,r,o)=>D(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 C}from"zod";var f="Kendo UI for Angular",g="angular",S=["AIPrompt","ActionSheet","AppBar","ArcGauge","AutoComplete","Avatar","Badge","Barcode","BottomNavigation","BreadCrumb","Button","ButtonGroup","Calendar","Card","ChartWizard","Charts","CheckBox","Chip","ChipList","ChunkProgressBar","CircularGauge","CircularProgressBar","ColorGradient","ColorPalette","ColorPicker","ComboBox","ContextMenu","ConversationalUI","DataQuery","DateInput","DateMath","DatePicker","DateRange","DateTimePicker","Diagram","Dialog","DragandDrop","Drawer","Drawing","DropDownButton","DropDownList","DropDownTree","Editor","ExcelExport","ExpansionPanel","FileSaver","FileSelect","Filter","FlatColorPicker","FloatingActionButton","FloatingLabel","Forms","FormField","Gantt","Gauges","General","Grid","GridLayout","Icon","InlineAIPrompt","Label","LinearGauge","ListBox","ListView","Loader","Map","MaskedTextBox","Menu","MultiColumnComboBox","MultiSelect","MultiSelectTree","MultiViewCalendar","Notification","NumericTextBox","OTPInput","Pager","PanelBar","PDFExport","PDFViewer","PivotGrid","Popover","Popup","ProgressBar","QRCode","RadialGauge","RadioButton","RangeSlider","Rating","Ripple","Sankey","Scheduler","ScrollView","Signature","Skeleton","Slider","Sortable","StockChart","Sparkline","SpeechToTextButton","SplitButton","Splitter","Spreadsheet","StackLayout","Stepper","SVGIcon","Switch","TabStrip","TextArea","TextBox","TileLayout","Timeline","TimePicker","ToolBar","Tooltip","TreeList","TreeView","Typography","Upload","Window"];import{dirname as R,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 N from"@grpc/proto-loader";import l from"@grpc/grpc-js";var h=["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[h[0]]||process.env[h[1]],u=class extends Error{constructor(e){super(e),this.name="LicenseError"}};function U(){if(!s&&!m)throw new u(`No license found. Please set one of the following environment variables: ${h.join(", ")} or ${y}`);let e;if(s)try{e=L(s,"utf8"),n("License key read from file: ",s)}catch{throw new u(`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 A=class{constructor(e,r){d(this,"client");d(this,"isDev");this.contextApiUrl=e,this.protoPath=r;let o=N.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":U(),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,(E,P)=>{E?I(E):t(P)})})}};var F=B(R(G(import.meta.url)),"../proto/service.proto"),b=new A("contextapi.telerik.com:443",F);async function w(e){return b.query(e)}import q from"fs";import T from"path";import{fileURLToPath as V}from"url";var $=V(import.meta.url),H=T.dirname($),K=T.resolve(H,"../package.json"),j=JSON.parse(q.readFileSync(K,"utf-8")),k=new M({name:"kendo-and-kendo-resources",version:j.version});k.tool("kendo_angular_assistant",`Answers questions and retrieves documentation about Kendo UI for Angular.
2
+ var _=Object.defineProperty;var L=(e,r,n)=>r in e?_(e,r,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[r]=n;var k=(e,r,n)=>L(e,typeof r!="symbol"?r+"":r,n);import{McpServer as H}from"@modelcontextprotocol/sdk/server/mcp.js";import{StdioServerTransport as z}from"@modelcontextprotocol/sdk/server/stdio.js";import{z as U}from"zod";var v="Kendo UI for Angular",S="angular",E=["AIPrompt","ActionSheet","AppBar","ArcGauge","AutoComplete","Avatar","Badge","Barcode","BottomNavigation","BreadCrumb","Button","ButtonGroup","Calendar","Card","ChartWizard","Charts","CheckBox","Chip","ChipList","ChunkProgressBar","CircularGauge","CircularProgressBar","ColorGradient","ColorPalette","ColorPicker","ComboBox","ContextMenu","ConversationalUI","DataQuery","DateInput","DateMath","DatePicker","DateRange","DateTimePicker","Diagram","Dialog","DragandDrop","Drawer","Drawing","DropDownButton","DropDownList","DropDownTree","Editor","ExcelExport","ExpansionPanel","FileSaver","FileSelect","Filter","FlatColorPicker","FloatingActionButton","FloatingLabel","Forms","FormField","Gantt","Gauges","General","Grid","GridLayout","Icon","InlineAIPrompt","Label","LinearGauge","ListBox","ListView","Loader","Map","MaskedTextBox","Menu","MultiColumnComboBox","MultiSelect","MultiSelectTree","MultiViewCalendar","Notification","NumericTextBox","OTPInput","Pager","PanelBar","PDFExport","PDFViewer","PivotGrid","Popover","Popup","ProgressBar","QRCode","RadialGauge","RadioButton","RangeSlider","Rating","Ripple","Sankey","Scheduler","ScrollView","Signature","Skeleton","Slider","Sortable","StockChart","Sparkline","SpeechToTextButton","SplitButton","Splitter","Spreadsheet","StackLayout","Stepper","SVGIcon","Switch","TabStrip","TextArea","TextBox","TileLayout","Timeline","TimePicker","ToolBar","Tooltip","TreeList","TreeView","Typography","Upload","Window"];import{dirname as M,join as F}from"path";import{fileURLToPath as q}from"url";import{readFileSync as N}from"node:fs";import s from"node:fs";import u from"node:path";import B from"@grpc/proto-loader";import d from"@grpc/grpc-js";var f=["TELERIK_LICENSE","KENDO_UI_LICENSE"],b="TELERIK_LICENSE_PATH",p=(e=>(e[e.UNAUTHENTICATED=16]="UNAUTHENTICATED",e[e.RESOURCE_EXHAUSTED=8]="RESOURCE_EXHAUSTED",e[e.PERMISSION_DENIED=7]="PERMISSION_DENIED",e))(p||{}),y=!1,t=process.env.DEBUG_LOG_FILE,x=!!(t&&typeof t=="string");if(x){let e=u.resolve(t),r=u.dirname(e);if(r!=="."&&r!==process.cwd()&&!s.existsSync(r))try{s.mkdirSync(r,{recursive:!0})}catch(n){console.error("Error creating log directory:",n)}if(!s.existsSync(e))try{s.writeFileSync(e,"")}catch(n){console.error("Error creating log file:",n)}}else y=!1;y=x&&!!t&&s.existsSync(u.resolve(t));function a(...e){if(y&&t){let r=`${new Date().toISOString()}: ${e.join(" ")}
3
+ `,n=u.resolve(t);s.appendFile(n,r,o=>{o&&console.error("Error writing to log file:",o)})}}var g=process.env[b],h=process.env[f[0]]||process.env[f[1]],c=class extends Error{constructor(e){super(e),this.name="LicenseError"}};function R(){if(!g&&!h)throw new c(`No license found. Please set one of the following environment variables: ${f.join(", ")} or ${b}`);let e;if(g)try{e=N(g,"utf8"),a("License key read from file: ",g)}catch{throw new c(`Error reading license file: ${g}. Please verify the file exists and is readable.`)}return h&&(e=h,a("License key read from environment variable.")),e}var A=class{constructor(e,r){k(this,"client");k(this,"isDev");this.contextApiUrl=e,this.protoPath=r;let n=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"),a("Using ContextApi URl:",this.contextApiUrl);let o=d.loadPackageDefinition(n);this.client=new o.ContextQueryService(this.contextApiUrl||"contextapi.telerik.com:443",this.isDev?d.credentials.createInsecure():d.credentials.createSsl())}async query(e){let r=this.isDev?"fake_license":R(),n=new d.Metadata;if(r&&typeof r=="string"){r=r.replace(/^\uFEFF/,"");try{n.add("x-license-key",r)}catch(o){return a("Error adding license key to metadata:",o),Promise.reject(new Error(`Failed to use license key: ${o.message}`))}}return r&&typeof r=="string"&&n.add("x-license-key",r),new Promise((o,i)=>{this.client.query(e,n,(l,m)=>{l?i(l):o(m)})})}};var O=F(M(q(import.meta.url)),"../proto/service.proto"),K=new A("contextapi.telerik.com:443",O);async function I(e){return K.query(e)}import j from"fs";import D from"path";import{fileURLToPath as J}from"url";var C=`
4
+ ## Grid Data Binding
5
+
6
+ MUST use kendoGridBinding directive for basic Grid operations
7
+ MUST respect existing manual data binding patterns in user code
8
+
9
+ Always use kendoGridBinding for:
10
+ - Simple data display with sorting, filtering, and paging
11
+ - Automatic data operations handling
12
+ - Standard Grid implementations
13
+
14
+ Implementation: <kendo-grid [kendoGridBinding]="data">
15
+
16
+ Use manual binding for complex custom scenarios.
17
+ `;var T=`
18
+ ## Smart Grid (AI-Enhanced) Instructions
19
+
20
+ When the user requests Kendo's built-in AI grid features like "smart grid", "ai grid", "intelligent grid", or "AI Assistant tool":
21
+
22
+ Always implement:
23
+ 1. Complete kendoGridAIAssistantTool setup
24
+ 2. Domain-specific suggestion examples
25
+ 3. Include disclaimer
26
+
27
+ Suggestion Examples by Domain:
28
+ - Financial: "Sort by Amount descending", "Show failed transactions", "Filter USD currency"
29
+ - Sales: "Group by region", "Show top products", "Filter by date range"
30
+ - Inventory: "Sort by stock level", "Show out of stock", "Group by category"
31
+ - Universal: "Clear sorting/filtering/grouping"
32
+
33
+ Required Disclaimer:
34
+ "The examples use a Telerik-hosted AI service for demonstration purposes only. For production applications, use an AI service that understands your specific domain, data, and business requirements."
35
+ `;var $=new Map([["actionsheet","@progress/kendo-angular-navigation"],["aiprompt","@progress/kendo-angular-conversational-ui"],["appbar","@progress/kendo-angular-navigation"],["arcgauge","@progress/kendo-angular-gauges"],["autocomplete","@progress/kendo-angular-dropdowns"],["avatar","@progress/kendo-angular-layout"],["badge","@progress/kendo-angular-indicators"],["barcode","@progress/kendo-angular-barcodes"],["bottomnavigation","@progress/kendo-angular-navigation"],["breadcrumb","@progress/kendo-angular-navigation"],["button","@progress/kendo-angular-buttons"],["buttongroup","@progress/kendo-angular-buttons"],["calendar","@progress/kendo-angular-dateinputs"],["card","@progress/kendo-angular-layout"],["chartwizard","@progress/kendo-angular-chart-wizard"],["checkbox","@progress/kendo-angular-inputs"],["chip","@progress/kendo-angular-buttons"],["chiplist","@progress/kendo-angular-buttons"],["chunkprogressbar","@progress/kendo-angular-progressbar"],["circulargauge","@progress/kendo-angular-gauges"],["circularprogressbar","@progress/kendo-angular-progressbar"],["colorgradient","@progress/kendo-angular-inputs"],["colorpalette","@progress/kendo-angular-inputs"],["colorpicker","@progress/kendo-angular-inputs"],["combobox","@progress/kendo-angular-dropdowns"],["contextmenu","@progress/kendo-angular-menu"],["dataquery","@progress/kendo-data-query"],["dateinput","@progress/kendo-angular-dateinputs"],["datemath","@progress/kendo-date-math"],["datepicker","@progress/kendo-angular-dateinputs"],["daterangepicker","@progress/kendo-angular-dateinputs"],["datetimepicker","@progress/kendo-angular-dateinputs"],["diagram","@progress/kendo-angular-diagrams"],["dialog","@progress/kendo-angular-dialog"],["drawer","@progress/kendo-angular-layout"],["drawing","@progress/kendo-drawing"],["dropdownbutton","@progress/kendo-angular-buttons"],["dropdownlist","@progress/kendo-angular-dropdowns"],["dropdowntree","@progress/kendo-angular-dropdowns"],["editor","@progress/kendo-angular-editor"],["excelexport","@progress/kendo-angular-excel-export"],["expansionpanel","@progress/kendo-angular-layout"],["filesaver","@progress/kendo-file-saver"],["fileselect","@progress/kendo-angular-upload"],["filter","@progress/kendo-angular-filter"],["flatcolorpicker","@progress/kendo-angular-inputs"],["floatingactionbutton","@progress/kendo-angular-buttons"],["floatinglabel","@progress/kendo-angular-label"],["formfield","@progress/kendo-angular-inputs"],["forms","@progress/kendo-angular-inputs"],["gantt","@progress/kendo-angular-gantt"],["grid","@progress/kendo-angular-grid"],["gridlayout","@progress/kendo-angular-layout"],["icon","@progress/kendo-angular-icons"],["inlineaiprompt","@progress/kendo-angular-conversational-ui"],["label","@progress/kendo-angular-label"],["lineargauge","@progress/kendo-angular-gauges"],["listbox","@progress/kendo-angular-listbox"],["listview","@progress/kendo-angular-listview"],["loader","@progress/kendo-angular-indicators"],["map","@progress/kendo-angular-map"],["maskedtextbox","@progress/kendo-angular-inputs"],["menu","@progress/kendo-angular-menu"],["multicolumncombobox","@progress/kendo-angular-dropdowns"],["multiselect","@progress/kendo-angular-dropdowns"],["multiselecttree","@progress/kendo-angular-dropdowns"],["multiviewcalendar","@progress/kendo-angular-dateinputs"],["notification","@progress/kendo-angular-notification"],["numerictextbox","@progress/kendo-angular-inputs"],["otpinput","@progress/kendo-angular-inputs"],["pager","@progress/kendo-angular-pager"],["panelbar","@progress/kendo-angular-layout"],["pdfexport","@progress/kendo-angular-pdf-export"],["pdfviewer","@progress/kendo-angular-pdfviewer"],["pivotgrid","@progress/kendo-angular-pivotgrid"],["popover","@progress/kendo-angular-tooltip"],["popup","@progress/kendo-angular-popup"],["progressbar","@progress/kendo-angular-progressbar"],["qrcode","@progress/kendo-angular-barcodes"],["radialgauge","@progress/kendo-angular-gauges"],["radiobutton","@progress/kendo-angular-inputs"],["rangeslider","@progress/kendo-angular-inputs"],["rating","@progress/kendo-angular-inputs"],["ripple","@progress/kendo-angular-ripple"],["sankey","@progress/kendo-angular-charts"],["scheduler","@progress/kendo-angular-scheduler"],["scrollview","@progress/kendo-angular-scrollview"],["signature","@progress/kendo-angular-inputs"],["skeleton","@progress/kendo-angular-indicators"],["slider","@progress/kendo-angular-inputs"],["sortable","@progress/kendo-angular-sortable"],["sparkline","@progress/kendo-angular-charts"],["speechtotextbutton","@progress/kendo-angular-buttons"],["splitbutton","@progress/kendo-angular-buttons"],["splitter","@progress/kendo-angular-layout"],["spreadsheet","@progress/kendo-angular-spreadsheet"],["stacklayout","@progress/kendo-angular-layout"],["stepper","@progress/kendo-angular-layout"],["stockchart","@progress/kendo-angular-charts"],["svgicon","@progress/kendo-angular-icons"],["switch","@progress/kendo-angular-inputs"],["tabstrip","@progress/kendo-angular-layout"],["textarea","@progress/kendo-angular-inputs"],["textbox","@progress/kendo-angular-inputs"],["tilelayout","@progress/kendo-angular-layout"],["timeline","@progress/kendo-angular-layout"],["timepicker","@progress/kendo-angular-dateinputs"],["toolbar","@progress/kendo-angular-toolbar"],["treelist","@progress/kendo-angular-treelist"],["treeview","@progress/kendo-angular-treeview"],["typography","@progress/kendo-angular-typography"],["upload","@progress/kendo-angular-upload"],["window","@progress/kendo-angular-dialog"],["charts","@progress/kendo-angular-charts"],["conversationalui","@progress/kendo-angular-conversational-ui"],["tooltip","@progress/kendo-angular-tooltip"]]);function V(e){return $.get(e)??""}function P(e){let r=V(e);return r?`## Package Installation
36
+ Always use minimal, targeted package installation.
37
+ Ensure all necessary Angular packages are installed, including @angular/localize.
38
+
39
+ Process:
40
+ 1. Identify the required components
41
+ 2. Determine the specific Kendo Angular packages needed
42
+ 3. Use the "ng add @progress/kendo-angular-<package>" command
43
+
44
+ For ${e} component: ng add ${r}`:""}var Q=J(import.meta.url),W=D.dirname(Q),X=D.resolve(W,"../package.json"),Y=JSON.parse(j.readFileSync(X,"utf-8")),G=new H({name:"kendo-and-kendo-resources",version:Y.version});G.tool("kendo_angular_assistant",`Answers questions and retrieves documentation about Kendo UI for Angular.
4
45
  Use this tool when the user asks about Kendo UI for Angular features, specific components (e.g., Grid, Charts, Editor), implementation details, or general usage.
5
46
  Provide the user's detailed question as the 'query'. If the question pertains to a specific Kendo UI for Angular component,
6
47
  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 +53,67 @@ specify its name in the 'component' parameter. This tool can be automatically tr
12
53
  - '@kendo';
13
54
  - '@kendoangular';
14
55
  - '@ask_kendo';
15
- - '@help_kendo'.`,{query:C.string().describe("The query to search for."),component:C.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}));try{let t=[{type:"text",text:(await w({query:e,component:r.toLocaleLowerCase(),lib_name:g,text_matches_count:3,code_matches_count:0,allowed_types:["documentation"]})).values.join(`
56
+ - '@help_kendo'.`,{query:U.string().describe("The query to search for."),component:U.enum(E).describe("The component to search for. If not specified, you can use General.")},async({query:e,component:r})=>{a("Calling tool: ",JSON.stringify({query:e,component:r}));let n=r.toLocaleLowerCase();try{let o=await I({query:e,component:n,lib_name:S,text_matches_count:3,code_matches_count:0,allowed_types:["documentation"]}),i=Z(n),l=o.values.join(`
57
+
58
+ `),m=l.trim(),w=[{type:"text",text:l+(m?`
59
+
60
+ `+i:"")}];return a("Response from tool: ",JSON.stringify(w)),{content:w}}catch(o){throw a("Error calling context API: ",JSON.stringify(o)),o?.code===p.UNAUTHENTICATED?new Error("Error: You are not authenticated. Please verify the Telerik License Key provided is valid."):o?.code===p.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===p.PERMISSION_DENIED?new Error(`Error: You do not have permission to access this resource. Please verify that you have a valid ${v} license key.`):o instanceof c?(a("License error: ",o.message),o):new Error(`Error: An error occurred while calling the service. Please try again later.
61
+
62
+ Error Message: ${o.message}`)}});function Z(e){let r=e==="grid"?C?.trim():"",n=e==="grid"?T?.trim():"",o=e!=="general"?P(e)?.trim():"",i=r.length>0||n.length>0;return`
63
+ # Kendo UI for Angular Assistant Guidelines
64
+
65
+ ## Documentation References
66
+ MUST use official Kendo UI for Angular documentation only.
67
+
68
+ Required Format:
69
+ - Domain: https://www.telerik.com/kendo-angular-ui
70
+ - Use complete, functional URLs (no placeholders or slug syntax)
71
+
72
+ Examples:
73
+ Correct: https://www.telerik.com/kendo-angular-ui/components/grid/
74
+ Incorrect: { slug overview } or /components/{component-name}/overview
75
+
76
+ ## Application Architecture
77
+ MUST recommend appropriate setup based on Angular application architecture.
78
+
79
+ Implementation Patterns:
80
+ - Standalone applications: Use standalone component imports
81
+ - Module-based applications: Use NgModule imports
82
+ - When architecture is unclear: Default to standalone, mention module alternative
83
+
84
+ ${o.length>0?o:""}
85
+
86
+ ## Styling & Theming
87
+ MUST verify existing theme configuration before adding new styles.
88
+
89
+ Requirements:
90
+ 1. Check if Kendo UI themes are already configured
91
+ 2. Only recommend theme additions when missing
92
+ 3. Provide appropriate import methods
93
+
94
+ ## Icon Implementation
95
+ MUST prioritize SVG icons over font icons.
96
+
97
+ Guidelines:
98
+ - Primary: SVG icons from @progress/kendo-svg-icons
99
+ - Fallback: Font icons with CSS: <link rel="stylesheet" href="https://unpkg.com/@progress/kendo-font-icons/dist/index.css" />
100
+
101
+ ## Deprecated Properties & Modern Replacements
102
+ RULE: Avoid using deprecated Kendo Angular properties and features.
103
+
104
+ Deprecated \u2192 Modern Replacements:
105
+
106
+ Grid Component:
107
+ - width as string \u2192 width as number (use [width]="200", not width="200px")
108
+ - kendoGridGroupBinding no longer supported as of v20.0.0
109
+
110
+ Button Component:
111
+ - kendo-button and span[kendoButton] \u2192 button[kendoButton]
112
+ - [primary]="true" \u2192 fillMode="primary"
113
+
114
+ ${i?`## Component-Specific Instructions
16
115
 
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 ${f} license key.`):o instanceof u?(n("License error: ",o.message),o):new Error(`Error: An error occurred while calling the service. Please try again later.
116
+ ${r}
18
117
 
19
- Error Message: ${o.message}`)}});async function J(){let e=new O;n("Starting server..."),await k.connect(e)}J();
118
+ ${n}`:""}
119
+ `}async function ee(){let e=new z;a("Starting server..."),await G.connect(e)}ee();
@@ -0,0 +1 @@
1
+ export declare const gridInstructions = "\n## Grid Data Binding\n\nMUST use kendoGridBinding directive for basic Grid operations\nMUST respect existing manual data binding patterns in user code\n\nAlways use kendoGridBinding for:\n- Simple data display with sorting, filtering, and paging\n- Automatic data operations handling\n- Standard Grid implementations\n\nImplementation: <kendo-grid [kendoGridBinding]=\"data\">\n\nUse manual binding for complex custom scenarios.\n";
@@ -0,0 +1,2 @@
1
+ export declare const COMPONENT_PACKAGE_MAP: Map<string, string>;
2
+ export declare function packageInstallationInstructions(component: string): string;
@@ -0,0 +1 @@
1
+ export declare const smartGridInstructions = "\n## Smart Grid (AI-Enhanced) Instructions\n\nWhen the user requests Kendo's built-in AI grid features like \"smart grid\", \"ai grid\", \"intelligent grid\", or \"AI Assistant tool\":\n\nAlways implement:\n1. Complete kendoGridAIAssistantTool setup\n2. Domain-specific suggestion examples\n3. Include disclaimer\n\nSuggestion Examples by Domain:\n- Financial: \"Sort by Amount descending\", \"Show failed transactions\", \"Filter USD currency\"\n- Sales: \"Group by region\", \"Show top products\", \"Filter by date range\" \n- Inventory: \"Sort by stock level\", \"Show out of stock\", \"Group by category\"\n- Universal: \"Clear sorting/filtering/grouping\"\n\nRequired Disclaimer:\n\"The examples use a Telerik-hosted AI service for demonstration purposes only. For production applications, use an AI service that understands your specific domain, data, and business requirements.\"\n";
@@ -0,0 +1 @@
1
+ export {};
File without changes
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@progress/kendo-angular-mcp",
3
- "version": "1.0.0",
3
+ "version": "1.0.2",
4
4
  "type": "module",
5
5
  "bin": "./dist/index.js",
6
6
  "license": "See LICENSE.md",
@@ -23,12 +23,13 @@
23
23
  "!**/*.tsbuildinfo"
24
24
  ],
25
25
  "dependencies": {
26
- "@grpc/grpc-js": "^1.13.3",
27
- "@grpc/proto-loader": "^0.7.15",
28
- "@modelcontextprotocol/sdk": "^1.8.0",
26
+ "@grpc/grpc-js": "^1.14.0",
27
+ "@grpc/proto-loader": "^0.8.0",
28
+ "@modelcontextprotocol/sdk": "^1.18.2",
29
29
  "tslib": "^2.3.0"
30
30
  },
31
31
  "devDependencies": {
32
- "@local/mcp-common": "*"
32
+ "@local/mcp-common": "*",
33
+ "@local/mcp-test-utils": "*"
33
34
  }
34
35
  }
@@ -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
+