@markstiles/sitecore-search-mcp 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 (88) hide show
  1. package/AUTHENTICATION.md +337 -0
  2. package/LICENSE +21 -0
  3. package/README.md +606 -0
  4. package/dist/client/base-client.d.ts +34 -0
  5. package/dist/client/base-client.d.ts.map +1 -0
  6. package/dist/client/base-client.js +117 -0
  7. package/dist/client/base-client.js.map +1 -0
  8. package/dist/client/events-client.d.ts +77 -0
  9. package/dist/client/events-client.d.ts.map +1 -0
  10. package/dist/client/events-client.js +32 -0
  11. package/dist/client/events-client.js.map +1 -0
  12. package/dist/client/ingestion-client.d.ts +76 -0
  13. package/dist/client/ingestion-client.d.ts.map +1 -0
  14. package/dist/client/ingestion-client.js +73 -0
  15. package/dist/client/ingestion-client.js.map +1 -0
  16. package/dist/client/search-client.d.ts +97 -0
  17. package/dist/client/search-client.d.ts.map +1 -0
  18. package/dist/client/search-client.js +18 -0
  19. package/dist/client/search-client.js.map +1 -0
  20. package/dist/config.d.ts +99 -0
  21. package/dist/config.d.ts.map +1 -0
  22. package/dist/config.js +75 -0
  23. package/dist/config.js.map +1 -0
  24. package/dist/index.d.ts +3 -0
  25. package/dist/index.d.ts.map +1 -0
  26. package/dist/index.js +312 -0
  27. package/dist/index.js.map +1 -0
  28. package/dist/tools/events/track-event.d.ts +394 -0
  29. package/dist/tools/events/track-event.d.ts.map +1 -0
  30. package/dist/tools/events/track-event.js +80 -0
  31. package/dist/tools/events/track-event.js.map +1 -0
  32. package/dist/tools/events/validate-event.d.ts +94 -0
  33. package/dist/tools/events/validate-event.d.ts.map +1 -0
  34. package/dist/tools/events/validate-event.js +51 -0
  35. package/dist/tools/events/validate-event.js.map +1 -0
  36. package/dist/tools/ingestion/check-status.d.ts +50 -0
  37. package/dist/tools/ingestion/check-status.d.ts.map +1 -0
  38. package/dist/tools/ingestion/check-status.js +27 -0
  39. package/dist/tools/ingestion/check-status.js.map +1 -0
  40. package/dist/tools/ingestion/create-document.d.ts +50 -0
  41. package/dist/tools/ingestion/create-document.d.ts.map +1 -0
  42. package/dist/tools/ingestion/create-document.js +27 -0
  43. package/dist/tools/ingestion/create-document.js.map +1 -0
  44. package/dist/tools/ingestion/delete-document.d.ts +50 -0
  45. package/dist/tools/ingestion/delete-document.d.ts.map +1 -0
  46. package/dist/tools/ingestion/delete-document.js +27 -0
  47. package/dist/tools/ingestion/delete-document.js.map +1 -0
  48. package/dist/tools/ingestion/ingest-from-source.d.ts +234 -0
  49. package/dist/tools/ingestion/ingest-from-source.d.ts.map +1 -0
  50. package/dist/tools/ingestion/ingest-from-source.js +48 -0
  51. package/dist/tools/ingestion/ingest-from-source.js.map +1 -0
  52. package/dist/tools/ingestion/update-document.d.ts +62 -0
  53. package/dist/tools/ingestion/update-document.d.ts.map +1 -0
  54. package/dist/tools/ingestion/update-document.js +34 -0
  55. package/dist/tools/ingestion/update-document.js.map +1 -0
  56. package/dist/tools/search/ai-search.d.ts +132 -0
  57. package/dist/tools/search/ai-search.d.ts.map +1 -0
  58. package/dist/tools/search/ai-search.js +65 -0
  59. package/dist/tools/search/ai-search.js.map +1 -0
  60. package/dist/tools/search/basic-search.d.ts +98 -0
  61. package/dist/tools/search/basic-search.d.ts.map +1 -0
  62. package/dist/tools/search/basic-search.js +51 -0
  63. package/dist/tools/search/basic-search.js.map +1 -0
  64. package/dist/tools/search/faceted-search.d.ts +114 -0
  65. package/dist/tools/search/faceted-search.d.ts.map +1 -0
  66. package/dist/tools/search/faceted-search.js +52 -0
  67. package/dist/tools/search/faceted-search.js.map +1 -0
  68. package/dist/tools/search/recommendations.d.ts +62 -0
  69. package/dist/tools/search/recommendations.d.ts.map +1 -0
  70. package/dist/tools/search/recommendations.js +50 -0
  71. package/dist/tools/search/recommendations.js.map +1 -0
  72. package/dist/utils/auth-manager.d.ts +60 -0
  73. package/dist/utils/auth-manager.d.ts.map +1 -0
  74. package/dist/utils/auth-manager.js +184 -0
  75. package/dist/utils/auth-manager.js.map +1 -0
  76. package/dist/utils/errors.d.ts +18 -0
  77. package/dist/utils/errors.d.ts.map +1 -0
  78. package/dist/utils/errors.js +58 -0
  79. package/dist/utils/errors.js.map +1 -0
  80. package/dist/utils/logger.d.ts +12 -0
  81. package/dist/utils/logger.d.ts.map +1 -0
  82. package/dist/utils/logger.js +50 -0
  83. package/dist/utils/logger.js.map +1 -0
  84. package/dist/utils/schema.d.ts +6 -0
  85. package/dist/utils/schema.d.ts.map +1 -0
  86. package/dist/utils/schema.js +14 -0
  87. package/dist/utils/schema.js.map +1 -0
  88. package/package.json +58 -0
package/dist/config.js ADDED
@@ -0,0 +1,75 @@
1
+ import { z } from 'zod';
2
+ /**
3
+ * Configuration schema for Sitecore Search MCP Server
4
+ */
5
+ export const DomainConfigSchema = z.object({
6
+ searchBaseUrl: z.string().url().optional().default('https://discover.sitecorecloud.io'),
7
+ ingestionBaseUrl: z.string().url().optional().default('https://discover.sitecorecloud.io'),
8
+ eventsBaseUrl: z.string().url().optional().default('https://discover.sitecorecloud.io'),
9
+ apiKey: z.string().optional(),
10
+ clientKey: z.string().optional(), // Full client key (e.g., 123456789-987654321) for Events API
11
+ // Token expiry settings (in milliseconds)
12
+ accessTokenExpiry: z.number().optional().default(86400000), // 1 day
13
+ refreshTokenExpiry: z.number().optional().default(604800000), // 7 days
14
+ // Scope settings for authentication
15
+ authScopes: z.array(z.enum(['discover', 'event', 'ingestion'])).optional().default(['discover', 'event', 'ingestion']),
16
+ });
17
+ export const ConfigSchema = z.object({
18
+ domains: z.record(z.string(), DomainConfigSchema),
19
+ defaultDomain: z.string().optional(),
20
+ });
21
+ /**
22
+ * Load configuration from environment variables
23
+ * Supports multiple domains via SITECORE_DOMAIN_{NAME}_* pattern
24
+ */
25
+ export function loadConfig() {
26
+ const domains = {};
27
+ // Load default domain configuration
28
+ if (process.env.SITECORE_DOMAIN_ID) {
29
+ domains[process.env.SITECORE_DOMAIN_ID] = {
30
+ searchBaseUrl: process.env.SITECORE_SEARCH_BASE_URL || 'https://discover.sitecorecloud.io',
31
+ ingestionBaseUrl: process.env.SITECORE_INGESTION_BASE_URL || 'https://discover.sitecorecloud.io',
32
+ eventsBaseUrl: process.env.SITECORE_EVENTS_BASE_URL || 'https://discover.sitecorecloud.io',
33
+ apiKey: process.env.SITECORE_API_KEY,
34
+ clientKey: process.env.SITECORE_CLIENT_KEY,
35
+ accessTokenExpiry: process.env.SITECORE_ACCESS_TOKEN_EXPIRY
36
+ ? parseInt(process.env.SITECORE_ACCESS_TOKEN_EXPIRY)
37
+ : 86400000,
38
+ refreshTokenExpiry: process.env.SITECORE_REFRESH_TOKEN_EXPIRY
39
+ ? parseInt(process.env.SITECORE_REFRESH_TOKEN_EXPIRY)
40
+ : 604800000,
41
+ authScopes: process.env.SITECORE_AUTH_SCOPES
42
+ ? process.env.SITECORE_AUTH_SCOPES.split(',').map(s => s.trim())
43
+ : ['discover', 'event', 'ingestion'],
44
+ };
45
+ }
46
+ // Parse additional domains from environment (format: SITECORE_DOMAINS_JSON)
47
+ if (process.env.SITECORE_DOMAINS_JSON) {
48
+ try {
49
+ const parsedDomains = JSON.parse(process.env.SITECORE_DOMAINS_JSON);
50
+ Object.assign(domains, parsedDomains);
51
+ }
52
+ catch (error) {
53
+ console.error('Failed to parse SITECORE_DOMAINS_JSON:', error);
54
+ }
55
+ }
56
+ return ConfigSchema.parse({
57
+ domains,
58
+ defaultDomain: process.env.SITECORE_DEFAULT_DOMAIN || process.env.SITECORE_DOMAIN_ID,
59
+ });
60
+ }
61
+ /**
62
+ * Get domain configuration by domain ID
63
+ */
64
+ export function getDomainConfig(config, domainId) {
65
+ const targetDomain = domainId || config.defaultDomain;
66
+ if (!targetDomain) {
67
+ throw new Error('No domain ID provided and no default domain configured');
68
+ }
69
+ const domainConfig = config.domains[targetDomain];
70
+ if (!domainConfig) {
71
+ throw new Error(`Domain configuration not found for: ${targetDomain}`);
72
+ }
73
+ return domainConfig;
74
+ }
75
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,312 @@
1
+ #!/usr/bin/env node
2
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
3
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
4
+ import { CallToolRequestSchema, ListToolsRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
5
+ import { loadConfig, getDomainConfig } from './config.js';
6
+ import { SearchClient } from './client/search-client.js';
7
+ import { IngestionClient } from './client/ingestion-client.js';
8
+ import { EventsClient } from './client/events-client.js';
9
+ import { Logger } from './utils/logger.js';
10
+ import { toJsonSchema } from './utils/schema.js';
11
+ import { AuthManager } from './utils/auth-manager.js';
12
+ // Import Search tools
13
+ import { basicSearchTool, executeBasicSearch } from './tools/search/basic-search.js';
14
+ import { facetedSearchTool, executeFacetedSearch } from './tools/search/faceted-search.js';
15
+ import { recommendationsTool, getRecommendations } from './tools/search/recommendations.js';
16
+ import { aiSearchTool, getAiSearchResults } from './tools/search/ai-search.js';
17
+ // Import Ingestion tools
18
+ import { createDocumentTool, createDocument } from './tools/ingestion/create-document.js';
19
+ import { updateDocumentTool, updateDocument } from './tools/ingestion/update-document.js';
20
+ import { deleteDocumentTool, deleteDocument } from './tools/ingestion/delete-document.js';
21
+ import { ingestFromSourceTool, ingestFromSource } from './tools/ingestion/ingest-from-source.js';
22
+ import { checkStatusTool, checkIngestionStatus } from './tools/ingestion/check-status.js';
23
+ // Import Events tools
24
+ import { trackEventTool, trackEvent } from './tools/events/track-event.js';
25
+ import { validateEventTool, validateEvent } from './tools/events/validate-event.js';
26
+ const logger = new Logger('MCPServer');
27
+ /**
28
+ * Main MCP Server for Sitecore Search APIs
29
+ */
30
+ class SitecoreSearchServer {
31
+ server;
32
+ config;
33
+ searchClients = new Map();
34
+ ingestionClients = new Map();
35
+ eventsClients = new Map();
36
+ authManagers = new Map();
37
+ constructor() {
38
+ this.server = new Server({
39
+ name: 'sitecore-search-server',
40
+ version: '1.0.0',
41
+ }, {
42
+ capabilities: {
43
+ tools: {},
44
+ },
45
+ });
46
+ // Load configuration
47
+ try {
48
+ this.config = loadConfig();
49
+ logger.info('Configuration loaded', {
50
+ domains: Object.keys(this.config.domains),
51
+ defaultDomain: this.config.defaultDomain,
52
+ });
53
+ }
54
+ catch (error) {
55
+ logger.error('Failed to load configuration', error);
56
+ throw error;
57
+ }
58
+ this.setupHandlers();
59
+ this.setupErrorHandling();
60
+ }
61
+ /**
62
+ * Get or create an AuthManager for a domain
63
+ */
64
+ getAuthManager(domainId) {
65
+ const domain = domainId || this.config.defaultDomain;
66
+ if (!domain) {
67
+ throw new Error('No domain ID provided and no default domain configured');
68
+ }
69
+ const domainConfig = getDomainConfig(this.config, domain);
70
+ // If no API key, return undefined (subdomain authentication)
71
+ if (!domainConfig.apiKey) {
72
+ return undefined;
73
+ }
74
+ if (!this.authManagers.has(domain)) {
75
+ this.authManagers.set(domain, new AuthManager(domainConfig.apiKey, domainConfig.authScopes, domainConfig.accessTokenExpiry, domainConfig.refreshTokenExpiry));
76
+ }
77
+ return this.authManagers.get(domain);
78
+ }
79
+ /**
80
+ * Get or create a SearchClient for a domain
81
+ */
82
+ getSearchClient(domainId) {
83
+ const domain = domainId || this.config.defaultDomain;
84
+ if (!domain) {
85
+ throw new Error('No domain ID provided and no default domain configured');
86
+ }
87
+ if (!this.searchClients.has(domain)) {
88
+ const domainConfig = getDomainConfig(this.config, domain);
89
+ const authManager = this.getAuthManager(domain);
90
+ this.searchClients.set(domain, new SearchClient(domainConfig.searchBaseUrl, authManager));
91
+ }
92
+ return this.searchClients.get(domain);
93
+ }
94
+ /**
95
+ * Get or create an IngestionClient for a domain
96
+ */
97
+ getIngestionClient(domainId) {
98
+ const domain = domainId || this.config.defaultDomain;
99
+ if (!domain) {
100
+ throw new Error('No domain ID provided and no default domain configured');
101
+ }
102
+ if (!this.ingestionClients.has(domain)) {
103
+ const domainConfig = getDomainConfig(this.config, domain);
104
+ const authManager = this.getAuthManager(domain);
105
+ this.ingestionClients.set(domain, new IngestionClient(domainConfig.ingestionBaseUrl, authManager));
106
+ }
107
+ return this.ingestionClients.get(domain);
108
+ }
109
+ /**
110
+ * Get or create an EventsClient for a domain
111
+ */
112
+ getEventsClient(domainId) {
113
+ const domain = domainId || this.config.defaultDomain;
114
+ if (!domain) {
115
+ throw new Error('No domain ID provided and no default domain configured');
116
+ }
117
+ if (!this.eventsClients.has(domain)) {
118
+ const domainConfig = getDomainConfig(this.config, domain);
119
+ const authManager = this.getAuthManager(domain);
120
+ this.eventsClients.set(domain, new EventsClient(domainConfig.eventsBaseUrl, authManager));
121
+ }
122
+ return this.eventsClients.get(domain);
123
+ }
124
+ /**
125
+ * Get client key for a domain
126
+ */
127
+ getClientKey(domainId) {
128
+ const domain = domainId || this.config.defaultDomain;
129
+ if (!domain) {
130
+ throw new Error('No domain ID provided and no default domain configured');
131
+ }
132
+ const domainConfig = getDomainConfig(this.config, domain);
133
+ if (!domainConfig.clientKey) {
134
+ throw new Error(`Client key not configured for domain: ${domain}. Please set SITECORE_CLIENT_KEY in your environment.`);
135
+ }
136
+ return domainConfig.clientKey;
137
+ }
138
+ /**
139
+ * Setup request handlers
140
+ */
141
+ setupHandlers() {
142
+ // List available tools
143
+ this.server.setRequestHandler(ListToolsRequestSchema, async () => {
144
+ return {
145
+ tools: [
146
+ // Search API tools
147
+ {
148
+ name: basicSearchTool.name,
149
+ description: basicSearchTool.description,
150
+ inputSchema: toJsonSchema(basicSearchTool.inputSchema),
151
+ },
152
+ {
153
+ name: facetedSearchTool.name,
154
+ description: facetedSearchTool.description,
155
+ inputSchema: toJsonSchema(facetedSearchTool.inputSchema),
156
+ },
157
+ {
158
+ name: recommendationsTool.name,
159
+ description: recommendationsTool.description,
160
+ inputSchema: toJsonSchema(recommendationsTool.inputSchema),
161
+ },
162
+ {
163
+ name: aiSearchTool.name,
164
+ description: aiSearchTool.description,
165
+ inputSchema: toJsonSchema(aiSearchTool.inputSchema),
166
+ },
167
+ // Ingestion API tools
168
+ {
169
+ name: createDocumentTool.name,
170
+ description: createDocumentTool.description,
171
+ inputSchema: toJsonSchema(createDocumentTool.inputSchema),
172
+ },
173
+ {
174
+ name: updateDocumentTool.name,
175
+ description: updateDocumentTool.description,
176
+ inputSchema: toJsonSchema(updateDocumentTool.inputSchema),
177
+ },
178
+ {
179
+ name: deleteDocumentTool.name,
180
+ description: deleteDocumentTool.description,
181
+ inputSchema: toJsonSchema(deleteDocumentTool.inputSchema),
182
+ },
183
+ {
184
+ name: ingestFromSourceTool.name,
185
+ description: ingestFromSourceTool.description,
186
+ inputSchema: toJsonSchema(ingestFromSourceTool.inputSchema),
187
+ },
188
+ {
189
+ name: checkStatusTool.name,
190
+ description: checkStatusTool.description,
191
+ inputSchema: toJsonSchema(checkStatusTool.inputSchema),
192
+ },
193
+ // Events API tools
194
+ {
195
+ name: trackEventTool.name,
196
+ description: trackEventTool.description,
197
+ inputSchema: toJsonSchema(trackEventTool.inputSchema),
198
+ },
199
+ {
200
+ name: validateEventTool.name,
201
+ description: validateEventTool.description,
202
+ inputSchema: toJsonSchema(validateEventTool.inputSchema),
203
+ },
204
+ ],
205
+ };
206
+ });
207
+ // Handle tool calls
208
+ this.server.setRequestHandler(CallToolRequestSchema, async (request) => {
209
+ const { name, arguments: args } = request.params;
210
+ logger.info('Tool called', { name, args });
211
+ if (!args) {
212
+ throw new Error('No arguments provided');
213
+ }
214
+ try {
215
+ let result;
216
+ // Route to appropriate tool handler
217
+ switch (name) {
218
+ // Search API tools
219
+ case basicSearchTool.name:
220
+ result = await executeBasicSearch(this.getSearchClient(args.domainId), args);
221
+ break;
222
+ case facetedSearchTool.name:
223
+ result = await executeFacetedSearch(this.getSearchClient(args.domainId), args);
224
+ break;
225
+ case recommendationsTool.name:
226
+ result = await getRecommendations(this.getSearchClient(args.domainId), args);
227
+ break;
228
+ case aiSearchTool.name:
229
+ result = await getAiSearchResults(this.getSearchClient(args.domainId), args);
230
+ break;
231
+ // Ingestion API tools
232
+ case createDocumentTool.name:
233
+ result = await createDocument(this.getIngestionClient(args.domain), args);
234
+ break;
235
+ case updateDocumentTool.name:
236
+ result = await updateDocument(this.getIngestionClient(args.domain), args);
237
+ break;
238
+ case deleteDocumentTool.name:
239
+ result = await deleteDocument(this.getIngestionClient(args.domain), args);
240
+ break;
241
+ case ingestFromSourceTool.name:
242
+ result = await ingestFromSource(this.getIngestionClient(args.domain), args);
243
+ break;
244
+ case checkStatusTool.name:
245
+ result = await checkIngestionStatus(this.getIngestionClient(args.domain), args);
246
+ break;
247
+ // Events API tools
248
+ case trackEventTool.name: {
249
+ const domainId = args.domainId;
250
+ const clientKey = this.getClientKey(domainId);
251
+ result = await trackEvent(this.getEventsClient(domainId), clientKey, args);
252
+ break;
253
+ }
254
+ case validateEventTool.name:
255
+ result = await validateEvent(this.getEventsClient(args.domainId), args);
256
+ break;
257
+ default:
258
+ throw new Error(`Unknown tool: ${name}`);
259
+ }
260
+ return {
261
+ content: [
262
+ {
263
+ type: 'text',
264
+ text: JSON.stringify(result, null, 2),
265
+ },
266
+ ],
267
+ };
268
+ }
269
+ catch (error) {
270
+ logger.error('Tool execution failed', error, { tool: name });
271
+ const errorMessage = error instanceof Error ? error.message : 'Unknown error';
272
+ return {
273
+ content: [
274
+ {
275
+ type: 'text',
276
+ text: JSON.stringify({ error: errorMessage }, null, 2),
277
+ },
278
+ ],
279
+ isError: true,
280
+ };
281
+ }
282
+ });
283
+ }
284
+ /**
285
+ * Setup error handling
286
+ */
287
+ setupErrorHandling() {
288
+ this.server.onerror = (error) => {
289
+ logger.error('Server error', error);
290
+ };
291
+ process.on('SIGINT', async () => {
292
+ logger.info('Shutting down server...');
293
+ await this.server.close();
294
+ process.exit(0);
295
+ });
296
+ }
297
+ /**
298
+ * Start the server
299
+ */
300
+ async start() {
301
+ const transport = new StdioServerTransport();
302
+ await this.server.connect(transport);
303
+ logger.info('Sitecore Search MCP Server started');
304
+ }
305
+ }
306
+ // Start the server
307
+ const server = new SitecoreSearchServer();
308
+ server.start().catch((error) => {
309
+ logger.error('Failed to start server', error);
310
+ process.exit(1);
311
+ });
312
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}