@kubedeck/kubebuddy-radar-mcp 0.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 +201 -0
- package/dist/index.js +590 -0
- package/dist/index.js.map +1 -0
- package/package.json +53 -0
package/README.md
ADDED
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
# KubeBuddy Radar MCP Server
|
|
2
|
+
|
|
3
|
+
> 🚧 **Work in Progress** - This MCP server is currently in active development. Features and tools are being tested and refined.
|
|
4
|
+
|
|
5
|
+
Model Context Protocol server for [KubeBuddy Radar](https://radar.kubebuddy.io) - Query 286+ CNCF projects, release notes, security tracking, and your personal dashboard with AI agents like Claude Desktop, Cursor, or Windsurf.
|
|
6
|
+
|
|
7
|
+
## What is this?
|
|
8
|
+
|
|
9
|
+
This TypeScript MCP server wraps the KubeBuddy Radar API so AI agents can:
|
|
10
|
+
- Search and discover CNCF projects
|
|
11
|
+
- Get latest release information with AI-parsed notes
|
|
12
|
+
- Track security vulnerabilities and CVEs
|
|
13
|
+
- Filter by category, CNCF status, and security releases
|
|
14
|
+
- Access your personal subscriptions and dashboard
|
|
15
|
+
|
|
16
|
+
Public tools are routed through Cloudflare cache for speed, while private tools use WordPress Application Passwords for authenticated access.
|
|
17
|
+
|
|
18
|
+
## Installation
|
|
19
|
+
|
|
20
|
+
### Prerequisites
|
|
21
|
+
- Node.js 18+ and npm
|
|
22
|
+
- A KubeBuddy Radar account (free tier available at [radar.kubebuddy.io](https://radar.kubebuddy.io))
|
|
23
|
+
|
|
24
|
+
> ⚠️ **Windows Users**: Direct installation from GitHub (`npm install -g github:KubeDeckio/kubebuddy-radar-mcp`) may fail with EPERM errors or missing TypeScript compiler. Use the local build method below.
|
|
25
|
+
|
|
26
|
+
### Option 1: Install from Local Build (Recommended)
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
git clone https://github.com/KubeDeckio/kubebuddy-radar-mcp.git
|
|
30
|
+
cd kubebuddy-radar-mcp
|
|
31
|
+
npm install
|
|
32
|
+
npm run build
|
|
33
|
+
npm pack
|
|
34
|
+
npm install -g kubebuddy-radar-mcp-0.0.1.tgz
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
### Option 2: Install from npm (when published)
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
npm install -g @kubedeck/kubebuddy-mcp-server
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Configuration
|
|
44
|
+
|
|
45
|
+
### Claude Desktop
|
|
46
|
+
|
|
47
|
+
Edit your Claude Desktop config file:
|
|
48
|
+
- **Windows**: `%APPDATA%\Claude\claude_desktop_config.json`
|
|
49
|
+
- **macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json`
|
|
50
|
+
|
|
51
|
+
```json
|
|
52
|
+
{
|
|
53
|
+
"mcpServers": {
|
|
54
|
+
"kubebuddy-radar": {
|
|
55
|
+
"command": "node",
|
|
56
|
+
"args": [
|
|
57
|
+
"C:\\Users\\YOUR_USERNAME\\AppData\\Roaming\\npm\\node_modules\\@kubedeck\\kubebuddy-mcp-server\\dist\\index.js"
|
|
58
|
+
]
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
**Note:** Replace `YOUR_USERNAME` with your Windows username. On macOS/Linux, the path will typically be `/usr/local/lib/node_modules/@kubedeck/kubebuddy-mcp-server/dist/index.js`.
|
|
65
|
+
|
|
66
|
+
Restart Claude Desktop, and you're ready to ask questions like:
|
|
67
|
+
- "What's the latest Kubernetes version?"
|
|
68
|
+
- "Show me recent security releases"
|
|
69
|
+
- "What are the most popular CNCF projects?"
|
|
70
|
+
|
|
71
|
+
If you prefer not to install globally, use `npx` to launch the MCP server on demand:
|
|
72
|
+
|
|
73
|
+
```
|
|
74
|
+
{
|
|
75
|
+
"mcpServers": {
|
|
76
|
+
"kubebuddy-radar": {
|
|
77
|
+
"command": "npx",
|
|
78
|
+
"args": [
|
|
79
|
+
"-y",
|
|
80
|
+
"@kubedeck/kubebuddy-mcp-server"
|
|
81
|
+
]
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
```
|
|
86
|
+
`npx -y` will download and run the scoped package automatically whenever Claude starts.
|
|
87
|
+
|
|
88
|
+
### Other AI Assistants
|
|
89
|
+
|
|
90
|
+
MCP support is expanding. Check the [official MCP documentation](https://modelcontextprotocol.io) for integration with:
|
|
91
|
+
- Cursor IDE
|
|
92
|
+
- Windsurf
|
|
93
|
+
- VS Code with GitHub Copilot (experimental)
|
|
94
|
+
|
|
95
|
+
## Available Tools
|
|
96
|
+
|
|
97
|
+
### Public Tools (No Authentication)
|
|
98
|
+
|
|
99
|
+
| Tool | Description |
|
|
100
|
+
|------|-------------|
|
|
101
|
+
| `search_projects` | Search 286+ CNCF projects by name, description, category, or CNCF status |
|
|
102
|
+
| `get_project_by_name` | Quick lookup by project name - finds the best match |
|
|
103
|
+
| `get_recent_releases` | Latest releases with filtering by category or security-only |
|
|
104
|
+
| `get_stats` | Platform statistics and CNCF project distribution |
|
|
105
|
+
| `get_project` | Detailed project information by ID |
|
|
106
|
+
| `get_project_releases` | Release history with AI-parsed notes and CVEs |
|
|
107
|
+
| `get_popular_projects` | Most subscribed projects ranked by popularity |
|
|
108
|
+
|
|
109
|
+
### Private Tools (Authentication Required)
|
|
110
|
+
|
|
111
|
+
| Tool | Description |
|
|
112
|
+
|------|-------------|
|
|
113
|
+
| `get_my_dashboard` | Your subscriptions, Pro status, and webhook settings |
|
|
114
|
+
| `get_my_subscriptions` | Detailed subscription list with configurations |
|
|
115
|
+
|
|
116
|
+
## Authentication
|
|
117
|
+
|
|
118
|
+
Private endpoints require your WordPress username and an Application Password:
|
|
119
|
+
|
|
120
|
+
1. Go to [Account → Developer API access](https://radar.kubebuddy.io/account/)
|
|
121
|
+
2. Create an Application Password
|
|
122
|
+
3. Use format: `username:app_password` when prompted by AI agent
|
|
123
|
+
|
|
124
|
+
## Example Queries
|
|
125
|
+
|
|
126
|
+
Once configured, ask your AI assistant:
|
|
127
|
+
|
|
128
|
+
**Security & Vulnerabilities:**
|
|
129
|
+
- "What are the latest security releases?"
|
|
130
|
+
- "Show me critical CVEs from this week"
|
|
131
|
+
- "Are there any security issues in the latest Kubernetes?"
|
|
132
|
+
|
|
133
|
+
**Version & Release Info:**
|
|
134
|
+
- "What's the latest ArgoCD version?"
|
|
135
|
+
- "Show me recent CI/CD tool releases"
|
|
136
|
+
- "What breaking changes are in the new Prometheus release?"
|
|
137
|
+
|
|
138
|
+
**Discovery:**
|
|
139
|
+
- "What are the CNCF graduated projects?"
|
|
140
|
+
- "Show me popular service mesh tools"
|
|
141
|
+
- "Find projects in the Networking category"
|
|
142
|
+
|
|
143
|
+
## Features
|
|
144
|
+
|
|
145
|
+
- 🔍 **Smart Search** - Server-side search with exact match prioritization
|
|
146
|
+
- 🏷️ **Category Filtering** - Filter by CI/CD, Networking, Storage, Security, Observability, etc.
|
|
147
|
+
- 🛡️ **Security Tracking** - CVE lists, severity levels, and security-only filtering
|
|
148
|
+
- 🎓 **CNCF Maturity Filtering** - Filter by graduated/incubating/sandbox status
|
|
149
|
+
- 🤖 **AI-Parsed Release Notes** - Every release includes AI-generated summaries
|
|
150
|
+
- ⚡ **Cloudflare Cached** - Public endpoints are cached for instant responses
|
|
151
|
+
- 🔐 **Secure Authentication** - WordPress Application Passwords for private data
|
|
152
|
+
|
|
153
|
+
## Documentation
|
|
154
|
+
|
|
155
|
+
- [Full Documentation](https://radar.kubebuddy.io/docs/mcp-server/)
|
|
156
|
+
- [API Reference](https://radar.kubebuddy.io/docs/api/)
|
|
157
|
+
- [Testing Guide](./TESTING.md)
|
|
158
|
+
- [UX Improvements](./UX-IMPROVEMENTS.md)
|
|
159
|
+
|
|
160
|
+
## Development
|
|
161
|
+
|
|
162
|
+
```bash
|
|
163
|
+
# Install dependencies
|
|
164
|
+
npm install
|
|
165
|
+
|
|
166
|
+
# Build TypeScript
|
|
167
|
+
npm run build
|
|
168
|
+
|
|
169
|
+
# Run in development mode
|
|
170
|
+
npm run dev
|
|
171
|
+
|
|
172
|
+
# Test with MCP Inspector
|
|
173
|
+
npx @modelcontextprotocol/inspector node dist/index.js
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
## Troubleshooting
|
|
177
|
+
|
|
178
|
+
**Installation fails with EPERM errors?**
|
|
179
|
+
This is a Windows-specific issue. Use the local build method: clone the repo, run `npm install && npm run build && npm pack`, then `npm install -g kubebuddy-radar-mcp-0.0.1.tgz`.
|
|
180
|
+
|
|
181
|
+
**Server not responding?**
|
|
182
|
+
Verify the path in your config matches where npm installed the package (typically `%APPDATA%\Roaming\npm\node_modules\@kubedeck\kubebuddy-mcp-server\dist\index.js` on Windows). Restart your AI assistant after configuration changes.
|
|
183
|
+
|
|
184
|
+
**Schema validation errors?**
|
|
185
|
+
Make sure you're on the latest version. Run `npm run build` and restart your AI assistant.
|
|
186
|
+
|
|
187
|
+
**Wrong project IDs?**
|
|
188
|
+
Search results now explicitly show IDs in format "ProjectName (ID: 651)".
|
|
189
|
+
|
|
190
|
+
**Need help?**
|
|
191
|
+
Check the [testing guide](./TESTING.md) or open an issue on GitHub.
|
|
192
|
+
|
|
193
|
+
## License
|
|
194
|
+
|
|
195
|
+
MIT
|
|
196
|
+
|
|
197
|
+
## Links
|
|
198
|
+
|
|
199
|
+
- [KubeBuddy Radar](https://radar.kubebuddy.io)
|
|
200
|
+
- [MCP Documentation](https://modelcontextprotocol.io)
|
|
201
|
+
- [Report Issues](https://github.com/KubeDeckio/kubebuddy-radar-mcp/issues)
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,590 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import fetch from 'node-fetch';
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
5
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
6
|
+
const BASE_URL = 'https://radar.kubebuddy.io/api/kb-radar/v1';
|
|
7
|
+
const USER_AGENT = 'KubeBuddy-MCP/1.0.0';
|
|
8
|
+
const PROJECTS_PER_PAGE = 25;
|
|
9
|
+
const MAX_RECENT_RELEASES = 20;
|
|
10
|
+
const ReleaseSchema = z
|
|
11
|
+
.object({
|
|
12
|
+
id: z.coerce.number().int().describe('Unique release identifier'),
|
|
13
|
+
product_id: z.coerce.number().int().describe('ID of the project this release belongs to'),
|
|
14
|
+
version: z.string().describe('Release version string'),
|
|
15
|
+
type: z.enum(['app', 'helm', 'pre']).describe('Release channel/type'),
|
|
16
|
+
release_notes: z.string().nullable().describe('AI-parsed release notes with HTML formatting including key features, breaking changes, and security information'),
|
|
17
|
+
url: z.string().nullable().describe('Optional link to the release announcement'),
|
|
18
|
+
published_at: z.string().describe('Publication timestamp'),
|
|
19
|
+
created_at: z.string().describe('Database insert timestamp for the release'),
|
|
20
|
+
has_security_fix: z.union([z.boolean(), z.string(), z.number()]).transform(val => val === true || val === '1' || val === 1).describe('Whether this release includes a security fix'),
|
|
21
|
+
cve_list: z.string().nullable().describe('Comma-separated CVEs associated with this release'),
|
|
22
|
+
security_severity: z
|
|
23
|
+
.enum(['none', 'low', 'medium', 'high', 'critical'])
|
|
24
|
+
.describe('Severity label for the security fix'),
|
|
25
|
+
security_summary: z.string().nullable().describe('Human-friendly summary of the security impact'),
|
|
26
|
+
cve_links: z.string().nullable().describe('Optional collection of CVE links'),
|
|
27
|
+
})
|
|
28
|
+
.describe('Release metadata and security tracking fields');
|
|
29
|
+
const ProjectSchema = z
|
|
30
|
+
.object({
|
|
31
|
+
id: z.coerce.number().int().describe('Internal project identifier'),
|
|
32
|
+
name: z.string().describe('Official project name'),
|
|
33
|
+
description: z.string().nullable().describe('Text description of the project'),
|
|
34
|
+
category: z.string().nullable().describe('Assigned project category'),
|
|
35
|
+
cncf_status: z.string().nullable().describe('CNCF graduation status'),
|
|
36
|
+
homepage: z.string().nullable().describe('Project landing page'),
|
|
37
|
+
docs_url: z.string().nullable().describe('Documentation site URL'),
|
|
38
|
+
repo_url: z.string().nullable().describe('Source repository URL'),
|
|
39
|
+
helm_chart_repo: z.string().nullable().describe('Chart repository, if applicable'),
|
|
40
|
+
logo_url: z.string().nullable().describe('Logo asset URL'),
|
|
41
|
+
updated_at: z.string().describe('Last update timestamp'),
|
|
42
|
+
latest_version: z.string().nullable().optional().describe('Most recently observed version'),
|
|
43
|
+
latest_published_at: z.string().nullable().optional().describe('Timestamp of latest published release'),
|
|
44
|
+
is_subscribed: z.union([z.boolean(), z.null()]).optional().transform(val => val === true).describe('Whether the current user is subscribed to this project'),
|
|
45
|
+
})
|
|
46
|
+
.describe('Catalog entry returned by /projects');
|
|
47
|
+
const ProjectsResponseSchema = z
|
|
48
|
+
.object({
|
|
49
|
+
page: z.coerce.number().int().describe('Current page number'),
|
|
50
|
+
per_page: z.coerce.number().int().describe('Projects per page'),
|
|
51
|
+
total: z.coerce.number().int().describe('Total number of available projects'),
|
|
52
|
+
total_pages: z.coerce.number().int().describe('Total pages for the catalog'),
|
|
53
|
+
items: z.array(ProjectSchema).describe('List of page results'),
|
|
54
|
+
})
|
|
55
|
+
.describe('Paginated response from the public project catalog');
|
|
56
|
+
const StatsSchema = z
|
|
57
|
+
.object({
|
|
58
|
+
success: z.boolean().describe('Flag that the stats endpoint succeeded'),
|
|
59
|
+
total_projects: z.coerce.number().int().describe('Projects tracked by Radar'),
|
|
60
|
+
total_releases: z.coerce.number().int().describe('Releases tracked by Radar'),
|
|
61
|
+
total_security_fixes: z.coerce.number().int().describe('Releases flagged as security fixes'),
|
|
62
|
+
})
|
|
63
|
+
.describe('Usage metrics returned by /stats');
|
|
64
|
+
const RecentReleaseSchema = z
|
|
65
|
+
.object({
|
|
66
|
+
id: z.coerce.number().int().describe('Release identifier'),
|
|
67
|
+
name: z.string().describe('Project name'),
|
|
68
|
+
logo_url: z.string().nullable().describe('Logo for the project'),
|
|
69
|
+
category: z.string().nullable().describe('Project category'),
|
|
70
|
+
cncf_status: z.string().nullable().describe('Graduation status'),
|
|
71
|
+
repo_url: z.string().nullable().describe('Repository URL'),
|
|
72
|
+
version: z.string().describe('Release version'),
|
|
73
|
+
type: z.enum(['app', 'helm', 'pre']).describe('Release channel'),
|
|
74
|
+
published_at: z.string().describe('Publication timestamp'),
|
|
75
|
+
release_notes: z.string().nullable().describe('AI-parsed release notes with HTML formatting'),
|
|
76
|
+
has_security_fix: z.union([z.boolean(), z.string(), z.number()]).transform(val => val === true || val === '1' || val === 1).describe('Security-fix flag'),
|
|
77
|
+
security_severity: z
|
|
78
|
+
.enum(['none', 'low', 'medium', 'high', 'critical'])
|
|
79
|
+
.describe('Security severity'),
|
|
80
|
+
})
|
|
81
|
+
.describe('Latest release distilled for the UI');
|
|
82
|
+
const RecentReleasesResponseSchema = z
|
|
83
|
+
.object({
|
|
84
|
+
success: z.boolean().describe('Indicates the endpoint succeeded'),
|
|
85
|
+
releases: z.array(RecentReleaseSchema).describe('Recent release entries'),
|
|
86
|
+
})
|
|
87
|
+
.describe('Response from /recent-releases');
|
|
88
|
+
const LabelSchema = z
|
|
89
|
+
.object({
|
|
90
|
+
id: z.coerce.number().int().describe('Label identifier'),
|
|
91
|
+
label_name: z.string().describe('Visible label name'),
|
|
92
|
+
label_color: z.string().describe('HEX color assigned to the label'),
|
|
93
|
+
subscription_count: z.coerce.number().int().describe('Number of subscriptions using this label'),
|
|
94
|
+
})
|
|
95
|
+
.describe('Label metadata for subscription filters');
|
|
96
|
+
const SubscriptionSchema = z
|
|
97
|
+
.object({
|
|
98
|
+
id: z.coerce.number().int().describe('Subscription record ID'),
|
|
99
|
+
user_id: z.coerce.number().int().describe('WordPress user ID'),
|
|
100
|
+
product_id: z.coerce.number().int().describe('Tracked project ID'),
|
|
101
|
+
webhook_url: z.string().nullable().describe('Optional webhook delivery URL'),
|
|
102
|
+
slack_webhook: z.string().nullable().describe('Slack webhook for this subscription'),
|
|
103
|
+
teams_webhook: z.string().nullable().describe('Teams webhook'),
|
|
104
|
+
generic_webhook: z.string().nullable().describe('Generic webhook endpoint'),
|
|
105
|
+
email_enabled: z.boolean().describe('Whether email notifications are enabled'),
|
|
106
|
+
email_frequency: z
|
|
107
|
+
.enum(['per_app', 'daily', 'weekly'])
|
|
108
|
+
.describe('Email cadence for subscription notifications'),
|
|
109
|
+
release_types_filter: z.string().describe('Comma-separated release types sent to email'),
|
|
110
|
+
webhook_release_types: z.string().describe('Comma-separated release types sent to webhooks'),
|
|
111
|
+
use_global_webhooks: z.boolean().describe('Whether the subscription reuses the global webhook'),
|
|
112
|
+
notifications_paused: z.boolean().describe('If notifications are paused for this subscription'),
|
|
113
|
+
created_at: z.string().describe('Record creation timestamp'),
|
|
114
|
+
name: z.string().describe('Project name'),
|
|
115
|
+
logo_url: z.string().nullable().describe('Logo assigned to the project'),
|
|
116
|
+
description: z.string().nullable().describe('Project description'),
|
|
117
|
+
repo_url: z.string().nullable().describe('Project repository URL'),
|
|
118
|
+
latest_release: ReleaseSchema.describe('Most recent release for this product').nullable(),
|
|
119
|
+
labels: z.array(LabelSchema).optional().describe('Custom labels attached to the subscription'),
|
|
120
|
+
})
|
|
121
|
+
.describe('Subscription record enriched with project metadata');
|
|
122
|
+
const DashboardResponseSchema = z
|
|
123
|
+
.object({
|
|
124
|
+
subscriptions: z.array(SubscriptionSchema).describe('All subscriptions for the user'),
|
|
125
|
+
is_pro: z.boolean().describe('Whether the user has a Pro membership'),
|
|
126
|
+
subscription_count: z.coerce.number().int().describe('Number of subscriptions'),
|
|
127
|
+
subscription_limit: z.coerce.number().int().describe('Free plan subscription cap (-1 means unlimited'),
|
|
128
|
+
user_email: z.string().nullable().describe('User notification email'),
|
|
129
|
+
user_login: z.string().nullable().describe('WordPress username'),
|
|
130
|
+
pms_status: z.string().nullable().describe('PMS subscription status'),
|
|
131
|
+
pms_trial_end: z.string().nullable().describe('PMS trial end date'),
|
|
132
|
+
pms_is_cancelled: z.boolean().describe('Whether PMS subscription is cancelled'),
|
|
133
|
+
slack_webhook: z.string().nullable().describe('Global Slack webhook'),
|
|
134
|
+
teams_webhook: z.string().nullable().describe('Global Teams webhook'),
|
|
135
|
+
generic_webhook: z.string().nullable().describe('Global generic webhook'),
|
|
136
|
+
webhook_release_types: z.string().nullable().describe('Release type filter for global webhooks'),
|
|
137
|
+
labels: z.array(LabelSchema).optional().describe('Labels available to the user'),
|
|
138
|
+
})
|
|
139
|
+
.describe('Private dashboard payload returned for authenticated users');
|
|
140
|
+
const SubscriptionsResponseSchema = z
|
|
141
|
+
.object({
|
|
142
|
+
subscriptions: z.array(SubscriptionSchema).describe('Matching subscriptions'),
|
|
143
|
+
subscription_count: z.coerce.number().int().describe('Number of subscriptions returned'),
|
|
144
|
+
})
|
|
145
|
+
.describe('Private subscription list payload');
|
|
146
|
+
const createFriendlyMessage = (context, error) => {
|
|
147
|
+
const message = error instanceof Error ? error.message : 'An unexpected error occurred.';
|
|
148
|
+
return {
|
|
149
|
+
content: [
|
|
150
|
+
{
|
|
151
|
+
type: 'text',
|
|
152
|
+
text: `Sorry, ${context}. ${message}`,
|
|
153
|
+
},
|
|
154
|
+
],
|
|
155
|
+
};
|
|
156
|
+
};
|
|
157
|
+
const buildAuthHeader = (username, appPassword) => {
|
|
158
|
+
const token = Buffer.from(`${username}:${appPassword}`, 'utf-8').toString('base64');
|
|
159
|
+
return `Basic ${token}`;
|
|
160
|
+
};
|
|
161
|
+
const fetchKubeBuddy = async (path, params, options) => {
|
|
162
|
+
const url = new URL(`${BASE_URL}${path}`);
|
|
163
|
+
if (params) {
|
|
164
|
+
for (const [key, value] of Object.entries(params)) {
|
|
165
|
+
if (value !== undefined && value !== null) {
|
|
166
|
+
url.searchParams.set(key, String(value));
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
const headers = {
|
|
171
|
+
'User-Agent': USER_AGENT,
|
|
172
|
+
Accept: 'application/json',
|
|
173
|
+
};
|
|
174
|
+
if (options?.authHeader) {
|
|
175
|
+
headers.Authorization = options.authHeader;
|
|
176
|
+
headers['Cache-Control'] = 'no-store';
|
|
177
|
+
}
|
|
178
|
+
const response = await fetch(url.toString(), { headers });
|
|
179
|
+
if (!response.ok) {
|
|
180
|
+
const body = await response.text().catch(() => '');
|
|
181
|
+
const snippet = body.length > 0 ? body.split('\n')[0] : response.statusText;
|
|
182
|
+
throw new Error(`KubeBuddy API ${path} returned ${response.status} (${snippet})`);
|
|
183
|
+
}
|
|
184
|
+
return response.json();
|
|
185
|
+
};
|
|
186
|
+
const clamp = (value, min, max) => Math.min(Math.max(value, min), max);
|
|
187
|
+
const server = new McpServer({
|
|
188
|
+
name: 'KubeBuddy Radar MCP Server',
|
|
189
|
+
version: '0.1.0',
|
|
190
|
+
}, {
|
|
191
|
+
instructions: 'Bridge AI agents like Claude, Windsurf, or Cursor to KubeBuddy Radar. Public tools skip Authorization so Cloudflare can cache responses, while private tools must send WordPress credentials to see dashboards and subscriptions.',
|
|
192
|
+
});
|
|
193
|
+
server.registerTool('search_projects', {
|
|
194
|
+
title: 'Search public projects',
|
|
195
|
+
description: 'Search the catalog of 286+ CNCF and cloud-native projects. Server-side search prioritizes exact name matches first, then name contains, then description/category/repo URL. Returns paginated results with project details including CNCF status (graduated/incubating/sandbox), category, and subscription counts. Filter by CNCF maturity level to find production-ready (graduated) or emerging (incubating/sandbox) projects. Use this to find specific projects or browse by keywords. No authentication required.',
|
|
196
|
+
inputSchema: z
|
|
197
|
+
.object({
|
|
198
|
+
search: z
|
|
199
|
+
.string()
|
|
200
|
+
.max(120)
|
|
201
|
+
.optional()
|
|
202
|
+
.describe('Search term to filter projects (e.g., "kubernetes", "monitoring", "service mesh"). Searches project name (prioritized), description, category, and repository URL.'),
|
|
203
|
+
page: z
|
|
204
|
+
.number()
|
|
205
|
+
.int()
|
|
206
|
+
.min(1)
|
|
207
|
+
.optional()
|
|
208
|
+
.describe('Page number for pagination (default: 1). Each page returns 20 projects.'),
|
|
209
|
+
cncf_status: z
|
|
210
|
+
.string()
|
|
211
|
+
.optional()
|
|
212
|
+
.describe('Filter by CNCF maturity level: "graduated" (production-ready), "incubating" (growing adoption), "sandbox" (early stage), or "open-source" (non-CNCF). Use this to assess project maturity.'),
|
|
213
|
+
})
|
|
214
|
+
.describe('Parameters for searching the public project catalog.'),
|
|
215
|
+
}, async (args) => {
|
|
216
|
+
const page = args.page ?? 1;
|
|
217
|
+
try {
|
|
218
|
+
const params = {
|
|
219
|
+
page,
|
|
220
|
+
per_page: PROJECTS_PER_PAGE,
|
|
221
|
+
search: args.search,
|
|
222
|
+
};
|
|
223
|
+
if (args.cncf_status)
|
|
224
|
+
params.cncf_status = args.cncf_status;
|
|
225
|
+
const raw = await fetchKubeBuddy('/projects', params);
|
|
226
|
+
const parsed = ProjectsResponseSchema.parse(raw);
|
|
227
|
+
// Build a more descriptive text response including project IDs
|
|
228
|
+
let textResponse = `Found ${parsed.items.length} projects on page ${parsed.page} of ${parsed.total_pages} (${parsed.total} total matching projects).`;
|
|
229
|
+
if (parsed.items.length > 0) {
|
|
230
|
+
textResponse += '\n\nProjects:';
|
|
231
|
+
parsed.items.forEach(project => {
|
|
232
|
+
textResponse += `\n- ${project.name} (ID: ${project.id}) - ${project.category || 'Uncategorized'}`;
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
return {
|
|
236
|
+
structuredContent: parsed,
|
|
237
|
+
content: [
|
|
238
|
+
{
|
|
239
|
+
type: 'text',
|
|
240
|
+
text: textResponse,
|
|
241
|
+
},
|
|
242
|
+
],
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
catch (error) {
|
|
246
|
+
console.error('search_projects tool failure', error);
|
|
247
|
+
return createFriendlyMessage('I could not retrieve the project catalog', error);
|
|
248
|
+
}
|
|
249
|
+
});
|
|
250
|
+
server.registerTool('get_recent_releases', {
|
|
251
|
+
title: 'Fetch recent releases',
|
|
252
|
+
description: 'Get the latest stable releases (type="app") across all tracked projects. Includes security fix flags (has_security_fix, security_severity), CVE information, and AI-parsed release notes with breaking changes. Filter by category (e.g., "CI/CD", "Networking", "Storage") or show only security releases. Use this to monitor the latest updates in the cloud-native ecosystem. No authentication required.',
|
|
253
|
+
inputSchema: z
|
|
254
|
+
.object({
|
|
255
|
+
limit: z
|
|
256
|
+
.number()
|
|
257
|
+
.int()
|
|
258
|
+
.min(1)
|
|
259
|
+
.optional()
|
|
260
|
+
.describe('Number of releases to return (max 20, default 5).'),
|
|
261
|
+
category: z
|
|
262
|
+
.string()
|
|
263
|
+
.optional()
|
|
264
|
+
.describe('Filter by project category (e.g., "CI/CD", "Networking", "Storage", "Service Mesh", "Monitoring"). Case-insensitive partial match.'),
|
|
265
|
+
security_only: z
|
|
266
|
+
.boolean()
|
|
267
|
+
.optional()
|
|
268
|
+
.describe('If true, only return releases with security fixes (has_security_fix=true). Useful for security monitoring.'),
|
|
269
|
+
})
|
|
270
|
+
.describe('Parameters for the recent release feed.'),
|
|
271
|
+
}, async (args) => {
|
|
272
|
+
const limit = clamp(args.limit ?? 5, 1, MAX_RECENT_RELEASES);
|
|
273
|
+
try {
|
|
274
|
+
const params = { limit };
|
|
275
|
+
if (args.category)
|
|
276
|
+
params.category = args.category;
|
|
277
|
+
if (args.security_only)
|
|
278
|
+
params.security_only = '1';
|
|
279
|
+
const raw = await fetchKubeBuddy('/recent-releases', params);
|
|
280
|
+
const parsed = RecentReleasesResponseSchema.parse(raw);
|
|
281
|
+
let filterDesc = '';
|
|
282
|
+
if (args.category)
|
|
283
|
+
filterDesc += ` in category "${args.category}"`;
|
|
284
|
+
if (args.security_only)
|
|
285
|
+
filterDesc += ' with security fixes';
|
|
286
|
+
return {
|
|
287
|
+
structuredContent: parsed,
|
|
288
|
+
content: [
|
|
289
|
+
{
|
|
290
|
+
type: 'text',
|
|
291
|
+
text: `Fetched ${parsed.releases.length} recent releases${filterDesc} (limit ${limit}).`,
|
|
292
|
+
},
|
|
293
|
+
],
|
|
294
|
+
};
|
|
295
|
+
}
|
|
296
|
+
catch (error) {
|
|
297
|
+
console.error('get_recent_releases tool failure', error);
|
|
298
|
+
return createFriendlyMessage('I could not fetch the recent releases feed', error);
|
|
299
|
+
}
|
|
300
|
+
});
|
|
301
|
+
server.registerTool('get_stats', {
|
|
302
|
+
title: 'Get platform statistics',
|
|
303
|
+
description: 'Get overall statistics about the platform: total projects tracked, total releases, release counts by time period (7d/30d/90d), security fix counts, and CNCF project distribution (graduated/incubating/sandbox). Use this for overview metrics. No authentication required.',
|
|
304
|
+
inputSchema: z.object({}).describe('No parameters required for stats.'),
|
|
305
|
+
}, async () => {
|
|
306
|
+
try {
|
|
307
|
+
const raw = await fetchKubeBuddy('/stats');
|
|
308
|
+
const parsed = StatsSchema.parse(raw);
|
|
309
|
+
return {
|
|
310
|
+
structuredContent: parsed,
|
|
311
|
+
content: [
|
|
312
|
+
{
|
|
313
|
+
type: 'text',
|
|
314
|
+
text: `KubeBuddy Radar tracks ${parsed.total_projects} projects with ${parsed.total_releases} releases (${parsed.total_security_fixes} security fixes).`,
|
|
315
|
+
},
|
|
316
|
+
],
|
|
317
|
+
};
|
|
318
|
+
}
|
|
319
|
+
catch (error) {
|
|
320
|
+
console.error('get_stats tool failure', error);
|
|
321
|
+
return createFriendlyMessage('I could not fetch platform statistics', error);
|
|
322
|
+
}
|
|
323
|
+
});
|
|
324
|
+
server.registerTool('get_project', {
|
|
325
|
+
title: 'Get project details',
|
|
326
|
+
description: 'Fetch detailed information about a single project by its ID. Returns project metadata (name, description, category, CNCF status, repository URL), subscriber count, and latest release with security information. Use this after searching to get comprehensive project details. No authentication required.',
|
|
327
|
+
inputSchema: z
|
|
328
|
+
.object({
|
|
329
|
+
id: z.number().int().positive().describe('The project ID to retrieve.'),
|
|
330
|
+
})
|
|
331
|
+
.describe('Parameters for fetching a single project.'),
|
|
332
|
+
}, async (args) => {
|
|
333
|
+
try {
|
|
334
|
+
const raw = await fetchKubeBuddy(`/projects/${args.id}`);
|
|
335
|
+
// API returns { product: {...} }
|
|
336
|
+
const data = raw.product;
|
|
337
|
+
const parsed = ProjectSchema.parse(data);
|
|
338
|
+
return {
|
|
339
|
+
structuredContent: parsed,
|
|
340
|
+
content: [
|
|
341
|
+
{
|
|
342
|
+
type: 'text',
|
|
343
|
+
text: `Project: ${parsed.name}${parsed.category ? ` (${parsed.category})` : ''} - ${parsed.description || 'No description'}`,
|
|
344
|
+
},
|
|
345
|
+
],
|
|
346
|
+
};
|
|
347
|
+
}
|
|
348
|
+
catch (error) {
|
|
349
|
+
console.error('get_project tool failure', error);
|
|
350
|
+
return createFriendlyMessage(`I could not fetch project ${args.id}`, error);
|
|
351
|
+
}
|
|
352
|
+
});
|
|
353
|
+
const ProjectReleasesResponseSchema = z
|
|
354
|
+
.object({
|
|
355
|
+
product: z.object({
|
|
356
|
+
releases: z.object({
|
|
357
|
+
app: z.array(ReleaseSchema).optional(),
|
|
358
|
+
helm: z.array(ReleaseSchema).optional(),
|
|
359
|
+
pre: z.array(ReleaseSchema).optional(),
|
|
360
|
+
}),
|
|
361
|
+
}),
|
|
362
|
+
})
|
|
363
|
+
.describe('Product with releases grouped by type');
|
|
364
|
+
server.registerTool('get_project_releases', {
|
|
365
|
+
title: 'Get project releases',
|
|
366
|
+
description: 'Retrieve release history for a specific project, grouped by release type: "app" (stable application releases), "helm" (Helm chart releases), or "pre" (pre-releases/RC). Includes security information (CVEs, severity), AI-parsed release notes, breaking changes, and key features. Use this to view version history and upgrade planning. No authentication required.',
|
|
367
|
+
inputSchema: z
|
|
368
|
+
.object({
|
|
369
|
+
id: z.number().int().positive().describe('The project ID.'),
|
|
370
|
+
type: z
|
|
371
|
+
.enum(['app', 'helm', 'pre'])
|
|
372
|
+
.optional()
|
|
373
|
+
.describe('Filter by release type: app (stable), helm (Helm charts), or pre (pre-release).'),
|
|
374
|
+
page: z.number().int().min(1).optional().describe('Page number (default: 1).'),
|
|
375
|
+
per_page: z.number().int().min(1).max(100).optional().describe('Results per page (default: 20).'),
|
|
376
|
+
})
|
|
377
|
+
.describe('Parameters for fetching project releases.'),
|
|
378
|
+
}, async (args) => {
|
|
379
|
+
try {
|
|
380
|
+
const raw = await fetchKubeBuddy(`/projects/${args.id}`);
|
|
381
|
+
const parsed = ProjectReleasesResponseSchema.parse(raw);
|
|
382
|
+
const releaseType = args.type || 'app';
|
|
383
|
+
const releases = parsed.product.releases[releaseType] || [];
|
|
384
|
+
const totalReleases = releases.length;
|
|
385
|
+
return {
|
|
386
|
+
structuredContent: { releases, total: totalReleases },
|
|
387
|
+
content: [
|
|
388
|
+
{
|
|
389
|
+
type: 'text',
|
|
390
|
+
text: `Found ${totalReleases} ${releaseType} releases for project ${args.id}.`,
|
|
391
|
+
},
|
|
392
|
+
],
|
|
393
|
+
};
|
|
394
|
+
}
|
|
395
|
+
catch (error) {
|
|
396
|
+
console.error('get_project_releases tool failure', error);
|
|
397
|
+
return createFriendlyMessage(`I could not fetch releases for project ${args.id}`, error);
|
|
398
|
+
}
|
|
399
|
+
});
|
|
400
|
+
const PopularProjectSchema = z
|
|
401
|
+
.object({
|
|
402
|
+
id: z.coerce.number().int(),
|
|
403
|
+
name: z.string(),
|
|
404
|
+
category: z.string().nullable(),
|
|
405
|
+
cncf_status: z.string().nullable(),
|
|
406
|
+
logo_url: z.string().nullable(),
|
|
407
|
+
repo_url: z.string().nullable(),
|
|
408
|
+
subscriber_count: z.coerce.number().int(),
|
|
409
|
+
last_release_at: z.string().nullable(),
|
|
410
|
+
releases_30d: z.coerce.number().int(),
|
|
411
|
+
})
|
|
412
|
+
.describe('Popular project with subscriber count and recent activity');
|
|
413
|
+
const PopularProjectsResponseSchema = z
|
|
414
|
+
.object({
|
|
415
|
+
success: z.boolean(),
|
|
416
|
+
projects: z.array(PopularProjectSchema),
|
|
417
|
+
})
|
|
418
|
+
.describe('Response from /popular-projects');
|
|
419
|
+
server.registerTool('get_popular_projects', {
|
|
420
|
+
title: 'Get popular projects',
|
|
421
|
+
description: 'Retrieve the most popular projects ranked by subscriber count. Shows how many users track each project and their release activity (releases in last 30 days). Use this to discover widely-used and actively maintained projects. No authentication required.',
|
|
422
|
+
inputSchema: z
|
|
423
|
+
.object({
|
|
424
|
+
limit: z
|
|
425
|
+
.number()
|
|
426
|
+
.int()
|
|
427
|
+
.min(1)
|
|
428
|
+
.max(50)
|
|
429
|
+
.optional()
|
|
430
|
+
.describe('Number of projects to return (default: 10, max: 50).'),
|
|
431
|
+
})
|
|
432
|
+
.describe('Parameters for fetching popular projects.'),
|
|
433
|
+
}, async (args) => {
|
|
434
|
+
try {
|
|
435
|
+
const raw = await fetchKubeBuddy('/popular-projects', {
|
|
436
|
+
limit: args.limit ?? 10,
|
|
437
|
+
});
|
|
438
|
+
const parsed = PopularProjectsResponseSchema.parse(raw);
|
|
439
|
+
return {
|
|
440
|
+
structuredContent: parsed,
|
|
441
|
+
content: [
|
|
442
|
+
{
|
|
443
|
+
type: 'text',
|
|
444
|
+
text: `Top ${parsed.projects.length} most followed projects on KubeBuddy Radar.`,
|
|
445
|
+
},
|
|
446
|
+
],
|
|
447
|
+
};
|
|
448
|
+
}
|
|
449
|
+
catch (error) {
|
|
450
|
+
console.error('get_popular_projects tool failure', error);
|
|
451
|
+
return createFriendlyMessage('I could not fetch popular projects', error);
|
|
452
|
+
}
|
|
453
|
+
});
|
|
454
|
+
server.registerTool('get_project_by_name', {
|
|
455
|
+
title: 'Quick project lookup by name',
|
|
456
|
+
description: 'Find a project by its exact or partial name and return the best match with full details. This is faster than search_projects when you know the project name. Returns the project ID, description, category, CNCF status, latest version, and repository URL. Use this for questions like "What\'s the latest Kubernetes version?" or "Show me ArgoCD details". No authentication required.',
|
|
457
|
+
inputSchema: z
|
|
458
|
+
.object({
|
|
459
|
+
name: z
|
|
460
|
+
.string()
|
|
461
|
+
.min(1)
|
|
462
|
+
.describe('Project name to find (e.g., "Kubernetes", "ArgoCD", "Prometheus"). Case-insensitive, exact matches prioritized.'),
|
|
463
|
+
})
|
|
464
|
+
.describe('Parameters for project name lookup.'),
|
|
465
|
+
}, async (args) => {
|
|
466
|
+
try {
|
|
467
|
+
// Use search with the name, get first page
|
|
468
|
+
const raw = await fetchKubeBuddy('/projects', {
|
|
469
|
+
search: args.name,
|
|
470
|
+
page: 1,
|
|
471
|
+
per_page: PROJECTS_PER_PAGE,
|
|
472
|
+
});
|
|
473
|
+
const parsed = ProjectsResponseSchema.parse(raw);
|
|
474
|
+
if (parsed.items.length === 0) {
|
|
475
|
+
return {
|
|
476
|
+
content: [
|
|
477
|
+
{
|
|
478
|
+
type: 'text',
|
|
479
|
+
text: `No projects found matching "${args.name}". Try a different search term or browse all projects with search_projects.`,
|
|
480
|
+
},
|
|
481
|
+
],
|
|
482
|
+
};
|
|
483
|
+
}
|
|
484
|
+
// Return the best match (first result, which is prioritized by server)
|
|
485
|
+
const project = parsed.items[0];
|
|
486
|
+
return {
|
|
487
|
+
structuredContent: project,
|
|
488
|
+
content: [
|
|
489
|
+
{
|
|
490
|
+
type: 'text',
|
|
491
|
+
text: `Found: ${project.name} (ID: ${project.id})\nCategory: ${project.category || 'Uncategorized'}\nCNCF Status: ${project.cncf_status || 'N/A'}\nLatest Version: ${project.latest_version || 'Unknown'}\nDescription: ${project.description || 'No description available'}\nRepository: ${project.repo_url || 'N/A'}`,
|
|
492
|
+
},
|
|
493
|
+
],
|
|
494
|
+
};
|
|
495
|
+
}
|
|
496
|
+
catch (error) {
|
|
497
|
+
console.error('get_project_by_name tool failure', error);
|
|
498
|
+
return createFriendlyMessage(`I could not find project "${args.name}"`, error);
|
|
499
|
+
}
|
|
500
|
+
});
|
|
501
|
+
const requireAuthHeaders = (username, appPassword) => buildAuthHeader(username, appPassword);
|
|
502
|
+
server.registerTool('get_my_dashboard', {
|
|
503
|
+
title: 'Retrieve my dashboard',
|
|
504
|
+
description: 'Requires WordPress Application Password credentials to bypass cache.',
|
|
505
|
+
inputSchema: z
|
|
506
|
+
.object({
|
|
507
|
+
username: z
|
|
508
|
+
.string()
|
|
509
|
+
.min(1)
|
|
510
|
+
.describe('Your WordPress username (not email).'),
|
|
511
|
+
appPassword: z
|
|
512
|
+
.string()
|
|
513
|
+
.min(1)
|
|
514
|
+
.describe('A WordPress Application Password generated from your profile.'),
|
|
515
|
+
})
|
|
516
|
+
.describe('Credentials used for dashboard access.'),
|
|
517
|
+
}, async (args) => {
|
|
518
|
+
const authHeader = requireAuthHeaders(args.username, args.appPassword);
|
|
519
|
+
try {
|
|
520
|
+
const raw = await fetchKubeBuddy('/dashboard', undefined, {
|
|
521
|
+
authHeader,
|
|
522
|
+
});
|
|
523
|
+
const parsed = DashboardResponseSchema.parse(raw);
|
|
524
|
+
return {
|
|
525
|
+
structuredContent: parsed,
|
|
526
|
+
content: [
|
|
527
|
+
{
|
|
528
|
+
type: 'text',
|
|
529
|
+
text: `Dashboard shows ${parsed.subscriptions.length} subscriptions for ${parsed.user_login || 'you'}.`,
|
|
530
|
+
},
|
|
531
|
+
],
|
|
532
|
+
};
|
|
533
|
+
}
|
|
534
|
+
catch (error) {
|
|
535
|
+
console.error('get_my_dashboard tool failure', error);
|
|
536
|
+
return createFriendlyMessage('I could not load your dashboard', error);
|
|
537
|
+
}
|
|
538
|
+
});
|
|
539
|
+
server.registerTool('get_my_subscriptions', {
|
|
540
|
+
title: 'List my subscriptions',
|
|
541
|
+
description: 'Uses Basic Auth to bypass Cloudflare cache and return private subscriptions.',
|
|
542
|
+
inputSchema: z
|
|
543
|
+
.object({
|
|
544
|
+
username: z
|
|
545
|
+
.string()
|
|
546
|
+
.min(1)
|
|
547
|
+
.describe('WordPress username tied to the application password.'),
|
|
548
|
+
appPassword: z
|
|
549
|
+
.string()
|
|
550
|
+
.min(1)
|
|
551
|
+
.describe('WordPress Application Password (shown only once).'),
|
|
552
|
+
})
|
|
553
|
+
.describe('Credentials to read the private subscriptions endpoint.'),
|
|
554
|
+
}, async (args) => {
|
|
555
|
+
const authHeader = requireAuthHeaders(args.username, args.appPassword);
|
|
556
|
+
try {
|
|
557
|
+
const raw = await fetchKubeBuddy('/subscriptions', undefined, {
|
|
558
|
+
authHeader,
|
|
559
|
+
});
|
|
560
|
+
const parsed = SubscriptionsResponseSchema.parse(raw);
|
|
561
|
+
return {
|
|
562
|
+
structuredContent: parsed,
|
|
563
|
+
content: [
|
|
564
|
+
{
|
|
565
|
+
type: 'text',
|
|
566
|
+
text: `Found ${parsed.subscription_count} subscriptions tied to ${args.username}.`,
|
|
567
|
+
},
|
|
568
|
+
],
|
|
569
|
+
};
|
|
570
|
+
}
|
|
571
|
+
catch (error) {
|
|
572
|
+
console.error('get_my_subscriptions tool failure', error);
|
|
573
|
+
return createFriendlyMessage('I could not retrieve your subscriptions', error);
|
|
574
|
+
}
|
|
575
|
+
});
|
|
576
|
+
const start = async () => {
|
|
577
|
+
const transport = new StdioServerTransport();
|
|
578
|
+
await server.connect(transport);
|
|
579
|
+
const tearDown = () => {
|
|
580
|
+
transport.close().catch(() => { });
|
|
581
|
+
server.close().catch(() => { });
|
|
582
|
+
};
|
|
583
|
+
process.on('SIGINT', tearDown);
|
|
584
|
+
process.on('SIGTERM', tearDown);
|
|
585
|
+
};
|
|
586
|
+
start().catch((error) => {
|
|
587
|
+
console.error('Failed to start the MCP server', error);
|
|
588
|
+
process.exit(1);
|
|
589
|
+
});
|
|
590
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@kubedeck/kubebuddy-radar-mcp",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "Model Context Protocol server for KubeBuddy Radar API - Query 286+ CNCF projects with AI agents",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"bin": {
|
|
8
|
+
"kubebuddy-radar-mcp": "./dist/index.js"
|
|
9
|
+
},
|
|
10
|
+
"files": [
|
|
11
|
+
"dist"
|
|
12
|
+
],
|
|
13
|
+
"publishConfig": {
|
|
14
|
+
"access": "public"
|
|
15
|
+
},
|
|
16
|
+
"scripts": {
|
|
17
|
+
"build": "tsc",
|
|
18
|
+
"prepare": "npm run build",
|
|
19
|
+
"dev": "ts-node src/index.ts",
|
|
20
|
+
"start": "node --enable-source-maps dist/index.js"
|
|
21
|
+
},
|
|
22
|
+
"repository": {
|
|
23
|
+
"type": "git",
|
|
24
|
+
"url": "https://github.com/KubeDeckio/kubebuddy-radar-mcp.git"
|
|
25
|
+
},
|
|
26
|
+
"keywords": [
|
|
27
|
+
"mcp",
|
|
28
|
+
"model-context-protocol",
|
|
29
|
+
"kubebuddy",
|
|
30
|
+
"kubernetes",
|
|
31
|
+
"cncf",
|
|
32
|
+
"releases",
|
|
33
|
+
"security",
|
|
34
|
+
"claude",
|
|
35
|
+
"ai"
|
|
36
|
+
],
|
|
37
|
+
"author": "KubeDeck",
|
|
38
|
+
"license": "MIT",
|
|
39
|
+
"homepage": "https://radar.kubebuddy.io/docs/mcp-server/",
|
|
40
|
+
"bugs": {
|
|
41
|
+
"url": "https://github.com/KubeDeckio/kubebuddy-radar-mcp/issues"
|
|
42
|
+
},
|
|
43
|
+
"dependencies": {
|
|
44
|
+
"@modelcontextprotocol/sdk": "^1.25.3",
|
|
45
|
+
"node-fetch": "^3.3.2",
|
|
46
|
+
"ws": "^8.19.0",
|
|
47
|
+
"zod": "^4.3.6",
|
|
48
|
+
"typescript": "^5.9.3"
|
|
49
|
+
},
|
|
50
|
+
"devDependencies": {
|
|
51
|
+
"ts-node": "^10.9.2"
|
|
52
|
+
}
|
|
53
|
+
}
|