@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.
Files changed (2) hide show
  1. package/dist/mcp.mjs +56 -6
  2. 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
- if (!resolveDocsMcpConfig(options.mcp, {
282
+ const resolved = resolveDocsMcpConfig(options.mcp, {
283
283
  defaultName: options.defaultName ?? options.source.siteTitle ?? DEFAULT_MCP_NAME,
284
284
  defaultVersion: options.defaultVersion
285
- }).enabled) return {
286
- GET: async () => createJsonErrorResponse(404, "MCP is disabled. Remove `mcp: false` or set `mcp: { enabled: true }` in docs.config to enable it again."),
287
- POST: async () => createJsonErrorResponse(404, "MCP is disabled. Remove `mcp: false` or set `mcp: { enabled: true }` in docs.config to enable it again."),
288
- DELETE: async () => createJsonErrorResponse(404, "MCP is disabled. Remove `mcp: false` or set `mcp: { enabled: true }` in docs.config to enable it again.")
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 (!initializeRequest) return createJsonErrorResponse(method === "DELETE" ? 404 : 400, "MCP session not initialized. Start with an initialize request against this endpoint.");
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
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@farming-labs/docs",
3
- "version": "0.1.64",
3
+ "version": "0.1.66",
4
4
  "description": "Modern, flexible MDX-based docs framework — core types, config, and CLI",
5
5
  "keywords": [
6
6
  "docs",