@youdie006/prodex 0.2.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/LICENSE +21 -0
- package/README.md +418 -0
- package/dist/banner.d.ts +5 -0
- package/dist/banner.js +47 -0
- package/dist/banner.js.map +1 -0
- package/dist/bundle.d.ts +15 -0
- package/dist/bundle.js +30 -0
- package/dist/bundle.js.map +1 -0
- package/dist/chatgpt-browser.d.ts +119 -0
- package/dist/chatgpt-browser.js +857 -0
- package/dist/chatgpt-browser.js.map +1 -0
- package/dist/cli.d.ts +8 -0
- package/dist/cli.js +3502 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +58 -0
- package/dist/config.js +277 -0
- package/dist/config.js.map +1 -0
- package/dist/http-mcp.d.ts +20 -0
- package/dist/http-mcp.js +236 -0
- package/dist/http-mcp.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp-tools.d.ts +395 -0
- package/dist/mcp-tools.js +167 -0
- package/dist/mcp-tools.js.map +1 -0
- package/dist/mcp.d.ts +37 -0
- package/dist/mcp.js +229 -0
- package/dist/mcp.js.map +1 -0
- package/dist/repo-write.d.ts +47 -0
- package/dist/repo-write.js +427 -0
- package/dist/repo-write.js.map +1 -0
- package/dist/repo.d.ts +27 -0
- package/dist/repo.js +386 -0
- package/dist/repo.js.map +1 -0
- package/dist/safe-file.d.ts +25 -0
- package/dist/safe-file.js +295 -0
- package/dist/safe-file.js.map +1 -0
- package/dist/schema.d.ts +402 -0
- package/dist/schema.js +109 -0
- package/dist/schema.js.map +1 -0
- package/dist/store.d.ts +157 -0
- package/dist/store.js +1402 -0
- package/dist/store.js.map +1 -0
- package/docs/claude.md +130 -0
- package/docs/clients.md +75 -0
- package/docs/http-mcp.md +223 -0
- package/package.json +67 -0
- package/scripts/release-check.mjs +436 -0
- package/scripts/release-pack.mjs +481 -0
package/dist/config.js
ADDED
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
import { constants } from "node:fs";
|
|
2
|
+
import { lstat, mkdir, open } from "node:fs/promises";
|
|
3
|
+
import { randomBytes } from "node:crypto";
|
|
4
|
+
import { isIP } from "node:net";
|
|
5
|
+
import path from "node:path";
|
|
6
|
+
import { z } from "zod";
|
|
7
|
+
import { SCHEMA_VERSION } from "./schema.js";
|
|
8
|
+
import { readVerifiedUtf8File, writeVerifiedUtf8File } from "./safe-file.js";
|
|
9
|
+
const BRIDGE_DIRECTORY_MODE = 0o700;
|
|
10
|
+
const LocalConfigSchema = z.object({
|
|
11
|
+
schema_version: z.literal(SCHEMA_VERSION),
|
|
12
|
+
host: z.string().min(1),
|
|
13
|
+
port: z.number().int().positive(),
|
|
14
|
+
token: z.string().min(1),
|
|
15
|
+
server_url: z.string().url(),
|
|
16
|
+
token_expires_at: z.string().datetime().optional(),
|
|
17
|
+
created_at: z.string().datetime(),
|
|
18
|
+
updated_at: z.string().datetime()
|
|
19
|
+
});
|
|
20
|
+
const LOCAL_CONFIG_CORRUPT_MESSAGE = "local MCP config is corrupt. Run `prodex setup` to replace .bridge/config.local.json.";
|
|
21
|
+
class LocalConfigCorruptError extends Error {
|
|
22
|
+
constructor(cause) {
|
|
23
|
+
super(LOCAL_CONFIG_CORRUPT_MESSAGE, { cause });
|
|
24
|
+
this.name = "LocalConfigCorruptError";
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
export function localConfigPath(cwd) {
|
|
28
|
+
return path.join(cwd, ".bridge", "config.local.json");
|
|
29
|
+
}
|
|
30
|
+
export function makeServerUrl(host, port, token) {
|
|
31
|
+
return `http://${host}:${port}/mcp?prodex_token=${encodeURIComponent(token)}`;
|
|
32
|
+
}
|
|
33
|
+
export function normalizeLoopbackHttpHost(host) {
|
|
34
|
+
const normalized = host.trim().toLowerCase();
|
|
35
|
+
const isLocalhost = normalized === "localhost";
|
|
36
|
+
const isIpv4Loopback = isIP(normalized) === 4 && normalized.startsWith("127.");
|
|
37
|
+
if (isLocalhost || isIpv4Loopback)
|
|
38
|
+
return normalized;
|
|
39
|
+
throw new Error("HTTP MCP host must be loopback-only, such as 127.0.0.1 or localhost. Keep prodex local and put your own tunnel in front of it when needed.");
|
|
40
|
+
}
|
|
41
|
+
export function assertLoopbackHttpHost(host) {
|
|
42
|
+
normalizeLoopbackHttpHost(host);
|
|
43
|
+
}
|
|
44
|
+
export async function writeLocalConfig(cwd, input = {}) {
|
|
45
|
+
await ensureBridgeLocalFiles(cwd);
|
|
46
|
+
await assertLocalConfigTargetSafe(cwd);
|
|
47
|
+
const now = new Date().toISOString();
|
|
48
|
+
const host = normalizeLoopbackHttpHost(input.host ?? "127.0.0.1");
|
|
49
|
+
const port = input.port ?? 8787;
|
|
50
|
+
const token = input.token ?? randomBytes(24).toString("hex");
|
|
51
|
+
const tokenExpiresAt = computeTokenExpiresAt(input.tokenTtlHours, now);
|
|
52
|
+
const existing = await readExistingConfig(cwd);
|
|
53
|
+
const config = LocalConfigSchema.parse({
|
|
54
|
+
schema_version: SCHEMA_VERSION,
|
|
55
|
+
host,
|
|
56
|
+
port,
|
|
57
|
+
token,
|
|
58
|
+
server_url: makeServerUrl(host, port, token),
|
|
59
|
+
...(tokenExpiresAt ? { token_expires_at: tokenExpiresAt } : {}),
|
|
60
|
+
created_at: existing?.created_at ?? now,
|
|
61
|
+
updated_at: now
|
|
62
|
+
});
|
|
63
|
+
await writeVerifiedUtf8File(localConfigPath(cwd), `${JSON.stringify(config, null, 2)}\n`, () => assertLocalConfigTargetSafe(cwd), {
|
|
64
|
+
create: true,
|
|
65
|
+
mode: 0o600
|
|
66
|
+
});
|
|
67
|
+
return config;
|
|
68
|
+
}
|
|
69
|
+
export async function loadLocalConfig(cwd) {
|
|
70
|
+
await assertLocalConfigTargetSafe(cwd, { allowMissing: false });
|
|
71
|
+
await chmodPrivateBridgeDirectory(cwd);
|
|
72
|
+
const raw = await readVerifiedUtf8File(localConfigPath(cwd), () => assertLocalConfigTargetSafe(cwd, { allowMissing: false }), {
|
|
73
|
+
mode: 0o600
|
|
74
|
+
});
|
|
75
|
+
let parsed;
|
|
76
|
+
try {
|
|
77
|
+
parsed = JSON.parse(raw);
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
throw new LocalConfigCorruptError(error);
|
|
81
|
+
}
|
|
82
|
+
let config;
|
|
83
|
+
try {
|
|
84
|
+
config = LocalConfigSchema.parse(parsed);
|
|
85
|
+
}
|
|
86
|
+
catch (error) {
|
|
87
|
+
if (error instanceof z.ZodError)
|
|
88
|
+
throw new LocalConfigCorruptError(error);
|
|
89
|
+
throw error;
|
|
90
|
+
}
|
|
91
|
+
assertLoopbackHttpHost(config.host);
|
|
92
|
+
assertLoopbackHttpHost(new URL(config.server_url).hostname);
|
|
93
|
+
assertServerUrlMatchesConfig(config);
|
|
94
|
+
return config;
|
|
95
|
+
}
|
|
96
|
+
export function getTokenExpiryStatus(config, now = new Date()) {
|
|
97
|
+
if (!config.token_expires_at) {
|
|
98
|
+
return {
|
|
99
|
+
status: "non_expiring",
|
|
100
|
+
warning: "Token has no expiry. Keep this local-only, or rerun `prodex setup --token-ttl-hours <hours>` before using a tunnel."
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
return isTokenExpired(config.token_expires_at, now)
|
|
104
|
+
? {
|
|
105
|
+
status: "expired",
|
|
106
|
+
token_expires_at: config.token_expires_at,
|
|
107
|
+
warning: `Token expired at ${config.token_expires_at}. Run \`prodex setup\` to create a new URL.`
|
|
108
|
+
}
|
|
109
|
+
: { status: "valid", token_expires_at: config.token_expires_at };
|
|
110
|
+
}
|
|
111
|
+
export function assertTokenNotExpired(config, now = new Date()) {
|
|
112
|
+
const status = getTokenExpiryStatus(config, now);
|
|
113
|
+
if (status.status === "expired") {
|
|
114
|
+
throw new Error(status.warning.toLowerCase());
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
function computeTokenExpiresAt(tokenTtlHours, nowIso) {
|
|
118
|
+
if (tokenTtlHours === undefined)
|
|
119
|
+
return undefined;
|
|
120
|
+
if (!Number.isFinite(tokenTtlHours) || tokenTtlHours <= 0) {
|
|
121
|
+
throw new Error("token ttl must be a positive number of hours");
|
|
122
|
+
}
|
|
123
|
+
const expiresAtMs = Date.parse(nowIso) + tokenTtlHours * 60 * 60 * 1000;
|
|
124
|
+
if (!Number.isFinite(expiresAtMs)) {
|
|
125
|
+
throw new Error("token ttl produced an invalid expiry time");
|
|
126
|
+
}
|
|
127
|
+
return new Date(expiresAtMs).toISOString();
|
|
128
|
+
}
|
|
129
|
+
function isTokenExpired(tokenExpiresAt, now) {
|
|
130
|
+
const expiresAtMs = Date.parse(tokenExpiresAt);
|
|
131
|
+
return !Number.isFinite(expiresAtMs) || expiresAtMs <= now.getTime();
|
|
132
|
+
}
|
|
133
|
+
function assertServerUrlMatchesConfig(config) {
|
|
134
|
+
const serverUrl = new URL(config.server_url);
|
|
135
|
+
const tokenParams = serverUrl.searchParams.getAll("prodex_token");
|
|
136
|
+
const hostMatches = normalizeLoopbackHttpHost(serverUrl.hostname) === normalizeLoopbackHttpHost(config.host);
|
|
137
|
+
const portMatches = effectiveUrlPort(serverUrl) === config.port;
|
|
138
|
+
const tokenMatches = tokenParams.length === 1 && tokenParams[0] === config.token;
|
|
139
|
+
const shapeMatches = serverUrl.protocol === "http:" && serverUrl.pathname === "/mcp" && Array.from(serverUrl.searchParams.keys()).length === 1;
|
|
140
|
+
if (!hostMatches || !portMatches || !tokenMatches || !shapeMatches) {
|
|
141
|
+
throw new Error(".bridge/config.local.json server_url must match host, port, and token. Run `prodex setup` to replace it.");
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
function effectiveUrlPort(url) {
|
|
145
|
+
if (url.port)
|
|
146
|
+
return Number(url.port);
|
|
147
|
+
return url.protocol === "http:" ? 80 : Number.NaN;
|
|
148
|
+
}
|
|
149
|
+
async function readExistingConfig(cwd) {
|
|
150
|
+
try {
|
|
151
|
+
return LocalConfigSchema.parse(JSON.parse(await readVerifiedUtf8File(localConfigPath(cwd), () => assertLocalConfigTargetSafe(cwd, { allowMissing: false }))));
|
|
152
|
+
}
|
|
153
|
+
catch {
|
|
154
|
+
return undefined;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
async function ensureBridgeLocalFiles(cwd) {
|
|
158
|
+
const bridgeDir = path.join(cwd, ".bridge");
|
|
159
|
+
await ensurePrivateBridgeDirectory(cwd);
|
|
160
|
+
const ignorePath = path.join(bridgeDir, ".gitignore");
|
|
161
|
+
let current = "";
|
|
162
|
+
try {
|
|
163
|
+
current = await readVerifiedUtf8File(ignorePath, () => assertBridgeGitignoreTargetSafe(cwd));
|
|
164
|
+
}
|
|
165
|
+
catch (error) {
|
|
166
|
+
if (!isMissingFileError(error))
|
|
167
|
+
throw error;
|
|
168
|
+
}
|
|
169
|
+
const required = [
|
|
170
|
+
"tasks/*.json",
|
|
171
|
+
"results/*.json",
|
|
172
|
+
"sessions/*.json",
|
|
173
|
+
"receipts/*.json",
|
|
174
|
+
"artifacts/*",
|
|
175
|
+
"config.local.json",
|
|
176
|
+
"receipt-key.local",
|
|
177
|
+
"!.gitignore"
|
|
178
|
+
];
|
|
179
|
+
const lines = new Set(current.split(/\r?\n/).filter(Boolean));
|
|
180
|
+
for (const line of required)
|
|
181
|
+
lines.add(line);
|
|
182
|
+
await writeVerifiedUtf8File(ignorePath, `${Array.from(lines).join("\n")}\n`, () => assertBridgeGitignoreTargetSafe(cwd), {
|
|
183
|
+
create: true
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
async function ensurePrivateBridgeDirectory(cwd) {
|
|
187
|
+
await mkdir(path.join(cwd, ".bridge"), { recursive: true, mode: BRIDGE_DIRECTORY_MODE });
|
|
188
|
+
await chmodPrivateBridgeDirectory(cwd);
|
|
189
|
+
}
|
|
190
|
+
async function chmodPrivateBridgeDirectory(cwd) {
|
|
191
|
+
const bridgeDir = path.join(cwd, ".bridge");
|
|
192
|
+
const handle = await openNoFollowDirectory(bridgeDir, ".bridge");
|
|
193
|
+
try {
|
|
194
|
+
await handle.chmod(BRIDGE_DIRECTORY_MODE);
|
|
195
|
+
await assertDirectoryHandle(handle, ".bridge");
|
|
196
|
+
}
|
|
197
|
+
finally {
|
|
198
|
+
await handle.close();
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
async function assertLocalConfigTargetSafe(cwd, options = { allowMissing: true }) {
|
|
202
|
+
await assertRealBridgeDirectory(cwd);
|
|
203
|
+
try {
|
|
204
|
+
const stat = await lstat(localConfigPath(cwd));
|
|
205
|
+
if (stat.isSymbolicLink()) {
|
|
206
|
+
throw new Error(".bridge/config.local.json must not be a symlink");
|
|
207
|
+
}
|
|
208
|
+
if (!stat.isFile()) {
|
|
209
|
+
throw new Error(".bridge/config.local.json must be a regular file");
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
catch (error) {
|
|
213
|
+
if (isMissingFileError(error) && options.allowMissing !== false)
|
|
214
|
+
return;
|
|
215
|
+
throw error;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
async function assertBridgeGitignoreTargetSafe(cwd, options = { allowMissing: true }) {
|
|
219
|
+
await assertRealBridgeDirectory(cwd);
|
|
220
|
+
const ignorePath = path.join(cwd, ".bridge", ".gitignore");
|
|
221
|
+
try {
|
|
222
|
+
const stat = await lstat(ignorePath);
|
|
223
|
+
if (stat.isSymbolicLink()) {
|
|
224
|
+
throw new Error(".bridge/.gitignore must not be a symlink");
|
|
225
|
+
}
|
|
226
|
+
if (!stat.isFile()) {
|
|
227
|
+
throw new Error(".bridge/.gitignore must be a regular file");
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
catch (error) {
|
|
231
|
+
if (isMissingFileError(error) && options.allowMissing !== false)
|
|
232
|
+
return;
|
|
233
|
+
throw error;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
async function assertRealBridgeDirectory(cwd) {
|
|
237
|
+
const bridgeDir = path.join(cwd, ".bridge");
|
|
238
|
+
const stat = await lstat(bridgeDir);
|
|
239
|
+
if (stat.isSymbolicLink()) {
|
|
240
|
+
throw new Error(".bridge must be a real directory, not a symlink");
|
|
241
|
+
}
|
|
242
|
+
if (!stat.isDirectory()) {
|
|
243
|
+
throw new Error(".bridge must be a real directory");
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
function isMissingFileError(error) {
|
|
247
|
+
return typeof error === "object" && error !== null && "code" in error && error.code === "ENOENT";
|
|
248
|
+
}
|
|
249
|
+
async function openNoFollowDirectory(dirPath, label) {
|
|
250
|
+
const noFollowFlag = typeof constants.O_NOFOLLOW === "number" ? constants.O_NOFOLLOW : 0;
|
|
251
|
+
const directoryFlag = typeof constants.O_DIRECTORY === "number" ? constants.O_DIRECTORY : 0;
|
|
252
|
+
try {
|
|
253
|
+
const handle = await open(dirPath, constants.O_RDONLY | directoryFlag | noFollowFlag);
|
|
254
|
+
try {
|
|
255
|
+
await assertDirectoryHandle(handle, label);
|
|
256
|
+
return handle;
|
|
257
|
+
}
|
|
258
|
+
catch (error) {
|
|
259
|
+
await handle.close().catch(() => undefined);
|
|
260
|
+
throw error;
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
catch (error) {
|
|
264
|
+
const maybe = error;
|
|
265
|
+
if (maybe.code === "ELOOP" || maybe.code === "ENOTDIR") {
|
|
266
|
+
throw new Error(`${label} must be a real directory and must not be a symlink`);
|
|
267
|
+
}
|
|
268
|
+
throw error;
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
async function assertDirectoryHandle(handle, label) {
|
|
272
|
+
const stat = await handle.stat();
|
|
273
|
+
if (!stat.isDirectory()) {
|
|
274
|
+
throw new Error(`${label} must be a real directory`);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
//# 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,20 @@
|
|
|
1
|
+
export interface StartHttpMcpServerOptions {
|
|
2
|
+
cwd: string;
|
|
3
|
+
host?: string;
|
|
4
|
+
port?: number;
|
|
5
|
+
token?: string;
|
|
6
|
+
tokenExpiresAt?: string;
|
|
7
|
+
requestBodyLimitBytes?: number;
|
|
8
|
+
}
|
|
9
|
+
export interface RunningHttpMcpServer {
|
|
10
|
+
host: string;
|
|
11
|
+
port: number;
|
|
12
|
+
url: string;
|
|
13
|
+
mcp_url: string;
|
|
14
|
+
close: (options?: CloseHttpMcpServerOptions) => Promise<void>;
|
|
15
|
+
}
|
|
16
|
+
export interface CloseHttpMcpServerOptions {
|
|
17
|
+
forceAfterMs?: number;
|
|
18
|
+
timeoutMs?: number;
|
|
19
|
+
}
|
|
20
|
+
export declare function startHttpMcpServer(options: StartHttpMcpServerOptions): Promise<RunningHttpMcpServer>;
|
package/dist/http-mcp.js
ADDED
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
import { randomUUID, timingSafeEqual } from "node:crypto";
|
|
2
|
+
import http from "node:http";
|
|
3
|
+
import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
|
|
4
|
+
import { isInitializeRequest } from "@modelcontextprotocol/sdk/types.js";
|
|
5
|
+
import { createServer as createMcpServer } from "./mcp.js";
|
|
6
|
+
import { normalizeLoopbackHttpHost } from "./config.js";
|
|
7
|
+
const DEFAULT_REQUEST_BODY_LIMIT_BYTES = 1_048_576;
|
|
8
|
+
const TRANSPORT_CLOSE_TIMEOUT_MS = 5_000;
|
|
9
|
+
export async function startHttpMcpServer(options) {
|
|
10
|
+
const host = normalizeLoopbackHttpHost(options.host ?? "127.0.0.1");
|
|
11
|
+
const token = options.token;
|
|
12
|
+
const requestBodyLimitBytes = options.requestBodyLimitBytes ?? DEFAULT_REQUEST_BODY_LIMIT_BYTES;
|
|
13
|
+
const transports = new Map();
|
|
14
|
+
const server = http.createServer(async (req, res) => {
|
|
15
|
+
try {
|
|
16
|
+
const requestUrl = new URL(req.url ?? "/", `http://${req.headers.host ?? host}`);
|
|
17
|
+
if (requestUrl.pathname === "/health") {
|
|
18
|
+
writeJson(res, 200, { ok: true, name: "prodex" });
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
if (requestUrl.pathname !== "/mcp") {
|
|
22
|
+
writeJson(res, 404, { error: "not_found" });
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
if (!isAuthorized(req, requestUrl, token, options.tokenExpiresAt)) {
|
|
26
|
+
writeJson(res, 401, { error: "unauthorized" });
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
if (req.method === "POST") {
|
|
30
|
+
await handlePost(req, res, transports, options.cwd, requestBodyLimitBytes);
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
if (req.method === "GET" || req.method === "DELETE") {
|
|
34
|
+
await handleSessionRequest(req, res, transports);
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
writeJson(res, 405, { error: "method_not_allowed" });
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
if (!res.headersSent) {
|
|
41
|
+
if (error instanceof HttpRequestError) {
|
|
42
|
+
writeJson(res, error.status, error.body);
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
writeJson(res, 500, { error: "internal_server_error" });
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
await new Promise((resolve, reject) => {
|
|
50
|
+
server.once("error", reject);
|
|
51
|
+
server.listen(options.port ?? 8787, host, () => {
|
|
52
|
+
server.off("error", reject);
|
|
53
|
+
resolve();
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
const address = server.address();
|
|
57
|
+
const port = typeof address === "object" && address ? address.port : options.port ?? 8787;
|
|
58
|
+
const url = `http://${host}:${port}`;
|
|
59
|
+
return {
|
|
60
|
+
host,
|
|
61
|
+
port,
|
|
62
|
+
url,
|
|
63
|
+
mcp_url: token ? `${url}/mcp?prodex_token=${encodeURIComponent(token)}` : `${url}/mcp`,
|
|
64
|
+
close: async (closeOptions = {}) => {
|
|
65
|
+
await Promise.all(Array.from(transports.values()).map((entry) => withTimeout(entry.transport.close(), TRANSPORT_CLOSE_TIMEOUT_MS, "timed out closing HTTP MCP transport").catch(() => undefined)));
|
|
66
|
+
transports.clear();
|
|
67
|
+
await closeHttpServer(server, closeOptions);
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
async function closeHttpServer(server, options) {
|
|
72
|
+
let forceTimer;
|
|
73
|
+
let timeout;
|
|
74
|
+
try {
|
|
75
|
+
await new Promise((resolve, reject) => {
|
|
76
|
+
if (options.forceAfterMs !== undefined) {
|
|
77
|
+
forceTimer = setTimeout(() => {
|
|
78
|
+
forceCloseHttpConnections(server);
|
|
79
|
+
}, options.forceAfterMs);
|
|
80
|
+
}
|
|
81
|
+
if (options.timeoutMs !== undefined) {
|
|
82
|
+
timeout = setTimeout(() => {
|
|
83
|
+
forceCloseHttpConnections(server);
|
|
84
|
+
reject(new Error("timed out closing HTTP MCP server"));
|
|
85
|
+
}, options.timeoutMs);
|
|
86
|
+
}
|
|
87
|
+
server.close((error) => (error ? reject(error) : resolve()));
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
finally {
|
|
91
|
+
if (forceTimer)
|
|
92
|
+
clearTimeout(forceTimer);
|
|
93
|
+
if (timeout)
|
|
94
|
+
clearTimeout(timeout);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
function forceCloseHttpConnections(server) {
|
|
98
|
+
server.closeIdleConnections?.();
|
|
99
|
+
server.closeAllConnections?.();
|
|
100
|
+
}
|
|
101
|
+
async function withTimeout(promise, timeoutMs, message) {
|
|
102
|
+
let timeout;
|
|
103
|
+
try {
|
|
104
|
+
return await Promise.race([
|
|
105
|
+
promise,
|
|
106
|
+
new Promise((_, reject) => {
|
|
107
|
+
timeout = setTimeout(() => reject(new Error(message)), timeoutMs);
|
|
108
|
+
})
|
|
109
|
+
]);
|
|
110
|
+
}
|
|
111
|
+
finally {
|
|
112
|
+
if (timeout)
|
|
113
|
+
clearTimeout(timeout);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
async function handlePost(req, res, transports, cwd, requestBodyLimitBytes) {
|
|
117
|
+
const body = await readJsonBody(req, requestBodyLimitBytes);
|
|
118
|
+
const sessionId = headerValue(req.headers["mcp-session-id"]);
|
|
119
|
+
if (sessionId) {
|
|
120
|
+
const entry = transports.get(sessionId);
|
|
121
|
+
if (!entry) {
|
|
122
|
+
writeJson(res, 404, { error: "session_not_found" });
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
await entry.transport.handleRequest(req, res, body);
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
if (!sessionId && isInitializeRequest(body)) {
|
|
129
|
+
let initializedSessionId = "";
|
|
130
|
+
const transport = new StreamableHTTPServerTransport({
|
|
131
|
+
sessionIdGenerator: () => randomUUID(),
|
|
132
|
+
enableJsonResponse: true,
|
|
133
|
+
onsessioninitialized: (newSessionId) => {
|
|
134
|
+
initializedSessionId = newSessionId;
|
|
135
|
+
transports.set(newSessionId, { transport });
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
transport.onclose = () => {
|
|
139
|
+
const id = transport.sessionId || initializedSessionId;
|
|
140
|
+
if (id)
|
|
141
|
+
transports.delete(id);
|
|
142
|
+
};
|
|
143
|
+
const mcpServer = createMcpServer(cwd, { source: "chatgpt_project", claimedBy: "chatgpt" });
|
|
144
|
+
await mcpServer.connect(transport);
|
|
145
|
+
await transport.handleRequest(req, res, body);
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
writeJson(res, 400, {
|
|
149
|
+
jsonrpc: "2.0",
|
|
150
|
+
error: { code: -32000, message: "Bad Request: no valid MCP session" },
|
|
151
|
+
id: null
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
async function handleSessionRequest(req, res, transports) {
|
|
155
|
+
const sessionId = headerValue(req.headers["mcp-session-id"]);
|
|
156
|
+
if (!sessionId) {
|
|
157
|
+
writeJson(res, 400, { error: "invalid_or_missing_session" });
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
if (!transports.has(sessionId)) {
|
|
161
|
+
writeJson(res, 404, { error: "session_not_found" });
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
await transports.get(sessionId).transport.handleRequest(req, res);
|
|
165
|
+
}
|
|
166
|
+
async function readJsonBody(req, limitBytes) {
|
|
167
|
+
const contentLength = parseContentLength(req.headers["content-length"]);
|
|
168
|
+
if (contentLength !== undefined && contentLength > limitBytes) {
|
|
169
|
+
throw new HttpRequestError(413, { error: "request_too_large", max_bytes: limitBytes });
|
|
170
|
+
}
|
|
171
|
+
const chunks = [];
|
|
172
|
+
let totalBytes = 0;
|
|
173
|
+
for await (const chunk of req) {
|
|
174
|
+
const buffer = typeof chunk === "string" ? Buffer.from(chunk) : chunk;
|
|
175
|
+
totalBytes += buffer.length;
|
|
176
|
+
if (totalBytes > limitBytes) {
|
|
177
|
+
throw new HttpRequestError(413, { error: "request_too_large", max_bytes: limitBytes });
|
|
178
|
+
}
|
|
179
|
+
chunks.push(buffer);
|
|
180
|
+
}
|
|
181
|
+
const text = Buffer.concat(chunks).toString("utf8");
|
|
182
|
+
if (!text.trim())
|
|
183
|
+
return undefined;
|
|
184
|
+
try {
|
|
185
|
+
return JSON.parse(text);
|
|
186
|
+
}
|
|
187
|
+
catch {
|
|
188
|
+
throw new HttpRequestError(400, { error: "invalid_json" });
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
function parseContentLength(value) {
|
|
192
|
+
const raw = headerValue(value);
|
|
193
|
+
if (!raw)
|
|
194
|
+
return undefined;
|
|
195
|
+
const parsed = Number(raw);
|
|
196
|
+
return Number.isFinite(parsed) && parsed >= 0 ? parsed : undefined;
|
|
197
|
+
}
|
|
198
|
+
class HttpRequestError extends Error {
|
|
199
|
+
status;
|
|
200
|
+
body;
|
|
201
|
+
constructor(status, body) {
|
|
202
|
+
super(String(body.error ?? status));
|
|
203
|
+
this.status = status;
|
|
204
|
+
this.body = body;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
function safeEqual(a, b) {
|
|
208
|
+
const ab = Buffer.from(a);
|
|
209
|
+
const bb = Buffer.from(b);
|
|
210
|
+
if (ab.length !== bb.length)
|
|
211
|
+
return false;
|
|
212
|
+
return timingSafeEqual(ab, bb);
|
|
213
|
+
}
|
|
214
|
+
function isAuthorized(req, url, token, tokenExpiresAt) {
|
|
215
|
+
if (!token)
|
|
216
|
+
return false;
|
|
217
|
+
if (tokenExpiresAt && isExpired(tokenExpiresAt))
|
|
218
|
+
return false;
|
|
219
|
+
const provided = url.searchParams.get("prodex_token");
|
|
220
|
+
if (provided !== null && safeEqual(provided, token))
|
|
221
|
+
return true;
|
|
222
|
+
const authorization = headerValue(req.headers.authorization);
|
|
223
|
+
return authorization !== undefined && safeEqual(authorization, `Bearer ${token}`);
|
|
224
|
+
}
|
|
225
|
+
function isExpired(tokenExpiresAt) {
|
|
226
|
+
const expiresAtMs = Date.parse(tokenExpiresAt);
|
|
227
|
+
return !Number.isFinite(expiresAtMs) || expiresAtMs <= Date.now();
|
|
228
|
+
}
|
|
229
|
+
function headerValue(value) {
|
|
230
|
+
return Array.isArray(value) ? value[0] : value;
|
|
231
|
+
}
|
|
232
|
+
function writeJson(res, status, value) {
|
|
233
|
+
res.writeHead(status, { "content-type": "application/json" });
|
|
234
|
+
res.end(`${JSON.stringify(value)}\n`);
|
|
235
|
+
}
|
|
236
|
+
//# sourceMappingURL=http-mcp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-mcp.js","sourceRoot":"","sources":["../src/http-mcp.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export * from "./schema.js";
|
|
2
|
+
export * from "./store.js";
|
|
3
|
+
export * from "./repo.js";
|
|
4
|
+
export * from "./bundle.js";
|
|
5
|
+
export * from "./chatgpt-browser.js";
|
|
6
|
+
export * from "./config.js";
|
|
7
|
+
export * from "./http-mcp.js";
|
|
8
|
+
export * from "./mcp-tools.js";
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,sBAAsB,CAAC;AACrC,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC"}
|