@antonytm/mcp-sitecore-server 0.18.0 → 0.19.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/dist/bundle.js +114 -87
- package/dist/config.d.ts +11 -1
- package/dist/config.js +36 -0
- package/dist/config.js.map +1 -1
- package/dist/const.d.ts +1 -0
- package/dist/const.js +1 -1
- package/dist/const.js.map +1 -1
- package/dist/server.d.ts +2 -1
- package/dist/server.js +3 -32
- package/dist/server.js.map +1 -1
- package/dist/sse.js +27 -14
- package/dist/sse.js.map +1 -1
- package/dist/stdio.js +2 -1
- package/dist/stdio.js.map +1 -1
- package/dist/streamable-http.js +44 -36
- package/dist/streamable-http.js.map +1 -1
- package/package.json +10 -2
package/dist/bundle.js
CHANGED
|
@@ -1,14 +1,17 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { fileURLToPath } from 'node:url';
|
|
4
|
+
import fs from 'node:fs';
|
|
2
5
|
import process$1 from 'node:process';
|
|
3
|
-
import
|
|
4
|
-
import
|
|
5
|
-
import { fileURLToPath, URL as URL$1 } from 'url';
|
|
6
|
+
import 'fs';
|
|
7
|
+
import require$$0$1 from 'path';
|
|
6
8
|
import 'http';
|
|
7
9
|
import { randomUUID } from 'node:crypto';
|
|
8
10
|
import require$$2$1 from 'statuses';
|
|
9
|
-
import require$$0$
|
|
11
|
+
import require$$0$2 from 'buffer';
|
|
10
12
|
import require$$1$1 from 'string_decoder';
|
|
11
13
|
import contentType from 'content-type';
|
|
14
|
+
import { URL as URL$1 } from 'url';
|
|
12
15
|
import express from 'express';
|
|
13
16
|
|
|
14
17
|
var util;
|
|
@@ -3979,6 +3982,7 @@ ZodNullable.create;
|
|
|
3979
3982
|
|
|
3980
3983
|
objectType({
|
|
3981
3984
|
name: stringType().default("mcp-sitecore-server"),
|
|
3985
|
+
version: stringType().optional(),
|
|
3982
3986
|
graphQL: objectType({
|
|
3983
3987
|
endpoint: stringType().url().min(1, "endpoint is required"),
|
|
3984
3988
|
schemas: arrayType(stringType()),
|
|
@@ -4012,6 +4016,7 @@ objectType({
|
|
|
4012
4016
|
password: "b",
|
|
4013
4017
|
serverUrl: "https://xmcloudcm.localhost/",
|
|
4014
4018
|
}),
|
|
4019
|
+
authorizationHeader: stringType().default("")
|
|
4015
4020
|
});
|
|
4016
4021
|
const envSchema = objectType({
|
|
4017
4022
|
GRAPHQL_ENDPOINT: stringType().url().optional(),
|
|
@@ -4026,6 +4031,7 @@ const envSchema = objectType({
|
|
|
4026
4031
|
POWERSHELL_USERNAME: stringType().optional(),
|
|
4027
4032
|
POWERSHELL_PASSWORD: stringType().optional(),
|
|
4028
4033
|
POWERSHELL_SERVER_URL: stringType().url().optional(),
|
|
4034
|
+
AUTORIZATION_HEADER: stringType().optional(),
|
|
4029
4035
|
});
|
|
4030
4036
|
const envStartSchema = objectType({
|
|
4031
4037
|
//* The transport to use for the server. Can be one of 'stdio' or 'sse'.
|
|
@@ -4041,6 +4047,35 @@ const envStartSchema = objectType({
|
|
|
4041
4047
|
return "stdio";
|
|
4042
4048
|
})
|
|
4043
4049
|
});
|
|
4050
|
+
// Read package.json data
|
|
4051
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
4052
|
+
const __dirname = path.dirname(__filename);
|
|
4053
|
+
const packagePath = path.resolve(__dirname, '..', 'package.json');
|
|
4054
|
+
const packageData = JSON.parse(fs.readFileSync(packagePath, 'utf8'));
|
|
4055
|
+
const { version, name } = packageData;
|
|
4056
|
+
const ENV$1 = envSchema.parse(process.env);
|
|
4057
|
+
const config = {
|
|
4058
|
+
name: `${name} ${version}`,
|
|
4059
|
+
graphQL: {
|
|
4060
|
+
endpoint: ENV$1.GRAPHQL_ENDPOINT || "https://xmcloudcm.localhost/sitecore/api/graph/",
|
|
4061
|
+
schemas: ENV$1.GRAPHQL_SCHEMAS ? ENV$1.GRAPHQL_SCHEMAS.split(",").map(x => x.trim()) : ["edge", "master"],
|
|
4062
|
+
apiKey: ENV$1.GRAPHQL_API_KEY || "{6D3F291E-66A5-4703-887A-D549AF83D859}",
|
|
4063
|
+
headers: ENV$1.GRAPHQL_HEADERS ? JSON.parse(ENV$1.GRAPHQL_HEADERS) : {},
|
|
4064
|
+
},
|
|
4065
|
+
itemService: {
|
|
4066
|
+
domain: ENV$1.ITEM_SERVICE_DOMAIN || "sitecore",
|
|
4067
|
+
username: ENV$1.ITEM_SERVICE_USERNAME || "admin",
|
|
4068
|
+
password: ENV$1.ITEM_SERVICE_PASSWORD || "b",
|
|
4069
|
+
serverUrl: ENV$1.ITEM_SERVICE_SERVER_URL || "https://xmcloudcm.localhost/",
|
|
4070
|
+
},
|
|
4071
|
+
powershell: {
|
|
4072
|
+
domain: ENV$1.POWERSHELL_DOMAIN || "sitecore",
|
|
4073
|
+
username: ENV$1.POWERSHELL_USERNAME || "admin",
|
|
4074
|
+
password: ENV$1.POWERSHELL_PASSWORD || "b",
|
|
4075
|
+
serverUrl: ENV$1.POWERSHELL_SERVER_URL || "https://xmcloudcm.localhost/",
|
|
4076
|
+
},
|
|
4077
|
+
authorizationHeader: ENV$1.AUTORIZATION_HEADER || "",
|
|
4078
|
+
};
|
|
4044
4079
|
|
|
4045
4080
|
const LATEST_PROTOCOL_VERSION = "2025-03-26";
|
|
4046
4081
|
const SUPPORTED_PROTOCOL_VERSIONS = [
|
|
@@ -26165,41 +26200,13 @@ async function registerAll(server, config) {
|
|
|
26165
26200
|
], server, config);
|
|
26166
26201
|
}
|
|
26167
26202
|
|
|
26168
|
-
|
|
26169
|
-
const __filename = fileURLToPath(import.meta.url);
|
|
26170
|
-
const __dirname = path.dirname(__filename);
|
|
26171
|
-
const packagePath = path.resolve(__dirname, '..', 'package.json');
|
|
26172
|
-
const packageData = JSON.parse(fs.readFileSync(packagePath, 'utf8'));
|
|
26173
|
-
const { version, name } = packageData;
|
|
26174
|
-
async function getServer() {
|
|
26203
|
+
async function getServer(config) {
|
|
26175
26204
|
const server = new McpServer({
|
|
26176
|
-
name: `Sitecore MCP Server: ${name}`,
|
|
26205
|
+
name: `Sitecore MCP Server: ${config.name}`,
|
|
26177
26206
|
description: "Modle Context Protocol for Sitecore",
|
|
26178
|
-
version: version
|
|
26207
|
+
version: config.version || "0.0.1",
|
|
26179
26208
|
});
|
|
26180
|
-
const ENV = envSchema.parse(process.env);
|
|
26181
26209
|
// Parse the environment variables and set default values
|
|
26182
|
-
const config = {
|
|
26183
|
-
name: `${name} ${version}`,
|
|
26184
|
-
graphQL: {
|
|
26185
|
-
endpoint: ENV.GRAPHQL_ENDPOINT || "https://xmcloudcm.localhost/sitecore/api/graph/",
|
|
26186
|
-
schemas: ENV.GRAPHQL_SCHEMAS ? ENV.GRAPHQL_SCHEMAS.split(",").map(x => x.trim()) : ["edge", "master"],
|
|
26187
|
-
apiKey: ENV.GRAPHQL_API_KEY || "{6D3F291E-66A5-4703-887A-D549AF83D859}",
|
|
26188
|
-
headers: ENV.GRAPHQL_HEADERS ? JSON.parse(ENV.GRAPHQL_HEADERS) : {},
|
|
26189
|
-
},
|
|
26190
|
-
itemService: {
|
|
26191
|
-
domain: ENV.ITEM_SERVICE_DOMAIN || "sitecore",
|
|
26192
|
-
username: ENV.ITEM_SERVICE_USERNAME || "admin",
|
|
26193
|
-
password: ENV.ITEM_SERVICE_PASSWORD || "b",
|
|
26194
|
-
serverUrl: ENV.ITEM_SERVICE_SERVER_URL || "https://xmcloudcm.localhost/",
|
|
26195
|
-
},
|
|
26196
|
-
powershell: {
|
|
26197
|
-
domain: ENV.POWERSHELL_DOMAIN || "sitecore",
|
|
26198
|
-
username: ENV.POWERSHELL_USERNAME || "admin",
|
|
26199
|
-
password: ENV.POWERSHELL_PASSWORD || "b",
|
|
26200
|
-
serverUrl: ENV.POWERSHELL_SERVER_URL || "https://xmcloudcm.localhost/",
|
|
26201
|
-
},
|
|
26202
|
-
};
|
|
26203
26210
|
server.resource("config", "config://main", async (uri) => {
|
|
26204
26211
|
return {
|
|
26205
26212
|
contents: [{
|
|
@@ -26223,7 +26230,7 @@ async function getServer() {
|
|
|
26223
26230
|
}
|
|
26224
26231
|
|
|
26225
26232
|
async function startSTDIO() {
|
|
26226
|
-
const server = await getServer();
|
|
26233
|
+
const server = await getServer(config);
|
|
26227
26234
|
const transport = new StdioServerTransport();
|
|
26228
26235
|
await server.connect(transport);
|
|
26229
26236
|
}
|
|
@@ -26425,7 +26432,7 @@ function requireDepd () {
|
|
|
26425
26432
|
* Module dependencies.
|
|
26426
26433
|
*/
|
|
26427
26434
|
|
|
26428
|
-
var relative =
|
|
26435
|
+
var relative = require$$0$1.relative;
|
|
26429
26436
|
|
|
26430
26437
|
/**
|
|
26431
26438
|
* Module exports.
|
|
@@ -27386,7 +27393,7 @@ function requireSafer () {
|
|
|
27386
27393
|
if (hasRequiredSafer) return safer_1;
|
|
27387
27394
|
hasRequiredSafer = 1;
|
|
27388
27395
|
|
|
27389
|
-
var buffer = require$$0$
|
|
27396
|
+
var buffer = require$$0$2;
|
|
27390
27397
|
var Buffer = buffer.Buffer;
|
|
27391
27398
|
|
|
27392
27399
|
var safer = {};
|
|
@@ -39238,28 +39245,42 @@ class SSEServerTransport {
|
|
|
39238
39245
|
}
|
|
39239
39246
|
}
|
|
39240
39247
|
|
|
39248
|
+
const authorizationHeaderName = "Authorization";
|
|
39249
|
+
|
|
39241
39250
|
async function startSSE() {
|
|
39242
|
-
const server = await getServer();
|
|
39251
|
+
const server = await getServer(config);
|
|
39243
39252
|
const app = express();
|
|
39244
39253
|
// to support multiple simultaneous connections we have a lookup object from
|
|
39245
39254
|
// sessionId to transport
|
|
39246
39255
|
const transports = {};
|
|
39247
|
-
app.get("/sse", async (
|
|
39248
|
-
|
|
39249
|
-
|
|
39250
|
-
|
|
39251
|
-
|
|
39252
|
-
|
|
39253
|
-
|
|
39256
|
+
app.get("/sse", async (req, res) => {
|
|
39257
|
+
if (config.authorizationHeader === ""
|
|
39258
|
+
|| config.authorizationHeader === req.headers[authorizationHeaderName]) {
|
|
39259
|
+
const transport = new SSEServerTransport('/messages', res);
|
|
39260
|
+
transports[transport.sessionId] = transport;
|
|
39261
|
+
res.on("close", () => {
|
|
39262
|
+
delete transports[transport.sessionId];
|
|
39263
|
+
});
|
|
39264
|
+
await server.connect(transport);
|
|
39265
|
+
}
|
|
39266
|
+
else {
|
|
39267
|
+
res.status(401).send('Unauthorized');
|
|
39268
|
+
}
|
|
39254
39269
|
});
|
|
39255
39270
|
app.post("/messages", async (req, res) => {
|
|
39256
|
-
|
|
39257
|
-
|
|
39258
|
-
|
|
39259
|
-
|
|
39271
|
+
if (config.authorizationHeader === ""
|
|
39272
|
+
|| config.authorizationHeader === req.headers[authorizationHeaderName]) {
|
|
39273
|
+
const sessionId = req.query.sessionId;
|
|
39274
|
+
const transport = transports[sessionId];
|
|
39275
|
+
if (transport) {
|
|
39276
|
+
await transport.handlePostMessage(req, res);
|
|
39277
|
+
}
|
|
39278
|
+
else {
|
|
39279
|
+
res.status(400).send('No transport found for sessionId');
|
|
39280
|
+
}
|
|
39260
39281
|
}
|
|
39261
39282
|
else {
|
|
39262
|
-
res.status(
|
|
39283
|
+
res.status(401).send('Unauthorized');
|
|
39263
39284
|
}
|
|
39264
39285
|
});
|
|
39265
39286
|
app.listen(3001);
|
|
@@ -39800,45 +39821,51 @@ function startStreamableHTTP() {
|
|
|
39800
39821
|
const transports = {};
|
|
39801
39822
|
// Handle POST requests for client-to-server communication
|
|
39802
39823
|
app.post('/mcp', async (req, res) => {
|
|
39803
|
-
|
|
39804
|
-
|
|
39805
|
-
|
|
39806
|
-
|
|
39807
|
-
|
|
39808
|
-
|
|
39809
|
-
|
|
39810
|
-
|
|
39811
|
-
|
|
39812
|
-
|
|
39813
|
-
|
|
39814
|
-
|
|
39815
|
-
|
|
39816
|
-
|
|
39817
|
-
|
|
39818
|
-
|
|
39819
|
-
|
|
39820
|
-
|
|
39821
|
-
|
|
39822
|
-
|
|
39823
|
-
|
|
39824
|
-
|
|
39825
|
-
|
|
39826
|
-
|
|
39824
|
+
if (config.authorizationHeader === "" ||
|
|
39825
|
+
config.authorizationHeader === req.headers[authorizationHeaderName]) {
|
|
39826
|
+
// Check for existing session ID
|
|
39827
|
+
const sessionId = req.headers['mcp-session-id'];
|
|
39828
|
+
let transport;
|
|
39829
|
+
if (sessionId && transports[sessionId]) {
|
|
39830
|
+
// Reuse existing transport
|
|
39831
|
+
transport = transports[sessionId];
|
|
39832
|
+
}
|
|
39833
|
+
else if (!sessionId && isInitializeRequest(req.body)) {
|
|
39834
|
+
// New initialization request
|
|
39835
|
+
transport = new StreamableHTTPServerTransport({
|
|
39836
|
+
sessionIdGenerator: () => generateUUID(),
|
|
39837
|
+
onsessioninitialized: (sessionId) => {
|
|
39838
|
+
// Store the transport by session ID
|
|
39839
|
+
transports[sessionId] = transport;
|
|
39840
|
+
}
|
|
39841
|
+
});
|
|
39842
|
+
// Clean up transport when closed
|
|
39843
|
+
transport.onclose = () => {
|
|
39844
|
+
if (transport.sessionId) {
|
|
39845
|
+
delete transports[transport.sessionId];
|
|
39846
|
+
}
|
|
39847
|
+
};
|
|
39848
|
+
const server = await getServer(config);
|
|
39849
|
+
await server.connect(transport);
|
|
39850
|
+
}
|
|
39851
|
+
else {
|
|
39852
|
+
// Invalid request
|
|
39853
|
+
res.status(400).json({
|
|
39854
|
+
jsonrpc: '2.0',
|
|
39855
|
+
error: {
|
|
39856
|
+
code: -32e3,
|
|
39857
|
+
message: 'Bad Request: No valid session ID provided',
|
|
39858
|
+
},
|
|
39859
|
+
id: null,
|
|
39860
|
+
});
|
|
39861
|
+
return;
|
|
39862
|
+
}
|
|
39863
|
+
// Handle the request
|
|
39864
|
+
await transport.handleRequest(req, res, req.body);
|
|
39827
39865
|
}
|
|
39828
39866
|
else {
|
|
39829
|
-
|
|
39830
|
-
res.status(400).json({
|
|
39831
|
-
jsonrpc: '2.0',
|
|
39832
|
-
error: {
|
|
39833
|
-
code: -32e3,
|
|
39834
|
-
message: 'Bad Request: No valid session ID provided',
|
|
39835
|
-
},
|
|
39836
|
-
id: null,
|
|
39837
|
-
});
|
|
39838
|
-
return;
|
|
39867
|
+
res.status(401).send('Unauthorized');
|
|
39839
39868
|
}
|
|
39840
|
-
// Handle the request
|
|
39841
|
-
await transport.handleRequest(req, res, req.body);
|
|
39842
39869
|
});
|
|
39843
39870
|
// Reusable handler for GET and DELETE requests
|
|
39844
39871
|
const handleSessionRequest = async (req, res) => {
|
package/dist/config.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
declare const ConfigSchema: z.ZodObject<{
|
|
3
3
|
name: z.ZodDefault<z.ZodString>;
|
|
4
|
+
version: z.ZodOptional<z.ZodString>;
|
|
4
5
|
graphQL: z.ZodDefault<z.ZodObject<{
|
|
5
6
|
endpoint: z.ZodString;
|
|
6
7
|
schemas: z.ZodArray<z.ZodString, "many">;
|
|
@@ -49,6 +50,7 @@ declare const ConfigSchema: z.ZodObject<{
|
|
|
49
50
|
password: string;
|
|
50
51
|
serverUrl: string;
|
|
51
52
|
}>>;
|
|
53
|
+
authorizationHeader: z.ZodDefault<z.ZodString>;
|
|
52
54
|
}, "strip", z.ZodTypeAny, {
|
|
53
55
|
name: string;
|
|
54
56
|
graphQL: {
|
|
@@ -69,8 +71,11 @@ declare const ConfigSchema: z.ZodObject<{
|
|
|
69
71
|
password: string;
|
|
70
72
|
serverUrl: string;
|
|
71
73
|
};
|
|
74
|
+
authorizationHeader: string;
|
|
75
|
+
version?: string | undefined;
|
|
72
76
|
}, {
|
|
73
77
|
name?: string | undefined;
|
|
78
|
+
version?: string | undefined;
|
|
74
79
|
graphQL?: {
|
|
75
80
|
endpoint: string;
|
|
76
81
|
schemas: string[];
|
|
@@ -89,6 +94,7 @@ declare const ConfigSchema: z.ZodObject<{
|
|
|
89
94
|
password: string;
|
|
90
95
|
serverUrl: string;
|
|
91
96
|
} | undefined;
|
|
97
|
+
authorizationHeader?: string | undefined;
|
|
92
98
|
}>;
|
|
93
99
|
export declare const envSchema: z.ZodObject<{
|
|
94
100
|
GRAPHQL_ENDPOINT: z.ZodOptional<z.ZodString>;
|
|
@@ -103,6 +109,7 @@ export declare const envSchema: z.ZodObject<{
|
|
|
103
109
|
POWERSHELL_USERNAME: z.ZodOptional<z.ZodString>;
|
|
104
110
|
POWERSHELL_PASSWORD: z.ZodOptional<z.ZodString>;
|
|
105
111
|
POWERSHELL_SERVER_URL: z.ZodOptional<z.ZodString>;
|
|
112
|
+
AUTORIZATION_HEADER: z.ZodOptional<z.ZodString>;
|
|
106
113
|
}, "strip", z.ZodTypeAny, {
|
|
107
114
|
GRAPHQL_ENDPOINT?: string | undefined;
|
|
108
115
|
GRAPHQL_SCHEMAS?: string | undefined;
|
|
@@ -116,6 +123,7 @@ export declare const envSchema: z.ZodObject<{
|
|
|
116
123
|
POWERSHELL_USERNAME?: string | undefined;
|
|
117
124
|
POWERSHELL_PASSWORD?: string | undefined;
|
|
118
125
|
POWERSHELL_SERVER_URL?: string | undefined;
|
|
126
|
+
AUTORIZATION_HEADER?: string | undefined;
|
|
119
127
|
}, {
|
|
120
128
|
GRAPHQL_ENDPOINT?: string | undefined;
|
|
121
129
|
GRAPHQL_SCHEMAS?: string | undefined;
|
|
@@ -129,6 +137,7 @@ export declare const envSchema: z.ZodObject<{
|
|
|
129
137
|
POWERSHELL_USERNAME?: string | undefined;
|
|
130
138
|
POWERSHELL_PASSWORD?: string | undefined;
|
|
131
139
|
POWERSHELL_SERVER_URL?: string | undefined;
|
|
140
|
+
AUTORIZATION_HEADER?: string | undefined;
|
|
132
141
|
}>;
|
|
133
142
|
export declare const envStartSchema: z.ZodObject<{
|
|
134
143
|
TRANSPORT: z.ZodEffects<z.ZodOptional<z.ZodDefault<z.ZodString>>, "stdio" | "sse" | "streamable-http", string | undefined>;
|
|
@@ -140,4 +149,5 @@ export declare const envStartSchema: z.ZodObject<{
|
|
|
140
149
|
export type Config = z.infer<typeof ConfigSchema>;
|
|
141
150
|
export type EnvConfig = z.infer<typeof envSchema>;
|
|
142
151
|
export type EnvStartConfig = z.infer<typeof envStartSchema>;
|
|
143
|
-
|
|
152
|
+
declare const config: Config;
|
|
153
|
+
export { config };
|
package/dist/config.js
CHANGED
|
@@ -1,6 +1,10 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { fileURLToPath } from "node:url";
|
|
1
3
|
import { z } from "zod";
|
|
4
|
+
import fs from "node:fs";
|
|
2
5
|
const ConfigSchema = z.object({
|
|
3
6
|
name: z.string().default("mcp-sitecore-server"),
|
|
7
|
+
version: z.string().optional(),
|
|
4
8
|
graphQL: z.object({
|
|
5
9
|
endpoint: z.string().url().min(1, "endpoint is required"),
|
|
6
10
|
schemas: z.array(z.string()),
|
|
@@ -34,6 +38,7 @@ const ConfigSchema = z.object({
|
|
|
34
38
|
password: "b",
|
|
35
39
|
serverUrl: "https://xmcloudcm.localhost/",
|
|
36
40
|
}),
|
|
41
|
+
authorizationHeader: z.string().default("")
|
|
37
42
|
});
|
|
38
43
|
export const envSchema = z.object({
|
|
39
44
|
GRAPHQL_ENDPOINT: z.string().url().optional(),
|
|
@@ -48,6 +53,7 @@ export const envSchema = z.object({
|
|
|
48
53
|
POWERSHELL_USERNAME: z.string().optional(),
|
|
49
54
|
POWERSHELL_PASSWORD: z.string().optional(),
|
|
50
55
|
POWERSHELL_SERVER_URL: z.string().url().optional(),
|
|
56
|
+
AUTORIZATION_HEADER: z.string().optional(),
|
|
51
57
|
});
|
|
52
58
|
export const envStartSchema = z.object({
|
|
53
59
|
//* The transport to use for the server. Can be one of 'stdio' or 'sse'.
|
|
@@ -63,4 +69,34 @@ export const envStartSchema = z.object({
|
|
|
63
69
|
return "stdio";
|
|
64
70
|
})
|
|
65
71
|
});
|
|
72
|
+
// Read package.json data
|
|
73
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
74
|
+
const __dirname = path.dirname(__filename);
|
|
75
|
+
const packagePath = path.resolve(__dirname, '..', 'package.json');
|
|
76
|
+
const packageData = JSON.parse(fs.readFileSync(packagePath, 'utf8'));
|
|
77
|
+
const { version, name } = packageData;
|
|
78
|
+
const ENV = envSchema.parse(process.env);
|
|
79
|
+
const config = {
|
|
80
|
+
name: `${name} ${version}`,
|
|
81
|
+
graphQL: {
|
|
82
|
+
endpoint: ENV.GRAPHQL_ENDPOINT || "https://xmcloudcm.localhost/sitecore/api/graph/",
|
|
83
|
+
schemas: ENV.GRAPHQL_SCHEMAS ? ENV.GRAPHQL_SCHEMAS.split(",").map(x => x.trim()) : ["edge", "master"],
|
|
84
|
+
apiKey: ENV.GRAPHQL_API_KEY || "{6D3F291E-66A5-4703-887A-D549AF83D859}",
|
|
85
|
+
headers: ENV.GRAPHQL_HEADERS ? JSON.parse(ENV.GRAPHQL_HEADERS) : {},
|
|
86
|
+
},
|
|
87
|
+
itemService: {
|
|
88
|
+
domain: ENV.ITEM_SERVICE_DOMAIN || "sitecore",
|
|
89
|
+
username: ENV.ITEM_SERVICE_USERNAME || "admin",
|
|
90
|
+
password: ENV.ITEM_SERVICE_PASSWORD || "b",
|
|
91
|
+
serverUrl: ENV.ITEM_SERVICE_SERVER_URL || "https://xmcloudcm.localhost/",
|
|
92
|
+
},
|
|
93
|
+
powershell: {
|
|
94
|
+
domain: ENV.POWERSHELL_DOMAIN || "sitecore",
|
|
95
|
+
username: ENV.POWERSHELL_USERNAME || "admin",
|
|
96
|
+
password: ENV.POWERSHELL_PASSWORD || "b",
|
|
97
|
+
serverUrl: ENV.POWERSHELL_SERVER_URL || "https://xmcloudcm.localhost/",
|
|
98
|
+
},
|
|
99
|
+
authorizationHeader: ENV.AUTORIZATION_HEADER || "",
|
|
100
|
+
};
|
|
101
|
+
export { config };
|
|
66
102
|
//# sourceMappingURL=config.js.map
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/const.d.ts
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const authorizationHeaderName = "Authorization";
|
package/dist/const.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
|
|
1
|
+
export const authorizationHeaderName = "Authorization";
|
|
2
2
|
//# sourceMappingURL=const.js.map
|
package/dist/const.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"const.js","sourceRoot":"","sources":["../src/const.ts"],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"const.js","sourceRoot":"","sources":["../src/const.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,uBAAuB,GAAG,eAAe,CAAC"}
|
package/dist/server.d.ts
CHANGED
package/dist/server.js
CHANGED
|
@@ -2,43 +2,14 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
|
2
2
|
import { envSchema } from "./config.js";
|
|
3
3
|
import fs from 'fs';
|
|
4
4
|
import path from 'path';
|
|
5
|
-
import { fileURLToPath } from 'url';
|
|
6
5
|
import { registerAll } from "./register.js";
|
|
7
|
-
|
|
8
|
-
const __filename = fileURLToPath(import.meta.url);
|
|
9
|
-
const __dirname = path.dirname(__filename);
|
|
10
|
-
const packagePath = path.resolve(__dirname, '..', 'package.json');
|
|
11
|
-
const packageData = JSON.parse(fs.readFileSync(packagePath, 'utf8'));
|
|
12
|
-
const { version, name } = packageData;
|
|
13
|
-
export async function getServer() {
|
|
6
|
+
export async function getServer(config) {
|
|
14
7
|
const server = new McpServer({
|
|
15
|
-
name: `Sitecore MCP Server: ${name}`,
|
|
8
|
+
name: `Sitecore MCP Server: ${config.name}`,
|
|
16
9
|
description: "Modle Context Protocol for Sitecore",
|
|
17
|
-
version: version
|
|
10
|
+
version: config.version || "0.0.1",
|
|
18
11
|
});
|
|
19
|
-
const ENV = envSchema.parse(process.env);
|
|
20
12
|
// Parse the environment variables and set default values
|
|
21
|
-
const config = {
|
|
22
|
-
name: `${name} ${version}`,
|
|
23
|
-
graphQL: {
|
|
24
|
-
endpoint: ENV.GRAPHQL_ENDPOINT || "https://xmcloudcm.localhost/sitecore/api/graph/",
|
|
25
|
-
schemas: ENV.GRAPHQL_SCHEMAS ? ENV.GRAPHQL_SCHEMAS.split(",").map(x => x.trim()) : ["edge", "master"],
|
|
26
|
-
apiKey: ENV.GRAPHQL_API_KEY || "{6D3F291E-66A5-4703-887A-D549AF83D859}",
|
|
27
|
-
headers: ENV.GRAPHQL_HEADERS ? JSON.parse(ENV.GRAPHQL_HEADERS) : {},
|
|
28
|
-
},
|
|
29
|
-
itemService: {
|
|
30
|
-
domain: ENV.ITEM_SERVICE_DOMAIN || "sitecore",
|
|
31
|
-
username: ENV.ITEM_SERVICE_USERNAME || "admin",
|
|
32
|
-
password: ENV.ITEM_SERVICE_PASSWORD || "b",
|
|
33
|
-
serverUrl: ENV.ITEM_SERVICE_SERVER_URL || "https://xmcloudcm.localhost/",
|
|
34
|
-
},
|
|
35
|
-
powershell: {
|
|
36
|
-
domain: ENV.POWERSHELL_DOMAIN || "sitecore",
|
|
37
|
-
username: ENV.POWERSHELL_USERNAME || "admin",
|
|
38
|
-
password: ENV.POWERSHELL_PASSWORD || "b",
|
|
39
|
-
serverUrl: ENV.POWERSHELL_SERVER_URL || "https://xmcloudcm.localhost/",
|
|
40
|
-
},
|
|
41
|
-
};
|
|
42
13
|
server.resource("config", "config://main", async (uri) => {
|
|
43
14
|
return {
|
|
44
15
|
contents: [{
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,SAAS,EAA+B,MAAM,aAAa,CAAC;AACrE,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,SAAS,EAA+B,MAAM,aAAa,CAAC;AACrE,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAI5C,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,MAAc;IAC1C,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QACzB,IAAI,EAAE,wBAAwB,MAAM,CAAC,IAAI,EAAE;QAC3C,WAAW,EAAE,qCAAqC;QAClD,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,OAAO;KACrC,CAAC,CAAC;IAEH,yDAAyD;IAEzD,MAAM,CAAC,QAAQ,CACX,QAAQ,EACR,eAAe,EACf,KAAK,EAAE,GAAG,EAAE,EAAE;QACV,OAAO;YACH,QAAQ,EAAE,CAAC;oBACP,GAAG,EAAE,GAAG,CAAC,IAAI;oBACb,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;iBACxC,CAAC;SACL,CAAA;IACL,CAAC,CACJ,CAAC;IAEF,MAAM,CAAC,IAAI,CACP,QAAQ,EACR,sDAAsD,EACtD,EAAE,EACF,KAAK,EAAE,MAAM,EAAE,EAAE;QACb,OAAO;YACH,OAAO,EAAE;gBACL;oBACI,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;iBACxC;aACJ;SACJ,CAAC;IACN,CAAC,CACJ,CAAC;IAEF,MAAM,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAElC,OAAO,MAAM,CAAC;AAClB,CAAC"}
|
package/dist/sse.js
CHANGED
|
@@ -1,29 +1,42 @@
|
|
|
1
|
-
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
1
|
import { SSEServerTransport } from "@modelcontextprotocol/sdk/server/sse.js";
|
|
3
2
|
import express from "express";
|
|
4
3
|
import { getServer } from "./server.js";
|
|
4
|
+
import { config } from "./config.js";
|
|
5
|
+
import { authorizationHeaderName } from "./const.js";
|
|
5
6
|
export async function startSSE() {
|
|
6
|
-
const server = await getServer();
|
|
7
|
+
const server = await getServer(config);
|
|
7
8
|
const app = express();
|
|
8
9
|
// to support multiple simultaneous connections we have a lookup object from
|
|
9
10
|
// sessionId to transport
|
|
10
11
|
const transports = {};
|
|
11
|
-
app.get("/sse", async (
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
12
|
+
app.get("/sse", async (req, res) => {
|
|
13
|
+
if (config.authorizationHeader === ""
|
|
14
|
+
|| config.authorizationHeader === req.headers[authorizationHeaderName]) {
|
|
15
|
+
const transport = new SSEServerTransport('/messages', res);
|
|
16
|
+
transports[transport.sessionId] = transport;
|
|
17
|
+
res.on("close", () => {
|
|
18
|
+
delete transports[transport.sessionId];
|
|
19
|
+
});
|
|
20
|
+
await server.connect(transport);
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
res.status(401).send('Unauthorized');
|
|
24
|
+
}
|
|
18
25
|
});
|
|
19
26
|
app.post("/messages", async (req, res) => {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
27
|
+
if (config.authorizationHeader === ""
|
|
28
|
+
|| config.authorizationHeader === req.headers[authorizationHeaderName]) {
|
|
29
|
+
const sessionId = req.query.sessionId;
|
|
30
|
+
const transport = transports[sessionId];
|
|
31
|
+
if (transport) {
|
|
32
|
+
await transport.handlePostMessage(req, res);
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
res.status(400).send('No transport found for sessionId');
|
|
36
|
+
}
|
|
24
37
|
}
|
|
25
38
|
else {
|
|
26
|
-
res.status(
|
|
39
|
+
res.status(401).send('Unauthorized');
|
|
27
40
|
}
|
|
28
41
|
});
|
|
29
42
|
app.listen(3001);
|
package/dist/sse.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sse.js","sourceRoot":"","sources":["../src/sse.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"sse.js","sourceRoot":"","sources":["../src/sse.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AAC7E,OAAO,OAAO,MAAM,SAAS,CAAC;AAG9B,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAErD,MAAM,CAAC,KAAK,UAAU,QAAQ;IAC5B,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC,CAAC;IAEvC,MAAM,GAAG,GAAG,OAAO,EAAE,CAAC;IAEtB,4EAA4E;IAC5E,yBAAyB;IACzB,MAAM,UAAU,GAAgD,EAAE,CAAC;IAEnE,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,EAAE;QAEpD,IAAI,MAAM,CAAC,mBAAmB,KAAK,EAAE;eAChC,MAAM,CAAC,mBAAmB,KAAK,GAAG,CAAC,OAAO,CAAC,uBAAuB,CAAC,EAAE,CAAC;YACzE,MAAM,SAAS,GAAG,IAAI,kBAAkB,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;YAC3D,UAAU,CAAC,SAAS,CAAC,SAAS,CAAC,GAAG,SAAS,CAAC;YAC5C,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;gBACnB,OAAO,UAAU,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;YACzC,CAAC,CAAC,CAAC;YACH,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAClC,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACvC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,EAAE;QAC1D,IAAI,MAAM,CAAC,mBAAmB,KAAK,EAAE;eAChC,MAAM,CAAC,mBAAmB,KAAK,GAAG,CAAC,OAAO,CAAC,uBAAuB,CAAC,EAAE,CAAC;YACzE,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,SAAmB,CAAC;YAChD,MAAM,SAAS,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;YACxC,IAAI,SAAS,EAAE,CAAC;gBACd,MAAM,SAAS,CAAC,iBAAiB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YAC9C,CAAC;iBAAM,CAAC;gBACN,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;YAC3D,CAAC;QACH,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACvC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AACnB,CAAC"}
|
package/dist/stdio.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
2
2
|
import { getServer } from './server.js';
|
|
3
|
+
import { config } from './config.js';
|
|
3
4
|
export async function startSTDIO() {
|
|
4
|
-
const server = await getServer();
|
|
5
|
+
const server = await getServer(config);
|
|
5
6
|
const transport = new StdioServerTransport();
|
|
6
7
|
await server.connect(transport);
|
|
7
8
|
}
|
package/dist/stdio.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stdio.js","sourceRoot":"","sources":["../src/stdio.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,MAAM,CAAC,KAAK,UAAU,UAAU;IAC5B,MAAM,MAAM,GAAG,MAAM,SAAS,
|
|
1
|
+
{"version":3,"file":"stdio.js","sourceRoot":"","sources":["../src/stdio.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,MAAM,CAAC,KAAK,UAAU,UAAU;IAC5B,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC,CAAC;IACvC,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AACpC,CAAC"}
|
package/dist/streamable-http.js
CHANGED
|
@@ -3,6 +3,8 @@ import { generateUUID } from "./utils.js";
|
|
|
3
3
|
import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
|
|
4
4
|
import { isInitializeRequest } from "@modelcontextprotocol/sdk/types.js";
|
|
5
5
|
import { getServer } from "./server.js";
|
|
6
|
+
import { config } from "./config.js";
|
|
7
|
+
import { authorizationHeaderName } from "./const.js";
|
|
6
8
|
export function startStreamableHTTP() {
|
|
7
9
|
const app = express();
|
|
8
10
|
app.use(express.json());
|
|
@@ -10,45 +12,51 @@ export function startStreamableHTTP() {
|
|
|
10
12
|
const transports = {};
|
|
11
13
|
// Handle POST requests for client-to-server communication
|
|
12
14
|
app.post('/mcp', async (req, res) => {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
15
|
+
if (config.authorizationHeader === "" ||
|
|
16
|
+
config.authorizationHeader === req.headers[authorizationHeaderName]) {
|
|
17
|
+
// Check for existing session ID
|
|
18
|
+
const sessionId = req.headers['mcp-session-id'];
|
|
19
|
+
let transport;
|
|
20
|
+
if (sessionId && transports[sessionId]) {
|
|
21
|
+
// Reuse existing transport
|
|
22
|
+
transport = transports[sessionId];
|
|
23
|
+
}
|
|
24
|
+
else if (!sessionId && isInitializeRequest(req.body)) {
|
|
25
|
+
// New initialization request
|
|
26
|
+
transport = new StreamableHTTPServerTransport({
|
|
27
|
+
sessionIdGenerator: () => generateUUID(),
|
|
28
|
+
onsessioninitialized: (sessionId) => {
|
|
29
|
+
// Store the transport by session ID
|
|
30
|
+
transports[sessionId] = transport;
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
// Clean up transport when closed
|
|
34
|
+
transport.onclose = () => {
|
|
35
|
+
if (transport.sessionId) {
|
|
36
|
+
delete transports[transport.sessionId];
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
const server = await getServer(config);
|
|
40
|
+
await server.connect(transport);
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
// Invalid request
|
|
44
|
+
res.status(400).json({
|
|
45
|
+
jsonrpc: '2.0',
|
|
46
|
+
error: {
|
|
47
|
+
code: -32000,
|
|
48
|
+
message: 'Bad Request: No valid session ID provided',
|
|
49
|
+
},
|
|
50
|
+
id: null,
|
|
51
|
+
});
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
// Handle the request
|
|
55
|
+
await transport.handleRequest(req, res, req.body);
|
|
37
56
|
}
|
|
38
57
|
else {
|
|
39
|
-
|
|
40
|
-
res.status(400).json({
|
|
41
|
-
jsonrpc: '2.0',
|
|
42
|
-
error: {
|
|
43
|
-
code: -32000,
|
|
44
|
-
message: 'Bad Request: No valid session ID provided',
|
|
45
|
-
},
|
|
46
|
-
id: null,
|
|
47
|
-
});
|
|
48
|
-
return;
|
|
58
|
+
res.status(401).send('Unauthorized');
|
|
49
59
|
}
|
|
50
|
-
// Handle the request
|
|
51
|
-
await transport.handleRequest(req, res, req.body);
|
|
52
60
|
});
|
|
53
61
|
// Reusable handler for GET and DELETE requests
|
|
54
62
|
const handleSessionRequest = async (req, res) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"streamable-http.js","sourceRoot":"","sources":["../src/streamable-http.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAC;AACnG,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAA;AACxE,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"streamable-http.js","sourceRoot":"","sources":["../src/streamable-http.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@antonytm/mcp-sitecore-server",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.19.0",
|
|
4
4
|
"description": "A Model Context Protocol server for Sitecore",
|
|
5
5
|
"files": [
|
|
6
6
|
"dist",
|
|
@@ -23,7 +23,15 @@
|
|
|
23
23
|
"start:streamable-http": "npm run build && cross-env TRANSPORT=streamable-http node dist/index.js",
|
|
24
24
|
"start:stdio": "npm run build && cross-env TRANSPORT=stdio node dist/index.js",
|
|
25
25
|
"run": "npm run build && node dist/run.js",
|
|
26
|
-
"test": "npm run build && npm run bundle && vitest run"
|
|
26
|
+
"test": "npm run build && npm run bundle && vitest run",
|
|
27
|
+
"docker:windows:build": "docker build -t antonytm/mcp-sitecore-windows:0.19.0 -t antonytm/mcp-sitecore-windows:latest --file .\\docker\\windows\\Dockerfile .",
|
|
28
|
+
"docker:windows:run": "docker run -it --rm -p 4001:3001 antonytm/mcp-sitecore-windows:latest",
|
|
29
|
+
"docker:windows:push": "docker push antonytm/mcp-sitecore-windows:0.19.0 && docker push antonytm/mcp-sitecore-windows:latest",
|
|
30
|
+
"docker:windows": "npm run docker:windows:build && npm run docker:windows:push",
|
|
31
|
+
"docker:linux:build": "docker build -t antonytm/mcp-sitecore-linux:0.19.0 -t antonytm/mcp-sitecore-linux:latest --file ./docker/linux/Dockerfile .",
|
|
32
|
+
"docker:linux:run": "docker run -it --rm -p 4001:3001 antonytm/mcp-sitecore-linux:latest",
|
|
33
|
+
"docker:linux:push": "docker push antonytm/mcp-sitecore-linux:0.19.0 && docker push antonytm/mcp-sitecore-linux:latest",
|
|
34
|
+
"docker:linux": "npm run docker:linux:build && npm run docker:linux:push"
|
|
27
35
|
},
|
|
28
36
|
"dependencies": {
|
|
29
37
|
"@antonytm/clixml-parser": "latest",
|