@postman/test-mcp-server 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/README.md +478 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +50 -0
- package/dist/index.js.map +1 -0
- package/dist/instructions.md +24 -0
- package/dist/logger.d.ts +8 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +27 -0
- package/dist/logger.js.map +1 -0
- package/dist/oauth/config.d.ts +6 -0
- package/dist/oauth/config.d.ts.map +1 -0
- package/dist/oauth/config.js +13 -0
- package/dist/oauth/config.js.map +1 -0
- package/dist/oauth/helpers.d.ts +17 -0
- package/dist/oauth/helpers.d.ts.map +1 -0
- package/dist/oauth/helpers.js +100 -0
- package/dist/oauth/helpers.js.map +1 -0
- package/dist/oauth/index.d.ts +17 -0
- package/dist/oauth/index.d.ts.map +1 -0
- package/dist/oauth/index.js +15 -0
- package/dist/oauth/index.js.map +1 -0
- package/dist/oauth/middleware.d.ts +15 -0
- package/dist/oauth/middleware.d.ts.map +1 -0
- package/dist/oauth/middleware.js +46 -0
- package/dist/oauth/middleware.js.map +1 -0
- package/dist/oauth/routes.d.ts +3 -0
- package/dist/oauth/routes.d.ts.map +1 -0
- package/dist/oauth/routes.js +476 -0
- package/dist/oauth/routes.js.map +1 -0
- package/dist/oauth/stores.d.ts +6 -0
- package/dist/oauth/stores.d.ts.map +1 -0
- package/dist/oauth/stores.js +20 -0
- package/dist/oauth/stores.js.map +1 -0
- package/dist/oauth/types.d.ts +46 -0
- package/dist/oauth/types.d.ts.map +1 -0
- package/dist/oauth/types.js +5 -0
- package/dist/oauth/types.js.map +1 -0
- package/dist/prompts/index.d.ts +99 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +135 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/resources/index.d.ts +70 -0
- package/dist/resources/index.d.ts.map +1 -0
- package/dist/resources/index.js +79 -0
- package/dist/resources/index.js.map +1 -0
- package/dist/server/index.d.ts +11 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +234 -0
- package/dist/server/index.js.map +1 -0
- package/dist/tools/constants.d.ts +5 -0
- package/dist/tools/constants.d.ts.map +1 -0
- package/dist/tools/constants.js +5 -0
- package/dist/tools/constants.js.map +1 -0
- package/dist/tools/definitions/add.d.ts +10 -0
- package/dist/tools/definitions/add.d.ts.map +1 -0
- package/dist/tools/definitions/add.js +24 -0
- package/dist/tools/definitions/add.js.map +1 -0
- package/dist/tools/definitions/annotatedMessage.d.ts +14 -0
- package/dist/tools/definitions/annotatedMessage.d.ts.map +1 -0
- package/dist/tools/definitions/annotatedMessage.js +63 -0
- package/dist/tools/definitions/annotatedMessage.js.map +1 -0
- package/dist/tools/definitions/echo.d.ts +9 -0
- package/dist/tools/definitions/echo.d.ts.map +1 -0
- package/dist/tools/definitions/echo.js +17 -0
- package/dist/tools/definitions/echo.js.map +1 -0
- package/dist/tools/definitions/elicitation.d.ts +8 -0
- package/dist/tools/definitions/elicitation.d.ts.map +1 -0
- package/dist/tools/definitions/elicitation.js +175 -0
- package/dist/tools/definitions/elicitation.js.map +1 -0
- package/dist/tools/definitions/getResourceLinks.d.ts +9 -0
- package/dist/tools/definitions/getResourceLinks.d.ts.map +1 -0
- package/dist/tools/definitions/getResourceLinks.js +31 -0
- package/dist/tools/definitions/getResourceLinks.js.map +1 -0
- package/dist/tools/definitions/getResourceReference.d.ts +9 -0
- package/dist/tools/definitions/getResourceReference.d.ts.map +1 -0
- package/dist/tools/definitions/getResourceReference.js +36 -0
- package/dist/tools/definitions/getResourceReference.js.map +1 -0
- package/dist/tools/definitions/getTinyImage.d.ts +7 -0
- package/dist/tools/definitions/getTinyImage.d.ts.map +1 -0
- package/dist/tools/definitions/getTinyImage.js +30 -0
- package/dist/tools/definitions/getTinyImage.js.map +1 -0
- package/dist/tools/definitions/listRoots.d.ts +8 -0
- package/dist/tools/definitions/listRoots.d.ts.map +1 -0
- package/dist/tools/definitions/listRoots.js +54 -0
- package/dist/tools/definitions/listRoots.js.map +1 -0
- package/dist/tools/definitions/longRunningOperation.d.ts +10 -0
- package/dist/tools/definitions/longRunningOperation.d.ts.map +1 -0
- package/dist/tools/definitions/longRunningOperation.js +39 -0
- package/dist/tools/definitions/longRunningOperation.js.map +1 -0
- package/dist/tools/definitions/printEnv.d.ts +7 -0
- package/dist/tools/definitions/printEnv.d.ts.map +1 -0
- package/dist/tools/definitions/printEnv.js +19 -0
- package/dist/tools/definitions/printEnv.js.map +1 -0
- package/dist/tools/definitions/sampleLlm.d.ts +10 -0
- package/dist/tools/definitions/sampleLlm.d.ts.map +1 -0
- package/dist/tools/definitions/sampleLlm.js +48 -0
- package/dist/tools/definitions/sampleLlm.js.map +1 -0
- package/dist/tools/definitions/structuredContent.d.ts +14 -0
- package/dist/tools/definitions/structuredContent.d.ts.map +1 -0
- package/dist/tools/definitions/structuredContent.js +29 -0
- package/dist/tools/definitions/structuredContent.js.map +1 -0
- package/dist/tools/definitions/zipResources.d.ts +9 -0
- package/dist/tools/definitions/zipResources.d.ts.map +1 -0
- package/dist/tools/definitions/zipResources.js +41 -0
- package/dist/tools/definitions/zipResources.js.map +1 -0
- package/dist/tools/index.d.ts +19 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +71 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/types.d.ts +28 -0
- package/dist/tools/types.d.ts.map +1 -0
- package/dist/tools/types.js +2 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/transports/sse.d.ts +2 -0
- package/dist/transports/sse.d.ts.map +1 -0
- package/dist/transports/sse.js +56 -0
- package/dist/transports/sse.js.map +1 -0
- package/dist/transports/stdio.d.ts +3 -0
- package/dist/transports/stdio.d.ts.map +1 -0
- package/dist/transports/stdio.js +28 -0
- package/dist/transports/stdio.js.map +1 -0
- package/dist/transports/streamableHttpServer.d.ts +37 -0
- package/dist/transports/streamableHttpServer.d.ts.map +1 -0
- package/dist/transports/streamableHttpServer.js +242 -0
- package/dist/transports/streamableHttpServer.js.map +1 -0
- package/package.json +76 -0
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unified Streamable HTTP Transport Server
|
|
3
|
+
*
|
|
4
|
+
* This module provides a configurable Streamable HTTP transport that can
|
|
5
|
+
* optionally enable OAuth2 authentication.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* // As a module:
|
|
9
|
+
* import { startStreamableHttpServer } from './streamableHttpServer.js';
|
|
10
|
+
* startStreamableHttpServer({ useAuth: true });
|
|
11
|
+
*
|
|
12
|
+
* // From command line (via index.ts):
|
|
13
|
+
* node dist/index.js streamableHttp # No auth
|
|
14
|
+
* node dist/index.js streamableHttp --auth # With OAuth2
|
|
15
|
+
*/
|
|
16
|
+
export interface StreamableHttpServerOptions {
|
|
17
|
+
/**
|
|
18
|
+
* Enable OAuth2 authentication for MCP endpoints.
|
|
19
|
+
* When true, clients must provide a valid Bearer token.
|
|
20
|
+
* @default false
|
|
21
|
+
*/
|
|
22
|
+
useAuth?: boolean;
|
|
23
|
+
/**
|
|
24
|
+
* Port to listen on.
|
|
25
|
+
* @default process.env.PORT || 3001
|
|
26
|
+
*/
|
|
27
|
+
port?: number;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Parse command line arguments for streamableHttp options.
|
|
31
|
+
*/
|
|
32
|
+
export declare function parseStreamableHttpArgs(args: string[]): StreamableHttpServerOptions;
|
|
33
|
+
/**
|
|
34
|
+
* Starts the Streamable HTTP server with optional OAuth2 authentication.
|
|
35
|
+
*/
|
|
36
|
+
export declare function startStreamableHttpServer(options?: StreamableHttpServerOptions): Promise<void>;
|
|
37
|
+
//# sourceMappingURL=streamableHttpServer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"streamableHttpServer.d.ts","sourceRoot":"","sources":["../../src/transports/streamableHttpServer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAUH,MAAM,WAAW,2BAA2B;IAC1C;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,2BAA2B,CAMnF;AAED;;GAEG;AACH,wBAAsB,yBAAyB,CAC7C,OAAO,GAAE,2BAAgC,GACxC,OAAO,CAAC,IAAI,CAAC,CAmPf"}
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unified Streamable HTTP Transport Server
|
|
3
|
+
*
|
|
4
|
+
* This module provides a configurable Streamable HTTP transport that can
|
|
5
|
+
* optionally enable OAuth2 authentication.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* // As a module:
|
|
9
|
+
* import { startStreamableHttpServer } from './streamableHttpServer.js';
|
|
10
|
+
* startStreamableHttpServer({ useAuth: true });
|
|
11
|
+
*
|
|
12
|
+
* // From command line (via index.ts):
|
|
13
|
+
* node dist/index.js streamableHttp # No auth
|
|
14
|
+
* node dist/index.js streamableHttp --auth # With OAuth2
|
|
15
|
+
*/
|
|
16
|
+
import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
|
|
17
|
+
import { InMemoryEventStore } from "@modelcontextprotocol/sdk/examples/shared/inMemoryEventStore.js";
|
|
18
|
+
import express from "express";
|
|
19
|
+
import { createServer } from "../server/index.js";
|
|
20
|
+
import { randomUUID } from "node:crypto";
|
|
21
|
+
import cors from "cors";
|
|
22
|
+
import { transportLogger } from "../logger.js";
|
|
23
|
+
/**
|
|
24
|
+
* Parse command line arguments for streamableHttp options.
|
|
25
|
+
*/
|
|
26
|
+
export function parseStreamableHttpArgs(args) {
|
|
27
|
+
const useAuth = args.includes("--auth");
|
|
28
|
+
const portArg = args.find((arg) => arg.startsWith("--port="));
|
|
29
|
+
const port = portArg ? parseInt(portArg.split("=")[1], 10) : undefined;
|
|
30
|
+
return { useAuth, port };
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Starts the Streamable HTTP server with optional OAuth2 authentication.
|
|
34
|
+
*/
|
|
35
|
+
export async function startStreamableHttpServer(options = {}) {
|
|
36
|
+
const { useAuth = false, port = parseInt(process.env.PORT || "3001", 10) } = options;
|
|
37
|
+
const transportName = useAuth ? "streamableHttpWithAuth" : "streamableHttp";
|
|
38
|
+
const log = transportLogger.child({ transport: transportName });
|
|
39
|
+
log.info({ useAuth }, "Starting Streamable HTTP server...");
|
|
40
|
+
const app = express();
|
|
41
|
+
// CORS configuration
|
|
42
|
+
app.use(cors({
|
|
43
|
+
origin: "*", // use "*" with caution in production
|
|
44
|
+
methods: "GET,POST,DELETE",
|
|
45
|
+
preflightContinue: false,
|
|
46
|
+
optionsSuccessStatus: 204,
|
|
47
|
+
exposedHeaders: ["mcp-session-id", "last-event-id", "mcp-protocol-version"],
|
|
48
|
+
}));
|
|
49
|
+
// Conditionally add OAuth routes and middleware
|
|
50
|
+
let authMiddleware = (_req, _res, next) => next(); // No-op by default
|
|
51
|
+
let oauthConfig;
|
|
52
|
+
if (useAuth) {
|
|
53
|
+
// Dynamically import OAuth module only when needed
|
|
54
|
+
const { oauthRouter, requireAuth, OAUTH_CONFIG } = await import("../oauth/index.js");
|
|
55
|
+
// Mount OAuth routes
|
|
56
|
+
app.use(oauthRouter);
|
|
57
|
+
// Use the requireAuth middleware
|
|
58
|
+
authMiddleware = requireAuth;
|
|
59
|
+
oauthConfig = {
|
|
60
|
+
clientId: OAUTH_CONFIG.clientId,
|
|
61
|
+
clientSecret: OAUTH_CONFIG.clientSecret,
|
|
62
|
+
};
|
|
63
|
+
log.info("OAuth2 authentication enabled");
|
|
64
|
+
}
|
|
65
|
+
// Session transport store
|
|
66
|
+
const transports = new Map();
|
|
67
|
+
// ============================================
|
|
68
|
+
// MCP Endpoints
|
|
69
|
+
// ============================================
|
|
70
|
+
app.post("/mcp", authMiddleware, async (req, res) => {
|
|
71
|
+
log.debug("Received MCP POST request");
|
|
72
|
+
try {
|
|
73
|
+
const sessionId = req.headers["mcp-session-id"];
|
|
74
|
+
let transport;
|
|
75
|
+
if (sessionId && transports.has(sessionId)) {
|
|
76
|
+
// Reuse existing transport
|
|
77
|
+
transport = transports.get(sessionId);
|
|
78
|
+
}
|
|
79
|
+
else if (!sessionId) {
|
|
80
|
+
// New session initialization
|
|
81
|
+
const { server, cleanup, startNotificationIntervals } = createServer();
|
|
82
|
+
const eventStore = new InMemoryEventStore();
|
|
83
|
+
// Generate session ID upfront so we can store the transport immediately
|
|
84
|
+
const newSessionId = randomUUID();
|
|
85
|
+
transport = new StreamableHTTPServerTransport({
|
|
86
|
+
sessionIdGenerator: () => newSessionId,
|
|
87
|
+
eventStore,
|
|
88
|
+
onsessioninitialized: (sid) => {
|
|
89
|
+
log.info({ sessionId: sid }, "Session initialized callback");
|
|
90
|
+
},
|
|
91
|
+
});
|
|
92
|
+
// Store transport immediately with the known session ID
|
|
93
|
+
transports.set(newSessionId, transport);
|
|
94
|
+
log.info({ sessionId: newSessionId }, "Transport stored in session map");
|
|
95
|
+
server.server.onclose = async () => {
|
|
96
|
+
const sid = transport.sessionId;
|
|
97
|
+
if (sid && transports.has(sid)) {
|
|
98
|
+
log.info({ sessionId: sid }, "Transport closed");
|
|
99
|
+
transports.delete(sid);
|
|
100
|
+
await cleanup();
|
|
101
|
+
}
|
|
102
|
+
};
|
|
103
|
+
await server.connect(transport);
|
|
104
|
+
await transport.handleRequest(req, res);
|
|
105
|
+
startNotificationIntervals(transport.sessionId);
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
// Session ID provided but not found
|
|
110
|
+
log.warn({
|
|
111
|
+
sessionId,
|
|
112
|
+
hasSession: transports.has(sessionId),
|
|
113
|
+
activeSessions: Array.from(transports.keys()),
|
|
114
|
+
}, "POST /mcp - Session ID provided but not found");
|
|
115
|
+
res.status(400).json({
|
|
116
|
+
jsonrpc: "2.0",
|
|
117
|
+
error: {
|
|
118
|
+
code: -32000,
|
|
119
|
+
message: `Bad Request: Session ID '${sessionId}' not found on server`,
|
|
120
|
+
},
|
|
121
|
+
id: req?.body?.id,
|
|
122
|
+
});
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
await transport.handleRequest(req, res);
|
|
126
|
+
}
|
|
127
|
+
catch (error) {
|
|
128
|
+
log.error({ err: error }, "Error handling MCP request");
|
|
129
|
+
if (!res.headersSent) {
|
|
130
|
+
res.status(500).json({
|
|
131
|
+
jsonrpc: "2.0",
|
|
132
|
+
error: {
|
|
133
|
+
code: -32603,
|
|
134
|
+
message: "Internal server error",
|
|
135
|
+
},
|
|
136
|
+
id: req?.body?.id,
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
app.get("/mcp", authMiddleware, async (req, res) => {
|
|
142
|
+
log.debug("Received MCP GET request");
|
|
143
|
+
const sessionId = req.headers["mcp-session-id"];
|
|
144
|
+
if (!sessionId || !transports.has(sessionId)) {
|
|
145
|
+
log.warn({
|
|
146
|
+
sessionId: sessionId || "(not provided)",
|
|
147
|
+
hasSession: sessionId ? transports.has(sessionId) : false,
|
|
148
|
+
activeSessions: Array.from(transports.keys()),
|
|
149
|
+
}, "GET /mcp - Invalid or missing session ID");
|
|
150
|
+
res.status(400).json({
|
|
151
|
+
jsonrpc: "2.0",
|
|
152
|
+
error: {
|
|
153
|
+
code: -32000,
|
|
154
|
+
message: `Bad Request: No valid session ID provided. Got: ${sessionId || "(none)"}`,
|
|
155
|
+
},
|
|
156
|
+
id: req?.body?.id,
|
|
157
|
+
});
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
const lastEventId = req.headers["last-event-id"];
|
|
161
|
+
if (lastEventId) {
|
|
162
|
+
log.debug({ sessionId, lastEventId }, "Client reconnecting");
|
|
163
|
+
}
|
|
164
|
+
else {
|
|
165
|
+
log.debug({ sessionId }, "Establishing new SSE stream");
|
|
166
|
+
}
|
|
167
|
+
const transport = transports.get(sessionId);
|
|
168
|
+
await transport.handleRequest(req, res);
|
|
169
|
+
});
|
|
170
|
+
app.delete("/mcp", authMiddleware, async (req, res) => {
|
|
171
|
+
const sessionId = req.headers["mcp-session-id"];
|
|
172
|
+
if (!sessionId || !transports.has(sessionId)) {
|
|
173
|
+
res.status(400).json({
|
|
174
|
+
jsonrpc: "2.0",
|
|
175
|
+
error: {
|
|
176
|
+
code: -32000,
|
|
177
|
+
message: "Bad Request: No valid session ID provided",
|
|
178
|
+
},
|
|
179
|
+
id: req?.body?.id,
|
|
180
|
+
});
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
log.info({ sessionId }, "Received session termination request");
|
|
184
|
+
try {
|
|
185
|
+
const transport = transports.get(sessionId);
|
|
186
|
+
await transport.handleRequest(req, res);
|
|
187
|
+
}
|
|
188
|
+
catch (error) {
|
|
189
|
+
log.error({ err: error, sessionId }, "Error handling session termination");
|
|
190
|
+
if (!res.headersSent) {
|
|
191
|
+
res.status(500).json({
|
|
192
|
+
jsonrpc: "2.0",
|
|
193
|
+
error: {
|
|
194
|
+
code: -32603,
|
|
195
|
+
message: "Error handling session termination",
|
|
196
|
+
},
|
|
197
|
+
id: req?.body?.id,
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
});
|
|
202
|
+
// ============================================
|
|
203
|
+
// Start Server
|
|
204
|
+
// ============================================
|
|
205
|
+
app.listen(port, () => {
|
|
206
|
+
const serverInfo = {
|
|
207
|
+
port,
|
|
208
|
+
mcp: {
|
|
209
|
+
endpoint: "/mcp",
|
|
210
|
+
authentication: useAuth ? "Bearer token required" : "None",
|
|
211
|
+
},
|
|
212
|
+
};
|
|
213
|
+
if (useAuth && oauthConfig) {
|
|
214
|
+
serverInfo.wellKnown = "/.well-known/oauth-authorization-server";
|
|
215
|
+
serverInfo.oauth = {
|
|
216
|
+
registerEndpoint: "/oauth/register",
|
|
217
|
+
tokenEndpoint: "/oauth/token",
|
|
218
|
+
introspectEndpoint: "/oauth/introspect",
|
|
219
|
+
revokeEndpoint: "/oauth/revoke",
|
|
220
|
+
};
|
|
221
|
+
serverInfo.testCredentials = oauthConfig;
|
|
222
|
+
}
|
|
223
|
+
log.info(serverInfo, `MCP Streamable HTTP Server${useAuth ? " with OAuth2" : ""} started`);
|
|
224
|
+
});
|
|
225
|
+
// Handle server shutdown
|
|
226
|
+
process.on("SIGINT", async () => {
|
|
227
|
+
log.info("Shutting down server...");
|
|
228
|
+
for (const sessionId of transports.keys()) {
|
|
229
|
+
try {
|
|
230
|
+
log.debug({ sessionId }, "Closing transport");
|
|
231
|
+
await transports.get(sessionId).close();
|
|
232
|
+
transports.delete(sessionId);
|
|
233
|
+
}
|
|
234
|
+
catch (error) {
|
|
235
|
+
log.error({ err: error, sessionId }, "Error closing transport");
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
log.info("Server shutdown complete");
|
|
239
|
+
process.exit(0);
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
//# sourceMappingURL=streamableHttpServer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"streamableHttpServer.js","sourceRoot":"","sources":["../../src/transports/streamableHttpServer.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@postman/test-mcp-server",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "MCP Server for E2E testing of the Postman MCP Client",
|
|
5
|
+
"license": "UNLICENSED",
|
|
6
|
+
"author": "Postman Labs <mail@postmanlabs.com>",
|
|
7
|
+
"homepage": "https://github.com/postman-eng/test-mcp-server/blob/main/README.md",
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "git+ssh://git@github.com/postman-eng/test-mcp-server.git"
|
|
11
|
+
},
|
|
12
|
+
"type": "module",
|
|
13
|
+
"bin": {
|
|
14
|
+
"test-mcp-server": "dist/index.js"
|
|
15
|
+
},
|
|
16
|
+
"engines": {
|
|
17
|
+
"node": ">=22.17.1"
|
|
18
|
+
},
|
|
19
|
+
"files": [
|
|
20
|
+
"dist"
|
|
21
|
+
],
|
|
22
|
+
"scripts": {
|
|
23
|
+
"build": "tsc && shx cp instructions.md dist/ && shx chmod +x dist/*.js",
|
|
24
|
+
"clean": "shx rm -rf dist *.tsbuildinfo",
|
|
25
|
+
"clean:all": "shx rm -rf dist node_modules *.tsbuildinfo *.log logs",
|
|
26
|
+
"lint": "eslint src/ e2e/",
|
|
27
|
+
"lint:fix": "eslint src/ e2e/ --fix",
|
|
28
|
+
"format": "prettier --write src/",
|
|
29
|
+
"format:check": "prettier --check src/",
|
|
30
|
+
"typecheck": "tsc --noEmit && tsc --noEmit -p tsconfig.test.json",
|
|
31
|
+
"precommit": "npm run format &&npm run lint && npm run typecheck && npm run test",
|
|
32
|
+
"start": "node dist/index.js",
|
|
33
|
+
"start:stdio": "node dist/index.js stdio",
|
|
34
|
+
"start:sse": "node dist/index.js sse",
|
|
35
|
+
"start:streamableHttp": "node dist/index.js streamableHttp",
|
|
36
|
+
"start:streamableHttp:auth": "node dist/index.js streamableHttp --auth",
|
|
37
|
+
"test": "vitest run",
|
|
38
|
+
"test:watch": "vitest",
|
|
39
|
+
"test:unit": "vitest run --dir src",
|
|
40
|
+
"test:e2e": "vitest run --dir e2e",
|
|
41
|
+
"test:coverage": "vitest run --coverage"
|
|
42
|
+
},
|
|
43
|
+
"dependencies": {
|
|
44
|
+
"@modelcontextprotocol/sdk": "^1.25.1",
|
|
45
|
+
"cors": "^2.8.5",
|
|
46
|
+
"express": "^5.2.1",
|
|
47
|
+
"jszip": "^3.10.1",
|
|
48
|
+
"pino": "^10.1.0",
|
|
49
|
+
"pino-pretty": "^13.1.3",
|
|
50
|
+
"zod": "^4.2.1"
|
|
51
|
+
},
|
|
52
|
+
"devDependencies": {
|
|
53
|
+
"@eslint/js": "^9.17.0",
|
|
54
|
+
"@types/cors": "^2.8.19",
|
|
55
|
+
"@types/express": "^5.0.6",
|
|
56
|
+
"@types/node": "^22.17.1",
|
|
57
|
+
"@types/supertest": "^6.0.3",
|
|
58
|
+
"eslint": "^9.17.0",
|
|
59
|
+
"prettier": "^3.4.2",
|
|
60
|
+
"shx": "^0.4.0",
|
|
61
|
+
"supertest": "^7.1.4",
|
|
62
|
+
"typescript": "^5.6.2",
|
|
63
|
+
"typescript-eslint": "^8.18.1",
|
|
64
|
+
"vitest": "^4.0.16"
|
|
65
|
+
},
|
|
66
|
+
"main": "dist/index.js",
|
|
67
|
+
"keywords": [
|
|
68
|
+
"mcp",
|
|
69
|
+
"test",
|
|
70
|
+
"server"
|
|
71
|
+
],
|
|
72
|
+
"types": "./dist/index.d.ts",
|
|
73
|
+
"bugs": {
|
|
74
|
+
"url": "https://github.com/postman-eng/test-mcp-server/issues"
|
|
75
|
+
}
|
|
76
|
+
}
|