@tocharianou/mcp-server-kibana 0.6.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/LICENSE +201 -0
- package/README.md +530 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +417 -0
- package/dist/index.js.map +1 -0
- package/dist/kibana-openapi-source.yaml +52597 -0
- package/dist/src/analysis-tools.d.ts +6 -0
- package/dist/src/analysis-tools.js +134 -0
- package/dist/src/analysis-tools.js.map +1 -0
- package/dist/src/base-tools.d.ts +2 -0
- package/dist/src/base-tools.js +349 -0
- package/dist/src/base-tools.js.map +1 -0
- package/dist/src/dependency-analyzer.d.ts +65 -0
- package/dist/src/dependency-analyzer.js +233 -0
- package/dist/src/dependency-analyzer.js.map +1 -0
- package/dist/src/health-analyzer.d.ts +60 -0
- package/dist/src/health-analyzer.js +301 -0
- package/dist/src/health-analyzer.js.map +1 -0
- package/dist/src/kibana-openapi-source.yaml +52597 -0
- package/dist/src/openapi-simplifier.d.ts +33 -0
- package/dist/src/openapi-simplifier.js +122 -0
- package/dist/src/openapi-simplifier.js.map +1 -0
- package/dist/src/prompts.d.ts +2 -0
- package/dist/src/prompts.js +91 -0
- package/dist/src/prompts.js.map +1 -0
- package/dist/src/resources.d.ts +2 -0
- package/dist/src/resources.js +125 -0
- package/dist/src/resources.js.map +1 -0
- package/dist/src/types.d.ts +150 -0
- package/dist/src/types.js +38 -0
- package/dist/src/types.js.map +1 -0
- package/dist/src/vl_create_tools.d.ts +5 -0
- package/dist/src/vl_create_tools.js +264 -0
- package/dist/src/vl_create_tools.js.map +1 -0
- package/dist/src/vl_delete_tools.d.ts +5 -0
- package/dist/src/vl_delete_tools.js +158 -0
- package/dist/src/vl_delete_tools.js.map +1 -0
- package/dist/src/vl_get_tools.d.ts +5 -0
- package/dist/src/vl_get_tools.js +201 -0
- package/dist/src/vl_get_tools.js.map +1 -0
- package/dist/src/vl_search_tools.d.ts +9 -0
- package/dist/src/vl_search_tools.js +290 -0
- package/dist/src/vl_search_tools.js.map +1 -0
- package/dist/src/vl_update_tools.d.ts +5 -0
- package/dist/src/vl_update_tools.js +372 -0
- package/dist/src/vl_update_tools.js.map +1 -0
- package/kibana-openapi-source.yaml +52597 -0
- package/package.json +95 -0
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Intelligent Analysis Tools Registration Module
|
|
3
|
+
* Register dependency analysis and health check features as MCP Tools
|
|
4
|
+
*/
|
|
5
|
+
import type { ServerBase, KibanaClient } from "./types.js";
|
|
6
|
+
export declare function registerAnalysisTools(server: ServerBase, kibanaClient: KibanaClient, defaultSpace: string): void;
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Intelligent Analysis Tools Registration Module
|
|
3
|
+
* Register dependency analysis and health check features as MCP Tools
|
|
4
|
+
*/
|
|
5
|
+
import { z } from "zod";
|
|
6
|
+
import { buildDependencyTree, analyzeImpact, formatDependencyTreeToMarkdown, formatImpactAnalysisToMarkdown } from "./dependency-analyzer.js";
|
|
7
|
+
import { analyzeDashboardHealth, batchAnalyzeDashboards, formatHealthReportToMarkdown, formatBatchHealthReportToMarkdown } from "./health-analyzer.js";
|
|
8
|
+
export function registerAnalysisTools(server, kibanaClient, defaultSpace) {
|
|
9
|
+
// Tool 1: Analyze Saved Object dependency tree
|
|
10
|
+
server.tool("analyze_object_dependencies", "Analyze dependency tree for a Kibana saved object (Dashboard, Visualization, etc.)", z.object({
|
|
11
|
+
id: z.string().describe("Saved object ID"),
|
|
12
|
+
type: z.string().describe("Saved object type (e.g., dashboard, visualization, lens, index-pattern)"),
|
|
13
|
+
space: z.string().optional().describe("Kibana space (optional)"),
|
|
14
|
+
max_depth: z.number().optional().default(5).describe("Maximum depth to traverse (default: 5)")
|
|
15
|
+
}), async ({ id, type, space, max_depth }) => {
|
|
16
|
+
try {
|
|
17
|
+
const targetSpace = space || defaultSpace;
|
|
18
|
+
const tree = await buildDependencyTree(kibanaClient, id, type, targetSpace, max_depth);
|
|
19
|
+
const markdown = formatDependencyTreeToMarkdown(tree);
|
|
20
|
+
return {
|
|
21
|
+
content: [
|
|
22
|
+
{
|
|
23
|
+
type: "text",
|
|
24
|
+
text: markdown
|
|
25
|
+
}
|
|
26
|
+
]
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
return {
|
|
31
|
+
content: [
|
|
32
|
+
{
|
|
33
|
+
type: "text",
|
|
34
|
+
text: `Error analyzing dependencies: ${error instanceof Error ? error.message : String(error)}`
|
|
35
|
+
}
|
|
36
|
+
],
|
|
37
|
+
isError: true
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
// Tool 2: Impact scope analysis
|
|
42
|
+
server.tool("analyze_deletion_impact", "Analyze the impact of deleting or modifying a saved object (what will be affected)", z.object({
|
|
43
|
+
id: z.string().describe("Saved object ID to analyze"),
|
|
44
|
+
type: z.string().describe("Saved object type (e.g., visualization, lens, index-pattern)"),
|
|
45
|
+
space: z.string().optional().describe("Kibana space (optional)")
|
|
46
|
+
}), async ({ id, type, space }) => {
|
|
47
|
+
try {
|
|
48
|
+
const targetSpace = space || defaultSpace;
|
|
49
|
+
const impact = await analyzeImpact(kibanaClient, id, type, targetSpace);
|
|
50
|
+
const markdown = formatImpactAnalysisToMarkdown(impact);
|
|
51
|
+
return {
|
|
52
|
+
content: [
|
|
53
|
+
{
|
|
54
|
+
type: "text",
|
|
55
|
+
text: markdown
|
|
56
|
+
}
|
|
57
|
+
]
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
return {
|
|
62
|
+
content: [
|
|
63
|
+
{
|
|
64
|
+
type: "text",
|
|
65
|
+
text: `Error analyzing impact: ${error instanceof Error ? error.message : String(error)}`
|
|
66
|
+
}
|
|
67
|
+
],
|
|
68
|
+
isError: true
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
// Tool 3: Dashboard health check
|
|
73
|
+
server.tool("check_dashboard_health", "Perform health check on a Dashboard to detect broken references, performance issues, etc.", z.object({
|
|
74
|
+
dashboard_id: z.string().describe("Dashboard ID to check"),
|
|
75
|
+
space: z.string().optional().describe("Kibana space (optional)"),
|
|
76
|
+
check_indices: z.boolean().optional().default(false).describe("Also check if referenced Elasticsearch indices exist (requires additional permissions)")
|
|
77
|
+
}), async ({ dashboard_id, space, check_indices }) => {
|
|
78
|
+
try {
|
|
79
|
+
const targetSpace = space || defaultSpace;
|
|
80
|
+
const health = await analyzeDashboardHealth(kibanaClient, dashboard_id, targetSpace, check_indices);
|
|
81
|
+
const markdown = formatHealthReportToMarkdown(health);
|
|
82
|
+
return {
|
|
83
|
+
content: [
|
|
84
|
+
{
|
|
85
|
+
type: "text",
|
|
86
|
+
text: markdown
|
|
87
|
+
}
|
|
88
|
+
]
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
catch (error) {
|
|
92
|
+
return {
|
|
93
|
+
content: [
|
|
94
|
+
{
|
|
95
|
+
type: "text",
|
|
96
|
+
text: `Error checking dashboard health: ${error instanceof Error ? error.message : String(error)}`
|
|
97
|
+
}
|
|
98
|
+
],
|
|
99
|
+
isError: true
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
// Tool 4: Batch Dashboard health scan
|
|
104
|
+
server.tool("scan_all_dashboards_health", "Scan health status of all Dashboards in a space (returns summary report)", z.object({
|
|
105
|
+
space: z.string().optional().describe("Kibana space (optional)"),
|
|
106
|
+
max_dashboards: z.number().optional().default(50).describe("Maximum number of dashboards to scan (default: 50)")
|
|
107
|
+
}), async ({ space, max_dashboards }) => {
|
|
108
|
+
try {
|
|
109
|
+
const targetSpace = space || defaultSpace;
|
|
110
|
+
const report = await batchAnalyzeDashboards(kibanaClient, targetSpace, max_dashboards);
|
|
111
|
+
const markdown = formatBatchHealthReportToMarkdown(report);
|
|
112
|
+
return {
|
|
113
|
+
content: [
|
|
114
|
+
{
|
|
115
|
+
type: "text",
|
|
116
|
+
text: markdown
|
|
117
|
+
}
|
|
118
|
+
]
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
catch (error) {
|
|
122
|
+
return {
|
|
123
|
+
content: [
|
|
124
|
+
{
|
|
125
|
+
type: "text",
|
|
126
|
+
text: `Error scanning dashboards: ${error instanceof Error ? error.message : String(error)}`
|
|
127
|
+
}
|
|
128
|
+
],
|
|
129
|
+
isError: true
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=analysis-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analysis-tools.js","sourceRoot":"","sources":["../../src/analysis-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,349 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { simplifyEndpointDetail, formatEndpointToMarkdown } from "./openapi-simplifier.js";
|
|
3
|
+
// Import API index and search logic
|
|
4
|
+
import fs from 'fs';
|
|
5
|
+
import path from 'path';
|
|
6
|
+
import yaml from 'js-yaml';
|
|
7
|
+
import { fileURLToPath } from 'url';
|
|
8
|
+
import { dirname } from 'path';
|
|
9
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
10
|
+
const __dirname = dirname(__filename);
|
|
11
|
+
let apiEndpointIndex = [];
|
|
12
|
+
let isIndexBuilt = false;
|
|
13
|
+
let YAML_FILE_PATH = '';
|
|
14
|
+
let openApiDoc = null;
|
|
15
|
+
async function buildApiIndex() {
|
|
16
|
+
if (isIndexBuilt)
|
|
17
|
+
return;
|
|
18
|
+
// Enhanced path resolution for both compiled JS and direct TS execution
|
|
19
|
+
const possiblePaths = [
|
|
20
|
+
// Environment variable takes highest priority
|
|
21
|
+
process.env.KIBANA_OPENAPI_YAML_PATH,
|
|
22
|
+
// Current working directory
|
|
23
|
+
path.join(process.cwd(), 'kibana-openapi-source.yaml'),
|
|
24
|
+
// Relative to the source file
|
|
25
|
+
path.join(__dirname, 'kibana-openapi-source.yaml'),
|
|
26
|
+
// One level up from source file (for ts-node execution)
|
|
27
|
+
path.resolve(__dirname, '..', 'kibana-openapi-source.yaml'),
|
|
28
|
+
// dist directory for compiled JS
|
|
29
|
+
path.join(process.cwd(), 'dist', 'src', 'kibana-openapi-source.yaml')
|
|
30
|
+
].filter((p) => typeof p === 'string' && p.length > 0);
|
|
31
|
+
for (const p of possiblePaths) {
|
|
32
|
+
if (fs.existsSync(p)) {
|
|
33
|
+
YAML_FILE_PATH = p;
|
|
34
|
+
console.warn(`Using YAML file from: ${p}`);
|
|
35
|
+
break;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
if (!YAML_FILE_PATH) {
|
|
39
|
+
console.error('Could not find kibana-openapi-source.yaml file');
|
|
40
|
+
isIndexBuilt = true;
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
try {
|
|
44
|
+
const yamlContent = fs.readFileSync(YAML_FILE_PATH, 'utf8');
|
|
45
|
+
openApiDoc = yaml.load(yamlContent);
|
|
46
|
+
if (!openApiDoc || !openApiDoc.paths) {
|
|
47
|
+
throw new Error('Invalid YAML file structure: missing paths');
|
|
48
|
+
}
|
|
49
|
+
for (const [pathStr, pathObj] of Object.entries(openApiDoc.paths)) {
|
|
50
|
+
for (const [method, methodObj] of Object.entries(pathObj)) {
|
|
51
|
+
if (["get", "post", "put", "delete", "patch"].includes(method)) {
|
|
52
|
+
apiEndpointIndex.push({
|
|
53
|
+
path: pathStr,
|
|
54
|
+
method: method.toUpperCase(),
|
|
55
|
+
description: methodObj.description,
|
|
56
|
+
summary: methodObj.summary,
|
|
57
|
+
parameters: methodObj.parameters,
|
|
58
|
+
requestBody: methodObj.requestBody,
|
|
59
|
+
responses: methodObj.responses,
|
|
60
|
+
deprecated: methodObj.deprecated,
|
|
61
|
+
tags: methodObj.tags
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
isIndexBuilt = true;
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
console.error('Error loading or parsing YAML file:', error);
|
|
70
|
+
throw error;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Smart API endpoint search (with simple relevance ranking)
|
|
75
|
+
*/
|
|
76
|
+
function searchApiEndpoints(query) {
|
|
77
|
+
if (!isIndexBuilt)
|
|
78
|
+
throw new Error('API index not built yet');
|
|
79
|
+
const q = query.toLowerCase();
|
|
80
|
+
return apiEndpointIndex
|
|
81
|
+
.map(e => {
|
|
82
|
+
let score = 0;
|
|
83
|
+
const pathLower = e.path.toLowerCase();
|
|
84
|
+
const summaryLower = (e.summary || '').toLowerCase();
|
|
85
|
+
const descLower = (e.description || '').toLowerCase();
|
|
86
|
+
// Path match has highest weight
|
|
87
|
+
if (pathLower === q)
|
|
88
|
+
score += 100;
|
|
89
|
+
else if (pathLower.includes(q))
|
|
90
|
+
score += 20;
|
|
91
|
+
// Summary match has secondary weight
|
|
92
|
+
if (summaryLower.includes(q))
|
|
93
|
+
score += 10;
|
|
94
|
+
// Tag match
|
|
95
|
+
if (e.tags && e.tags.some(tag => tag.toLowerCase().includes(q)))
|
|
96
|
+
score += 5;
|
|
97
|
+
// Description match has lowest weight
|
|
98
|
+
if (descLower.includes(q))
|
|
99
|
+
score += 1;
|
|
100
|
+
return { endpoint: e, score };
|
|
101
|
+
})
|
|
102
|
+
.filter(item => item.score > 0)
|
|
103
|
+
.sort((a, b) => b.score - a.score) // Sort by score descending
|
|
104
|
+
.map(item => item.endpoint);
|
|
105
|
+
}
|
|
106
|
+
// Recursively resolve $ref references
|
|
107
|
+
function resolveRef(obj, doc, seen = new Set()) {
|
|
108
|
+
if (!obj || typeof obj !== 'object')
|
|
109
|
+
return obj;
|
|
110
|
+
if (Array.isArray(obj))
|
|
111
|
+
return obj.map(item => resolveRef(item, doc, seen));
|
|
112
|
+
if (obj.$ref) {
|
|
113
|
+
const ref = obj.$ref;
|
|
114
|
+
if (seen.has(ref))
|
|
115
|
+
return { circularRef: ref };
|
|
116
|
+
seen.add(ref);
|
|
117
|
+
const parts = ref.replace(/^#\//, '').split('/');
|
|
118
|
+
let target = doc;
|
|
119
|
+
for (const p of parts) {
|
|
120
|
+
if (target && typeof target === 'object')
|
|
121
|
+
target = target[p];
|
|
122
|
+
else
|
|
123
|
+
return { invalidRef: ref };
|
|
124
|
+
}
|
|
125
|
+
return resolveRef(target, doc, seen);
|
|
126
|
+
}
|
|
127
|
+
const result = {};
|
|
128
|
+
for (const k of Object.keys(obj)) {
|
|
129
|
+
result[k] = resolveRef(obj[k], doc, seen);
|
|
130
|
+
}
|
|
131
|
+
return result;
|
|
132
|
+
}
|
|
133
|
+
export function registerBaseTools(server, kibanaClient, defaultSpace) {
|
|
134
|
+
// Tool: Get Kibana server status
|
|
135
|
+
server.tool("get_status", `Get Kibana server status with multi-space support`, z.object({
|
|
136
|
+
space: z.string().optional().describe("Target Kibana space (optional, defaults to configured space)")
|
|
137
|
+
}), async ({ space }) => {
|
|
138
|
+
try {
|
|
139
|
+
const targetSpace = space || defaultSpace;
|
|
140
|
+
const response = await kibanaClient.get('/api/status', { space });
|
|
141
|
+
return {
|
|
142
|
+
content: [
|
|
143
|
+
{
|
|
144
|
+
type: "text",
|
|
145
|
+
text: `[Space: ${targetSpace}] Kibana server status: ${JSON.stringify(response, null, 2)}`
|
|
146
|
+
}
|
|
147
|
+
]
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
catch (error) {
|
|
151
|
+
console.error(`Failed to get server status: ${error}`);
|
|
152
|
+
return {
|
|
153
|
+
content: [
|
|
154
|
+
{
|
|
155
|
+
type: "text",
|
|
156
|
+
text: `Error: ${error instanceof Error ? error.message : String(error)}`
|
|
157
|
+
}
|
|
158
|
+
],
|
|
159
|
+
isError: true
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
});
|
|
163
|
+
// Tool: Execute custom API request
|
|
164
|
+
server.tool("execute_kb_api", `Execute a custom API request for Kibana with multi-space support`, z.object({
|
|
165
|
+
method: z.enum(['GET', 'POST', 'PUT', 'DELETE']),
|
|
166
|
+
path: z.string(),
|
|
167
|
+
body: z.any().optional(),
|
|
168
|
+
params: z.record(z.union([z.string(), z.number(), z.boolean()])).optional(),
|
|
169
|
+
space: z.string().optional().describe("Target Kibana space (optional, defaults to configured space)")
|
|
170
|
+
}), async ({ method, path, body, params, space }) => {
|
|
171
|
+
try {
|
|
172
|
+
const targetSpace = space || defaultSpace;
|
|
173
|
+
let url = path;
|
|
174
|
+
if (params) {
|
|
175
|
+
const queryString = new URLSearchParams(Object.entries(params).map(([key, value]) => [key, String(value)])).toString();
|
|
176
|
+
url += `?${queryString}`;
|
|
177
|
+
}
|
|
178
|
+
let response;
|
|
179
|
+
switch (method.toLowerCase()) {
|
|
180
|
+
case 'get':
|
|
181
|
+
response = await kibanaClient.get(url, { space });
|
|
182
|
+
break;
|
|
183
|
+
case 'post':
|
|
184
|
+
response = await kibanaClient.post(url, body, { space });
|
|
185
|
+
break;
|
|
186
|
+
case 'put':
|
|
187
|
+
response = await kibanaClient.put(url, body, { space });
|
|
188
|
+
break;
|
|
189
|
+
case 'delete':
|
|
190
|
+
response = await kibanaClient.delete(url, { space });
|
|
191
|
+
break;
|
|
192
|
+
default:
|
|
193
|
+
throw new Error(`Unsupported HTTP method: ${method}`);
|
|
194
|
+
}
|
|
195
|
+
return {
|
|
196
|
+
content: [
|
|
197
|
+
{
|
|
198
|
+
type: "text",
|
|
199
|
+
text: `[Space: ${targetSpace}] API response: ${JSON.stringify(response, null, 2)}`
|
|
200
|
+
}
|
|
201
|
+
]
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
catch (error) {
|
|
205
|
+
console.error(`API request failed: ${error}`);
|
|
206
|
+
return {
|
|
207
|
+
content: [
|
|
208
|
+
{
|
|
209
|
+
type: "text",
|
|
210
|
+
text: `Error: ${error instanceof Error ? error.message : String(error)}`
|
|
211
|
+
}
|
|
212
|
+
],
|
|
213
|
+
isError: true
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
});
|
|
217
|
+
// Tool: Search Kibana API endpoints (by keyword)
|
|
218
|
+
server.tool("search_kibana_api_paths", `Search Kibana API endpoints by keyword`, z.object({
|
|
219
|
+
search: z.string().describe('Search keyword for filtering API endpoints')
|
|
220
|
+
}), async ({ search }) => {
|
|
221
|
+
await buildApiIndex();
|
|
222
|
+
const endpoints = searchApiEndpoints(search);
|
|
223
|
+
// Limit results to avoid token overflow
|
|
224
|
+
const limitedEndpoints = endpoints.slice(0, 15);
|
|
225
|
+
return {
|
|
226
|
+
content: [
|
|
227
|
+
{
|
|
228
|
+
type: "text",
|
|
229
|
+
text: `Found ${endpoints.length} API endpoints (showing top ${limitedEndpoints.length}): ${JSON.stringify(limitedEndpoints.map(e => ({
|
|
230
|
+
method: e.method,
|
|
231
|
+
path: e.path,
|
|
232
|
+
summary: e.summary,
|
|
233
|
+
description: e.description ? (e.description.length > 100 ? e.description.substring(0, 100) + '...' : e.description) : undefined
|
|
234
|
+
})), null, 2)}`
|
|
235
|
+
}
|
|
236
|
+
]
|
|
237
|
+
};
|
|
238
|
+
});
|
|
239
|
+
// Tool: List all Kibana API endpoints (no filter, full list, resource style)
|
|
240
|
+
server.tool("list_all_kibana_api_paths", `List all Kibana API endpoints as a resource list`, z.object({}), async () => {
|
|
241
|
+
await buildApiIndex();
|
|
242
|
+
const endpoints = apiEndpointIndex.map(e => ({
|
|
243
|
+
method: e.method,
|
|
244
|
+
path: e.path,
|
|
245
|
+
summary: e.summary,
|
|
246
|
+
description: e.description
|
|
247
|
+
}));
|
|
248
|
+
return {
|
|
249
|
+
content: [
|
|
250
|
+
{
|
|
251
|
+
type: "text",
|
|
252
|
+
text: JSON.stringify({
|
|
253
|
+
contents: [
|
|
254
|
+
{
|
|
255
|
+
uri: "kibana-api://paths",
|
|
256
|
+
mimeType: "application/json",
|
|
257
|
+
text: JSON.stringify(endpoints, null, 2)
|
|
258
|
+
}
|
|
259
|
+
]
|
|
260
|
+
}, null, 2)
|
|
261
|
+
}
|
|
262
|
+
]
|
|
263
|
+
};
|
|
264
|
+
});
|
|
265
|
+
// Tool: Get details for a specific Kibana API endpoint
|
|
266
|
+
server.tool("get_kibana_api_detail", `Get details for a specific Kibana API endpoint`, z.object({
|
|
267
|
+
method: z.string().describe("HTTP method, e.g. GET, POST, PUT, DELETE"),
|
|
268
|
+
path: z.string().describe("API path, e.g. /api/actions/connector_types"),
|
|
269
|
+
raw: z.boolean().optional().describe("If true, return raw JSON schema instead of simplified TypeScript interface")
|
|
270
|
+
}), async ({ method, path, raw }) => {
|
|
271
|
+
await buildApiIndex();
|
|
272
|
+
const endpoint = apiEndpointIndex.find(e => e.method === method.toUpperCase() && e.path === path);
|
|
273
|
+
if (!endpoint) {
|
|
274
|
+
return {
|
|
275
|
+
content: [
|
|
276
|
+
{
|
|
277
|
+
type: "text",
|
|
278
|
+
text: `API endpoint not found: ${method} ${path}`
|
|
279
|
+
}
|
|
280
|
+
],
|
|
281
|
+
isError: true
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
// Recursively resolve parameters, requestBody, and responses references
|
|
285
|
+
const detailed = {
|
|
286
|
+
...endpoint,
|
|
287
|
+
parameters: resolveRef(endpoint.parameters, openApiDoc),
|
|
288
|
+
requestBody: resolveRef(endpoint.requestBody, openApiDoc),
|
|
289
|
+
responses: resolveRef(endpoint.responses, openApiDoc)
|
|
290
|
+
};
|
|
291
|
+
if (raw) {
|
|
292
|
+
return {
|
|
293
|
+
content: [
|
|
294
|
+
{
|
|
295
|
+
type: "text",
|
|
296
|
+
text: `API endpoint details (Raw): ${JSON.stringify(detailed, null, 2)}`
|
|
297
|
+
}
|
|
298
|
+
]
|
|
299
|
+
};
|
|
300
|
+
}
|
|
301
|
+
// Use smart simplifier
|
|
302
|
+
const simplified = simplifyEndpointDetail(detailed);
|
|
303
|
+
const markdown = formatEndpointToMarkdown(simplified);
|
|
304
|
+
return {
|
|
305
|
+
content: [
|
|
306
|
+
{
|
|
307
|
+
type: "text",
|
|
308
|
+
text: markdown
|
|
309
|
+
}
|
|
310
|
+
]
|
|
311
|
+
};
|
|
312
|
+
});
|
|
313
|
+
server.tool("get_available_spaces", "Get all available Kibana spaces with current context", z.object({
|
|
314
|
+
include_details: z.boolean().optional().default(true).describe("Include detailed space information (name, description, etc.)")
|
|
315
|
+
}), async ({ include_details = true }) => {
|
|
316
|
+
try {
|
|
317
|
+
const response = await kibanaClient.get('/api/spaces/space');
|
|
318
|
+
const result = {
|
|
319
|
+
current_default_space: defaultSpace,
|
|
320
|
+
total_count: response.length,
|
|
321
|
+
available_spaces: include_details ? response : response.map((space) => ({
|
|
322
|
+
id: space.id,
|
|
323
|
+
name: space.name
|
|
324
|
+
}))
|
|
325
|
+
};
|
|
326
|
+
return {
|
|
327
|
+
content: [
|
|
328
|
+
{
|
|
329
|
+
type: "text",
|
|
330
|
+
text: JSON.stringify(result, null, 2)
|
|
331
|
+
}
|
|
332
|
+
]
|
|
333
|
+
};
|
|
334
|
+
}
|
|
335
|
+
catch (error) {
|
|
336
|
+
console.error(`Failed to get available spaces: ${error}`);
|
|
337
|
+
return {
|
|
338
|
+
content: [
|
|
339
|
+
{
|
|
340
|
+
type: "text",
|
|
341
|
+
text: `Error: ${error instanceof Error ? error.message : String(error)}`
|
|
342
|
+
}
|
|
343
|
+
],
|
|
344
|
+
isError: true
|
|
345
|
+
};
|
|
346
|
+
}
|
|
347
|
+
});
|
|
348
|
+
}
|
|
349
|
+
//# sourceMappingURL=base-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-tools.js","sourceRoot":"","sources":["../../src/base-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Saved Object Dependency Analyzer
|
|
3
|
+
* Analyzes reference relationships between Kibana objects (Dashboard, Visualization, Index Pattern, etc.)
|
|
4
|
+
*/
|
|
5
|
+
import type { KibanaClient } from "./types";
|
|
6
|
+
export interface SavedObjectRef {
|
|
7
|
+
id: string;
|
|
8
|
+
type: string;
|
|
9
|
+
name: string;
|
|
10
|
+
}
|
|
11
|
+
export interface DependencyNode {
|
|
12
|
+
id: string;
|
|
13
|
+
type: string;
|
|
14
|
+
title?: string;
|
|
15
|
+
referencedBy: SavedObjectRef[];
|
|
16
|
+
references: SavedObjectRef[];
|
|
17
|
+
depth: number;
|
|
18
|
+
}
|
|
19
|
+
export interface DependencyTree {
|
|
20
|
+
root: DependencyNode;
|
|
21
|
+
allNodes: Map<string, DependencyNode>;
|
|
22
|
+
summary: {
|
|
23
|
+
total_objects: number;
|
|
24
|
+
max_depth: number;
|
|
25
|
+
top_referenced: Array<{
|
|
26
|
+
id: string;
|
|
27
|
+
type: string;
|
|
28
|
+
title?: string;
|
|
29
|
+
count: number;
|
|
30
|
+
}>;
|
|
31
|
+
orphans: Array<{
|
|
32
|
+
id: string;
|
|
33
|
+
type: string;
|
|
34
|
+
title?: string;
|
|
35
|
+
}>;
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
export interface ImpactAnalysis {
|
|
39
|
+
target: {
|
|
40
|
+
id: string;
|
|
41
|
+
type: string;
|
|
42
|
+
title?: string;
|
|
43
|
+
};
|
|
44
|
+
direct_dependencies: number;
|
|
45
|
+
indirect_dependencies: number;
|
|
46
|
+
affected_dashboards: SavedObjectRef[];
|
|
47
|
+
risk_level: 'Low' | 'Medium' | 'High' | 'Critical';
|
|
48
|
+
recommendation: string;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Build dependency tree
|
|
52
|
+
*/
|
|
53
|
+
export declare function buildDependencyTree(kibanaClient: KibanaClient, rootId: string, rootType: string, space?: string, maxDepth?: number): Promise<DependencyTree>;
|
|
54
|
+
/**
|
|
55
|
+
* Analyze impact scope of deleting/modifying an object
|
|
56
|
+
*/
|
|
57
|
+
export declare function analyzeImpact(kibanaClient: KibanaClient, targetId: string, targetType: string, space?: string): Promise<ImpactAnalysis>;
|
|
58
|
+
/**
|
|
59
|
+
* Format dependency tree to Markdown
|
|
60
|
+
*/
|
|
61
|
+
export declare function formatDependencyTreeToMarkdown(tree: DependencyTree): string;
|
|
62
|
+
/**
|
|
63
|
+
* Format impact analysis to Markdown
|
|
64
|
+
*/
|
|
65
|
+
export declare function formatImpactAnalysisToMarkdown(analysis: ImpactAnalysis): string;
|