@farming-labs/docs 0.2.124 → 0.2.125

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.d.mts CHANGED
@@ -254,6 +254,8 @@ interface DocsMcpResolvedSecurityConfig {
254
254
  authenticate?: DocsMcpAuthenticate;
255
255
  protectedResource?: DocsMcpResolvedProtectedResourceConfig;
256
256
  maxBodyBytes: number;
257
+ /** Optional for manually constructed resolved configs from older releases. */
258
+ maxToolInputElements?: number;
257
259
  cors: DocsMcpResolvedCorsConfig;
258
260
  }
259
261
  interface DocsMcpResolvedProtectedResourceConfig {
@@ -364,6 +366,7 @@ declare const DOCS_MCP_CONTENT_CHANGES_CURRENT_URI = "docs://changes/current";
364
366
  declare const DOCS_MCP_CONTENT_CHANGES_URI_TEMPLATE = "docs://changes/{generation}";
365
367
  declare const DEFAULT_DOCS_MCP_CONTENT_CHANGE_POLL_INTERVAL_MS = 30000;
366
368
  declare const DEFAULT_DOCS_MCP_MAX_BODY_BYTES: number;
369
+ declare const DEFAULT_DOCS_MCP_MAX_TOOL_INPUT_ELEMENTS = 10000;
367
370
  declare const DEFAULT_DOCS_MCP_CORS_MAX_AGE_SECONDS = 600;
368
371
  declare const DEFAULT_DOCS_MCP_CORS_ALLOWED_HEADERS: readonly string[];
369
372
  declare const DEFAULT_DOCS_MCP_CORS_EXPOSED_HEADERS: readonly string[];
@@ -385,4 +388,4 @@ declare function getDocsConfigSchema(filters?: {
385
388
  }): DocsMcpConfigSchema;
386
389
  declare function buildDocsMcpContext(options: DocsMcpContextOptions): Promise<DocsMcpContextResult>;
387
390
  //#endregion
388
- export { CreateDocsMcpServerOptions, DEFAULT_DOCS_CONTENT_CHANGE_HYDRATION_TOKEN_BUDGET, DEFAULT_DOCS_MCP_CONTENT_CHANGE_POLL_INTERVAL_MS, DEFAULT_DOCS_MCP_CORS_ALLOWED_HEADERS, DEFAULT_DOCS_MCP_CORS_EXPOSED_HEADERS, DEFAULT_DOCS_MCP_CORS_MAX_AGE_SECONDS, DEFAULT_DOCS_MCP_MAX_BODY_BYTES, DOCS_CONFIG_SCHEMA_OPTIONS, DOCS_CONTENT_CHANGE_HYDRATION_FORMAT, DOCS_MCP_CONTENT_CHANGES_CURRENT_URI, DOCS_MCP_CONTENT_CHANGES_URI_TEMPLATE, type DocsContentChangeHydrationBudget, type DocsContentChangeHydrationContent, type DocsContentChangeHydrationResponse, type DocsContentChangeHydrationSection, type DocsContentChangeHydrationTombstone, DocsMcpAgentContractSummary, DocsMcpApiReferenceSource, DocsMcpCodeExample, DocsMcpConfigSchema, DocsMcpConfigSchemaOption, DocsMcpContextOptions, DocsMcpContextResult, DocsMcpContextSource, DocsMcpDocsList, DocsMcpDocsPageSummary, DocsMcpDocsSection, DocsMcpFolderNode, DocsMcpHttpHandlers, DocsMcpNavigationNode, DocsMcpNavigationTree, DocsMcpPage, DocsMcpPageNode, DocsMcpPageSectionIndex, DocsMcpPageSectionList, DocsMcpPaginatedDocsList, DocsMcpPagination, DocsMcpRequestContext, DocsMcpResolvedConfig, DocsMcpResolvedCorsConfig, DocsMcpResolvedPromptsConfig, DocsMcpResolvedProtectedResourceConfig, DocsMcpResolvedSecurityConfig, DocsMcpSource, DocsMcpTaskSummary, type HydrateDocsContentChangesOptions, MAX_DOCS_CONTENT_CHANGE_HYDRATION_TOKEN_BUDGET, MIN_DOCS_CONTENT_CHANGE_HYDRATION_TOKEN_BUDGET, buildDocsMcpContext, createDocsMcpHttpHandler, createDocsMcpServer, createFilesystemDocsMcpSource, getDocsConfigSchema, hydrateDocsContentChanges, normalizeDocsMcpRoute, resolveDocsMcpConfig, resolveDocsMcpPromptsConfig, runDocsMcpStdio };
391
+ export { CreateDocsMcpServerOptions, DEFAULT_DOCS_CONTENT_CHANGE_HYDRATION_TOKEN_BUDGET, DEFAULT_DOCS_MCP_CONTENT_CHANGE_POLL_INTERVAL_MS, DEFAULT_DOCS_MCP_CORS_ALLOWED_HEADERS, DEFAULT_DOCS_MCP_CORS_EXPOSED_HEADERS, DEFAULT_DOCS_MCP_CORS_MAX_AGE_SECONDS, DEFAULT_DOCS_MCP_MAX_BODY_BYTES, DEFAULT_DOCS_MCP_MAX_TOOL_INPUT_ELEMENTS, DOCS_CONFIG_SCHEMA_OPTIONS, DOCS_CONTENT_CHANGE_HYDRATION_FORMAT, DOCS_MCP_CONTENT_CHANGES_CURRENT_URI, DOCS_MCP_CONTENT_CHANGES_URI_TEMPLATE, type DocsContentChangeHydrationBudget, type DocsContentChangeHydrationContent, type DocsContentChangeHydrationResponse, type DocsContentChangeHydrationSection, type DocsContentChangeHydrationTombstone, DocsMcpAgentContractSummary, DocsMcpApiReferenceSource, DocsMcpCodeExample, DocsMcpConfigSchema, DocsMcpConfigSchemaOption, DocsMcpContextOptions, DocsMcpContextResult, DocsMcpContextSource, DocsMcpDocsList, DocsMcpDocsPageSummary, DocsMcpDocsSection, DocsMcpFolderNode, DocsMcpHttpHandlers, DocsMcpNavigationNode, DocsMcpNavigationTree, DocsMcpPage, DocsMcpPageNode, DocsMcpPageSectionIndex, DocsMcpPageSectionList, DocsMcpPaginatedDocsList, DocsMcpPagination, DocsMcpRequestContext, DocsMcpResolvedConfig, DocsMcpResolvedCorsConfig, DocsMcpResolvedPromptsConfig, DocsMcpResolvedProtectedResourceConfig, DocsMcpResolvedSecurityConfig, DocsMcpSource, DocsMcpTaskSummary, type HydrateDocsContentChangesOptions, MAX_DOCS_CONTENT_CHANGE_HYDRATION_TOKEN_BUDGET, MIN_DOCS_CONTENT_CHANGE_HYDRATION_TOKEN_BUDGET, buildDocsMcpContext, createDocsMcpHttpHandler, createDocsMcpServer, createFilesystemDocsMcpSource, getDocsConfigSchema, hydrateDocsContentChanges, normalizeDocsMcpRoute, resolveDocsMcpConfig, resolveDocsMcpPromptsConfig, runDocsMcpStdio };
package/dist/mcp.mjs CHANGED
@@ -62,6 +62,7 @@ const DOCS_MCP_CONTENT_CHANGES_URI_TEMPLATE = "docs://changes/{generation}";
62
62
  const DEFAULT_DOCS_MCP_CONTENT_CHANGE_POLL_INTERVAL_MS = 3e4;
63
63
  const UTF8_ENCODER = new TextEncoder();
64
64
  const DEFAULT_DOCS_MCP_MAX_BODY_BYTES = 1024 * 1024;
65
+ const DEFAULT_DOCS_MCP_MAX_TOOL_INPUT_ELEMENTS = 1e4;
65
66
  const DEFAULT_DOCS_MCP_CORS_MAX_AGE_SECONDS = 600;
66
67
  const DEFAULT_DOCS_MCP_CORS_ALLOWED_HEADERS = Object.freeze([
67
68
  "Accept",
@@ -1767,6 +1768,13 @@ const DOCS_CONFIG_SCHEMA_OPTIONS_TEMPLATE = [
1767
1768
  default: DEFAULT_DOCS_MCP_MAX_BODY_BYTES,
1768
1769
  description: "Maximum accepted Streamable HTTP POST body size in bytes."
1769
1770
  },
1771
+ {
1772
+ path: "mcp.security.maxToolInputElements",
1773
+ name: "maxToolInputElements",
1774
+ type: "number",
1775
+ default: DEFAULT_DOCS_MCP_MAX_TOOL_INPUT_ELEMENTS,
1776
+ description: "Maximum total array items and object keys in Streamable HTTP tool arguments, checked before schema validation. Does not affect stdio."
1777
+ },
1770
1778
  {
1771
1779
  path: "mcp.security.cors",
1772
1780
  name: "cors",
@@ -2962,11 +2970,14 @@ function normalizeDocsMcpPromptSelectorList(value, configPath) {
2962
2970
  function resolveDocsMcpSecurityConfig(security) {
2963
2971
  const configuredMaxBodyBytes = security?.maxBodyBytes;
2964
2972
  const maxBodyBytes = typeof configuredMaxBodyBytes === "number" && Number.isFinite(configuredMaxBodyBytes) && configuredMaxBodyBytes > 0 ? Math.floor(configuredMaxBodyBytes) : DEFAULT_DOCS_MCP_MAX_BODY_BYTES;
2973
+ const configuredMaxToolInputElements = security?.maxToolInputElements;
2974
+ const maxToolInputElements = typeof configuredMaxToolInputElements === "number" && Number.isSafeInteger(Math.floor(configuredMaxToolInputElements)) && configuredMaxToolInputElements >= 1 ? Math.floor(configuredMaxToolInputElements) : DEFAULT_DOCS_MCP_MAX_TOOL_INPUT_ELEMENTS;
2965
2975
  return {
2966
2976
  allowedOrigins: security?.allowedOrigins ?? "same-origin",
2967
2977
  authenticate: security?.authenticate,
2968
2978
  protectedResource: resolveDocsMcpProtectedResourceConfig(security?.protectedResource),
2969
2979
  maxBodyBytes,
2980
+ maxToolInputElements,
2970
2981
  cors: resolveDocsMcpCorsConfig(security?.cors)
2971
2982
  };
2972
2983
  }
@@ -3387,32 +3398,35 @@ async function createDocsMcpServer(options) {
3387
3398
  const server = new McpServer({
3388
3399
  name: resolved.name,
3389
3400
  version: resolved.version
3390
- }, { cacheHints: {
3391
- "server/discover": {
3392
- ttlMs: DOCS_MCP_DISCOVERY_CACHE_TTL_MS,
3393
- cacheScope
3394
- },
3395
- "tools/list": {
3396
- ttlMs: DOCS_MCP_LIST_CACHE_TTL_MS,
3397
- cacheScope
3398
- },
3399
- "prompts/list": {
3400
- ttlMs: DOCS_MCP_LIST_CACHE_TTL_MS,
3401
- cacheScope
3402
- },
3403
- "resources/list": {
3404
- ttlMs: DOCS_MCP_LIST_CACHE_TTL_MS,
3405
- cacheScope
3406
- },
3407
- "resources/templates/list": {
3408
- ttlMs: DOCS_MCP_LIST_CACHE_TTL_MS,
3409
- cacheScope
3410
- },
3411
- "resources/read": {
3412
- ttlMs: DOCS_MCP_RESOURCE_CACHE_TTL_MS,
3413
- cacheScope
3401
+ }, {
3402
+ ...options.requestContext?.transport === "http" ? { maxToolInputElements: resolved.security?.maxToolInputElements ?? DEFAULT_DOCS_MCP_MAX_TOOL_INPUT_ELEMENTS } : {},
3403
+ cacheHints: {
3404
+ "server/discover": {
3405
+ ttlMs: DOCS_MCP_DISCOVERY_CACHE_TTL_MS,
3406
+ cacheScope
3407
+ },
3408
+ "tools/list": {
3409
+ ttlMs: DOCS_MCP_LIST_CACHE_TTL_MS,
3410
+ cacheScope
3411
+ },
3412
+ "prompts/list": {
3413
+ ttlMs: DOCS_MCP_LIST_CACHE_TTL_MS,
3414
+ cacheScope
3415
+ },
3416
+ "resources/list": {
3417
+ ttlMs: DOCS_MCP_LIST_CACHE_TTL_MS,
3418
+ cacheScope
3419
+ },
3420
+ "resources/templates/list": {
3421
+ ttlMs: DOCS_MCP_LIST_CACHE_TTL_MS,
3422
+ cacheScope
3423
+ },
3424
+ "resources/read": {
3425
+ ttlMs: DOCS_MCP_RESOURCE_CACHE_TTL_MS,
3426
+ cacheScope
3427
+ }
3414
3428
  }
3415
- } });
3429
+ });
3416
3430
  installDocsMcpSdkRegistrationPagination(server, protocolScope);
3417
3431
  if (contentChangesEnabled) server.server.registerCapabilities({ resources: { subscribe: true } });
3418
3432
  const registerResource = (name, uri, metadata, callback) => {
@@ -7149,4 +7163,4 @@ function toPageResourceUri(url) {
7149
7163
  }
7150
7164
 
7151
7165
  //#endregion
7152
- export { DEFAULT_DOCS_CONTENT_CHANGE_HYDRATION_TOKEN_BUDGET, DEFAULT_DOCS_MCP_CONTENT_CHANGE_POLL_INTERVAL_MS, DEFAULT_DOCS_MCP_CORS_ALLOWED_HEADERS, DEFAULT_DOCS_MCP_CORS_EXPOSED_HEADERS, DEFAULT_DOCS_MCP_CORS_MAX_AGE_SECONDS, DEFAULT_DOCS_MCP_MAX_BODY_BYTES, DOCS_CONFIG_SCHEMA_OPTIONS, DOCS_CONTENT_CHANGE_HYDRATION_FORMAT, DOCS_MCP_CONTENT_CHANGES_CURRENT_URI, DOCS_MCP_CONTENT_CHANGES_URI_TEMPLATE, MAX_DOCS_CONTENT_CHANGE_HYDRATION_TOKEN_BUDGET, MIN_DOCS_CONTENT_CHANGE_HYDRATION_TOKEN_BUDGET, buildDocsMcpContext, createDocsMcpHttpHandler, createDocsMcpServer, createFilesystemDocsMcpSource, getDocsConfigSchema, hydrateDocsContentChanges, normalizeDocsMcpRoute, resolveDocsMcpConfig, resolveDocsMcpPromptsConfig, runDocsMcpStdio };
7166
+ export { DEFAULT_DOCS_CONTENT_CHANGE_HYDRATION_TOKEN_BUDGET, DEFAULT_DOCS_MCP_CONTENT_CHANGE_POLL_INTERVAL_MS, DEFAULT_DOCS_MCP_CORS_ALLOWED_HEADERS, DEFAULT_DOCS_MCP_CORS_EXPOSED_HEADERS, DEFAULT_DOCS_MCP_CORS_MAX_AGE_SECONDS, DEFAULT_DOCS_MCP_MAX_BODY_BYTES, DEFAULT_DOCS_MCP_MAX_TOOL_INPUT_ELEMENTS, DOCS_CONFIG_SCHEMA_OPTIONS, DOCS_CONTENT_CHANGE_HYDRATION_FORMAT, DOCS_MCP_CONTENT_CHANGES_CURRENT_URI, DOCS_MCP_CONTENT_CHANGES_URI_TEMPLATE, MAX_DOCS_CONTENT_CHANGE_HYDRATION_TOKEN_BUDGET, MIN_DOCS_CONTENT_CHANGE_HYDRATION_TOKEN_BUDGET, buildDocsMcpContext, createDocsMcpHttpHandler, createDocsMcpServer, createFilesystemDocsMcpSource, getDocsConfigSchema, hydrateDocsContentChanges, normalizeDocsMcpRoute, resolveDocsMcpConfig, resolveDocsMcpPromptsConfig, runDocsMcpStdio };
package/dist/types.d.mts CHANGED
@@ -1403,6 +1403,8 @@ interface DocsMcpSecurityConfig {
1403
1403
  protectedResource?: DocsMcpProtectedResourceConfig;
1404
1404
  /** Maximum POST body size in bytes. Defaults to 1 MiB. */
1405
1405
  maxBodyBytes?: number;
1406
+ /** Maximum total array items and object keys in HTTP tool arguments. Defaults to 10,000. */
1407
+ maxToolInputElements?: number;
1406
1408
  /**
1407
1409
  * CORS responses for accepted browser Origins. Defaults to enabled with exact-Origin responses;
1408
1410
  * set `false` to suppress CORS headers or use an object for credential/header controls.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@farming-labs/docs",
3
- "version": "0.2.124",
3
+ "version": "0.2.125",
4
4
  "description": "Modern, flexible MDX-based docs framework — core types, config, and CLI",
5
5
  "keywords": [
6
6
  "docs",
@@ -97,7 +97,7 @@
97
97
  },
98
98
  "dependencies": {
99
99
  "@clack/prompts": "^1.7.0",
100
- "@modelcontextprotocol/server": "2.0.0",
100
+ "@modelcontextprotocol/server": "2.3.0",
101
101
  "@scalar/core": "^0.4.3",
102
102
  "github-slugger": "^2.0.0",
103
103
  "gray-matter": "^4.0.3",