@get-technology-inc/jamf-docs-mcp-server 1.0.0 → 1.2.0
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 +61 -139
- package/dist/completions.d.ts +13 -0
- package/dist/completions.d.ts.map +1 -0
- package/dist/completions.js +31 -0
- package/dist/completions.js.map +1 -0
- package/dist/constants.d.ts +123 -1
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +187 -17
- package/dist/constants.js.map +1 -1
- package/dist/index.js +46 -6
- package/dist/index.js.map +1 -1
- package/dist/prompts/compare-versions.d.ts +7 -0
- package/dist/prompts/compare-versions.d.ts.map +1 -0
- package/dist/prompts/compare-versions.js +56 -0
- package/dist/prompts/compare-versions.js.map +1 -0
- package/dist/prompts/index.d.ts +6 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +12 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/prompts/setup-guide.d.ts +7 -0
- package/dist/prompts/setup-guide.d.ts.map +1 -0
- package/dist/prompts/setup-guide.js +53 -0
- package/dist/prompts/setup-guide.js.map +1 -0
- package/dist/prompts/troubleshoot.d.ts +7 -0
- package/dist/prompts/troubleshoot.d.ts.map +1 -0
- package/dist/prompts/troubleshoot.js +52 -0
- package/dist/prompts/troubleshoot.js.map +1 -0
- package/dist/resources/index.d.ts +13 -0
- package/dist/resources/index.d.ts.map +1 -0
- package/dist/resources/index.js +121 -0
- package/dist/resources/index.js.map +1 -0
- package/dist/schemas/index.d.ts +29 -63
- package/dist/schemas/index.d.ts.map +1 -1
- package/dist/schemas/index.js +35 -16
- package/dist/schemas/index.js.map +1 -1
- package/dist/schemas/output.d.ts +63 -0
- package/dist/schemas/output.d.ts.map +1 -0
- package/dist/schemas/output.js +63 -0
- package/dist/schemas/output.js.map +1 -0
- package/dist/services/cache.d.ts +37 -12
- package/dist/services/cache.d.ts.map +1 -1
- package/dist/services/cache.js +141 -41
- package/dist/services/cache.js.map +1 -1
- package/dist/services/metadata.d.ts +78 -0
- package/dist/services/metadata.d.ts.map +1 -0
- package/dist/services/metadata.js +362 -0
- package/dist/services/metadata.js.map +1 -0
- package/dist/services/scraper.d.ts +3 -2
- package/dist/services/scraper.d.ts.map +1 -1
- package/dist/services/scraper.js +170 -145
- package/dist/services/scraper.js.map +1 -1
- package/dist/services/search-suggestions.d.ts +27 -0
- package/dist/services/search-suggestions.d.ts.map +1 -0
- package/dist/services/search-suggestions.js +193 -0
- package/dist/services/search-suggestions.js.map +1 -0
- package/dist/services/tokenizer.d.ts +17 -1
- package/dist/services/tokenizer.d.ts.map +1 -1
- package/dist/services/tokenizer.js +122 -66
- package/dist/services/tokenizer.js.map +1 -1
- package/dist/tools/get-article.d.ts +1 -1
- package/dist/tools/get-article.d.ts.map +1 -1
- package/dist/tools/get-article.js +145 -70
- package/dist/tools/get-article.js.map +1 -1
- package/dist/tools/get-toc.d.ts +1 -1
- package/dist/tools/get-toc.d.ts.map +1 -1
- package/dist/tools/get-toc.js +107 -47
- package/dist/tools/get-toc.js.map +1 -1
- package/dist/tools/list-products.d.ts +1 -1
- package/dist/tools/list-products.d.ts.map +1 -1
- package/dist/tools/list-products.js +42 -13
- package/dist/tools/list-products.js.map +1 -1
- package/dist/tools/search.d.ts +1 -1
- package/dist/tools/search.d.ts.map +1 -1
- package/dist/tools/search.js +142 -69
- package/dist/tools/search.js.map +1 -1
- package/dist/transport/http.d.ts +12 -0
- package/dist/transport/http.d.ts.map +1 -0
- package/dist/transport/http.js +297 -0
- package/dist/transport/http.js.map +1 -0
- package/dist/transport/index.d.ts +13 -0
- package/dist/transport/index.d.ts.map +1 -0
- package/dist/transport/index.js +40 -0
- package/dist/transport/index.js.map +1 -0
- package/dist/types.d.ts +12 -18
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/utils/doc-type.d.ts +9 -0
- package/dist/utils/doc-type.d.ts.map +1 -0
- package/dist/utils/doc-type.js +16 -0
- package/dist/utils/doc-type.js.map +1 -0
- package/dist/utils/progress.d.ts +13 -0
- package/dist/utils/progress.d.ts.map +1 -0
- package/dist/utils/progress.js +18 -0
- package/dist/utils/progress.js.map +1 -0
- package/dist/utils/sanitize.d.ts +30 -0
- package/dist/utils/sanitize.d.ts.map +1 -0
- package/dist/utils/sanitize.js +57 -0
- package/dist/utils/sanitize.js.map +1 -0
- package/dist/utils/url.d.ts +11 -0
- package/dist/utils/url.d.ts.map +1 -0
- package/dist/utils/url.js +23 -0
- package/dist/utils/url.js.map +1 -0
- package/package.json +8 -5
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP transport using Web Standard APIs
|
|
3
|
+
*
|
|
4
|
+
* Uses WebStandardStreamableHTTPServerTransport from the SDK,
|
|
5
|
+
* compatible with Node.js, Cloudflare Workers, Deno, and Bun.
|
|
6
|
+
*/
|
|
7
|
+
import { createServer } from 'node:http';
|
|
8
|
+
import { WebStandardStreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/webStandardStreamableHttp.js';
|
|
9
|
+
import { SERVER_VERSION, getEnvNumber } from '../constants.js';
|
|
10
|
+
const SHUTDOWN_TIMEOUT = 10_000;
|
|
11
|
+
const MAX_BODY_SIZE = 1_048_576; // 1MB
|
|
12
|
+
class PayloadTooLargeError extends Error {
|
|
13
|
+
constructor() {
|
|
14
|
+
super('Payload too large');
|
|
15
|
+
this.name = 'PayloadTooLargeError';
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
// CORS configuration
|
|
19
|
+
const CORS_ALLOWED_ORIGINS = (process.env.CORS_ALLOWED_ORIGINS ?? '').split(',').map(s => s.trim()).filter(Boolean);
|
|
20
|
+
/**
|
|
21
|
+
* Token bucket rate limiter (per-IP)
|
|
22
|
+
*/
|
|
23
|
+
class RateLimiter {
|
|
24
|
+
buckets = new Map();
|
|
25
|
+
maxTokens;
|
|
26
|
+
windowMs;
|
|
27
|
+
constructor(maxTokens, windowMs) {
|
|
28
|
+
this.maxTokens = maxTokens;
|
|
29
|
+
this.windowMs = windowMs;
|
|
30
|
+
}
|
|
31
|
+
isAllowed(ip) {
|
|
32
|
+
const now = Date.now();
|
|
33
|
+
let bucket = this.buckets.get(ip);
|
|
34
|
+
if (bucket === undefined) {
|
|
35
|
+
bucket = { tokens: this.maxTokens, lastRefill: now };
|
|
36
|
+
this.buckets.set(ip, bucket);
|
|
37
|
+
}
|
|
38
|
+
// Refill tokens based on elapsed time
|
|
39
|
+
const elapsed = now - bucket.lastRefill;
|
|
40
|
+
const tokensToAdd = (elapsed / this.windowMs) * this.maxTokens;
|
|
41
|
+
bucket.tokens = Math.min(this.maxTokens, bucket.tokens + tokensToAdd);
|
|
42
|
+
bucket.lastRefill = now;
|
|
43
|
+
if (bucket.tokens >= 1) {
|
|
44
|
+
bucket.tokens -= 1;
|
|
45
|
+
return true;
|
|
46
|
+
}
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
// Periodically clean up old entries to prevent memory leak
|
|
50
|
+
cleanup() {
|
|
51
|
+
const now = Date.now();
|
|
52
|
+
for (const [ip, bucket] of this.buckets.entries()) {
|
|
53
|
+
if (now - bucket.lastRefill > this.windowMs * 2) {
|
|
54
|
+
this.buckets.delete(ip);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Get CORS headers for a given origin
|
|
61
|
+
*/
|
|
62
|
+
function getCorsHeaders(origin) {
|
|
63
|
+
const headers = {};
|
|
64
|
+
if (CORS_ALLOWED_ORIGINS.length === 0) {
|
|
65
|
+
// No origins configured — deny cross-origin by not setting Access-Control-Allow-Origin
|
|
66
|
+
return headers;
|
|
67
|
+
}
|
|
68
|
+
const originStr = Array.isArray(origin) ? origin[0] : origin;
|
|
69
|
+
if (originStr !== undefined && CORS_ALLOWED_ORIGINS.includes(originStr)) {
|
|
70
|
+
headers['Access-Control-Allow-Origin'] = originStr;
|
|
71
|
+
headers['Access-Control-Allow-Methods'] = 'GET, POST, OPTIONS';
|
|
72
|
+
headers['Access-Control-Allow-Headers'] = 'Content-Type';
|
|
73
|
+
headers['Access-Control-Max-Age'] = '86400';
|
|
74
|
+
headers.Vary = 'Origin';
|
|
75
|
+
}
|
|
76
|
+
return headers;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Get client IP from request
|
|
80
|
+
*/
|
|
81
|
+
function getClientIp(req) {
|
|
82
|
+
const forwarded = req.headers['x-forwarded-for'];
|
|
83
|
+
if (typeof forwarded === 'string') {
|
|
84
|
+
return forwarded.split(',')[0]?.trim() ?? 'unknown';
|
|
85
|
+
}
|
|
86
|
+
// socket may be undefined in test environments
|
|
87
|
+
const socket = req.socket;
|
|
88
|
+
return socket?.remoteAddress ?? 'unknown';
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Convert Node.js IncomingMessage to a Web Standard Request
|
|
92
|
+
*/
|
|
93
|
+
function toWebRequest(req, body, url) {
|
|
94
|
+
const headers = new Headers();
|
|
95
|
+
for (const [key, value] of Object.entries(req.headers)) {
|
|
96
|
+
if (value !== undefined) {
|
|
97
|
+
if (Array.isArray(value)) {
|
|
98
|
+
for (const v of value) {
|
|
99
|
+
headers.append(key, v);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
headers.set(key, value);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
const method = req.method ?? 'GET';
|
|
108
|
+
const init = {
|
|
109
|
+
method,
|
|
110
|
+
headers,
|
|
111
|
+
};
|
|
112
|
+
// Only add body for methods that support it
|
|
113
|
+
if (method !== 'GET' && method !== 'HEAD' && method !== 'DELETE') {
|
|
114
|
+
init.body = body;
|
|
115
|
+
}
|
|
116
|
+
return new Request(url.toString(), init);
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Write a Web Standard Response back to Node.js ServerResponse
|
|
120
|
+
*/
|
|
121
|
+
async function writeWebResponse(webRes, res) {
|
|
122
|
+
res.writeHead(webRes.status, Object.fromEntries(webRes.headers.entries()));
|
|
123
|
+
if (webRes.body === null) {
|
|
124
|
+
res.end();
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
const reader = webRes.body.getReader();
|
|
128
|
+
try {
|
|
129
|
+
for (;;) {
|
|
130
|
+
const result = await reader.read();
|
|
131
|
+
if (result.done) {
|
|
132
|
+
break;
|
|
133
|
+
}
|
|
134
|
+
res.write(result.value);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
finally {
|
|
138
|
+
reader.releaseLock();
|
|
139
|
+
res.end();
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Collect request body from IncomingMessage into a Buffer.
|
|
144
|
+
* Enforces a maximum body size to prevent memory exhaustion.
|
|
145
|
+
*/
|
|
146
|
+
async function collectBody(req) {
|
|
147
|
+
const chunks = [];
|
|
148
|
+
let totalSize = 0;
|
|
149
|
+
for await (const chunk of req) {
|
|
150
|
+
const buf = typeof chunk === 'string' ? Buffer.from(chunk) : chunk;
|
|
151
|
+
totalSize += buf.length;
|
|
152
|
+
if (totalSize > MAX_BODY_SIZE) {
|
|
153
|
+
req.destroy();
|
|
154
|
+
throw new PayloadTooLargeError();
|
|
155
|
+
}
|
|
156
|
+
chunks.push(buf);
|
|
157
|
+
}
|
|
158
|
+
return Buffer.concat(chunks);
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Create and start an HTTP server for the MCP server
|
|
162
|
+
*/
|
|
163
|
+
export async function startHttpServer(mcpServer, port, host) {
|
|
164
|
+
const rateLimitRpm = getEnvNumber('RATE_LIMIT_RPM', 60, 1, 10000);
|
|
165
|
+
const rateLimiter = new RateLimiter(rateLimitRpm, 60_000);
|
|
166
|
+
setInterval(() => { rateLimiter.cleanup(); }, 5 * 60_000).unref();
|
|
167
|
+
const httpServer = createServer((req, res) => {
|
|
168
|
+
void handleHttpRequest(req, res, mcpServer, rateLimiter);
|
|
169
|
+
});
|
|
170
|
+
// Graceful shutdown
|
|
171
|
+
let shuttingDown = false;
|
|
172
|
+
function shutdown(signal) {
|
|
173
|
+
if (shuttingDown) {
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
shuttingDown = true;
|
|
177
|
+
console.error(`\n${signal} received, shutting down...`);
|
|
178
|
+
httpServer.close(() => {
|
|
179
|
+
console.error('HTTP server closed');
|
|
180
|
+
process.exit(0);
|
|
181
|
+
});
|
|
182
|
+
// Force exit after timeout
|
|
183
|
+
setTimeout(() => {
|
|
184
|
+
console.error('Shutdown timeout, forcing exit');
|
|
185
|
+
process.exit(1);
|
|
186
|
+
}, SHUTDOWN_TIMEOUT);
|
|
187
|
+
}
|
|
188
|
+
process.on('SIGINT', () => { shutdown('SIGINT'); });
|
|
189
|
+
process.on('SIGTERM', () => { shutdown('SIGTERM'); });
|
|
190
|
+
// Start listening
|
|
191
|
+
await new Promise((resolve, reject) => {
|
|
192
|
+
httpServer.on('error', (error) => {
|
|
193
|
+
if (error.code === 'EADDRINUSE') {
|
|
194
|
+
console.error(`Port ${port} is already in use`);
|
|
195
|
+
process.exit(1);
|
|
196
|
+
}
|
|
197
|
+
reject(error);
|
|
198
|
+
});
|
|
199
|
+
httpServer.listen(port, host, () => {
|
|
200
|
+
if (host !== '127.0.0.1' && host !== '::1') {
|
|
201
|
+
console.error(`[SECURITY WARNING] Server is binding to ${host}, which exposes it to the network. Use 127.0.0.1 for local-only access.`);
|
|
202
|
+
}
|
|
203
|
+
console.error(`Jamf Docs MCP Server running on http://${host}:${port}`);
|
|
204
|
+
console.error(`MCP endpoint: http://${host}:${port}/mcp`);
|
|
205
|
+
console.error(`Health check: http://${host}:${port}/health`);
|
|
206
|
+
resolve();
|
|
207
|
+
});
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Handle a single HTTP request
|
|
212
|
+
*/
|
|
213
|
+
async function handleHttpRequest(req, res, mcpServer, rateLimiter) {
|
|
214
|
+
// Use hardcoded base URL to prevent Host header injection (SAST #8)
|
|
215
|
+
const url = new URL(req.url ?? '/', 'http://localhost');
|
|
216
|
+
const { pathname } = url;
|
|
217
|
+
const { origin } = req.headers;
|
|
218
|
+
const corsHeaders = getCorsHeaders(origin);
|
|
219
|
+
// Handle CORS preflight
|
|
220
|
+
if (req.method === 'OPTIONS') {
|
|
221
|
+
res.writeHead(204, { ...corsHeaders, 'Content-Length': '0' });
|
|
222
|
+
res.end();
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
// Rate limiting
|
|
226
|
+
const clientIp = getClientIp(req);
|
|
227
|
+
if (!rateLimiter.isAllowed(clientIp)) {
|
|
228
|
+
res.writeHead(429, { 'Content-Type': 'application/json', ...corsHeaders });
|
|
229
|
+
res.end(JSON.stringify({ error: 'Too many requests' }));
|
|
230
|
+
return;
|
|
231
|
+
}
|
|
232
|
+
// Health check endpoint
|
|
233
|
+
if (pathname === '/health' && req.method === 'GET') {
|
|
234
|
+
res.writeHead(200, { 'Content-Type': 'application/json', ...corsHeaders });
|
|
235
|
+
res.end(JSON.stringify({ status: 'ok', version: SERVER_VERSION }));
|
|
236
|
+
return;
|
|
237
|
+
}
|
|
238
|
+
// MCP endpoint
|
|
239
|
+
if (pathname === '/mcp') {
|
|
240
|
+
let body;
|
|
241
|
+
try {
|
|
242
|
+
body = await collectBody(req);
|
|
243
|
+
}
|
|
244
|
+
catch (err) {
|
|
245
|
+
if (err instanceof PayloadTooLargeError) {
|
|
246
|
+
res.writeHead(413, { 'Content-Type': 'application/json', ...corsHeaders });
|
|
247
|
+
res.end(JSON.stringify({ error: 'Payload too large' }));
|
|
248
|
+
return;
|
|
249
|
+
}
|
|
250
|
+
throw err;
|
|
251
|
+
}
|
|
252
|
+
// Create a per-request transport (stateless mode)
|
|
253
|
+
const transport = new WebStandardStreamableHTTPServerTransport({
|
|
254
|
+
enableJsonResponse: true,
|
|
255
|
+
});
|
|
256
|
+
// Connect the MCP server to this transport
|
|
257
|
+
await mcpServer.connect(transport);
|
|
258
|
+
try {
|
|
259
|
+
// Convert Node request to Web Standard Request
|
|
260
|
+
const webReq = toWebRequest(req, body, url);
|
|
261
|
+
// Parse body for the transport if present
|
|
262
|
+
let parsedBody;
|
|
263
|
+
if (body.length > 0) {
|
|
264
|
+
try {
|
|
265
|
+
parsedBody = JSON.parse(body.toString());
|
|
266
|
+
}
|
|
267
|
+
catch {
|
|
268
|
+
res.writeHead(400, { 'Content-Type': 'application/json', ...corsHeaders });
|
|
269
|
+
res.end(JSON.stringify({ error: 'Invalid JSON in request body' }));
|
|
270
|
+
return;
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
// Handle the request
|
|
274
|
+
const webRes = await transport.handleRequest(webReq, { parsedBody });
|
|
275
|
+
// Add CORS headers to the web response before writing
|
|
276
|
+
for (const [key, value] of Object.entries(corsHeaders)) {
|
|
277
|
+
webRes.headers.set(key, value);
|
|
278
|
+
}
|
|
279
|
+
// Write the response
|
|
280
|
+
await writeWebResponse(webRes, res);
|
|
281
|
+
}
|
|
282
|
+
catch {
|
|
283
|
+
if (!res.headersSent) {
|
|
284
|
+
res.writeHead(500, { 'Content-Type': 'application/json', ...corsHeaders });
|
|
285
|
+
res.end(JSON.stringify({ error: 'Internal server error' }));
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
finally {
|
|
289
|
+
await transport.close();
|
|
290
|
+
}
|
|
291
|
+
return;
|
|
292
|
+
}
|
|
293
|
+
// 404 for everything else
|
|
294
|
+
res.writeHead(404, { 'Content-Type': 'application/json', ...corsHeaders });
|
|
295
|
+
res.end(JSON.stringify({ error: 'Not found' }));
|
|
296
|
+
}
|
|
297
|
+
//# sourceMappingURL=http.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/transport/http.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Transport configuration and CLI argument parsing
|
|
3
|
+
*/
|
|
4
|
+
export interface TransportArgs {
|
|
5
|
+
transport: 'stdio' | 'http';
|
|
6
|
+
port: number;
|
|
7
|
+
host: string;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Parse CLI arguments for transport configuration
|
|
11
|
+
*/
|
|
12
|
+
export declare function parseCliArgs(argv: string[]): TransportArgs;
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/transport/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,OAAO,GAAG,MAAM,CAAC;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,aAAa,CAgC1D"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Transport configuration and CLI argument parsing
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Parse CLI arguments for transport configuration
|
|
6
|
+
*/
|
|
7
|
+
export function parseCliArgs(argv) {
|
|
8
|
+
const args = {
|
|
9
|
+
transport: 'stdio',
|
|
10
|
+
port: 3000,
|
|
11
|
+
host: '127.0.0.1',
|
|
12
|
+
};
|
|
13
|
+
for (let i = 0; i < argv.length; i++) {
|
|
14
|
+
const arg = argv[i];
|
|
15
|
+
const next = argv[i + 1];
|
|
16
|
+
if (arg === '--transport' && next !== undefined) {
|
|
17
|
+
if (next !== 'stdio' && next !== 'http') {
|
|
18
|
+
console.error(`Invalid transport: "${next}". Must be "stdio" or "http".`);
|
|
19
|
+
process.exit(1);
|
|
20
|
+
}
|
|
21
|
+
args.transport = next;
|
|
22
|
+
i++;
|
|
23
|
+
}
|
|
24
|
+
else if (arg === '--port' && next !== undefined) {
|
|
25
|
+
const port = parseInt(next, 10);
|
|
26
|
+
if (isNaN(port) || port < 1 || port > 65535) {
|
|
27
|
+
console.error(`Invalid port: "${next}". Must be 1-65535.`);
|
|
28
|
+
process.exit(1);
|
|
29
|
+
}
|
|
30
|
+
args.port = port;
|
|
31
|
+
i++;
|
|
32
|
+
}
|
|
33
|
+
else if (arg === '--host' && next !== undefined) {
|
|
34
|
+
args.host = next;
|
|
35
|
+
i++;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return args;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/transport/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,IAAc;IACzC,MAAM,IAAI,GAAkB;QAC1B,SAAS,EAAE,OAAO;QAClB,IAAI,EAAE,IAAI;QACV,IAAI,EAAE,WAAW;KAClB,CAAC;IAEF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACzB,IAAI,GAAG,KAAK,aAAa,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YAChD,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;gBACxC,OAAO,CAAC,KAAK,CAAC,uBAAuB,IAAI,+BAA+B,CAAC,CAAC;gBAC1E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;YACtB,CAAC,EAAE,CAAC;QACN,CAAC;aAAM,IAAI,GAAG,KAAK,QAAQ,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YAClD,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAChC,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,KAAK,EAAE,CAAC;gBAC5C,OAAO,CAAC,KAAK,CAAC,kBAAkB,IAAI,qBAAqB,CAAC,CAAC;gBAC3D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;YACjB,CAAC,EAAE,CAAC;QACN,CAAC;aAAM,IAAI,GAAG,KAAK,QAAQ,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YAClD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;YACjB,CAAC,EAAE,CAAC;QACN,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Type definitions for Jamf Docs MCP Server
|
|
3
3
|
*/
|
|
4
|
-
import { ResponseFormat, ProductId, TopicId } from './constants.js';
|
|
4
|
+
import type { ResponseFormat, ProductId, TopicId, DocTypeId } from './constants.js';
|
|
5
5
|
/**
|
|
6
6
|
* Token information for response size management
|
|
7
7
|
*/
|
|
@@ -40,13 +40,13 @@ export interface JamfProduct {
|
|
|
40
40
|
versions: readonly string[];
|
|
41
41
|
}
|
|
42
42
|
export interface ProductListResponse {
|
|
43
|
-
products:
|
|
43
|
+
products: {
|
|
44
44
|
id: string;
|
|
45
45
|
name: string;
|
|
46
46
|
description: string;
|
|
47
47
|
currentVersion: string;
|
|
48
48
|
availableVersions: string[];
|
|
49
|
-
}
|
|
49
|
+
}[];
|
|
50
50
|
tokenInfo: TokenInfo;
|
|
51
51
|
}
|
|
52
52
|
export interface SearchParams {
|
|
@@ -54,6 +54,7 @@ export interface SearchParams {
|
|
|
54
54
|
product?: ProductId | undefined;
|
|
55
55
|
version?: string | undefined;
|
|
56
56
|
topic?: TopicId | undefined;
|
|
57
|
+
docType?: DocTypeId | undefined;
|
|
57
58
|
limit?: number | undefined;
|
|
58
59
|
page?: number | undefined;
|
|
59
60
|
maxTokens?: number | undefined;
|
|
@@ -63,9 +64,10 @@ export interface SearchResult {
|
|
|
63
64
|
title: string;
|
|
64
65
|
url: string;
|
|
65
66
|
snippet: string;
|
|
66
|
-
product: string;
|
|
67
|
+
product: string | null;
|
|
67
68
|
version?: string;
|
|
68
69
|
relevance?: number;
|
|
70
|
+
docType?: DocTypeId;
|
|
69
71
|
}
|
|
70
72
|
export interface SearchResponse {
|
|
71
73
|
total: number;
|
|
@@ -94,10 +96,10 @@ export interface ParsedArticle {
|
|
|
94
96
|
version?: string | undefined;
|
|
95
97
|
lastUpdated?: string | undefined;
|
|
96
98
|
breadcrumb?: string[] | undefined;
|
|
97
|
-
relatedArticles?:
|
|
99
|
+
relatedArticles?: {
|
|
98
100
|
title: string;
|
|
99
101
|
url: string;
|
|
100
|
-
}
|
|
102
|
+
}[] | undefined;
|
|
101
103
|
}
|
|
102
104
|
export interface ArticleResponse extends ParsedArticle {
|
|
103
105
|
format: ResponseFormat;
|
|
@@ -147,19 +149,14 @@ export declare enum JamfDocsErrorCode {
|
|
|
147
149
|
CACHE_ERROR = "CACHE_ERROR",
|
|
148
150
|
TIMEOUT = "TIMEOUT"
|
|
149
151
|
}
|
|
150
|
-
export interface HttpRequestOptions {
|
|
151
|
-
timeout?: number;
|
|
152
|
-
headers?: Record<string, string>;
|
|
153
|
-
retries?: number;
|
|
154
|
-
retryDelay?: number;
|
|
155
|
-
}
|
|
156
152
|
export interface ToolResult {
|
|
157
153
|
[key: string]: unknown;
|
|
158
|
-
content:
|
|
154
|
+
content: {
|
|
159
155
|
type: 'text';
|
|
160
156
|
text: string;
|
|
161
|
-
}
|
|
157
|
+
}[];
|
|
162
158
|
isError?: boolean;
|
|
159
|
+
structuredContent?: Record<string, unknown>;
|
|
163
160
|
}
|
|
164
161
|
export interface ZoominSearchResponse {
|
|
165
162
|
status: string;
|
|
@@ -167,7 +164,7 @@ export interface ZoominSearchResponse {
|
|
|
167
164
|
Pagination?: ZoominPagination;
|
|
168
165
|
}
|
|
169
166
|
export interface ZoominSearchResultWrapper {
|
|
170
|
-
leading_result
|
|
167
|
+
leading_result?: ZoominLeadingResult | null;
|
|
171
168
|
follower_result?: ZoominLeadingResult[];
|
|
172
169
|
bundle_data?: unknown;
|
|
173
170
|
}
|
|
@@ -191,7 +188,4 @@ export interface ZoominPagination {
|
|
|
191
188
|
ResultsPerPage: number;
|
|
192
189
|
TotalResults: number;
|
|
193
190
|
}
|
|
194
|
-
export type DeepPartial<T> = {
|
|
195
|
-
[P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];
|
|
196
|
-
};
|
|
197
191
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAgKH,cAAc;AACd,MAAM,OAAO,aAAc,SAAQ,KAAK;IAGpB;IACA;IACA;IAJlB,YACE,OAAe,EACC,IAAuB,EACvB,GAAY,EACZ,UAAmB;QAEnC,KAAK,CAAC,OAAO,CAAC,CAAC;QAJC,SAAI,GAAJ,IAAI,CAAmB;QACvB,QAAG,GAAH,GAAG,CAAS;QACZ,eAAU,GAAV,UAAU,CAAS;QAGnC,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAC9B,CAAC;CACF;AAED,MAAM,CAAN,IAAY,iBASX;AATD,WAAY,iBAAiB;IAC3B,4CAAuB,CAAA;IACvB,kDAA6B,CAAA;IAC7B,gDAA2B,CAAA;IAC3B,oDAA+B,CAAA;IAC/B,gDAA2B,CAAA;IAC3B,wDAAmC,CAAA;IACnC,gDAA2B,CAAA;IAC3B,wCAAmB,CAAA;AACrB,CAAC,EATW,iBAAiB,KAAjB,iBAAiB,QAS5B"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Document type inference utility
|
|
3
|
+
*/
|
|
4
|
+
import { type DocTypeId } from '../constants.js';
|
|
5
|
+
/**
|
|
6
|
+
* Infer document type from bundle ID using pattern matching
|
|
7
|
+
*/
|
|
8
|
+
export declare function inferDocType(bundleId: string): DocTypeId;
|
|
9
|
+
//# sourceMappingURL=doc-type.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doc-type.d.ts","sourceRoot":"","sources":["../../src/utils/doc-type.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAa,KAAK,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5D;;GAEG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAOxD"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Document type inference utility
|
|
3
|
+
*/
|
|
4
|
+
import { DOC_TYPES } from '../constants.js';
|
|
5
|
+
/**
|
|
6
|
+
* Infer document type from bundle ID using pattern matching
|
|
7
|
+
*/
|
|
8
|
+
export function inferDocType(bundleId) {
|
|
9
|
+
for (const [id, docType] of Object.entries(DOC_TYPES)) {
|
|
10
|
+
if ('bundlePattern' in docType && docType.bundlePattern.test(bundleId)) {
|
|
11
|
+
return id;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
return 'documentation';
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=doc-type.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doc-type.js","sourceRoot":"","sources":["../../src/utils/doc-type.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAkB,MAAM,iBAAiB,CAAC;AAE5D;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,QAAgB;IAC3C,KAAK,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QACtD,IAAI,eAAe,IAAI,OAAO,IAAI,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YACvE,OAAO,EAAe,CAAC;QACzB,CAAC;IACH,CAAC;IACD,OAAO,eAAe,CAAC;AACzB,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Progress notification utility
|
|
3
|
+
*/
|
|
4
|
+
import type { ServerNotification, ServerRequest } from '@modelcontextprotocol/sdk/types.js';
|
|
5
|
+
import type { RequestHandlerExtra } from '@modelcontextprotocol/sdk/shared/protocol.js';
|
|
6
|
+
type Extra = RequestHandlerExtra<ServerRequest, ServerNotification>;
|
|
7
|
+
/**
|
|
8
|
+
* Report progress to the client if a progressToken was provided.
|
|
9
|
+
* No-op if the client didn't request progress notifications.
|
|
10
|
+
*/
|
|
11
|
+
export declare function reportProgress(extra: Extra, progress: number, total: number): Promise<void>;
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=progress.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"progress.d.ts","sourceRoot":"","sources":["../../src/utils/progress.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AAC5F,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,8CAA8C,CAAC;AAExF,KAAK,KAAK,GAAG,mBAAmB,CAAC,aAAa,EAAE,kBAAkB,CAAC,CAAC;AAEpE;;;GAGG;AACH,wBAAsB,cAAc,CAClC,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC,CAUf"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Progress notification utility
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Report progress to the client if a progressToken was provided.
|
|
6
|
+
* No-op if the client didn't request progress notifications.
|
|
7
|
+
*/
|
|
8
|
+
export async function reportProgress(extra, progress, total) {
|
|
9
|
+
const progressToken = extra._meta?.progressToken;
|
|
10
|
+
if (progressToken === undefined) {
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
await extra.sendNotification({
|
|
14
|
+
method: 'notifications/progress',
|
|
15
|
+
params: { progressToken, progress, total },
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=progress.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"progress.js","sourceRoot":"","sources":["../../src/utils/progress.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,KAAY,EACZ,QAAgB,EAChB,KAAa;IAEb,MAAM,aAAa,GAAG,KAAK,CAAC,KAAK,EAAE,aAAa,CAAC;IACjD,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;QAChC,OAAO;IACT,CAAC;IAED,MAAM,KAAK,CAAC,gBAAgB,CAAC;QAC3B,MAAM,EAAE,wBAAwB;QAChC,MAAM,EAAE,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE;KAC3C,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Security sanitization utilities
|
|
3
|
+
*
|
|
4
|
+
* Functions for sanitizing user-controlled or externally-sourced content
|
|
5
|
+
* before interpolation into Markdown output or client-facing error messages.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Escape Markdown special characters in text to prevent Markdown injection.
|
|
9
|
+
* Use this for titles, snippets, and other text interpolated into Markdown.
|
|
10
|
+
*/
|
|
11
|
+
export declare function sanitizeMarkdownText(text: string): string;
|
|
12
|
+
/**
|
|
13
|
+
* Sanitize a URL for use in Markdown link syntax.
|
|
14
|
+
* - Only allows https: protocol
|
|
15
|
+
* - Percent-encodes parentheses to prevent breaking Markdown links
|
|
16
|
+
* - Returns '#' for invalid or non-https URLs
|
|
17
|
+
*/
|
|
18
|
+
export declare function sanitizeMarkdownUrl(url: string): string;
|
|
19
|
+
/**
|
|
20
|
+
* Extract and sanitize an error message from an unknown thrown value.
|
|
21
|
+
*/
|
|
22
|
+
export declare function getSafeErrorMessage(error: unknown): string;
|
|
23
|
+
/**
|
|
24
|
+
* Sanitize error messages before returning to clients.
|
|
25
|
+
* - Replaces backend hostnames with frontend equivalents
|
|
26
|
+
* - Removes absolute file paths
|
|
27
|
+
* - Removes stack traces
|
|
28
|
+
*/
|
|
29
|
+
export declare function sanitizeErrorMessage(message: string): string;
|
|
30
|
+
//# sourceMappingURL=sanitize.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sanitize.d.ts","sourceRoot":"","sources":["../../src/utils/sanitize.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAWvD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAG1D;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAc5D"}
|