@progress/kendo-angular-mcp 0.1.2 → 1.0.1
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 +7 -20
- package/dist/index.js +4 -4
- package/dist/lib/constants.d.ts +1 -1
- package/dist/test/cli.test.d.ts +1 -0
- package/dist/test/setup.d.ts +0 -0
- package/package.json +8 -2
package/README.md
CHANGED
|
@@ -2,9 +2,6 @@
|
|
|
2
2
|
|
|
3
3
|
The Kendo UI for Angular [MCP Server](https://modelcontextprotocol.io/introduction) enables you achieve interation with AI and reach new levels of developer productivity. The MCP server provides proprietary context to AI-powered IDEs, apps and tools. You can use the Kendo UI for Angular MCP server to ask about Kendo UI for Angular components, features, or general usage. You can successfully prompt more complex questions and tasks, and generate tailored code that includes Kendo UI for Angular components and API.
|
|
4
4
|
|
|
5
|
-
> **Disclaimer:**
|
|
6
|
-
> This version of the Kendo UI for Angular MCP Server is a **beta release**. Behavior may change before the final release.
|
|
7
|
-
|
|
8
5
|
## Prerequisites
|
|
9
6
|
|
|
10
7
|
To use the Kendo UI for Angular MCP server, you need:
|
|
@@ -90,22 +87,12 @@ To [enable the Kendo UI for Angular MCP server in a specific workspace](https://
|
|
|
90
87
|
|
|
91
88
|
To use the Kendo UI for Angular MCP server:
|
|
92
89
|
|
|
93
|
-
1. Start your prompt with
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
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.
|
|
102
|
-
|
|
103
|
-
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:
|
|
104
|
-
* `Running kendo-angular-assistant` (in VS Code)
|
|
105
|
-
* `Calling MCP tool kendo-angular-assistant` (in Cursor)
|
|
106
|
-
|
|
107
|
-
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.
|
|
108
|
-
1. Grant the Kendo UI for Angular MCP server a permission to run for this session, workspace, or always.
|
|
109
|
-
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
|
+

|
|
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.
|
|
110
97
|
|
|
111
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,6 @@
|
|
|
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
|
|
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[
|
|
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.
|
|
4
4
|
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
5
|
Provide the user's detailed question as the 'query'. If the question pertains to a specific Kendo UI for Angular 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:
|
|
@@ -14,6 +14,6 @@ specify its name in the 'component' parameter. This tool can be automatically tr
|
|
|
14
14
|
- '@ask_kendo';
|
|
15
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(`
|
|
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 ${
|
|
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.
|
|
18
18
|
|
|
19
|
-
Error Message: ${o.message}`)}});async function J(){let e=new O;n("Starting server..."),await
|
|
19
|
+
Error Message: ${o.message}`)}});async function J(){let e=new O;n("Starting server..."),await k.connect(e)}J();
|
package/dist/lib/constants.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
export declare const ANGULAR_SUITE_NAME = "Kendo UI for Angular";
|
|
2
2
|
export declare const Suite = "angular";
|
|
3
|
-
export declare const AngularComponents: readonly ["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", "Dialog", "DragandDrop", "Drawer", "Drawing", "DropDownButton", "DropDownList", "DropDownTree", "Editor", "ExcelExport", "ExpansionPanel", "FileSaver", "FileSelect", "Filter", "FlatColorPicker", "FloatingActionButton", "FloatingLabel", "Forms", "FormField", "Gantt", "Gauges", "General", "Grid", "GridLayout", "Icon", "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", "SplitButton", "Splitter", "Spreadsheet", "StackLayout", "Stepper", "SVGIcon", "Switch", "TabStrip", "TextArea", "TextBox", "TileLayout", "Timeline", "TimePicker", "ToolBar", "Tooltip", "TreeList", "TreeView", "Typography", "Upload", "Window"];
|
|
3
|
+
export declare const AngularComponents: readonly ["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"];
|
|
@@ -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": "0.1
|
|
3
|
+
"version": "1.0.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"bin": "./dist/index.js",
|
|
6
6
|
"license": "See LICENSE.md",
|
|
@@ -22,6 +22,11 @@
|
|
|
22
22
|
"LICENSE.md",
|
|
23
23
|
"!**/*.tsbuildinfo"
|
|
24
24
|
],
|
|
25
|
+
"scripts": {
|
|
26
|
+
"build": "tsc",
|
|
27
|
+
"test": "vitest",
|
|
28
|
+
"test:run": "vitest run"
|
|
29
|
+
},
|
|
25
30
|
"dependencies": {
|
|
26
31
|
"@grpc/grpc-js": "^1.13.3",
|
|
27
32
|
"@grpc/proto-loader": "^0.7.15",
|
|
@@ -29,6 +34,7 @@
|
|
|
29
34
|
"tslib": "^2.3.0"
|
|
30
35
|
},
|
|
31
36
|
"devDependencies": {
|
|
32
|
-
"@local/mcp-common": "*"
|
|
37
|
+
"@local/mcp-common": "*",
|
|
38
|
+
"@local/mcp-test-utils": "*"
|
|
33
39
|
}
|
|
34
40
|
}
|