@get-technology-inc/jamf-docs-mcp-server 0.0.1 → 1.0.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.
Files changed (47) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +189 -29
  3. package/dist/constants.d.ts +260 -0
  4. package/dist/constants.d.ts.map +1 -0
  5. package/dist/constants.js +303 -0
  6. package/dist/constants.js.map +1 -0
  7. package/dist/index.d.ts +9 -0
  8. package/dist/index.d.ts.map +1 -0
  9. package/dist/index.js +36 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/schemas/index.d.ts +98 -0
  12. package/dist/schemas/index.d.ts.map +1 -0
  13. package/dist/schemas/index.js +110 -0
  14. package/dist/schemas/index.js.map +1 -0
  15. package/dist/services/cache.d.ts +56 -0
  16. package/dist/services/cache.d.ts.map +1 -0
  17. package/dist/services/cache.js +189 -0
  18. package/dist/services/cache.js.map +1 -0
  19. package/dist/services/scraper.d.ts +62 -0
  20. package/dist/services/scraper.d.ts.map +1 -0
  21. package/dist/services/scraper.js +568 -0
  22. package/dist/services/scraper.js.map +1 -0
  23. package/dist/services/tokenizer.d.ts +77 -0
  24. package/dist/services/tokenizer.d.ts.map +1 -0
  25. package/dist/services/tokenizer.js +274 -0
  26. package/dist/services/tokenizer.js.map +1 -0
  27. package/dist/tools/get-article.d.ts +7 -0
  28. package/dist/tools/get-article.d.ts.map +1 -0
  29. package/dist/tools/get-article.js +195 -0
  30. package/dist/tools/get-article.js.map +1 -0
  31. package/dist/tools/get-toc.d.ts +7 -0
  32. package/dist/tools/get-toc.d.ts.map +1 -0
  33. package/dist/tools/get-toc.js +172 -0
  34. package/dist/tools/get-toc.js.map +1 -0
  35. package/dist/tools/list-products.d.ts +7 -0
  36. package/dist/tools/list-products.d.ts.map +1 -0
  37. package/dist/tools/list-products.js +132 -0
  38. package/dist/tools/list-products.js.map +1 -0
  39. package/dist/tools/search.d.ts +7 -0
  40. package/dist/tools/search.d.ts.map +1 -0
  41. package/dist/tools/search.js +212 -0
  42. package/dist/tools/search.js.map +1 -0
  43. package/dist/types.d.ts +197 -0
  44. package/dist/types.d.ts.map +1 -0
  45. package/dist/types.js +28 -0
  46. package/dist/types.js.map +1 -0
  47. package/package.json +68 -6
@@ -0,0 +1,303 @@
1
+ /**
2
+ * Constants for Jamf Docs MCP Server
3
+ *
4
+ * Note: Jamf documentation has moved from docs.jamf.com to learn.jamf.com
5
+ * The new URL structure is: learn.jamf.com/en-US/bundle/{product}-documentation/page/{page}.html
6
+ */
7
+ // Environment variable helpers
8
+ const getEnvNumber = (key, defaultValue) => {
9
+ const value = process.env[key];
10
+ if (value === undefined) {
11
+ return defaultValue;
12
+ }
13
+ const parsed = parseInt(value, 10);
14
+ return isNaN(parsed) ? defaultValue : parsed;
15
+ };
16
+ const getEnvString = (key, defaultValue) => {
17
+ return process.env[key] ?? defaultValue;
18
+ };
19
+ // Base URLs
20
+ export const DOCS_BASE_URL = 'https://learn.jamf.com';
21
+ export const LEARN_BASE_URL = 'https://learn.jamf.com';
22
+ export const DOCS_API_URL = 'https://learn-be.jamf.com';
23
+ // Supported products - updated URL patterns for learn.jamf.com
24
+ export const JAMF_PRODUCTS = {
25
+ 'jamf-pro': {
26
+ id: 'jamf-pro',
27
+ name: 'Jamf Pro',
28
+ description: 'Apple device management for enterprise',
29
+ urlPattern: 'en-US/bundle/jamf-pro-documentation/page',
30
+ bundleId: 'jamf-pro-documentation',
31
+ searchLabel: 'product-pro', // Label used in Zoomin search API
32
+ latestVersion: 'current',
33
+ versions: ['current'] // learn.jamf.com uses latest version only
34
+ },
35
+ 'jamf-school': {
36
+ id: 'jamf-school',
37
+ name: 'Jamf School',
38
+ description: 'Apple device management for education',
39
+ urlPattern: 'en-US/bundle/jamf-school-documentation/page',
40
+ bundleId: 'jamf-school-documentation',
41
+ searchLabel: 'product-school',
42
+ latestVersion: 'current',
43
+ versions: ['current']
44
+ },
45
+ 'jamf-connect': {
46
+ id: 'jamf-connect',
47
+ name: 'Jamf Connect',
48
+ description: 'Identity and access management',
49
+ urlPattern: 'en-US/bundle/jamf-connect-documentation/page',
50
+ bundleId: 'jamf-connect-documentation',
51
+ searchLabel: 'product-connect',
52
+ latestVersion: 'current',
53
+ versions: ['current']
54
+ },
55
+ 'jamf-protect': {
56
+ id: 'jamf-protect',
57
+ name: 'Jamf Protect',
58
+ description: 'Endpoint security for Apple',
59
+ urlPattern: 'en-US/bundle/jamf-protect-documentation/page',
60
+ bundleId: 'jamf-protect-documentation',
61
+ searchLabel: 'product-protect',
62
+ latestVersion: 'current',
63
+ versions: ['current']
64
+ }
65
+ };
66
+ // Response format
67
+ export var ResponseFormat;
68
+ (function (ResponseFormat) {
69
+ ResponseFormat["MARKDOWN"] = "markdown";
70
+ ResponseFormat["JSON"] = "json";
71
+ })(ResponseFormat || (ResponseFormat = {}));
72
+ // Cache settings (in milliseconds) - configurable via environment variables
73
+ export const CACHE_TTL = {
74
+ SEARCH_RESULTS: getEnvNumber('CACHE_TTL_SEARCH', 30 * 60 * 1000), // 30 minutes
75
+ ARTICLE_CONTENT: getEnvNumber('CACHE_TTL_ARTICLE', 24 * 60 * 60 * 1000), // 24 hours
76
+ PRODUCT_LIST: getEnvNumber('CACHE_TTL_PRODUCTS', 7 * 24 * 60 * 60 * 1000), // 7 days
77
+ TOC: getEnvNumber('CACHE_TTL_TOC', 24 * 60 * 60 * 1000) // 24 hours
78
+ };
79
+ // Cache directory - configurable via environment variable
80
+ export const CACHE_DIR = getEnvString('CACHE_DIR', '.cache');
81
+ // Request settings - configurable via environment variables
82
+ export const REQUEST_CONFIG = {
83
+ TIMEOUT: getEnvNumber('REQUEST_TIMEOUT', 15000), // 15 seconds
84
+ MAX_RETRIES: getEnvNumber('MAX_RETRIES', 3),
85
+ RETRY_DELAY: getEnvNumber('RETRY_DELAY', 1000), // 1 second
86
+ RATE_LIMIT_DELAY: getEnvNumber('RATE_LIMIT_DELAY', 500), // 500ms between requests
87
+ USER_AGENT: getEnvString('USER_AGENT', 'JamfDocsMCP/1.0 (https://github.com/GET-Technology-Inc/jamf-docs-mcp-server)')
88
+ };
89
+ // Content limits
90
+ export const CONTENT_LIMITS = {
91
+ MAX_SEARCH_RESULTS: 50,
92
+ DEFAULT_SEARCH_RESULTS: 10,
93
+ MAX_CONTENT_LENGTH: 100000, // 100KB
94
+ MAX_SNIPPET_LENGTH: 500
95
+ };
96
+ // Token configuration (Context7 style)
97
+ export const TOKEN_CONFIG = {
98
+ DEFAULT_MAX_TOKENS: 5000,
99
+ MAX_TOKENS_LIMIT: 20000,
100
+ MIN_TOKENS: 100,
101
+ CHARS_PER_TOKEN: 4, // Estimation ratio
102
+ CODE_CHARS_PER_TOKEN: 3 // Code blocks have higher token density
103
+ };
104
+ // Pagination configuration
105
+ export const PAGINATION_CONFIG = {
106
+ DEFAULT_PAGE: 1,
107
+ DEFAULT_PAGE_SIZE: 10,
108
+ MAX_PAGE: 100
109
+ };
110
+ // Topic categories for filtering (comprehensive list based on actual Jamf documentation)
111
+ export const JAMF_TOPICS = {
112
+ // === Enrollment & Onboarding ===
113
+ 'enrollment': {
114
+ name: 'Enrollment & Onboarding',
115
+ keywords: ['enroll', 'dep', 'ade', 'automated device enrollment', 'user enrollment', 'apple configurator', 'onboard', 'prestage', 'enrollment method']
116
+ },
117
+ // === Device Management ===
118
+ 'computer-management': {
119
+ name: 'Computer Management',
120
+ keywords: ['computer management', 'computer inventory', 'remote command', 'remote administration', 'mass action', 'unmanag', 'check-in', 'startup script', 'login event']
121
+ },
122
+ 'mobile-management': {
123
+ name: 'Mobile Device Management',
124
+ keywords: ['mobile device', 'iphone', 'ipad', 'ios', 'ipados', 'mobile inventory', 'mdm capabilities']
125
+ },
126
+ // === Configuration ===
127
+ 'profiles': {
128
+ name: 'Configuration Profiles',
129
+ keywords: ['configuration profile', 'profile', 'payload', 'restriction', 'settings management', 'computer configuration', 'mobile configuration']
130
+ },
131
+ 'policies': {
132
+ name: 'Policies',
133
+ keywords: ['policy', 'policies', 'execution frequency', 'user interaction', 'policy management', 'policy payload', 'trigger']
134
+ },
135
+ // === Software & Packages ===
136
+ 'packages': {
137
+ name: 'Packages & Deployment',
138
+ keywords: ['package', 'pkg', 'dmg', 'package deployment', 'package management', 'installer']
139
+ },
140
+ 'scripts': {
141
+ name: 'Scripts',
142
+ keywords: ['script', 'bash', 'shell', 'login script', 'startup script', 'extension attribute']
143
+ },
144
+ 'patch': {
145
+ name: 'Patch Management',
146
+ keywords: ['patch', 'patch management', 'patch policy', 'software update', 'patch reporting', 'software title', 'patch source']
147
+ },
148
+ 'apps': {
149
+ name: 'App Management',
150
+ keywords: ['app', 'application', 'app installer', 'vpp', 'volume purchase', 'managed app', 'app store', 'mac app store']
151
+ },
152
+ // === Self Service ===
153
+ 'self-service': {
154
+ name: 'Self Service',
155
+ keywords: ['self service', 'self-service', 'dock item', 'branding', 'bookmark', 'user portal']
156
+ },
157
+ // === Security ===
158
+ 'security': {
159
+ name: 'Security Settings',
160
+ keywords: ['security', 'security settings', 'restricted software', 'efi password', 'firmware password', 'gatekeeper']
161
+ },
162
+ 'filevault': {
163
+ name: 'FileVault & Encryption',
164
+ keywords: ['filevault', 'encryption', 'recovery key', 'disk encryption', 'institutional recovery', 'personal recovery']
165
+ },
166
+ 'compliance': {
167
+ name: 'Compliance & Baseline',
168
+ keywords: ['compliance', 'baseline', 'compliance baseline', 'security benchmark', 'cis benchmark', 'gdpr']
169
+ },
170
+ // === Endpoint Protection (Jamf Protect) ===
171
+ 'protect-analytics': {
172
+ name: 'Threat Analytics',
173
+ keywords: ['analytic', 'threat', 'detection', 'analytic chain', 'custom analytic', 'jamf-managed analytic', 'alert']
174
+ },
175
+ 'protect-plans': {
176
+ name: 'Protect Plans',
177
+ keywords: ['protect plan', 'jamf protect plan', 'threat prevention', 'endpoint security']
178
+ },
179
+ 'data-integration': {
180
+ name: 'SIEM & Data Integration',
181
+ keywords: ['siem', 'splunk', 'sentinel', 'elastic', 'datadog', 'sumo logic', 'google secops', 'amazon s3', 'data stream', 'data integration']
182
+ },
183
+ // === Identity & Authentication ===
184
+ 'sso': {
185
+ name: 'Single Sign-On',
186
+ keywords: ['sso', 'single sign-on', 'saml', 'oidc', 'oauth', 'jamf account', 'platform sso']
187
+ },
188
+ 'ldap': {
189
+ name: 'Directory Services',
190
+ keywords: ['ldap', 'active directory', 'directory binding', 'open directory', 'google secure ldap']
191
+ },
192
+ 'identity-provider': {
193
+ name: 'Identity Providers',
194
+ keywords: ['identity provider', 'idp', 'okta', 'azure ad', 'entra id', 'microsoft entra', 'google', 'cloud identity']
195
+ },
196
+ // === Jamf Connect ===
197
+ 'connect-login': {
198
+ name: 'Jamf Connect Login',
199
+ keywords: ['jamf connect', 'login window', 'local account', 'account creation', 'account migration', 'mobile account']
200
+ },
201
+ 'connect-password': {
202
+ name: 'Password & Keychain',
203
+ keywords: ['password sync', 'keychain', 'password policy', 'local password']
204
+ },
205
+ 'privilege-elevation': {
206
+ name: 'Privilege Elevation',
207
+ keywords: ['privilege elevation', 'admin rights', 'sudo', 'privilege', 'self service+']
208
+ },
209
+ // === Users & Accounts ===
210
+ 'users': {
211
+ name: 'Users & Accounts',
212
+ keywords: ['user account', 'local account', 'managed local administrator', 'mdm-enabled', 'user group', 'admin account']
213
+ },
214
+ 'user-roles': {
215
+ name: 'Roles & Permissions',
216
+ keywords: ['user role', 'permission', 'privilege', 'administrator role', 'api role', 'access level']
217
+ },
218
+ // === Inventory & Reporting ===
219
+ 'inventory': {
220
+ name: 'Inventory',
221
+ keywords: ['inventory', 'inventory collection', 'inventory display', 'hardware inventory', 'software inventory', 'inventory preload']
222
+ },
223
+ 'extension-attributes': {
224
+ name: 'Extension Attributes',
225
+ keywords: ['extension attribute', 'custom attribute', 'ea', 'custom field', 'inventory attribute']
226
+ },
227
+ 'reports': {
228
+ name: 'Reports & Searches',
229
+ keywords: ['report', 'search', 'advanced search', 'simple search', 'smart group', 'criteria', 'computer report']
230
+ },
231
+ 'history': {
232
+ name: 'History & Logs',
233
+ keywords: ['history', 'log', 'audit', 'audit log', 'computer history', 'management history', 'server log']
234
+ },
235
+ // === API & Integration ===
236
+ 'api': {
237
+ name: 'API & Automation',
238
+ keywords: ['api', 'rest api', 'classic api', 'jamf pro api', 'api role', 'api client', 'bearer token']
239
+ },
240
+ 'graphql': {
241
+ name: 'GraphQL API',
242
+ keywords: ['graphql', 'query', 'mutation', 'schema', 'protect api']
243
+ },
244
+ 'webhooks': {
245
+ name: 'Webhooks & Notifications',
246
+ keywords: ['webhook', 'notification', 'email notification', 'impact alert', 'event']
247
+ },
248
+ // === Network & Printing ===
249
+ 'network': {
250
+ name: 'Network Configuration',
251
+ keywords: ['wifi', 'vpn', 'network', 'proxy', 'firewall', 'port', 'ip address', 'url']
252
+ },
253
+ 'certificates': {
254
+ name: 'Certificates',
255
+ keywords: ['certificate', 'ssl', 'scep', 'push certificate', 'apns', 'signing']
256
+ },
257
+ 'printers': {
258
+ name: 'Printers',
259
+ keywords: ['printer', 'print', 'cups', 'ppd']
260
+ },
261
+ // === Remote Access ===
262
+ 'remote-access': {
263
+ name: 'Remote Access',
264
+ keywords: ['remote assist', 'jamf remote', 'teamviewer', 'screen sharing', 'vnc', 'remote administration']
265
+ },
266
+ // === Server Administration ===
267
+ 'server-admin': {
268
+ name: 'Server Administration',
269
+ keywords: ['server', 'jamf pro server', 'activation code', 'smtp', 'ssl certificate', 'maintenance', 'health check', 'clustering']
270
+ },
271
+ 'change-management': {
272
+ name: 'Change Management',
273
+ keywords: ['change management', 'change log', 'version', 'backup', 'restore']
274
+ },
275
+ // === License Management ===
276
+ 'licensing': {
277
+ name: 'License Management',
278
+ keywords: ['license', 'licensed software', 'license compliance', 'license usage', 'vpp token']
279
+ },
280
+ // === Education (Jamf School) ===
281
+ 'education': {
282
+ name: 'Education & Classroom',
283
+ keywords: ['school', 'class', 'teacher', 'student', 'jamf teacher', 'jamf student', 'jamf parent', 'classroom', 'education']
284
+ },
285
+ 'school-integration': {
286
+ name: 'School Integrations',
287
+ keywords: ['apple school manager', 'asm', 'shared ipad', 'location', 'google classroom']
288
+ }
289
+ };
290
+ // HTML selectors for learn.jamf.com (React-based site)
291
+ export const SELECTORS = {
292
+ // Main content - learn.jamf.com uses semantic article tag
293
+ CONTENT: 'article, .article-content, main article, #content',
294
+ TITLE: 'h1',
295
+ // Navigation - learn.jamf.com structure
296
+ BREADCRUMB: '[class*="breadcrumb"] a, nav[aria-label="breadcrumb"] a',
297
+ TOC: 'nav.related-links a, [class*="toc"] a, [class*="sidebar"] a',
298
+ // Related content
299
+ RELATED: 'nav.related-links a, .related-topics a, [class*="related"] a',
300
+ // Elements to remove (scripts, tracking, etc.)
301
+ REMOVE: 'script, style, noscript, footer, [id="initial-data"], [class*="cookie"], [class*="tracking"], [class*="analytics"]'
302
+ };
303
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Jamf Docs MCP Server
4
+ *
5
+ * An MCP server that provides access to Jamf documentation (docs.jamf.com)
6
+ * for AI assistants like Claude.
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;GAKG"}
package/dist/index.js ADDED
@@ -0,0 +1,36 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Jamf Docs MCP Server
4
+ *
5
+ * An MCP server that provides access to Jamf documentation (docs.jamf.com)
6
+ * for AI assistants like Claude.
7
+ */
8
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
9
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
10
+ import { registerSearchTool } from './tools/search.js';
11
+ import { registerGetArticleTool } from './tools/get-article.js';
12
+ import { registerListProductsTool } from './tools/list-products.js';
13
+ import { registerGetTocTool } from './tools/get-toc.js';
14
+ // Create server instance
15
+ const server = new McpServer({
16
+ name: 'jamf-docs-mcp-server',
17
+ version: '1.0.0',
18
+ });
19
+ // Register all tools
20
+ registerListProductsTool(server);
21
+ registerSearchTool(server);
22
+ registerGetArticleTool(server);
23
+ registerGetTocTool(server);
24
+ // Start server
25
+ async function main() {
26
+ const transport = new StdioServerTransport();
27
+ await server.connect(transport);
28
+ // Log to stderr (not stdout, which is used for MCP protocol)
29
+ console.error('Jamf Docs MCP Server running on stdio');
30
+ console.error('Available tools: jamf_docs_list_products, jamf_docs_search, jamf_docs_get_article, jamf_docs_get_toc');
31
+ }
32
+ main().catch((error) => {
33
+ console.error('Fatal error:', error);
34
+ process.exit(1);
35
+ });
36
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAEjF,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,yBAAyB;AACzB,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;IAC3B,IAAI,EAAE,sBAAsB;IAC5B,OAAO,EAAE,OAAO;CACjB,CAAC,CAAC;AAEH,qBAAqB;AACrB,wBAAwB,CAAC,MAAM,CAAC,CAAC;AACjC,kBAAkB,CAAC,MAAM,CAAC,CAAC;AAC3B,sBAAsB,CAAC,MAAM,CAAC,CAAC;AAC/B,kBAAkB,CAAC,MAAM,CAAC,CAAC;AAE3B,eAAe;AACf,KAAK,UAAU,IAAI;IACjB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAEhC,6DAA6D;IAC7D,OAAO,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAC;IACvD,OAAO,CAAC,KAAK,CAAC,sGAAsG,CAAC,CAAC;AACxH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,98 @@
1
+ /**
2
+ * Zod schemas for input validation
3
+ */
4
+ import { z } from 'zod';
5
+ import { ResponseFormat } from '../constants.js';
6
+ /**
7
+ * Schema for jamf_docs_list_products
8
+ */
9
+ export declare const ListProductsInputSchema: z.ZodObject<{
10
+ maxTokens: z.ZodOptional<z.ZodDefault<z.ZodNumber>>;
11
+ responseFormat: z.ZodDefault<z.ZodNativeEnum<typeof ResponseFormat>>;
12
+ }, "strict", z.ZodTypeAny, {
13
+ responseFormat: ResponseFormat;
14
+ maxTokens?: number | undefined;
15
+ }, {
16
+ maxTokens?: number | undefined;
17
+ responseFormat?: ResponseFormat | undefined;
18
+ }>;
19
+ export type ListProductsInput = z.infer<typeof ListProductsInputSchema>;
20
+ /**
21
+ * Schema for jamf_docs_search
22
+ */
23
+ export declare const SearchInputSchema: z.ZodObject<{
24
+ query: z.ZodString;
25
+ product: z.ZodOptional<z.ZodEnum<[string, ...string[]]>>;
26
+ topic: z.ZodOptional<z.ZodEnum<[string, ...string[]]>>;
27
+ version: z.ZodOptional<z.ZodString>;
28
+ limit: z.ZodDefault<z.ZodNumber>;
29
+ page: z.ZodOptional<z.ZodDefault<z.ZodNumber>>;
30
+ maxTokens: z.ZodOptional<z.ZodDefault<z.ZodNumber>>;
31
+ responseFormat: z.ZodDefault<z.ZodNativeEnum<typeof ResponseFormat>>;
32
+ }, "strict", z.ZodTypeAny, {
33
+ query: string;
34
+ responseFormat: ResponseFormat;
35
+ limit: number;
36
+ version?: string | undefined;
37
+ maxTokens?: number | undefined;
38
+ product?: string | undefined;
39
+ topic?: string | undefined;
40
+ page?: number | undefined;
41
+ }, {
42
+ query: string;
43
+ version?: string | undefined;
44
+ maxTokens?: number | undefined;
45
+ responseFormat?: ResponseFormat | undefined;
46
+ product?: string | undefined;
47
+ topic?: string | undefined;
48
+ limit?: number | undefined;
49
+ page?: number | undefined;
50
+ }>;
51
+ export type SearchInput = z.infer<typeof SearchInputSchema>;
52
+ /**
53
+ * Schema for jamf_docs_get_article
54
+ */
55
+ export declare const GetArticleInputSchema: z.ZodObject<{
56
+ url: z.ZodEffects<z.ZodString, string, string>;
57
+ section: z.ZodOptional<z.ZodString>;
58
+ includeRelated: z.ZodDefault<z.ZodBoolean>;
59
+ maxTokens: z.ZodOptional<z.ZodDefault<z.ZodNumber>>;
60
+ responseFormat: z.ZodDefault<z.ZodNativeEnum<typeof ResponseFormat>>;
61
+ }, "strict", z.ZodTypeAny, {
62
+ url: string;
63
+ responseFormat: ResponseFormat;
64
+ includeRelated: boolean;
65
+ maxTokens?: number | undefined;
66
+ section?: string | undefined;
67
+ }, {
68
+ url: string;
69
+ maxTokens?: number | undefined;
70
+ responseFormat?: ResponseFormat | undefined;
71
+ section?: string | undefined;
72
+ includeRelated?: boolean | undefined;
73
+ }>;
74
+ export type GetArticleInput = z.infer<typeof GetArticleInputSchema>;
75
+ /**
76
+ * Schema for jamf_docs_get_toc
77
+ */
78
+ export declare const GetTocInputSchema: z.ZodObject<{
79
+ product: z.ZodEnum<[string, ...string[]]>;
80
+ version: z.ZodOptional<z.ZodString>;
81
+ page: z.ZodOptional<z.ZodDefault<z.ZodNumber>>;
82
+ maxTokens: z.ZodOptional<z.ZodDefault<z.ZodNumber>>;
83
+ responseFormat: z.ZodDefault<z.ZodNativeEnum<typeof ResponseFormat>>;
84
+ }, "strict", z.ZodTypeAny, {
85
+ responseFormat: ResponseFormat;
86
+ product: string;
87
+ version?: string | undefined;
88
+ maxTokens?: number | undefined;
89
+ page?: number | undefined;
90
+ }, {
91
+ product: string;
92
+ version?: string | undefined;
93
+ maxTokens?: number | undefined;
94
+ responseFormat?: ResponseFormat | undefined;
95
+ page?: number | undefined;
96
+ }>;
97
+ export type GetTocInput = z.infer<typeof GetTocInputSchema>;
98
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/schemas/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EACL,cAAc,EAMf,MAAM,iBAAiB,CAAC;AA2BzB;;GAEG;AACH,eAAO,MAAM,uBAAuB;;;;;;;;;EAQzB,CAAC;AAEZ,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAExE;;GAEG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;EAoCnB,CAAC;AAEZ,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAE5D;;GAEG;AACH,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;EAwBvB,CAAC;AAEZ,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEpE;;GAEG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;EAmBnB,CAAC;AAEZ,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC"}
@@ -0,0 +1,110 @@
1
+ /**
2
+ * Zod schemas for input validation
3
+ */
4
+ import { z } from 'zod';
5
+ import { ResponseFormat, JAMF_PRODUCTS, CONTENT_LIMITS, TOKEN_CONFIG, PAGINATION_CONFIG, JAMF_TOPICS } from '../constants.js';
6
+ // Valid product IDs
7
+ const productIds = Object.keys(JAMF_PRODUCTS);
8
+ // Valid topic IDs
9
+ const topicIds = Object.keys(JAMF_TOPICS);
10
+ // Response format enum
11
+ const ResponseFormatSchema = z.nativeEnum(ResponseFormat);
12
+ // Common maxTokens parameter schema
13
+ const MaxTokensSchema = z.number()
14
+ .int()
15
+ .min(TOKEN_CONFIG.MIN_TOKENS)
16
+ .max(TOKEN_CONFIG.MAX_TOKENS_LIMIT)
17
+ .default(TOKEN_CONFIG.DEFAULT_MAX_TOKENS)
18
+ .describe(`Maximum tokens in response (${TOKEN_CONFIG.MIN_TOKENS}-${TOKEN_CONFIG.MAX_TOKENS_LIMIT}, default: ${TOKEN_CONFIG.DEFAULT_MAX_TOKENS})`);
19
+ // Common page parameter schema
20
+ const PageSchema = z.number()
21
+ .int()
22
+ .min(1)
23
+ .max(PAGINATION_CONFIG.MAX_PAGE)
24
+ .default(PAGINATION_CONFIG.DEFAULT_PAGE)
25
+ .describe(`Page number (1-${PAGINATION_CONFIG.MAX_PAGE}, default: 1)`);
26
+ /**
27
+ * Schema for jamf_docs_list_products
28
+ */
29
+ export const ListProductsInputSchema = z.object({
30
+ maxTokens: MaxTokensSchema
31
+ .optional()
32
+ .describe(`Maximum tokens in response (${TOKEN_CONFIG.MIN_TOKENS}-${TOKEN_CONFIG.MAX_TOKENS_LIMIT}, default: ${TOKEN_CONFIG.DEFAULT_MAX_TOKENS})`),
33
+ responseFormat: ResponseFormatSchema
34
+ .default(ResponseFormat.MARKDOWN)
35
+ .describe('Output format: "markdown" for human-readable or "json" for machine-readable')
36
+ }).strict();
37
+ /**
38
+ * Schema for jamf_docs_search
39
+ */
40
+ export const SearchInputSchema = z.object({
41
+ query: z.string()
42
+ .min(2, 'Query must be at least 2 characters')
43
+ .max(200, 'Query must not exceed 200 characters')
44
+ .describe('Search keywords to find in Jamf documentation'),
45
+ product: z.enum(productIds)
46
+ .optional()
47
+ .describe('Filter by product: jamf-pro, jamf-school, jamf-connect, jamf-protect'),
48
+ topic: z.enum(topicIds)
49
+ .optional()
50
+ .describe('Filter by topic: enrollment, profiles, security, inventory, policies, smart-groups, apps, identity, api, network'),
51
+ version: z.string()
52
+ .optional()
53
+ .describe('Filter by version (e.g., "11.5.0", "10.x")'),
54
+ limit: z.number()
55
+ .int()
56
+ .min(1)
57
+ .max(CONTENT_LIMITS.MAX_SEARCH_RESULTS)
58
+ .default(CONTENT_LIMITS.DEFAULT_SEARCH_RESULTS)
59
+ .describe(`Maximum number of results per page (1-${CONTENT_LIMITS.MAX_SEARCH_RESULTS})`),
60
+ page: PageSchema
61
+ .optional()
62
+ .describe(`Page number for pagination (1-${PAGINATION_CONFIG.MAX_PAGE}, default: 1)`),
63
+ maxTokens: MaxTokensSchema
64
+ .optional()
65
+ .describe(`Maximum tokens in response (${TOKEN_CONFIG.MIN_TOKENS}-${TOKEN_CONFIG.MAX_TOKENS_LIMIT}, default: ${TOKEN_CONFIG.DEFAULT_MAX_TOKENS})`),
66
+ responseFormat: ResponseFormatSchema
67
+ .default(ResponseFormat.MARKDOWN)
68
+ .describe('Output format: "markdown" for human-readable or "json" for machine-readable')
69
+ }).strict();
70
+ /**
71
+ * Schema for jamf_docs_get_article
72
+ */
73
+ export const GetArticleInputSchema = z.object({
74
+ url: z.string()
75
+ .url('Must be a valid URL')
76
+ .refine((url) => url.includes('docs.jamf.com') || url.includes('learn.jamf.com'), 'URL must be from docs.jamf.com or learn.jamf.com')
77
+ .describe('Full URL of the Jamf documentation article'),
78
+ section: z.string()
79
+ .optional()
80
+ .describe('Extract only a specific section by title or ID (e.g., "Prerequisites", "Configuration")'),
81
+ includeRelated: z.boolean()
82
+ .default(false)
83
+ .describe('Include related article links in the response'),
84
+ maxTokens: MaxTokensSchema
85
+ .optional()
86
+ .describe(`Maximum tokens in response (${TOKEN_CONFIG.MIN_TOKENS}-${TOKEN_CONFIG.MAX_TOKENS_LIMIT}, default: ${TOKEN_CONFIG.DEFAULT_MAX_TOKENS})`),
87
+ responseFormat: ResponseFormatSchema
88
+ .default(ResponseFormat.MARKDOWN)
89
+ .describe('Output format: "markdown" for human-readable or "json" for machine-readable')
90
+ }).strict();
91
+ /**
92
+ * Schema for jamf_docs_get_toc
93
+ */
94
+ export const GetTocInputSchema = z.object({
95
+ product: z.enum(productIds)
96
+ .describe('Product ID: jamf-pro, jamf-school, jamf-connect, jamf-protect'),
97
+ version: z.string()
98
+ .optional()
99
+ .describe('Specific version (defaults to latest)'),
100
+ page: PageSchema
101
+ .optional()
102
+ .describe(`Page number for pagination (1-${PAGINATION_CONFIG.MAX_PAGE}, default: 1)`),
103
+ maxTokens: MaxTokensSchema
104
+ .optional()
105
+ .describe(`Maximum tokens in response (${TOKEN_CONFIG.MIN_TOKENS}-${TOKEN_CONFIG.MAX_TOKENS_LIMIT}, default: ${TOKEN_CONFIG.DEFAULT_MAX_TOKENS})`),
106
+ responseFormat: ResponseFormatSchema
107
+ .default(ResponseFormat.MARKDOWN)
108
+ .describe('Output format: "markdown" for human-readable or "json" for machine-readable')
109
+ }).strict();
110
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/schemas/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Caching service for Jamf documentation
3
+ *
4
+ * Provides file-based caching with TTL support
5
+ */
6
+ /**
7
+ * File-based cache implementation
8
+ */
9
+ declare class FileCache {
10
+ private cacheDir;
11
+ private memoryCache;
12
+ constructor(cacheDir?: string);
13
+ /**
14
+ * Generate a cache key hash
15
+ */
16
+ private getCacheKey;
17
+ /**
18
+ * Get the file path for a cache key
19
+ */
20
+ private getCachePath;
21
+ /**
22
+ * Ensure cache directory exists
23
+ */
24
+ private ensureCacheDir;
25
+ /**
26
+ * Get a value from cache
27
+ */
28
+ get<T>(key: string): Promise<T | null>;
29
+ /**
30
+ * Set a value in cache
31
+ */
32
+ set<T>(key: string, data: T, ttl?: number): Promise<void>;
33
+ /**
34
+ * Delete a cache entry
35
+ */
36
+ delete(key: string): Promise<void>;
37
+ /**
38
+ * Clear all cache entries
39
+ */
40
+ clear(): Promise<void>;
41
+ /**
42
+ * Get cache statistics
43
+ */
44
+ stats(): Promise<{
45
+ memoryEntries: number;
46
+ fileEntries: number;
47
+ totalSize: number;
48
+ }>;
49
+ /**
50
+ * Prune expired entries
51
+ */
52
+ prune(): Promise<number>;
53
+ }
54
+ export declare const cache: FileCache;
55
+ export {};
56
+ //# sourceMappingURL=cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/services/cache.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AASH;;GAEG;AACH,cAAM,SAAS;IACb,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,WAAW,CAA+C;gBAEtD,QAAQ,GAAE,MAAkB;IAIxC;;OAEG;IACH,OAAO,CAAC,WAAW;IAInB;;OAEG;IACH,OAAO,CAAC,YAAY;IAIpB;;OAEG;YACW,cAAc;IAQ5B;;OAEG;IACG,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAiC5C;;OAEG;IACG,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,GAAE,MAAkC,GAAG,OAAO,CAAC,IAAI,CAAC;IAsB1F;;OAEG;IACG,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAYxC;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAiB5B;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IAwBzF;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;CAmC/B;AAGD,eAAO,MAAM,KAAK,WAAkB,CAAC"}