@farming-labs/docs 0.1.64 → 0.1.66
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/mcp.mjs +56 -6
- package/package.json +1 -1
package/dist/mcp.mjs
CHANGED
|
@@ -279,13 +279,21 @@ async function createDocsMcpServer(options) {
|
|
|
279
279
|
return server;
|
|
280
280
|
}
|
|
281
281
|
function createDocsMcpHttpHandler(options) {
|
|
282
|
-
|
|
282
|
+
const resolved = resolveDocsMcpConfig(options.mcp, {
|
|
283
283
|
defaultName: options.defaultName ?? options.source.siteTitle ?? DEFAULT_MCP_NAME,
|
|
284
284
|
defaultVersion: options.defaultVersion
|
|
285
|
-
})
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
285
|
+
});
|
|
286
|
+
const disabledMessage = "MCP is disabled. Remove `mcp: false` or set `mcp: { enabled: true }` in docs.config to enable it again.";
|
|
287
|
+
if (!resolved.enabled) return {
|
|
288
|
+
GET: async () => createJsonErrorResponse(404, disabledMessage),
|
|
289
|
+
POST: async ({ request }) => createJsonRpcErrorResponse({
|
|
290
|
+
status: 404,
|
|
291
|
+
code: -32e3,
|
|
292
|
+
message: disabledMessage,
|
|
293
|
+
id: readJsonRpcId(await parseJsonBody(request)),
|
|
294
|
+
data: { reason: "mcp_disabled" }
|
|
295
|
+
}),
|
|
296
|
+
DELETE: async () => createJsonErrorResponse(404, disabledMessage)
|
|
289
297
|
};
|
|
290
298
|
const sessions = /* @__PURE__ */ new Map();
|
|
291
299
|
async function createSession() {
|
|
@@ -316,9 +324,11 @@ function createDocsMcpHttpHandler(options) {
|
|
|
316
324
|
const sessionId = request.headers.get("mcp-session-id") ?? request.headers.get("Mcp-Session-Id");
|
|
317
325
|
const existing = sessionId ? sessions.get(sessionId) : void 0;
|
|
318
326
|
let parsedBody;
|
|
327
|
+
let bodyParseFailed = false;
|
|
319
328
|
if (method === "POST") try {
|
|
320
329
|
parsedBody = await request.clone().json();
|
|
321
330
|
} catch {
|
|
331
|
+
bodyParseFailed = true;
|
|
322
332
|
parsedBody = void 0;
|
|
323
333
|
}
|
|
324
334
|
const initializeRequest = method === "POST" && parsedBody && isInitializeRequest(parsedBody);
|
|
@@ -334,7 +344,18 @@ function createDocsMcpHttpHandler(options) {
|
|
|
334
344
|
}
|
|
335
345
|
});
|
|
336
346
|
if (!existing) {
|
|
337
|
-
if (
|
|
347
|
+
if (method === "POST" && bodyParseFailed) return createJsonRpcErrorResponse({
|
|
348
|
+
status: 400,
|
|
349
|
+
code: -32700,
|
|
350
|
+
message: "Parse error: Invalid JSON"
|
|
351
|
+
});
|
|
352
|
+
if (!initializeRequest) return createJsonRpcErrorResponse({
|
|
353
|
+
status: sessionId || method === "DELETE" ? 404 : 400,
|
|
354
|
+
code: sessionId ? -32001 : -32e3,
|
|
355
|
+
message: sessionId ? "Session not found. Reinitialize the MCP client before calling docs tools." : "MCP session not initialized. Start with an initialize request against this endpoint.",
|
|
356
|
+
id: readJsonRpcId(parsedBody),
|
|
357
|
+
data: { reason: sessionId ? "session_not_found" : "session_not_initialized" }
|
|
358
|
+
});
|
|
338
359
|
return (await createSession()).transport.handleRequest(request, parsedBody === void 0 ? void 0 : { parsedBody });
|
|
339
360
|
}
|
|
340
361
|
return existing.transport.handleRequest(request, parsedBody === void 0 ? void 0 : { parsedBody });
|
|
@@ -356,6 +377,35 @@ function createJsonErrorResponse(status, error) {
|
|
|
356
377
|
headers: { "Content-Type": "application/json" }
|
|
357
378
|
});
|
|
358
379
|
}
|
|
380
|
+
async function parseJsonBody(request) {
|
|
381
|
+
try {
|
|
382
|
+
return await request.clone().json();
|
|
383
|
+
} catch {
|
|
384
|
+
return;
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
function readJsonRpcId(value) {
|
|
388
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) return null;
|
|
389
|
+
const id = value.id;
|
|
390
|
+
return typeof id === "string" || typeof id === "number" ? id : null;
|
|
391
|
+
}
|
|
392
|
+
function createJsonRpcErrorResponse({ status, code, message, id = null, data }) {
|
|
393
|
+
return new Response(JSON.stringify({
|
|
394
|
+
jsonrpc: "2.0",
|
|
395
|
+
id,
|
|
396
|
+
error: data ? {
|
|
397
|
+
code,
|
|
398
|
+
message,
|
|
399
|
+
data
|
|
400
|
+
} : {
|
|
401
|
+
code,
|
|
402
|
+
message
|
|
403
|
+
}
|
|
404
|
+
}), {
|
|
405
|
+
status,
|
|
406
|
+
headers: { "Content-Type": "application/json" }
|
|
407
|
+
});
|
|
408
|
+
}
|
|
359
409
|
function normalizePathSegment(value) {
|
|
360
410
|
return value.replace(/^\/+|\/+$/g, "");
|
|
361
411
|
}
|