@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.
- package/AUTHENTICATION.md +337 -0
- package/LICENSE +21 -0
- package/README.md +606 -0
- package/dist/client/base-client.d.ts +34 -0
- package/dist/client/base-client.d.ts.map +1 -0
- package/dist/client/base-client.js +117 -0
- package/dist/client/base-client.js.map +1 -0
- package/dist/client/events-client.d.ts +77 -0
- package/dist/client/events-client.d.ts.map +1 -0
- package/dist/client/events-client.js +32 -0
- package/dist/client/events-client.js.map +1 -0
- package/dist/client/ingestion-client.d.ts +76 -0
- package/dist/client/ingestion-client.d.ts.map +1 -0
- package/dist/client/ingestion-client.js +73 -0
- package/dist/client/ingestion-client.js.map +1 -0
- package/dist/client/search-client.d.ts +97 -0
- package/dist/client/search-client.d.ts.map +1 -0
- package/dist/client/search-client.js +18 -0
- package/dist/client/search-client.js.map +1 -0
- package/dist/config.d.ts +99 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +75 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +312 -0
- package/dist/index.js.map +1 -0
- package/dist/tools/events/track-event.d.ts +394 -0
- package/dist/tools/events/track-event.d.ts.map +1 -0
- package/dist/tools/events/track-event.js +80 -0
- package/dist/tools/events/track-event.js.map +1 -0
- package/dist/tools/events/validate-event.d.ts +94 -0
- package/dist/tools/events/validate-event.d.ts.map +1 -0
- package/dist/tools/events/validate-event.js +51 -0
- package/dist/tools/events/validate-event.js.map +1 -0
- package/dist/tools/ingestion/check-status.d.ts +50 -0
- package/dist/tools/ingestion/check-status.d.ts.map +1 -0
- package/dist/tools/ingestion/check-status.js +27 -0
- package/dist/tools/ingestion/check-status.js.map +1 -0
- package/dist/tools/ingestion/create-document.d.ts +50 -0
- package/dist/tools/ingestion/create-document.d.ts.map +1 -0
- package/dist/tools/ingestion/create-document.js +27 -0
- package/dist/tools/ingestion/create-document.js.map +1 -0
- package/dist/tools/ingestion/delete-document.d.ts +50 -0
- package/dist/tools/ingestion/delete-document.d.ts.map +1 -0
- package/dist/tools/ingestion/delete-document.js +27 -0
- package/dist/tools/ingestion/delete-document.js.map +1 -0
- package/dist/tools/ingestion/ingest-from-source.d.ts +234 -0
- package/dist/tools/ingestion/ingest-from-source.d.ts.map +1 -0
- package/dist/tools/ingestion/ingest-from-source.js +48 -0
- package/dist/tools/ingestion/ingest-from-source.js.map +1 -0
- package/dist/tools/ingestion/update-document.d.ts +62 -0
- package/dist/tools/ingestion/update-document.d.ts.map +1 -0
- package/dist/tools/ingestion/update-document.js +34 -0
- package/dist/tools/ingestion/update-document.js.map +1 -0
- package/dist/tools/search/ai-search.d.ts +132 -0
- package/dist/tools/search/ai-search.d.ts.map +1 -0
- package/dist/tools/search/ai-search.js +65 -0
- package/dist/tools/search/ai-search.js.map +1 -0
- package/dist/tools/search/basic-search.d.ts +98 -0
- package/dist/tools/search/basic-search.d.ts.map +1 -0
- package/dist/tools/search/basic-search.js +51 -0
- package/dist/tools/search/basic-search.js.map +1 -0
- package/dist/tools/search/faceted-search.d.ts +114 -0
- package/dist/tools/search/faceted-search.d.ts.map +1 -0
- package/dist/tools/search/faceted-search.js +52 -0
- package/dist/tools/search/faceted-search.js.map +1 -0
- package/dist/tools/search/recommendations.d.ts +62 -0
- package/dist/tools/search/recommendations.d.ts.map +1 -0
- package/dist/tools/search/recommendations.js +50 -0
- package/dist/tools/search/recommendations.js.map +1 -0
- package/dist/utils/auth-manager.d.ts +60 -0
- package/dist/utils/auth-manager.d.ts.map +1 -0
- package/dist/utils/auth-manager.js +184 -0
- package/dist/utils/auth-manager.js.map +1 -0
- package/dist/utils/errors.d.ts +18 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +58 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/logger.d.ts +12 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +50 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/schema.d.ts +6 -0
- package/dist/utils/schema.d.ts.map +1 -0
- package/dist/utils/schema.js +14 -0
- package/dist/utils/schema.js.map +1 -0
- 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":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,mCAAmC,CAAC;IACvF,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,mCAAmC,CAAC;IAC1F,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,mCAAmC,CAAC;IACvF,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC7B,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,6DAA6D;IAC/F,0CAA0C;IAC1C,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,QAAQ;IACpE,kBAAkB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,SAAS;IACvE,oCAAoC;IACpC,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;CACvH,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,kBAAkB,CAAC;IACjD,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACrC,CAAC,CAAC;AAKH;;;GAGG;AACH,MAAM,UAAU,UAAU;IACxB,MAAM,OAAO,GAAiC,EAAE,CAAC;IAEjD,oCAAoC;IACpC,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,CAAC;QACnC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,GAAG;YACxC,aAAa,EAAE,OAAO,CAAC,GAAG,CAAC,wBAAwB,IAAI,mCAAmC;YAC1F,gBAAgB,EAAE,OAAO,CAAC,GAAG,CAAC,2BAA2B,IAAI,mCAAmC;YAChG,aAAa,EAAE,OAAO,CAAC,GAAG,CAAC,wBAAwB,IAAI,mCAAmC;YAC1F,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB;YACpC,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,mBAAmB;YAC1C,iBAAiB,EAAE,OAAO,CAAC,GAAG,CAAC,4BAA4B;gBACzD,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC;gBACpD,CAAC,CAAC,QAAQ;YACZ,kBAAkB,EAAE,OAAO,CAAC,GAAG,CAAC,6BAA6B;gBAC3D,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC;gBACrD,CAAC,CAAC,SAAS;YACb,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,oBAAoB;gBAC1C,CAAC,CAAE,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAA4C;gBAC5G,CAAC,CAAC,CAAC,UAAU,EAAE,OAAO,EAAE,WAAW,CAAC;SACvC,CAAC;IACJ,CAAC;IAED,4EAA4E;IAC5E,IAAI,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,CAAC;QACtC,IAAI,CAAC;YACH,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;YACpE,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;QACxC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,wCAAwC,EAAE,KAAK,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;IAED,OAAO,YAAY,CAAC,KAAK,CAAC;QACxB,OAAO;QACP,aAAa,EAAE,OAAO,CAAC,GAAG,CAAC,uBAAuB,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB;KACrF,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,MAAc,EAAE,QAAiB;IAC/D,MAAM,YAAY,GAAG,QAAQ,IAAI,MAAM,CAAC,aAAa,CAAC;IAEtD,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;IAC5E,CAAC;IAED,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAClD,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,uCAAuC,YAAY,EAAE,CAAC,CAAC;IACzE,CAAC;IAED,OAAO,YAAY,CAAC;AACtB,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -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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"}
|