@redocly/redoc 0.129.0-next.1 → 0.129.0-next.3

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 (295) hide show
  1. package/CHANGELOG.md +52 -0
  2. package/dist/bin.js +1 -1
  3. package/dist/cli/develop.d.ts +1 -1
  4. package/dist/cli/develop.js +1 -1
  5. package/dist/cli/prepare/analytics/collectors/get-file-extensions-usage.js +1 -1
  6. package/dist/cli/prepare/analytics/collectors/get-frontmatter-usage.js +1 -1
  7. package/dist/cli/prepare/analytics/collectors/get-markdoc-usage.js +1 -1
  8. package/dist/cli/prepare/analytics/collectors/get-nested-configs-usage.js +1 -1
  9. package/dist/cli/prepare/analytics/collectors/get-refs-usage.js +1 -1
  10. package/dist/cli/prepare/index.d.ts +1 -1
  11. package/dist/cli/translations/collect-config-translations.js +1 -1
  12. package/dist/cli/translations/update-translations.js +1 -1
  13. package/dist/client/TestProvider.js +1 -1
  14. package/dist/client/app/Sidebar/RequestAccessButton.js +2 -2
  15. package/dist/client/app/Sidebar/Sidebar.js +7 -2
  16. package/dist/client/app/Sidebar/useSidebarItems.d.ts +1 -0
  17. package/dist/client/app/Sidebar/useSidebarItems.js +1 -1
  18. package/dist/client/app/hooks/catalog/useFetchCatalogEntities.js +1 -1
  19. package/dist/client/app/hooks/catalog/useFetchCatalogEntitiesRelations.js +1 -1
  20. package/dist/client/app/hooks/catalog/useFetchCatalogEntityRevisions.d.ts +10 -0
  21. package/dist/client/app/hooks/catalog/useFetchCatalogEntityRevisions.js +1 -0
  22. package/dist/client/app/hooks/index.d.ts +1 -0
  23. package/dist/client/app/hooks/index.js +1 -1
  24. package/dist/client/app/hooks/useBanner.d.ts +4 -0
  25. package/dist/client/app/hooks/useBanner.js +1 -1
  26. package/dist/client/app/hooks/useLoginUrl.js +1 -1
  27. package/dist/client/app/pages/DevLogin/DevLogin.js +1 -1
  28. package/dist/client/app/pages/Login/Login.js +1 -1
  29. package/dist/client/app/utils/loadAndNavigate.js +1 -1
  30. package/dist/client/browser-entry.js +2 -2
  31. package/dist/client/providers/page-data/hooks.d.ts +2 -1
  32. package/dist/client/providers/page-data/hooks.js +1 -1
  33. package/dist/client/providers/theme/ThemeDataProvider.js +1 -1
  34. package/dist/client/runtime/loader.js +1 -1
  35. package/dist/client/types/post-message.d.ts +2 -1
  36. package/dist/client/utils/catalog/inject-catalog-items.d.ts +1 -1
  37. package/dist/client/utils/catalog/inject-catalog-items.js +1 -1
  38. package/dist/constants/common.d.ts +0 -4
  39. package/dist/constants/common.js +1 -1
  40. package/dist/constants/l10n/langs/ar.js +1 -1
  41. package/dist/constants/l10n/langs/de.js +1 -1
  42. package/dist/constants/l10n/langs/en.js +1 -1
  43. package/dist/constants/l10n/langs/es.js +1 -1
  44. package/dist/constants/l10n/langs/fr.js +1 -1
  45. package/dist/constants/l10n/langs/hi.js +1 -1
  46. package/dist/constants/l10n/langs/it.js +1 -1
  47. package/dist/constants/l10n/langs/ja.js +1 -1
  48. package/dist/constants/l10n/langs/ko.js +1 -1
  49. package/dist/constants/l10n/langs/pl.js +1 -1
  50. package/dist/constants/l10n/langs/pt-BR.js +1 -1
  51. package/dist/constants/l10n/langs/pt.js +1 -1
  52. package/dist/constants/l10n/langs/ru.js +1 -1
  53. package/dist/constants/l10n/langs/uk.js +1 -1
  54. package/dist/constants/l10n/langs/zh.js +1 -1
  55. package/dist/server/api-routes/execute-api-route.d.ts +0 -7
  56. package/dist/server/api-routes/execute-api-route.js +1 -1
  57. package/dist/server/api-routes/helpers/setup-logger.d.ts +2 -2
  58. package/dist/server/api-routes/helpers/setup-logger.js +1 -1
  59. package/dist/server/api-routes/run-api-routes-worker.js +1 -1
  60. package/dist/server/fs/cache.d.ts +1 -2
  61. package/dist/server/fs/cache.js +1 -1
  62. package/dist/server/fs/content-fs.d.ts +9 -4
  63. package/dist/server/fs/content-fs.js +1 -1
  64. package/dist/server/fs/fs.d.ts +6 -6
  65. package/dist/server/fs/fs.js +1 -3
  66. package/dist/server/fs/load-error.d.ts +2 -2
  67. package/dist/server/fs/load-error.js +1 -1
  68. package/dist/server/fs/utils/async-storage.d.ts +0 -8
  69. package/dist/server/fs/utils/async-storage.js +1 -1
  70. package/dist/server/fs/utils/isVirtualFile.d.ts +1 -1
  71. package/dist/server/fs/utils/isVirtualFile.js +1 -1
  72. package/dist/server/persistence/kv/helpers/decode-cursor.d.ts +2 -0
  73. package/dist/server/persistence/kv/helpers/decode-cursor.js +1 -0
  74. package/dist/server/persistence/kv/helpers/encode-cursor.d.ts +2 -0
  75. package/dist/server/persistence/kv/helpers/encode-cursor.js +1 -0
  76. package/dist/server/persistence/kv/mappers/create-kv-list-entry.d.ts +5 -0
  77. package/dist/server/persistence/kv/mappers/create-kv-list-entry.js +1 -0
  78. package/dist/server/persistence/kv/mappers/create-kv-value.d.ts +4 -0
  79. package/dist/server/persistence/kv/mappers/create-kv-value.js +1 -0
  80. package/dist/server/persistence/kv/repositories/kv-remote-repository.d.ts +5 -5
  81. package/dist/server/persistence/kv/repositories/kv-remote-repository.js +1 -1
  82. package/dist/server/persistence/kv/schemas/kv-schemas.d.ts +10 -0
  83. package/dist/server/persistence/kv/schemas/kv-schemas.js +1 -0
  84. package/dist/server/persistence/kv/services/kv-service.d.ts +6 -6
  85. package/dist/server/persistence/kv/services/kv-service.js +1 -1
  86. package/dist/server/plugins/api-functions/index.js +1 -1
  87. package/dist/server/plugins/arazzo-docs/arazzo-doc-loader.d.ts +1 -1
  88. package/dist/server/plugins/arazzo-docs/arazzo-doc-loader.js +2 -2
  89. package/dist/server/plugins/arazzo-docs/index.d.ts +1 -1
  90. package/dist/server/plugins/arazzo-docs/index.js +1 -1
  91. package/dist/server/plugins/asyncapi-docs/asyncapi-doc-loader.d.ts +1 -1
  92. package/dist/server/plugins/asyncapi-docs/asyncapi-doc-loader.js +2 -2
  93. package/dist/server/plugins/asyncapi-docs/index.d.ts +1 -1
  94. package/dist/server/plugins/asyncapi-docs/index.js +1 -1
  95. package/dist/server/plugins/asyncapi-docs/is-asyncapi-doc.js +1 -1
  96. package/dist/server/plugins/catalog-entities/database/catalog-entities-service.d.ts +23 -18
  97. package/dist/server/plugins/catalog-entities/database/catalog-entities-service.js +1 -1
  98. package/dist/server/plugins/catalog-entities/database/mappers/create-bff-entity.js +1 -1
  99. package/dist/server/plugins/catalog-entities/database/mappers/create-bff-related-entity.d.ts +9 -0
  100. package/dist/server/plugins/catalog-entities/database/mappers/create-bff-related-entity.js +1 -1
  101. package/dist/server/plugins/catalog-entities/database/mappers/create-entity-db-record.d.ts +1 -0
  102. package/dist/server/plugins/catalog-entities/database/mappers/create-entity-db-record.js +1 -1
  103. package/dist/server/plugins/catalog-entities/database/mappers/create-entity-read-model.js +1 -1
  104. package/dist/server/plugins/catalog-entities/database/mappers/create-entity-relation-db-record-from-dto.js +1 -1
  105. package/dist/server/plugins/catalog-entities/database/mappers/create-entity-relation-db-record-from-file-schema.js +1 -1
  106. package/dist/server/plugins/catalog-entities/database/mappers/create-entity-relation.js +1 -1
  107. package/dist/server/plugins/catalog-entities/database/mappers/map-entity-relation-row.d.ts +12 -0
  108. package/dist/server/plugins/catalog-entities/database/mappers/map-entity-relation-row.js +1 -0
  109. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-read-repository.d.ts +15 -4
  110. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-read-repository.js +67 -55
  111. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-repository.d.ts +21 -15
  112. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-repository.js +1 -1
  113. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-write-repository.d.ts +16 -3
  114. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-write-repository.js +1 -1
  115. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-relations-repository.d.ts +17 -0
  116. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-relations-repository.js +1 -0
  117. package/dist/server/plugins/catalog-entities/database/repositories/utils.d.ts +4 -4
  118. package/dist/server/plugins/catalog-entities/database/repositories/utils.js +1 -1
  119. package/dist/server/plugins/catalog-entities/entities/{extract-entities-content.d.ts → extract-file-content.d.ts} +1 -1
  120. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/arazzo-entities-extractor.d.ts +2 -2
  121. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/arazzo-entities-extractor.js +1 -1
  122. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/asyncapi-entities-extractor.d.ts +2 -2
  123. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/asyncapi-entities-extractor.js +1 -1
  124. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/base.d.ts +2 -2
  125. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/base.js +1 -1
  126. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/graphql-entities-extractor.d.ts +2 -2
  127. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/graphql-entities-extractor.js +2 -2
  128. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/openapi-entities-extractor.d.ts +2 -2
  129. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/openapi-entities-extractor.js +1 -1
  130. package/dist/server/plugins/catalog-entities/extensions/extractors/fs-entities-extractor.js +1 -1
  131. package/dist/server/plugins/catalog-entities/get-server-props.d.ts +1 -2
  132. package/dist/server/plugins/catalog-entities/get-server-props.js +1 -1
  133. package/dist/server/plugins/catalog-entities/schemas/database-schemas.d.ts +64 -0
  134. package/dist/server/plugins/catalog-entities/schemas/database-schemas.js +1 -1
  135. package/dist/server/plugins/catalog-entities/schemas/dto-schemas.d.ts +6 -12
  136. package/dist/server/plugins/catalog-entities/schemas/dto-schemas.js +1 -1
  137. package/dist/server/plugins/catalog-entities/schemas/read-model-schemas.d.ts +4 -8
  138. package/dist/server/plugins/catalog-entities/schemas/read-model-schemas.js +1 -1
  139. package/dist/server/plugins/catalog-entities/utils/catalog-data-collector.js +1 -1
  140. package/dist/server/plugins/catalog-entities/utils/read-string.d.ts +7 -0
  141. package/dist/server/plugins/catalog-entities/utils/read-string.js +1 -0
  142. package/dist/server/plugins/config-parser/loaders/content-slugs-loader.js +1 -1
  143. package/dist/server/plugins/config-parser/loaders/nearest-redocly-config-loader.js +1 -1
  144. package/dist/server/plugins/config-parser/loaders/utils/read-and-validate-config.js +1 -1
  145. package/dist/server/plugins/config-parser/loaders/yaml-parser.js +1 -1
  146. package/dist/server/plugins/default-theme/resolve-products-config.js +1 -1
  147. package/dist/server/plugins/ensure-frontmatter-theme-compatibility.js +1 -1
  148. package/dist/server/plugins/entitlements/index.js +1 -1
  149. package/dist/server/plugins/graphql-docs/index.js +1 -1
  150. package/dist/server/plugins/l10n/index.js +1 -1
  151. package/dist/server/plugins/lifecycle.js +2 -2
  152. package/dist/server/plugins/markdown/attribute-resolvers/code-walkthrough/filesets-resolver.js +1 -1
  153. package/dist/server/plugins/markdown/attribute-resolvers/helpers/dereference-json-schema-refs.d.ts +14 -0
  154. package/dist/server/plugins/markdown/attribute-resolvers/helpers/dereference-json-schema-refs.js +1 -0
  155. package/dist/server/plugins/markdown/attribute-resolvers/helpers/generate-sample-from-schema.d.ts +62 -0
  156. package/dist/server/plugins/markdown/attribute-resolvers/helpers/generate-sample-from-schema.js +2 -0
  157. package/dist/server/plugins/markdown/attribute-resolvers/index.js +1 -1
  158. package/dist/server/plugins/markdown/attribute-resolvers/resolve-code-snippet-from-file.js +1 -1
  159. package/dist/server/plugins/markdown/attribute-resolvers/resolve-json-example-ref.d.ts +4 -0
  160. package/dist/server/plugins/markdown/attribute-resolvers/resolve-json-example-ref.js +1 -0
  161. package/dist/server/plugins/markdown/attribute-resolvers/resolve-json-schema-ref.js +1 -1
  162. package/dist/server/plugins/markdown/attribute-resolvers/resolve-link.d.ts +1 -1
  163. package/dist/server/plugins/markdown/attribute-resolvers/resolve-link.js +1 -1
  164. package/dist/server/plugins/markdown/attribute-resolvers/resolve-open-api-ref.js +1 -1
  165. package/dist/server/plugins/markdown/attribute-resolvers/resolve-parsed-yaml.js +1 -1
  166. package/dist/server/plugins/markdown/attribute-resolvers/resolve-raw-content.js +1 -1
  167. package/dist/server/plugins/markdown/attribute-resolvers/resolve-sample-from-json-schema.d.ts +4 -0
  168. package/dist/server/plugins/markdown/attribute-resolvers/resolve-sample-from-json-schema.js +1 -0
  169. package/dist/server/plugins/markdown/attribute-resolvers/resolve-svg-content.js +1 -1
  170. package/dist/server/plugins/markdown/compiler.js +1 -1
  171. package/dist/server/plugins/markdown/get-server-props.js +1 -1
  172. package/dist/server/plugins/markdown/index.js +1 -1
  173. package/dist/server/plugins/markdown/markdoc/attributes/index.d.ts +2 -0
  174. package/dist/server/plugins/markdown/markdoc/attributes/index.js +1 -1
  175. package/dist/server/plugins/markdown/markdoc/attributes/json-example-ref.d.ts +6 -0
  176. package/dist/server/plugins/markdown/markdoc/attributes/json-example-ref.js +1 -0
  177. package/dist/server/plugins/markdown/markdoc/attributes/sample-from-json-schema.d.ts +6 -0
  178. package/dist/server/plugins/markdown/markdoc/attributes/sample-from-json-schema.js +1 -0
  179. package/dist/server/plugins/markdown/markdoc/custom-components/openapi/index.d.ts +1 -0
  180. package/dist/server/plugins/markdown/markdoc/custom-components/openapi/index.js +1 -1
  181. package/dist/server/plugins/markdown/markdoc/custom-components/openapi/json-example.d.ts +8 -0
  182. package/dist/server/plugins/markdown/markdoc/custom-components/openapi/json-example.js +7 -0
  183. package/dist/server/plugins/markdown/markdoc/partials.js +1 -1
  184. package/dist/server/plugins/markdown/markdoc/resolve-raw-partials.js +1 -1
  185. package/dist/server/plugins/markdown/markdoc/tags/index.d.ts +4 -0
  186. package/dist/server/plugins/markdown/markdoc/tags/index.js +1 -1
  187. package/dist/server/plugins/markdown/markdoc/tags/json-example.d.ts +3 -0
  188. package/dist/server/plugins/markdown/markdoc/tags/json-example.js +1 -0
  189. package/dist/server/plugins/markdown/markdown-static-data-loader.js +1 -1
  190. package/dist/server/plugins/mcp/auth/auth-handlers.d.ts +1 -1
  191. package/dist/server/plugins/mcp/auth/auth-handlers.js +1 -1
  192. package/dist/server/plugins/mcp/docs-mcp/tools/get-endpoint-info.d.ts +7 -2
  193. package/dist/server/plugins/mcp/docs-mcp/tools/get-endpoint-info.js +1 -1
  194. package/dist/server/plugins/mcp/docs-mcp/tools/get-endpoints.d.ts +7 -2
  195. package/dist/server/plugins/mcp/docs-mcp/tools/get-endpoints.js +1 -1
  196. package/dist/server/plugins/mcp/docs-mcp/tools/get-full-api-description.d.ts +7 -2
  197. package/dist/server/plugins/mcp/docs-mcp/tools/get-full-api-description.js +1 -1
  198. package/dist/server/plugins/mcp/docs-mcp/tools/get-security-schemes.d.ts +7 -2
  199. package/dist/server/plugins/mcp/docs-mcp/tools/get-security-schemes.js +1 -1
  200. package/dist/server/plugins/mcp/docs-mcp/tools/index.d.ts +4 -3
  201. package/dist/server/plugins/mcp/docs-mcp/tools/index.js +1 -1
  202. package/dist/server/plugins/mcp/docs-mcp/tools/list-apis.d.ts +5 -2
  203. package/dist/server/plugins/mcp/docs-mcp/tools/list-apis.js +1 -1
  204. package/dist/server/plugins/mcp/docs-mcp/tools/utils.d.ts +6 -0
  205. package/dist/server/plugins/mcp/docs-mcp/tools/utils.js +6 -6
  206. package/dist/server/plugins/mcp/docs-mcp/tools/whoami.js +1 -1
  207. package/dist/server/plugins/mcp/docs-mcp/utils.d.ts +3 -3
  208. package/dist/server/plugins/mcp/docs-mcp/utils.js +1 -1
  209. package/dist/server/plugins/mcp/handlers/docs-mcp-handler.js +1 -1
  210. package/dist/server/plugins/mcp/index.js +1 -1
  211. package/dist/server/plugins/mcp/servers/docs-server.d.ts +10 -3
  212. package/dist/server/plugins/mcp/servers/docs-server.js +1 -1
  213. package/dist/server/plugins/mcp/types.d.ts +26 -2
  214. package/dist/server/plugins/mcp/utils.d.ts +9 -8
  215. package/dist/server/plugins/mcp/utils.js +1 -1
  216. package/dist/server/plugins/mcp/workers/run-api-routes-worker.js +1 -1
  217. package/dist/server/plugins/nav-utils.js +1 -1
  218. package/dist/server/plugins/openapi-docs/decorators.d.ts +3 -2
  219. package/dist/server/plugins/openapi-docs/decorators.js +1 -1
  220. package/dist/server/plugins/openapi-docs/index.d.ts +2 -2
  221. package/dist/server/plugins/openapi-docs/index.js +1 -1
  222. package/dist/server/plugins/openapi-docs/is-openapi-doc.js +1 -1
  223. package/dist/server/plugins/openapi-docs/load-definition.d.ts +1 -1
  224. package/dist/server/plugins/openapi-docs/load-definition.js +3 -3
  225. package/dist/server/plugins/pages/index.js +1 -1
  226. package/dist/server/plugins/scorecard-classic/get-scorecard-config.d.ts +11 -0
  227. package/dist/server/plugins/scorecard-classic/loaders/scorecard.js +1 -1
  228. package/dist/server/plugins/search/llmstxt/index.js +5 -5
  229. package/dist/server/plugins/sidebars/index.js +3 -3
  230. package/dist/server/plugins/utils.js +1 -1
  231. package/dist/server/providers/database/databases/catalog-sqlite/schemas/entities-relations-table.d.ts +25 -46
  232. package/dist/server/providers/database/databases/catalog-sqlite/schemas/entities-relations-table.js +1 -1
  233. package/dist/server/providers/database/databases/catalog-sqlite/schemas/entities-table.d.ts +20 -3
  234. package/dist/server/providers/database/databases/catalog-sqlite/schemas/entities-table.js +1 -1
  235. package/dist/server/providers/database/pagination/combined-filters.d.ts +4 -1
  236. package/dist/server/providers/database/pagination/combined-filters.js +1 -1
  237. package/dist/server/providers/database/pagination/filter.d.ts +1 -0
  238. package/dist/server/providers/database/pagination/filter.js +1 -1
  239. package/dist/server/providers/database/pagination/index.d.ts +4 -1
  240. package/dist/server/providers/database/pagination/utils/decode-cursor.js +1 -1
  241. package/dist/server/ssr/index.js +1 -1
  242. package/dist/server/ssr/render.js +1 -1
  243. package/dist/server/ssr/template.d.ts +1 -1
  244. package/dist/server/ssr/template.js +13 -13
  245. package/dist/server/ssr/utils.js +27 -13
  246. package/dist/server/store.js +1 -1
  247. package/dist/server/tools/notifiers/formatter.d.ts +2 -0
  248. package/dist/server/tools/notifiers/formatter.js +3 -3
  249. package/dist/server/tools/notifiers/logger.d.ts +18 -39
  250. package/dist/server/tools/notifiers/logger.js +2 -6
  251. package/dist/server/tools/notifiers/reporter.js +9 -9
  252. package/dist/server/tools/notifiers/terminal-manager.d.ts +8 -0
  253. package/dist/server/tools/notifiers/terminal-manager.js +5 -0
  254. package/dist/server/types/fs.d.ts +5 -10
  255. package/dist/server/types/plugins/api-routes.d.ts +0 -3
  256. package/dist/server/types/plugins/common.d.ts +0 -1
  257. package/dist/server/utils/is-valid-iso-date.d.ts +5 -0
  258. package/dist/server/utils/is-valid-iso-date.js +1 -0
  259. package/dist/server/utils/lifecycle-hooks.js +1 -1
  260. package/dist/server/utils/queue.js +1 -1
  261. package/dist/server/utils/redirects/find-redirect.d.ts +4 -2
  262. package/dist/server/utils/redirects/find-redirect.js +1 -1
  263. package/dist/server/utils/resolve-asset-path.js +1 -1
  264. package/dist/server/utils/safe-parse.d.ts +6 -0
  265. package/dist/server/utils/safe-parse.js +1 -0
  266. package/dist/server/utils/validate-and-sanitize-string.d.ts +29 -0
  267. package/dist/server/utils/validate-and-sanitize-string.js +1 -0
  268. package/dist/server/web-server/auth.d.ts +5 -0
  269. package/dist/server/web-server/auth.js +3 -3
  270. package/dist/server/web-server/http.js +2 -2
  271. package/dist/server/web-server/middleware/loggerMiddleware.js +1 -1
  272. package/dist/server/web-server/routes/auth.js +1 -1
  273. package/dist/server/web-server/routes/catalog/bff-catalog-related-entities.js +1 -1
  274. package/dist/server/web-server/routes/catalog/bff-catalog.js +1 -1
  275. package/dist/server/web-server/routes/catalog/catalog-relations.js +1 -1
  276. package/dist/server/web-server/routes/mcp-oauth.js +1 -1
  277. package/dist/server/web-server/routes/search.js +1 -1
  278. package/dist/server/web-server/utils/get-redirect-login-url.js +1 -1
  279. package/dist/types/ssr.d.ts +3 -1
  280. package/dist/utils/auth/build-login-url.d.ts +1 -3
  281. package/dist/utils/auth/build-login-url.js +1 -1
  282. package/dist/utils/env/is-local-development.d.ts +13 -0
  283. package/dist/utils/env/is-local-development.js +1 -0
  284. package/dist/utils/env/is-production.d.ts +13 -0
  285. package/dist/utils/env/is-production.js +1 -0
  286. package/dist/utils/env/is-web-view.d.ts +14 -0
  287. package/dist/utils/env/is-web-view.js +1 -0
  288. package/dist/utils/path/remove-fragment.d.ts +16 -0
  289. package/dist/utils/path/remove-fragment.js +1 -0
  290. package/package.json +12 -11
  291. package/dist/server/persistence/kv/mappers/create-kv-read-record.d.ts +0 -4
  292. package/dist/server/persistence/kv/mappers/create-kv-read-record.js +0 -1
  293. package/dist/server/web-server/routes/otel/types.d.ts +0 -61
  294. package/dist/server/web-server/routes/otel/types.js +0 -1
  295. /package/dist/server/plugins/catalog-entities/entities/{extract-entities-content.js → extract-file-content.js} +0 -0
@@ -5,4 +5,5 @@ export * from './openapi-example.js';
5
5
  export * from './step-by-step-wrapper.js';
6
6
  export * from './replay-openapi.js';
7
7
  export * from './openapi-response-sample.js';
8
+ export * from './json-example.js';
8
9
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- export*from"./json-schema.js";export*from"./explain-step.js";export*from"./openapi-code-sample.js";export*from"./openapi-example.js";export*from"./step-by-step-wrapper.js";export*from"./replay-openapi.js";export*from"./openapi-response-sample.js";
1
+ export*from"./json-schema.js";export*from"./explain-step.js";export*from"./openapi-code-sample.js";export*from"./openapi-example.js";export*from"./step-by-step-wrapper.js";export*from"./replay-openapi.js";export*from"./openapi-response-sample.js";export*from"./json-example.js";
@@ -0,0 +1,8 @@
1
+ import React from 'react';
2
+ export type JsonExampleProps = {
3
+ title?: string;
4
+ json: unknown;
5
+ errors: string[];
6
+ };
7
+ export declare function JsonExample(props: JsonExampleProps): React.JSX.Element;
8
+ //# sourceMappingURL=json-example.d.ts.map
@@ -0,0 +1,7 @@
1
+ import r from"react";import l from"styled-components";import{JsonViewer as n}from"@redocly/theme/components/JsonViewer/JsonViewer";import{ClipboardService as a}from"@redocly/theme/core/utils";function E(c){const{json:e,title:t,errors:o}=c;return o.length?r.createElement(i,null,r.createElement(p,null,"error"),r.createElement(n,{data:o,expandLevel:3,onCopyClick:()=>{a.copyCustom(JSON.stringify(o))},title:t})):r.createElement(n,{data:e,expandLevel:3,onCopyClick:()=>{a.copyCustom(JSON.stringify(e))},title:t})}const i=l.div`
2
+ background-color: var(--code-block-bg-color);
3
+ border: 2px solid var(--color-error-border);
4
+ `,p=l.p`
5
+ color: var(--color-error-text);
6
+ padding-left: var(--spacing-xs);
7
+ `;export{E as JsonExample};
@@ -1 +1 @@
1
- import*as l from"path";import{MARKDOC_PARTIALS_DATA_KEY as f,MARKDOC_PARTIALS_DEPS_KEY as D}from"../../../store.js";import{isPartial as h}from"../is-partial.js";function A(e,t){return Promise.all(e.map(t)).then(o=>e.filter((i,n)=>o[n]))}async function C(e,t){const{markdown:o}=await e.getConfig(),i=o?.partialsFolders??[],n=await A(await e.fs.scan(/\.md$/),async a=>!(!l.posix.basename(a.relativePath).endsWith(".md")||await e.isPathIgnored(a.relativePath)||!h(a.relativePath,i)));t.setGlobalConfig({[f]:Object.fromEntries(n.map(a=>[a.relativePath,{}]))});const m={},p={};for(const a of n){const{ast:s,info:r}=await t.parseMarkdoc(a,e);m[a.relativePath]=s;const c=Array.isArray(r.dynamicMarkdocComponents)?r.dynamicMarkdocComponents:[],d=r.sharedDataDeps instanceof Set?Array.from(r.sharedDataDeps):Array.isArray(r.sharedDataDeps)?r.sharedDataDeps:[];p[a.relativePath]={dynamicComponents:new Set(c),sharedDataDeps:new Set(d)}}return t.setGlobalConfig({[D]:Object.fromEntries(Object.entries(p).map(([a,s])=>[a,{dynamicComponents:Array.from(s.dynamicComponents),sharedDataDeps:Array.from(s.sharedDataDeps)}]))}),m}export{C as prepareMarkdocPartials};
1
+ import*as l from"path";import{MARKDOC_PARTIALS_DATA_KEY as f,MARKDOC_PARTIALS_DEPS_KEY as D}from"../../../store.js";import{isPartial as h}from"../is-partial.js";function A(e,t){return Promise.all(e.map(t)).then(o=>e.filter((i,n)=>o[n]))}async function C(e,t){const{markdown:o}=await e.getConfig(),i=o?.partialsFolders??[],n=await A(e.fs.scan(/\.md$/),async a=>!(!l.posix.basename(a.relativePath).endsWith(".md")||await e.isPathIgnored(a.relativePath)||!h(a.relativePath,i)));t.setGlobalConfig({[f]:Object.fromEntries(n.map(a=>[a.relativePath,{}]))});const m={},p={};for(const a of n){const{ast:s,info:r}=await t.parseMarkdoc(a,e);m[a.relativePath]=s;const c=Array.isArray(r.dynamicMarkdocComponents)?r.dynamicMarkdocComponents:[],d=r.sharedDataDeps instanceof Set?Array.from(r.sharedDataDeps):Array.isArray(r.sharedDataDeps)?r.sharedDataDeps:[];p[a.relativePath]={dynamicComponents:new Set(c),sharedDataDeps:new Set(d)}}return t.setGlobalConfig({[D]:Object.fromEntries(Object.entries(p).map(([a,s])=>[a,{dynamicComponents:Array.from(s.dynamicComponents),sharedDataDeps:Array.from(s.sharedDataDeps)}]))}),m}export{C as prepareMarkdocPartials};
@@ -1,2 +1,2 @@
1
- import p from"node:path";import _ from"is-glob";import{slash as $}from"../../../../utils/path/slash.js";import{reporter as d}from"../../../tools/notifiers/reporter.js";import{convertGlobToRegex as h}from"../../../utils/index.js";import{formatMarkdocError as k}from"../errors.js";import{isPartial as E}from"../is-partial.js";const b=/\{\% ?raw-partial file="([^"]+)" ?\/?\%\}/gm,y=async(t,a,i=[],o,l=[a])=>{for(const s of i){const r=_(s)?h(s):new RegExp(`^${s}/`);await o.fs.scan(r)}const n=[],f=t.replace(b,(s,r)=>(n.push(u(s,r)),"_$redocly$"+(n.length-1)+"$")),w=await Promise.all(n);return f.replace(/_\$redocly\$(\d+)\$/g,(s,r)=>w[+r]);async function u(s,r){const e=r.startsWith("/")?r.slice(1):$(p.relative(o.fs.cwd,p.resolve(o.fs.cwd,p.dirname(a),r)));if(l.includes(e)){const c=[...l,e];return await d.panicOnBuildContentError(`Circular reference chain detected when processing raw partials: ${c.map(()=>"%rp").join(" -> ")}`,...c),""}const m=!await o.fs.exists(e),g=!e.endsWith(".md")||await o.isPathIgnored(e)||!E(e,i);if(m||g){const R={type:"resolve_link",lines:[1,t.split(`
1
+ import p from"node:path";import _ from"is-glob";import{slash as $}from"../../../../utils/path/slash.js";import{reporter as d}from"../../../tools/notifiers/reporter.js";import{convertGlobToRegex as h}from"../../../utils/index.js";import{formatMarkdocError as k}from"../errors.js";import{isPartial as E}from"../is-partial.js";const b=/\{\% ?raw-partial file="([^"]+)" ?\/?\%\}/gm,y=async(t,a,i=[],o,l=[a])=>{for(const s of i){const r=_(s)?h(s):new RegExp(`^${s}/`);await o.fs.scan(r)}const n=[],f=t.replace(b,(s,r)=>(n.push(u(s,r)),"_$redocly$"+(n.length-1)+"$")),w=await Promise.all(n);return f.replace(/_\$redocly\$(\d+)\$/g,(s,r)=>w[+r]);async function u(s,r){const e=r.startsWith("/")?r.slice(1):$(p.relative(o.fs.cwd,p.resolve(o.fs.cwd,p.dirname(a),r)));if(l.includes(e)){const c=[...l,e];return await d.panicOnBuildContentError(`Circular reference chain detected when processing raw partials: ${c.map(()=>"%rp").join(" -> ")}`,...c),""}const m=!o.fs.exists(e),g=!e.endsWith(".md")||await o.isPathIgnored(e)||!E(e,i);if(m||g){const R={type:"resolve_link",lines:[1,t.split(`
2
2
  `).length],meta:{rawLink:r,link:e},error:{id:"error",level:"error",message:m?"Raw partial file does not exist":"Could not resolve raw partial. Starting with 0.73.0 version all partials should be placed in partials folders"}};return d.reportMarkdocProblem(k(R,a,t)),""}const v=await o.fs.read(e);return await y(v,e,i,o,[...l,e])}};export{y as resolveRawPartials};
@@ -3,6 +3,7 @@ import { openApiCodeSample } from './openapi-code-sample.js';
3
3
  import { openApiExample } from './openapi-example.js';
4
4
  import { replayOpenApi } from './replay-openapi.js';
5
5
  import { openApiResponseSample } from './openapi-response-sample.js';
6
+ import { jsonExample } from './json-example.js';
6
7
  declare const _default: {
7
8
  [jsonSchema.tagName]: import("@markdoc/markdoc").Schema & {
8
9
  dynamicComponentLib: string;
@@ -19,6 +20,9 @@ declare const _default: {
19
20
  [openApiResponseSample.tagName]: import("@markdoc/markdoc").Schema & {
20
21
  dynamicComponentLib: string;
21
22
  };
23
+ [jsonExample.tagName]: import("@markdoc/markdoc").Schema & {
24
+ dynamicComponentLib: string;
25
+ };
22
26
  };
23
27
  export default _default;
24
28
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- import{jsonSchema as e}from"./json-schema.js";import{openApiCodeSample as m}from"./openapi-code-sample.js";import{openApiExample as a}from"./openapi-example.js";import{replayOpenApi as p}from"./replay-openapi.js";import{openApiResponseSample as o}from"./openapi-response-sample.js";var f={[e.tagName]:e.schema,[m.tagName]:m.schema,[a.tagName]:a.schema,[p.tagName]:p.schema,[o.tagName]:o.schema};export{f as default};
1
+ import{jsonSchema as m}from"./json-schema.js";import{openApiCodeSample as e}from"./openapi-code-sample.js";import{openApiExample as a}from"./openapi-example.js";import{replayOpenApi as p}from"./replay-openapi.js";import{openApiResponseSample as o}from"./openapi-response-sample.js";import{jsonExample as r}from"./json-example.js";var n={[m.tagName]:m.schema,[e.tagName]:e.schema,[a.tagName]:a.schema,[p.tagName]:p.schema,[o.tagName]:o.schema,[r.tagName]:r.schema};export{n as default};
@@ -0,0 +1,3 @@
1
+ import type { CustomMarkdocTag } from '../../../../types';
2
+ export declare const jsonExample: CustomMarkdocTag;
3
+ //# sourceMappingURL=json-example.d.ts.map
@@ -0,0 +1 @@
1
+ import l from"@markdoc/markdoc";import{SampleFromJsonSchema as m,JsonExampleRef as n}from"../attributes/index.js";const v={schema:{attributes:{value:{type:n,required:!1},schema:{type:m,required:!1},mode:{type:String,matches:["read","write"],required:!1},title:{type:String,required:!1},valueResolved:{required:!1},valueResolvedErrors:{type:Array,default:[]},schemaResolved:{required:!1},schemaResolvedErrors:{type:Array,default:[]}},render:"JsonExample",selfClosing:!0,dynamicComponentLib:"openapi",transform:(e,r)=>{const o=e.transformAttributes(r),{valueResolved:a,schemaResolved:u,schemaResolvedErrors:i,valueResolvedErrors:t,title:s}=o;return a||t.length?new l.Tag("JsonExample",{title:s,json:a,errors:t}):new l.Tag("JsonExample",{title:s,json:u,errors:i})},validate(e){const r=[];return e.attributes.schema&&e.attributes.value&&r.push({id:"schema-and-value-attributes-are-mutually-exclusive",level:"error",message:'The "schema" and "value" attributes are mutually exclusive, you can only use one.'}),!e.attributes.schema&&!e.attributes.value&&r.push({id:"schema-or-value-attribute-required",level:"error",message:'This tag requires the "schema" or "value" attribute to render correctly.'}),r}},tagName:"json-example"};export{v as jsonExample};
@@ -1 +1 @@
1
- import A from"path";import{REDOCLY_TEAMS_RBAC as m,REDOCLY_ROUTE_RBAC as y}from"@redocly/config";import{removeTrailingSlash as R}from"../../../utils/url/remove-trailing-slash.js";import{addLeadingSlash as S}from"../../../utils/url/add-leading-slash.js";import{resolveFrontmatterKeys as P}from"../resolve-frontmatter-keys.js";import{resolveItem as T}from"../nav-utils.js";const C=new WeakMap;async function _(l,i,s,e,a){const o=await s.getConfig(),{ast:d,compoundHash:n,info:c}=await a.parseMarkdoc(l,s),g={...o.markdown?.editPage,...e.markdown?.editPage},t=i.fsPath!=null?await s.fs.getFileInfo(i.fsPath):null,f=!g?.hide&&g?.baseUrl?{to:R(g.baseUrl)+S(t?.realRelativePath||i.fsPath||"")}:void 0,k={...o.feedback,...e.feedback},u=e.feedback?{type:k.type||"sentiment",settings:k.settings||{},hide:e.feedback?.hide}:void 0;let w=C.get(d),r=w?.ast;(!r||w?.compoundHash!==n)&&(r=JSON.stringify(d),C.set(d,{ast:r,compoundHash:n}));let h;e.navigation&&(h={...e.navigation,nextButton:await L(e.navigation.nextButton,i,a,s),previousButton:await L(e.navigation.previousButton,i,a,s)});const p=e?.seo?await P(e.seo,["image"],i.fsPath||"",a,s):void 0,v=c.tagList;Array.isArray(v)&&v.includes("code-walkthrough")&&(e.markdown=e.markdown||{},e.markdown.toc={hide:!0},e.footer=e.footer||{},e.footer={hide:!0});const b=e?.seo?.title||await i.getNavText?.();return{ast:r,frontmatter:await P({...e,...u!==void 0?{feedback:u}:{},...p!==void 0?{seo:p}:{},...h!==void 0?{navigation:h}:{}},o.markdown?.frontMatterKeysToResolve||["image","links"],i.fsPath||"",a,s),editPage:f,props:{metadata:{markdoc:{tagList:c.tagList}},seo:{...p,...b?{title:b}:{}}},[m]:i[m],[y]:i[y]}}async function L(l,i,s,e){if(!l||typeof l!="object")return;let a=l,o,d;if("page"in a&&typeof a.page=="string"){const{page:t,...f}=a;a=f,o=t}if("label"in a&&typeof a.label=="string"){const{label:t,...f}=a;a=f,d=t}let n;if(o){const t=await T({page:o},i.fsPath?A.dirname(i.fsPath):".",s,e,{navFile:i.fsPath||""});n=Array.isArray(t)?t[0]:t,n=n?.type!=="error"?n:void 0}const c=n?.routeSlug,g=d??n?.label;return{...a,label:g,link:c}}export{_ as markdownStaticDataLoader};
1
+ import A from"path";import{REDOCLY_TEAMS_RBAC as m,REDOCLY_ROUTE_RBAC as y}from"@redocly/config";import{removeTrailingSlash as R}from"../../../utils/url/remove-trailing-slash.js";import{addLeadingSlash as S}from"../../../utils/url/add-leading-slash.js";import{resolveFrontmatterKeys as P}from"../resolve-frontmatter-keys.js";import{resolveItem as T}from"../nav-utils.js";const C=new WeakMap;async function _(l,i,s,e,a){const o=await s.getConfig(),{ast:d,compoundHash:n,info:c}=await a.parseMarkdoc(l,s),g={...o.markdown?.editPage,...e.markdown?.editPage},t=i.fsPath!=null?s.fs.getFileInfo(i.fsPath):null,f=!g?.hide&&g?.baseUrl?{to:R(g.baseUrl)+S(t?.realRelativePath||i.fsPath||"")}:void 0,k={...o.feedback,...e.feedback},u=e.feedback?{type:k.type||"sentiment",settings:k.settings||{},hide:e.feedback?.hide}:void 0;let w=C.get(d),r=w?.ast;(!r||w?.compoundHash!==n)&&(r=JSON.stringify(d),C.set(d,{ast:r,compoundHash:n}));let h;e.navigation&&(h={...e.navigation,nextButton:await L(e.navigation.nextButton,i,a,s),previousButton:await L(e.navigation.previousButton,i,a,s)});const p=e?.seo?await P(e.seo,["image"],i.fsPath||"",a,s):void 0,v=c.tagList;Array.isArray(v)&&v.includes("code-walkthrough")&&(e.markdown=e.markdown||{},e.markdown.toc={hide:!0},e.footer=e.footer||{},e.footer={hide:!0});const b=e?.seo?.title||await i.getNavText?.();return{ast:r,frontmatter:await P({...e,...u!==void 0?{feedback:u}:{},...p!==void 0?{seo:p}:{},...h!==void 0?{navigation:h}:{}},o.markdown?.frontMatterKeysToResolve||["image","links"],i.fsPath||"",a,s),editPage:f,props:{metadata:{markdoc:{tagList:c.tagList}},seo:{...p,...b?{title:b}:{}}},[m]:i[m],[y]:i[y]}}async function L(l,i,s,e){if(!l||typeof l!="object")return;let a=l,o,d;if("page"in a&&typeof a.page=="string"){const{page:t,...f}=a;a=f,o=t}if("label"in a&&typeof a.label=="string"){const{label:t,...f}=a;a=f,d=t}let n;if(o){const t=await T({page:o},i.fsPath?A.dirname(i.fsPath):".",s,e,{navFile:i.fsPath||""});n=Array.isArray(t)?t[0]:t,n=n?.type!=="error"?n:void 0}const c=n?.routeSlug,g=d??n?.label;return{...a,label:g,link:c}}export{_ as markdownStaticDataLoader};
@@ -1,5 +1,5 @@
1
1
  import type { ApiFunctionsContext, ApiFunctionsUser } from '@redocly/config';
2
- export declare function shouldHandleMcpAuth(context: ApiFunctionsContext): boolean;
2
+ export declare function shouldHandleMcpAuth(requiresLogin: boolean, rbacConfig?: Record<string, unknown>): boolean;
3
3
  export declare function handleMcpAuth(request: Request, context: ApiFunctionsContext): Promise<{
4
4
  isAuthenticated: boolean;
5
5
  isTokenValid?: boolean;
@@ -1 +1 @@
1
- import{extractTokenFromAuthHeader as u}from"../utils/jwt.js";import{getUserParamsFromCookies as d}from"../../../web-server/auth.js";import{DEFAULT_ANONYMOUS_VISITOR_TEAM as s,RBAC_ALL_OTHER_TEAMS as a}from"../../../../constants/common.js";function c(e){return!e||typeof e!="object"||Object.keys(e).length===0?!1:!(e[s]&&e[s]!=="none"||e[a]&&e[a]!=="none")}function p(e){const o=!!e?.config?.requiresLogin,r=e?.config?.rbac;if(!r||Object.keys(r).length===0)return o;const t=r.content;if(t&&Object.keys(t).length>0&&Object.values(t).some(c))return!0;const i=r.teamFoldersBaseRoles;return c(i)?!0:o}async function g(e,o){const r=e.headers.get("Authorization");if(!r)return{isAuthenticated:!1};const t=u(r),i=o?.config?.ssoDirect||{},n=t?await d(i,{authorization:t,idp_access_token:t}):{};return t&&n&&n.isAuthenticated?{isAuthenticated:!0,isTokenValid:!0,currentUser:{teams:n.teams||[],email:n.email||"",claims:n,isAuthenticated:!0,idpAccessToken:n.idpAccessToken||void 0,idpId:n.idpId||void 0}}:{isAuthenticated:!1,isTokenValid:!1}}function m(e){return new Response(JSON.stringify({error:"unauthorized",message:"Authentication required"}),{status:401,headers:{"Content-Type":"application/json","WWW-Authenticate":`Bearer realm="${e}/.well-known/oauth-protected-resource/mcp"`,"Access-Control-Allow-Origin":"*"}})}function k(){return new Response(JSON.stringify({error:"invalid_token",message:"Invalid or expired token"}),{status:401,headers:{"Content-Type":"application/json","WWW-Authenticate":'Bearer error="invalid_token", error_description="Invalid or expired token"',"Access-Control-Allow-Origin":"*"}})}export{k as constructInvalidTokenResponse,m as constructUnauthorizedResponse,g as handleMcpAuth,p as shouldHandleMcpAuth};
1
+ import{extractTokenFromAuthHeader as u}from"../utils/jwt.js";import{getUserParamsFromCookies as d}from"../../../web-server/auth.js";import{DEFAULT_ANONYMOUS_VISITOR_TEAM as i,RBAC_ALL_OTHER_TEAMS as a}from"../../../../constants/common.js";function c(e){return!e||typeof e!="object"||Object.keys(e).length===0?!1:!(e[i]&&e[i]!=="none"||e[a]&&e[a]!=="none")}function p(e,t){if(!t||Object.keys(t).length===0)return e;const r=t.content;if(r&&Object.keys(r).length>0&&Object.values(r).some(c))return!0;const o=t.teamFoldersBaseRoles;return c(o)?!0:e}async function m(e,t){const r=e.headers.get("Authorization");if(!r)return{isAuthenticated:!1};const o=u(r),s=t?.config?.ssoDirect||{},n=o?await d(s,{authorization:o,idp_access_token:o}):{};return o&&n&&n.isAuthenticated?{isAuthenticated:!0,isTokenValid:!0,currentUser:{teams:n.teams||[],email:n.email||"",claims:n,isAuthenticated:!0,idpAccessToken:n.idpAccessToken||void 0,idpId:n.idpId||void 0}}:{isAuthenticated:!1,isTokenValid:!1}}function k(e){return new Response(JSON.stringify({error:"unauthorized",message:"Authentication required"}),{status:401,headers:{"Content-Type":"application/json","WWW-Authenticate":`Bearer realm="${e}/.well-known/oauth-protected-resource/mcp"`,"Access-Control-Allow-Origin":"*"}})}function T(){return new Response(JSON.stringify({error:"invalid_token",message:"Invalid or expired token"}),{status:401,headers:{"Content-Type":"application/json","WWW-Authenticate":'Bearer error="invalid_token", error_description="Invalid or expired token"',"Access-Control-Allow-Origin":"*"}})}export{T as constructInvalidTokenResponse,k as constructUnauthorizedResponse,m as handleMcpAuth,p as shouldHandleMcpAuth};
@@ -1,4 +1,9 @@
1
1
  import type { McpServer } from '@redocly/mcp-typescript-sdk/server/mcp.js';
2
- import type { OpenAPIDefinition } from '@redocly/openapi-docs/lib/types/open-api.js';
3
- export declare function registerGetEndpointTools(server: McpServer, definitions: OpenAPIDefinition[]): void;
2
+ import type { AccessInfo, ApiDescriptionInfo } from '../../types.js';
3
+ export declare function registerGetEndpointTools({ server, apiDescriptionsMap, outdir, accessInfo, }: {
4
+ server: McpServer;
5
+ apiDescriptionsMap: Record<string, ApiDescriptionInfo>;
6
+ outdir: string;
7
+ accessInfo: AccessInfo;
8
+ }): void;
4
9
  //# sourceMappingURL=get-endpoint-info.d.ts.map
@@ -1 +1 @@
1
- import{findDefinitionByName as h,resolveParameters as T,resolveRequestBody as g,resolveResponses as P}from"../utils.js";import{checkEndpointAndDeleteXMcp as v}from"../../utils/xmcp-utils.js";import{telemetry as a}from"../../../../telemetry/index.js";const s="get-endpoint-info",c=["GET","POST","PUT","DELETE","PATCH","OPTIONS","HEAD","TRACE"],O={type:"object",required:["name","path","method"],additionalProperties:!1,properties:{name:{type:"string",description:"API name (or part of it)",minLength:1},path:{type:"string",description:"Endpoint path (e.g. /api/v1/users)",minLength:1},method:{type:"string",description:"HTTP method (GET, POST, PUT, DELETE, etc.)",enum:[...c,...c.map(n=>n.toLowerCase())],minLength:1}}};function M(n,d){n.tool(s,"Get comprehensive information about specific endpoint including parameters, security, and examples",O,async({name:i,path:o,method:p})=>{try{const e=h(d,i),m=o.startsWith("/")?o:`/${o}`;if(!e)return{content:[{type:"text",text:`No APIs found matching "${i}"`}]};const{title:l=""}=e.info||{},r=e.paths?.[m],u=p.toLowerCase();if(!r)return{content:[{type:"text",text:"Endpoint not found"}],isError:!0};const t=r[u];if(!t||!v(t,"docs"))return{content:[{type:"text",text:"Endpoint not found"}],isError:!0};const y=r?.parameters||[],E=t.parameters||[],f={...t,parameters:T({pathParams:y,opParams:E,definition:e}),requestBody:g(t.requestBody,e),responses:P(t.responses,e)};return a.sendMcpToolCalledMessage({server_type:"docs",tool:s}),{content:[{type:"text",text:JSON.stringify({api:l,version:e.info?.version||"",servers:e.servers||[],endpoint:{path:o,method:p.toUpperCase(),...f},globalSecurity:e.security||[],securitySchemes:e.components?.securitySchemes||[]},null,2)}]}}catch(e){throw a.sendMcpErrorMessage({server_type:"docs",tool:s,message:e?.message||"",stack:e?.stack||""}),e}})}export{M as registerGetEndpointTools};
1
+ import{findApiDescriptionByName as P,resolveParameters as v,resolveRequestBody as x,resolveResponses as O}from"../utils.js";import{checkEndpointAndDeleteXMcp as S}from"../../utils/xmcp-utils.js";import{telemetry as c}from"../../../../telemetry/index.js";import{getApiDescriptionFromFs as A}from"./utils.js";const p="get-endpoint-info",d=["GET","POST","PUT","DELETE","PATCH","OPTIONS","HEAD","TRACE"],L={type:"object",required:["name","path","method"],additionalProperties:!1,properties:{name:{type:"string",description:"API name (or part of it)",minLength:1},path:{type:"string",description:"Endpoint path (e.g. /api/v1/users)",minLength:1},method:{type:"string",description:"HTTP method (GET, POST, PUT, DELETE, etc.)",enum:[...d,...d.map(n=>n.toLowerCase())],minLength:1}}};function N({server:n,apiDescriptionsMap:m,outdir:l,accessInfo:u}){n.tool(p,"Get comprehensive information about specific endpoint including parameters, security, and examples",L,async({name:s,path:r,method:a})=>{try{const t=P(m,s);if(!t)return{content:[{type:"text",text:`No API found matching "${s}".`}]};const e=await A({relativePath:t?.relativePath||"",outdir:l,accessInfo:u});if(!e)return{content:[{type:"text",text:`Spec not found from the file system with "${s}".`}]};const f=r.startsWith("/")?r:`/${r}`,{title:y=""}=e.info||{},i=e.paths?.[f],h=a.toLowerCase();if(!i)return{content:[{type:"text",text:"Endpoint not found"}],isError:!0};const o=i[h];if(!o||!S(o,"docs"))return{content:[{type:"text",text:"Endpoint not found"}],isError:!0};const E=i?.parameters||[],T=o.parameters||[],g={...o,parameters:v({pathParams:E,opParams:T,definition:e}),requestBody:x(o.requestBody,e),responses:O(o.responses,e)};return c.sendMcpToolCalledMessage({server_type:"docs",tool:p}),{content:[{type:"text",text:JSON.stringify({api:y,version:e.info?.version||"",servers:e.servers||[],endpoint:{path:r,method:a.toUpperCase(),...g},globalSecurity:e.security||[],securitySchemes:e.components?.securitySchemes||[]},null,2)}]}}catch(t){throw c.sendMcpErrorMessage({server_type:"docs",tool:p,message:t?.message||"",stack:t?.stack||""}),t}})}export{N as registerGetEndpointTools};
@@ -1,4 +1,9 @@
1
1
  import type { McpServer } from '@redocly/mcp-typescript-sdk/server/mcp.js';
2
- import type { OpenAPIDefinition } from '@redocly/openapi-docs/lib/types/open-api.js';
3
- export declare function registerGetEndpointsTools(server: McpServer, definitions: OpenAPIDefinition[]): void;
2
+ import type { AccessInfo, ApiDescriptionInfo } from '../../types.js';
3
+ export declare function registerGetEndpointsTools({ server, apiDescriptionsMap, outdir, accessInfo, }: {
4
+ server: McpServer;
5
+ apiDescriptionsMap: Record<string, ApiDescriptionInfo>;
6
+ outdir: string;
7
+ accessInfo: AccessInfo;
8
+ }): void;
4
9
  //# sourceMappingURL=get-endpoints.d.ts.map
@@ -1 +1 @@
1
- import{findDefinitionByName as p}from"../utils.js";import{getEndpointsFromPaths as c}from"./utils.js";import{telemetry as r}from"../../../../telemetry/index.js";const e="get-endpoints",a={type:"object",required:["name"],additionalProperties:!1,properties:{name:{type:"string",description:"API name (or part of it)",minLength:1}}};function m(s,i){s.tool(e,"Get all endpoints for a specific API",a,async({name:o})=>{try{const t=p(i,o);if(!t)return{content:[{type:"text",text:`No APIs found matching "${o}"`}]};const n=c(t);return n.length===0?{content:[{type:"text",text:"No endpoints found"}]}:(r.sendMcpToolCalledMessage({server_type:"docs",tool:e}),{content:[{type:"text",text:JSON.stringify({api:t.info?.title||"",version:t.info?.version||"",servers:t.servers||[],endpoints:n},null,2)}]})}catch(t){throw r.sendMcpErrorMessage({server_type:"docs",tool:e,message:t?.message||"",stack:t?.stack||""}),t}})}export{m as registerGetEndpointsTools};
1
+ import{findApiDescriptionByName as f}from"../utils.js";import{getApiDescriptionFromFs as d,getEndpointsFromPaths as l}from"./utils.js";import{telemetry as i}from"../../../../telemetry/index.js";const n="get-endpoints",m={type:"object",required:["name"],additionalProperties:!1,properties:{name:{type:"string",description:"API name (or part of it)",minLength:1}}};function u({server:s,apiDescriptionsMap:p,outdir:c,accessInfo:a}){s.tool(n,"Get all endpoints for a specific API",m,async({name:o})=>{try{const t=f(p,o);if(!t)return{content:[{type:"text",text:`No API found matching "${o}".`}]};const e=await d({relativePath:t?.relativePath||"",outdir:c,accessInfo:a});if(!e)return{content:[{type:"text",text:`Spec not found from the file system with "${o}".`}]};const r=l(e);return r.length===0?{content:[{type:"text",text:"No endpoints found"}]}:(i.sendMcpToolCalledMessage({server_type:"docs",tool:n}),{content:[{type:"text",text:JSON.stringify({api:e.info?.title||"",version:e.info?.version||"",servers:e.servers||[],endpoints:r},null,2)}]})}catch(t){throw i.sendMcpErrorMessage({server_type:"docs",tool:n,message:t?.message||"",stack:t?.stack||""}),t}})}export{u as registerGetEndpointsTools};
@@ -1,4 +1,9 @@
1
- import type { OpenAPIDefinition } from '@redocly/openapi-docs';
2
1
  import type { McpServer } from '@redocly/mcp-typescript-sdk/server/mcp.js';
3
- export declare function registerGetFullApiDescriptionTools(server: McpServer, definitions: OpenAPIDefinition[]): void;
2
+ import type { AccessInfo, ApiDescriptionInfo } from '../../types.js';
3
+ export declare function registerGetFullApiDescriptionTools({ server, apiDescriptionsMap, outdir, accessInfo, }: {
4
+ server: McpServer;
5
+ apiDescriptionsMap: Record<string, ApiDescriptionInfo>;
6
+ outdir: string;
7
+ accessInfo: AccessInfo;
8
+ }): void;
4
9
  //# sourceMappingURL=get-full-api-description.d.ts.map
@@ -1 +1 @@
1
- import{findDefinitionByName as s}from"../utils.js";import{telemetry as r}from"../../../../telemetry/index.js";const t="get-full-api-description",p={type:"object",required:["name"],additionalProperties:!1,properties:{name:{type:"string",description:"API name (or part of it)",minLength:1}}};function l(i,n){i.tool(t,"Get the complete OpenAPI description",p,async({name:o})=>{try{const e=s(n,o);return e?(r.sendMcpToolCalledMessage({server_type:"docs",tool:t}),{content:[{type:"text",text:JSON.stringify({api:e.info?.title||"",version:e.info?.version||"",definition:e},null,2)}]}):{content:[{type:"text",text:`No APIs found matching "${o}"`}]}}catch(e){throw r.sendMcpErrorMessage({server_type:"docs",tool:t,message:e?.message||"",stack:e?.stack||""}),e}})}export{l as registerGetFullApiDescriptionTools};
1
+ import{findApiDescriptionByName as a}from"../utils.js";import{telemetry as r}from"../../../../telemetry/index.js";import{getApiDescriptionFromFs as l}from"./utils.js";const i="get-full-api-description",f={type:"object",required:["name"],additionalProperties:!1,properties:{name:{type:"string",description:"API name (or part of it)",minLength:1}}};function g({server:n,apiDescriptionsMap:s,outdir:p,accessInfo:c}){n.tool(i,"Get the complete OpenAPI description",f,async({name:o})=>{try{const t=a(s,o);if(!t)return{content:[{type:"text",text:`No API found matching "${o}".`}]};const e=await l({relativePath:t?.relativePath||"",outdir:p,accessInfo:c});return e?(r.sendMcpToolCalledMessage({server_type:"docs",tool:i}),{content:[{type:"text",text:JSON.stringify({api:e.info?.title||"",version:e.info?.version||"",definition:e},null,2)}]}):{content:[{type:"text",text:`Spec not found from the file system with "${o}".`}]}}catch(t){throw r.sendMcpErrorMessage({server_type:"docs",tool:i,message:t?.message||"",stack:t?.stack||""}),t}})}export{g as registerGetFullApiDescriptionTools};
@@ -1,4 +1,9 @@
1
- import type { OpenAPIDefinition } from '@redocly/openapi-docs';
2
1
  import type { McpServer } from '@redocly/mcp-typescript-sdk/server/mcp.js';
3
- export declare function registerGetSecuritySchemesTools(server: McpServer, definitions: OpenAPIDefinition[]): void;
2
+ import type { AccessInfo, ApiDescriptionInfo } from '../../types.js';
3
+ export declare function registerGetSecuritySchemesTools({ server, apiDescriptionsMap, outdir, accessInfo, }: {
4
+ server: McpServer;
5
+ apiDescriptionsMap: Record<string, ApiDescriptionInfo>;
6
+ outdir: string;
7
+ accessInfo: AccessInfo;
8
+ }): void;
4
9
  //# sourceMappingURL=get-security-schemes.d.ts.map
@@ -1 +1 @@
1
- import{findDefinitionByName as n}from"../utils";import{telemetry as r}from"../../../../telemetry/index.js";const t="get-security-schemes",c={type:"object",required:["name"],additionalProperties:!1,properties:{name:{type:"string",description:"API name (or part of it)",minLength:1}}};function p(o,i){o.tool(t,"Get the security schemes for a specific API",c,async({name:s})=>{try{const e=n(i,s);return e?(r.sendMcpToolCalledMessage({server_type:"docs",tool:t}),{content:[{type:"text",text:JSON.stringify({name:e.info?.title,version:e.info?.version,securitySchemes:e.components?.securitySchemes||[],security:e.security||[]},null,2)}]}):{content:[{type:"text",text:`No APIs found matching "${s}"`}]}}catch(e){throw r.sendMcpErrorMessage({server_type:"docs",tool:t,message:e?.message||"",stack:e?.stack||""}),e}})}export{p as registerGetSecuritySchemesTools};
1
+ import{findApiDescriptionByName as a}from"../utils";import{telemetry as i}from"../../../../telemetry/index.js";import{getApiDescriptionFromFs as m}from"./utils.js";const o="get-security-schemes",y={type:"object",required:["name"],additionalProperties:!1,properties:{name:{type:"string",description:"API name (or part of it)",minLength:1}}};function h({server:s,apiDescriptionsMap:n,outdir:c,accessInfo:p}){s.tool(o,"Get the security schemes for a specific API",y,async({name:r})=>{try{const e=a(n,r);if(!e)return{content:[{type:"text",text:`No API found matching "${r}".`}]};const t=await m({relativePath:e?.relativePath||"",outdir:c,accessInfo:p});return t?(i.sendMcpToolCalledMessage({server_type:"docs",tool:o}),{content:[{type:"text",text:JSON.stringify({name:t.info?.title,version:t.info?.version,securitySchemes:t.components?.securitySchemes||[],security:t.security||[]},null,2)}]}):{content:[{type:"text",text:`Spec not found from the file system with "${r}".`}]}}catch(e){throw i.sendMcpErrorMessage({server_type:"docs",tool:o,message:e?.message||"",stack:e?.stack||""}),e}})}export{h as registerGetSecuritySchemesTools};
@@ -1,13 +1,14 @@
1
1
  import type { McpServer } from '@redocly/mcp-typescript-sdk/server/mcp.js';
2
- import type { OpenAPIDefinition } from '@redocly/openapi-docs/lib/types/open-api.js';
2
+ import type { AccessInfo, ApiDescriptionInfo } from '../../types.js';
3
3
  /**
4
4
  * Registers all tools with the MCP server
5
5
  */
6
- export declare function registerDocsTools({ server, definitions, baseUrl, outdir, headers, }: {
6
+ export declare function registerDocsTools({ server, baseUrl, outdir, apiDescriptionsMap, headers, accessInfo, }: {
7
7
  server: McpServer;
8
- definitions: OpenAPIDefinition[];
9
8
  baseUrl: string;
10
9
  outdir: string;
10
+ apiDescriptionsMap: Record<string, ApiDescriptionInfo>;
11
+ accessInfo: AccessInfo;
11
12
  headers?: Record<string, string | string[] | undefined>;
12
13
  }): void;
13
14
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- import{registerListApisTools as i}from"./list-apis.js";import{registerGetEndpointsTools as l}from"./get-endpoints.js";import{registerGetEndpointTools as s}from"./get-endpoint-info.js";import{registerGetSecuritySchemesTools as e}from"./get-security-schemes.js";import{registerGetFullApiDescriptionTools as g}from"./get-full-api-description.js";import{registerSearchTool as T}from"./search.js";import{registerWhoAmITool as c}from"./whoami.js";function E({server:o,definitions:t,baseUrl:m,outdir:p,headers:r}){c(o,r),i(o,t),l(o,t),s(o,t),e(o,t),g(o,t),T(o,m,p,r)}export{E as registerDocsTools};
1
+ import{registerListApisTools as g}from"./list-apis.js";import{registerGetEndpointsTools as T}from"./get-endpoints.js";import{registerGetEndpointTools as e}from"./get-endpoint-info.js";import{registerGetSecuritySchemesTools as f}from"./get-security-schemes.js";import{registerGetFullApiDescriptionTools as h}from"./get-full-api-description.js";import{registerSearchTool as A}from"./search.js";import{registerWhoAmITool as G}from"./whoami.js";import{shouldHandleMcpAuth as p}from"../../auth/auth-handlers.js";function F({server:o,baseUrl:l,outdir:m,apiDescriptionsMap:r,headers:i,accessInfo:t}){p(t.requiresLogin,t.rbac)&&G(o,i),g({server:o,apiDescriptionsMap:r}),T({server:o,apiDescriptionsMap:r,outdir:m,accessInfo:t}),e({server:o,apiDescriptionsMap:r,outdir:m,accessInfo:t}),f({server:o,apiDescriptionsMap:r,outdir:m,accessInfo:t}),h({server:o,apiDescriptionsMap:r,outdir:m,accessInfo:t}),A(o,l,m,i)}export{F as registerDocsTools};
@@ -1,4 +1,7 @@
1
- import type { OpenAPIDefinition } from '@redocly/openapi-docs';
2
1
  import type { McpServer } from '@redocly/mcp-typescript-sdk/server/mcp.js';
3
- export declare function registerListApisTools(server: McpServer, definitions: OpenAPIDefinition[]): void;
2
+ import type { ApiDescriptionInfo } from '../../types.js';
3
+ export declare function registerListApisTools({ server, apiDescriptionsMap, }: {
4
+ server: McpServer;
5
+ apiDescriptionsMap: Record<string, ApiDescriptionInfo>;
6
+ }): void;
4
7
  //# sourceMappingURL=list-apis.d.ts.map
@@ -1 +1 @@
1
- import{findAllDefinitionsByName as p}from"../utils.js";import{telemetry as a}from"../../../../telemetry/index.js";const r="list-apis",n={type:"object",required:[],additionalProperties:!1,properties:{name:{type:"string",description:"API name (or part of it)",nullable:!0}}};function y(l,o){l.tool(r,"Lists available APIs with their context and purpose",n,async({name:s})=>{try{let e=o;return s&&s!=="null"&&(e=p(o,s)),e.length===0?{content:[{type:"text",text:s?`No APIs found matching "${s}"`:"No APIs available"}]}:(a.sendMcpToolCalledMessage({server_type:"docs",tool:r}),{content:e.map(t=>({type:"text",text:JSON.stringify({name:t.info?.title||"",description:t.info?.description||"",version:t.info?.version||"",paths:Object.keys(t.paths||{}).length,schemas:Object.keys(t.components?.schemas||{}).length,servers:t.servers||[]},null,2)}))})}catch(e){throw a.sendMcpErrorMessage({server_type:"docs",tool:r,message:e?.message||"",stack:e?.stack||""}),e}})}export{y as registerListApisTools};
1
+ import{telemetry as a}from"../../../../telemetry/index.js";import{filterApiDescriptionsByName as g}from"../utils.js";const r="list-apis",f={type:"object",additionalProperties:!1,required:[],properties:{filter:{type:"string",description:"API name (or part of it)",minLength:1},page:{type:"number",description:"Page number",minimum:1,default:1},limit:{type:"number",description:"Number of APIs per page. Default is 300",minimum:1,default:300}}};function b({server:p,apiDescriptionsMap:c}){p.tool(r,"Lists available APIs with their context and purpose",f,async({filter:o,page:i=1,limit:t=300})=>{let e=Object.values(c);o&&(e=g(e,o));const n=(i-1)*t,l=n+t,m=Math.ceil(e.length/t),d=e.length;e=e.slice(n,l);try{return e.length===0?{content:[{type:"text",text:"No APIs available"}]}:(a.sendMcpToolCalledMessage({server_type:"docs",tool:r}),{content:[{type:"text",text:JSON.stringify({items:e.map(({relativePath:s,...u})=>u),limit:t,total:d,page:i,totalPages:m})}]})}catch(s){throw a.sendMcpErrorMessage({server_type:"docs",tool:r,message:s?.message||"",stack:s?.stack||""}),s}})}export{b as registerListApisTools};
@@ -1,10 +1,16 @@
1
1
  import type { OpenAPIDefinition, OpenAPIOperation } from '@redocly/openapi-docs';
2
2
  import type { SearchItemData } from '@redocly/theme/core/types';
3
+ import type { AccessInfo } from '../../types';
3
4
  type EndpointInfo = Pick<OpenAPIOperation, 'summary' | 'description' | 'security'> & {
4
5
  method: string;
5
6
  path: string;
6
7
  };
7
8
  export declare function getEndpointsFromPaths(def: OpenAPIDefinition): EndpointInfo[];
8
9
  export declare function processDocuments(documents: Record<string, SearchItemData[]>, outdir: string): string;
10
+ export declare function getApiDescriptionFromFs({ relativePath, outdir, accessInfo: { isAuthenticated, email, teams, rbac, requiresLogin }, }: {
11
+ relativePath: string;
12
+ outdir: string;
13
+ accessInfo: AccessInfo;
14
+ }): Promise<OpenAPIDefinition | undefined>;
9
15
  export {};
10
16
  //# sourceMappingURL=utils.d.ts.map
@@ -1,11 +1,11 @@
1
- import u from"node:fs";import y from"node:path";import{checkEndpointAndDeleteXMcp as x}from"../../utils/xmcp-utils.js";import{MAX_DOCUMENTS_PER_CATEGORY as O}from"../../constants.js";function E(s){const{paths:c={}}=s,a=[];for(const[l,n]of Object.entries(c)){const f=!x(n,"docs");for(const[m,t]of Object.entries(n))f||!x(t,"docs")||a.push({path:l,method:m.toUpperCase(),summary:t.summary,description:t.description,security:t.security})}return a}function k(s,c){return Object.entries(s).map(([l,n])=>{if(!n||n.length===0)return"";const f=n.slice(0,O).map(m=>{const{document:t,highlight:p}=m,g=p?.title||(Array.isArray(t.title)?t.title[0]:t.title);let r=`Document: ${t.title}`;r+=`### [${g}](${t.url})
1
+ import y from"node:fs";import u from"node:path";import{existsSync as A}from"node:fs";import{readFile as O}from"node:fs/promises";import{replaceFileExtension as g}from"../../../../plugins/openapi-docs/store-definition-bundles";import{PUBLIC_API_DEFINITIONS_FOLDER as j}from"../../../../constants/common";import{filterDataByAccessDeep as F}from"../../../../utils/rbac";import{checkEndpointAndDeleteXMcp as D}from"../../utils/xmcp-utils.js";import{MAX_DOCUMENTS_PER_CATEGORY as C}from"../../constants.js";function T(i){const{paths:o={}}=i,s=[];for(const[c,n]of Object.entries(o)){const a=!D(n,"docs");for(const[f,t]of Object.entries(n))a||!D(t,"docs")||s.push({path:c,method:f.toUpperCase(),summary:t.summary,description:t.description,security:t.security})}return s}function M(i,o){return Object.entries(i).map(([c,n])=>{if(!n||n.length===0)return"";const a=n.slice(0,C).map(f=>{const{document:t,highlight:m}=f,d=m?.title||(Array.isArray(t.title)?t.title[0]:t.title);let r=`Document: ${t.title}`;r+=`### [${d}](${t.url})
2
2
 
3
- `;let i;if(t.url)try{let e=t.url.startsWith("/")?t.url.slice(1):t.url;const o=e.indexOf("#");o!==-1&&(e=e.substring(0,o));const d=y.extname(e);d&&(e=e.slice(0,-d.length));let A=e+".md";const h=y.join(c,A);u.existsSync(h)&&(i=u.readFileSync(h,"utf8"))}catch{}return i||(i=p?.text||(Array.isArray(t.text)?t.text[0]:t.text)),r+=i,t.facets&&(r+=`
3
+ `;let p;if(t.url)try{let e=t.url.startsWith("/")?t.url.slice(1):t.url;const l=e.indexOf("#");l!==-1&&(e=e.substring(0,l));const h=u.extname(e);h&&(e=e.slice(0,-h.length));let E=e+".md";const x=u.join(o,E);y.existsSync(x)&&(p=y.readFileSync(x,"utf8"))}catch{}return p||(p=m?.text||(Array.isArray(t.text)?t.text[0]:t.text)),r+=p,t.facets&&(r+=`
4
4
 
5
5
  **Categories:**
6
- `,Object.entries(t.facets).forEach(([e,o])=>{r+=`- ${e}: ${o}
7
- `})),r});return`## ${l}
6
+ `,Object.entries(t.facets).forEach(([e,l])=>{r+=`- ${e}: ${l}
7
+ `})),r});return`## ${c}
8
8
 
9
- ${f}`}).join(`
9
+ ${a}`}).join(`
10
10
 
11
- `).trim()}export{E as getEndpointsFromPaths,k as processDocuments};
11
+ `).trim()}async function R({relativePath:i,outdir:o,accessInfo:{isAuthenticated:s,email:c,teams:n,rbac:a={},requiresLogin:f=!1}}){const t=u.join(o||"",j,g(i,".json"));if(!A(t))return;const d=await O(t,"utf-8"),r=JSON.parse(d);return F(r,{isAuthenticated:s,email:c,teams:n},a,f)}export{R as getApiDescriptionFromFs,T as getEndpointsFromPaths,M as processDocuments};
@@ -1 +1 @@
1
- import{telemetry as r}from"../../../../telemetry/index";import{getUserInfoFromHeaders as s}from"../../utils/jwt";const t="whoami";function c(o,n){o.tool(t,"Get information about the currently authenticated user",()=>{try{const e=s(n||{});return e?(r.sendMcpToolCalledMessage({server_type:"docs",tool:t}),{content:[{type:"text",text:JSON.stringify({email:e.email,name:e.name,subject:e.sub,clientId:e.client_id,scope:e.scope,issuedAt:e.iat?new Date(e.iat*1e3).toISOString():void 0,expiresAt:e.exp?new Date(e.exp*1e3).toISOString():void 0})}],isError:!1}):{content:[{type:"text",text:JSON.stringify({error:"Not authenticated",message:"No valid authentication token found. Please authenticate first."})}],isError:!0}}catch(e){return r.sendMcpErrorMessage({server_type:"docs",tool:t,message:e?.message||"Failed to get user info",stack:e?.stack||""}),{content:[{type:"text",text:JSON.stringify({error:"Failed to get user info",details:e instanceof Error?e.message:String(e)})}],isError:!0}}})}export{c as registerWhoAmITool};
1
+ import{telemetry as r}from"../../../../telemetry/index";import{getUserInfoFromHeaders as s}from"../../utils/jwt";const t="whoami";function c(o,n){o.tool(t,"Get information about the currently authenticated user",()=>{try{const e=s(n||{});return r.sendMcpToolCalledMessage({server_type:"docs",tool:t}),e?{content:[{type:"text",text:JSON.stringify({email:e.email,name:e.name,subject:e.sub,clientId:e.client_id,scope:e.scope,issuedAt:e.iat?new Date(e.iat*1e3).toISOString():void 0,expiresAt:e.exp?new Date(e.exp*1e3).toISOString():void 0})}],isError:!1}:{content:[{type:"text",text:JSON.stringify({error:"Not authenticated",message:"No valid authentication token found. Please authenticate first."})}],isError:!0}}catch(e){return r.sendMcpErrorMessage({server_type:"docs",tool:t,message:e?.message||"Failed to get user info",stack:e?.stack||""}),{content:[{type:"text",text:JSON.stringify({error:"Failed to get user info",details:e instanceof Error?e.message:String(e)})}],isError:!0}}})}export{c as registerWhoAmITool};
@@ -1,7 +1,7 @@
1
1
  import type { OpenAPISchema, OpenAPIParameter, OpenAPIResponse, OpenAPIRequestBody, Referenced, OpenAPIDefinition } from '@redocly/openapi-docs/lib/types/open-api.js';
2
- import type { McpServerType } from '../types';
3
- export declare function findDefinitionByName(openapiDefinitions: OpenAPIDefinition[], name: string, serverType?: McpServerType): OpenAPIDefinition | undefined;
4
- export declare function findAllDefinitionsByName(openapiDefinitions: OpenAPIDefinition[], name: string, serverType?: McpServerType): OpenAPIDefinition[];
2
+ import type { ApiDescriptionInfo } from '../types.js';
3
+ export declare function findApiDescriptionByName(apiDescriptionsMap: Record<string, ApiDescriptionInfo>, name: string): ApiDescriptionInfo | undefined;
4
+ export declare function filterApiDescriptionsByName(apiDescriptionsMap: ApiDescriptionInfo[], filter: string): ApiDescriptionInfo[];
5
5
  export declare function resolveRef<T>(ref: string, def?: OpenAPIDefinition): T | undefined;
6
6
  type ResolveSchemaRefsParams = {
7
7
  schema: Referenced<OpenAPISchema> | undefined;
@@ -1 +1 @@
1
- import{isDefinitionHidden as $}from"../utils/xmcp-utils";function h(t,o,r="docs"){return t.find(({info:e})=>e?.title?.toLowerCase().includes(o.toLowerCase())&&!$(e,r))}function x(t,o,r="docs"){return t.filter(({info:e})=>e?.title?.toLowerCase().includes(o.toLowerCase())&&!$(e,r))}function d(t,o){if(!o||!t?.startsWith("#/"))return;const r=t.slice(2).split("/");let e=o;for(const s of r)if(typeof e=="object"&&e!==null&&s in e)e=e[s];else return;return e}function l({schema:t,definition:o,visitedRefs:r=new Set,maxDepth:e=50,currentDepth:s=0}){if(!t)return;if(s>=e)return{type:"object",description:`Maximum resolution depth exceeded (${e})`};if("$ref"in t&&t.$ref){if(r.has(t.$ref))return{type:"object",description:`Circular reference detected: ${t.$ref}`,"x-circular-ref":t.$ref};const f=new Set(r);f.add(t.$ref);const u=d(t.$ref,o);return u?l({schema:u,definition:o,visitedRefs:f,maxDepth:e,currentDepth:s+1}):{type:"object",description:`Could not resolve reference: ${t.$ref}`,"x-unresolved-ref":t.$ref}}const n={...t};if(n.properties){const f={};for(const[u,i]of Object.entries(n.properties)){const m=l({schema:i,definition:o,visitedRefs:new Set(r),maxDepth:e,currentDepth:s+1});f[u]=m||i}n.properties=f}if(n.items&&typeof n.items=="object")if(Array.isArray(n.items))n.items=n.items.map(f=>l({schema:f,definition:o,visitedRefs:new Set(r),maxDepth:e,currentDepth:s+1})||f);else{const f=l({schema:n.items,definition:o,visitedRefs:new Set(r),maxDepth:e,currentDepth:s+1});f&&(n.items=f)}return["allOf","anyOf","oneOf"].forEach(f=>{const u=n[f];Array.isArray(u)&&(n[f]=u.reduce((i,m)=>{const p=l({schema:m,definition:o,visitedRefs:new Set(r),maxDepth:e,currentDepth:s+1});return p&&i.push(p),i},[]))}),n}function w({pathParams:t,opParams:o,definition:r}){return[...t,...o].reduce((e,s)=>{if(!s)return e;if("$ref"in s&&s.$ref){const n=d(s.$ref,r);return n&&e.push({...n,schema:"schema"in n&&n.schema?l({schema:n.schema,definition:r}):void 0}),e}return e.push({...s,schema:"schema"in s&&s.schema?l({schema:s.schema,definition:r}):void 0}),e},[])}function a(t,o){const r={...t};if(t.example!==void 0&&(r.example=t.example),!t.examples)return r;const e={};for(const[s,n]of Object.entries(t.examples))if("$ref"in n){const c=d(n.$ref,o);c&&(e[s]=c)}else e[s]=n;return r.examples=e,r}function y(t,o){if(!t)return;const r="$ref"in t&&t.$ref?d(t.$ref,o):t;if(!r)return;const e={...r};if("content"in r&&r.content){const s={};for(const[n,c]of Object.entries(r.content))s[n]={...a(c,o),schema:c.schema?l({schema:c.schema,definition:o}):void 0};e.content=s}return e}function b(t,o){return Object.entries(t).reduce((r,[e,s])=>{const n="$ref"in s&&s.$ref?d(s.$ref,o):s;if(!n)return r;const c={...n};if("content"in n&&n.content){const f={};for(const[u,i]of Object.entries(n.content))f[u]={...a(i,o),schema:i.schema?l({schema:i.schema,definition:o}):void 0};c.content=f}return r[e]=c,r},{})}export{x as findAllDefinitionsByName,h as findDefinitionByName,w as resolveParameters,d as resolveRef,y as resolveRequestBody,b as resolveResponses,l as resolveSchemaRefs};
1
+ function a(e,o){if(o)return e[o.toLowerCase()]}function v(e,o){return Object.values(e).filter(({name:n})=>n.toLowerCase().includes(o.toLowerCase()))}function d(e,o){if(!o||!e?.startsWith("#/"))return;const n=e.slice(2).split("/");let t=o;for(const s of n)if(typeof t=="object"&&t!==null&&s in t)t=t[s];else return;return t}function l({schema:e,definition:o,visitedRefs:n=new Set,maxDepth:t=50,currentDepth:s=0}){if(!e)return;if(s>=t)return{type:"object",description:`Maximum resolution depth exceeded (${t})`};if("$ref"in e&&e.$ref){if(n.has(e.$ref))return{type:"object",description:`Circular reference detected: ${e.$ref}`,"x-circular-ref":e.$ref};const f=new Set(n);f.add(e.$ref);const u=d(e.$ref,o);return u?l({schema:u,definition:o,visitedRefs:f,maxDepth:t,currentDepth:s+1}):{type:"object",description:`Could not resolve reference: ${e.$ref}`,"x-unresolved-ref":e.$ref}}const r={...e};if(r.properties){const f={};for(const[u,i]of Object.entries(r.properties)){const p=l({schema:i,definition:o,visitedRefs:new Set(n),maxDepth:t,currentDepth:s+1});f[u]=p||i}r.properties=f}if(r.items&&typeof r.items=="object")if(Array.isArray(r.items))r.items=r.items.map(f=>l({schema:f,definition:o,visitedRefs:new Set(n),maxDepth:t,currentDepth:s+1})||f);else{const f=l({schema:r.items,definition:o,visitedRefs:new Set(n),maxDepth:t,currentDepth:s+1});f&&(r.items=f)}return["allOf","anyOf","oneOf"].forEach(f=>{const u=r[f];Array.isArray(u)&&(r[f]=u.reduce((i,p)=>{const m=l({schema:p,definition:o,visitedRefs:new Set(n),maxDepth:t,currentDepth:s+1});return m&&i.push(m),i},[]))}),r}function h({pathParams:e,opParams:o,definition:n}){return[...e,...o].reduce((t,s)=>{if(!s)return t;if("$ref"in s&&s.$ref){const r=d(s.$ref,n);return r&&t.push({...r,schema:"schema"in r&&r.schema?l({schema:r.schema,definition:n}):void 0}),t}return t.push({...s,schema:"schema"in s&&s.schema?l({schema:s.schema,definition:n}):void 0}),t},[])}function $(e,o){const n={...e};if(e.example!==void 0&&(n.example=e.example),!e.examples)return n;const t={};for(const[s,r]of Object.entries(e.examples))if("$ref"in r){const c=d(r.$ref,o);c&&(t[s]=c)}else t[s]=r;return n.examples=t,n}function x(e,o){if(!e)return;const n="$ref"in e&&e.$ref?d(e.$ref,o):e;if(!n)return;const t={...n};if("content"in n&&n.content){const s={};for(const[r,c]of Object.entries(n.content))s[r]={...$(c,o),schema:c.schema?l({schema:c.schema,definition:o}):void 0};t.content=s}return t}function w(e,o){return Object.entries(e).reduce((n,[t,s])=>{const r="$ref"in s&&s.$ref?d(s.$ref,o):s;if(!r)return n;const c={...r};if("content"in r&&r.content){const f={};for(const[u,i]of Object.entries(r.content))f[u]={...$(i,o),schema:i.schema?l({schema:i.schema,definition:o}):void 0};c.content=f}return n[t]=c,n},{})}export{v as filterApiDescriptionsByName,a as findApiDescriptionByName,h as resolveParameters,d as resolveRef,x as resolveRequestBody,w as resolveResponses,l as resolveSchemaRefs};
@@ -1 +1 @@
1
- import{createMcpRequestHandler as v}from"./mcp-request-handler.js";import{createDocsMcpServer as M}from"../servers/docs-server.js";import{filterDefinitionsByRbac as D}from"../utils.js";import{createInternalServerError as h}from"./errors.js";import{McpServerType as y}from"../constants.js";import{telemetry as c}from"../../../telemetry/index.js";import{constructInvalidTokenResponse as R,constructUnauthorizedResponse as S,handleMcpAuth as w,shouldHandleMcpAuth as I}from"../auth/auth-handlers.js";async function T(t,r,o,s){try{c.initialize();const e=r,n=e?.props?.config?.openapiDefinitions||[],a=e?.props?.config?.outdir||"",p=e?.props?.config?.catalogName||"Docs MCP server",f=new URL(s.url).origin,{user:i,config:{rbac:m={},mcp:d={}}}=t,l=D(n,i,m,!!i?.isAuthenticated).map(({definition:g})=>g),u=d.docs?.name||p;return await M(l,u,f,o,a)}catch(e){throw c.sendMcpErrorMessage({server_type:"docs",message:e?.message||"",stack:e?.stack||""}),h(e?.message||"Internal server error mcp docs")}}const U=v({createServerInstance:T,serverType:y.Docs}),b=async(t,r,o)=>{if(I(r)){const{isAuthenticated:s,isTokenValid:e,currentUser:n}=await w(t,r);if(!s)return S(new URL(t.url).origin);if(!e)return R();n&&(r.user=n)}return U(t,r,o)};var B=b;export{B as default};
1
+ import{createMcpRequestHandler as D}from"./mcp-request-handler.js";import{createDocsMcpServer as v}from"../servers/docs-server.js";import{filterApiDescriptionsByRbac as h}from"../utils.js";import{createInternalServerError as y}from"./errors.js";import{McpServerType as m}from"../constants.js";import{telemetry as f}from"../../../telemetry/index.js";import{constructInvalidTokenResponse as A,constructUnauthorizedResponse as L,handleMcpAuth as S,shouldHandleMcpAuth as b}from"../auth/auth-handlers.js";async function I(r,s,i,n){try{f.initialize();const e=s,t=e?.props?.config?.apiDescriptionsMap||{},a=e?.props?.outdir||"",o=e?.props?.config?.mcpDocsServerName||"Docs MCP server",u=new URL(n.url).origin,{user:c,config:{rbac:p={},mcp:l={}}}=r,d=h(t,c,p,r.config.requiresLogin||!1),g=l.docs?.name||o,M={rbac:p,email:c?.email,teams:c?.teams,isAuthenticated:!!c?.isAuthenticated,requiresLogin:r.config.requiresLogin||!1};return await v({name:g,baseUrl:u,headers:i,apiDescriptionsMap:d,outdir:a,accessInfo:M})}catch(e){throw f.sendMcpErrorMessage({server_type:m.Docs,message:e?.message||"",stack:e?.stack||""}),y(e?.message||"Internal server error mcp docs")}}const R=D({createServerInstance:I,serverType:m.Docs}),w=async(r,s,i)=>{const n=!!s?.config?.requiresLogin,e=s?.config?.rbac;if(b(n,e)){const{isAuthenticated:t,isTokenValid:a,currentUser:o}=await S(r,s);if(!t)return L(new URL(r.url).origin);if(!a)return A();o&&(s.user=o)}return R(r,s,i)};var E=w;export{E as default};
@@ -1 +1 @@
1
- import{fileURLToPath as m}from"node:url";import{dirname as f,join as l}from"node:path";import{logger as a}from"../../tools/notifiers/logger.js";import{reporter as g}from"../../tools/notifiers/reporter.js";import{filterIgnoredDefinitions as u,getCleanedUpDefinitions as h,isMcpInRedirects as D}from"./utils.js";import{telemetryTraceStep as v}from"../../../cli/telemetry/helpers/trace-step.js";const c="mcp-docs-server-handler",y=f(m(import.meta.url));async function C(){return{id:"mcp",async processContent(i,o){await v("build.plugin.mcp",async r=>{const t=await i.loadOpenApiDefinitions(o),n=await o.getConfig(),{mcp:e,redirects:s}=n;if(r?.setAttribute("config",JSON.stringify(e||{})),!(e?.hide||e?.docs?.hide)&&(D(s)&&await g.panicOnBuildContentError('The reserved route "/mcp" cannot be used in redirect configuration. Please remove any redirects involving "/mcp" from your redocly.yaml config.'),!e?.docs?.hide)){a.info("Configuring MCP servers...");const d=l(y,"./handlers/docs-mcp-handler.js"),p=h(u(t,e?.docs?.ignore||[]));await P(i,d,p,e,i.outdir)}})},async afterRoutesCreated(i,o){const r=await o.getConfig(),{mcp:t}=r;i.setGlobalData({mcpData:{docs:{enabled:!t?.hide&&!t?.docs?.hide,name:t?.docs?.name}}})}}}var E=C;async function P(i,o,r,t,n){i.createRequestHandler(c,o),i.addApiRoute({slug:"/mcp",requestHandlerId:c,httpMethod:"all",getStaticData:async()=>({props:{config:{openapiDefinitions:r.map(e=>({definition:e.definition,relativePath:e.relativePath})),outdir:n,catalogName:t?.docs?.name||"Docs MCP Server"}}})}),a.info("Registered Docs MCP Server endpoint at /mcp")}export{c as MCP_DOCS_SERVER_HANDLER_ID,E as default,C as mcpServerPlugin};
1
+ import{fileURLToPath as g}from"node:url";import{dirname as u,join as D}from"node:path";import{logger as a}from"../../tools/notifiers/logger.js";import{reporter as h}from"../../tools/notifiers/reporter.js";import{filterIgnoredApiDescriptions as v,getCleanedUpApiDescriptions as C,isMcpInRedirects as y}from"./utils.js";import{telemetryTraceStep as P}from"../../../cli/telemetry/helpers/trace-step.js";const p="mcp-docs-server-handler",M=u(g(import.meta.url));async function R(){let o=!1;return{id:"mcp",async processContent(e,i){o||await P("build.plugin.mcp",async n=>{const s=await e.loadOpenApiDefinitions(i),d=await i.getConfig(),{mcp:r,redirects:f}=d;if(n?.setAttribute("config",JSON.stringify(r||{})),!(r?.hide||r?.docs?.hide)&&(y(f)&&await h.panicOnBuildContentError('The reserved route "/mcp" cannot be used in redirect configuration. Please remove any redirects involving "/mcp" from your redocly.yaml config.'),!r?.docs?.hide)){a.info("Configuring MCP servers...");const m=D(M,"./handlers/docs-mcp-handler.js"),l=C(v(s,r?.docs?.ignore||[])),c=new Map;for(const t of l)c.set(t.definition.info?.title?.toLowerCase()||"",{name:t.definition.info?.title||"",description:t.definition.info?.description||"",version:t.definition.info?.version||"",servers:t.definition.servers||[],relativePath:t.relativePath});await S({actions:e,handlerPath:m,apiDescriptionsMap:Object.fromEntries(c),mcpConfig:r}),o=!0}})},async afterRoutesCreated(e,i){const n=await i.getConfig(),{mcp:s}=n;e.setGlobalData({mcpData:{docs:{enabled:!s?.hide&&!s?.docs?.hide,name:s?.docs?.name}}})}}}var I=R;async function S({actions:o,handlerPath:e,apiDescriptionsMap:i,mcpConfig:n}){o.createRequestHandler(p,e),o.addApiRoute({slug:"/mcp",requestHandlerId:p,httpMethod:"all",getStaticData:async()=>({props:{config:{apiDescriptionsMap:i,mcpDocsServerName:n?.docs?.name||"Docs MCP Server"}}})}),a.info("Registered Docs MCP Server endpoint at /mcp")}export{p as MCP_DOCS_SERVER_HANDLER_ID,I as default,R as mcpServerPlugin};
@@ -1,5 +1,4 @@
1
- import type { OpenAPIDefinition } from '@redocly/openapi-docs/lib/types/open-api.js';
2
- import type { DocsServerDependencies, McpServerType } from '../types.js';
1
+ import type { AccessInfo, ApiDescriptionInfo, DocsServerDependencies, McpServerType } from '../types.js';
3
2
  import { BaseMcpServer } from './base-server.js';
4
3
  export declare class DocsMcpServer extends BaseMcpServer {
5
4
  private readonly dependencies;
@@ -7,9 +6,17 @@ export declare class DocsMcpServer extends BaseMcpServer {
7
6
  baseUrl: string;
8
7
  headers: Record<string, string | string[] | undefined>;
9
8
  outdir: string;
9
+ accessInfo: AccessInfo;
10
10
  });
11
11
  protected registerTools(): void;
12
12
  protected getServerType(): McpServerType;
13
13
  }
14
- export declare function createDocsMcpServer(definitions: OpenAPIDefinition[], name: string, baseUrl: string, headers: Record<string, string | string[] | undefined>, outdir: string): Promise<import("../types.js").McpServerInstance>;
14
+ export declare function createDocsMcpServer({ name, baseUrl, headers, apiDescriptionsMap, outdir, accessInfo, }: {
15
+ name: string;
16
+ baseUrl: string;
17
+ headers: Record<string, string | string[] | undefined>;
18
+ apiDescriptionsMap: Record<string, ApiDescriptionInfo>;
19
+ outdir: string;
20
+ accessInfo: AccessInfo;
21
+ }): Promise<import("../types.js").McpServerInstance>;
15
22
  //# sourceMappingURL=docs-server.d.ts.map
@@ -1 +1 @@
1
- import{BaseMcpServer as n}from"./base-server.js";import{registerDocsTools as o}from"../docs-mcp/tools/index.js";import{McpServerType as c}from"../constants.js";class p extends n{dependencies;constructor(e){super({name:e.name,version:new Date().toISOString().slice(0,10)}),this.dependencies=e}registerTools(){o({server:this.server,definitions:this.dependencies.definitions,baseUrl:this.dependencies.baseUrl,outdir:this.dependencies.outdir,headers:this.dependencies.headers})}getServerType(){return c.Docs}}async function m(r,e,s,i,t){return await new p({definitions:r,name:e,baseUrl:s,headers:i,outdir:t}).initialize()}export{p as DocsMcpServer,m as createDocsMcpServer};
1
+ import{BaseMcpServer as c}from"./base-server.js";import{registerDocsTools as o}from"../docs-mcp/tools/index.js";import{McpServerType as p}from"../constants.js";class a extends c{dependencies;constructor(e){super({name:e.name,version:new Date().toISOString().slice(0,10)}),this.dependencies=e}registerTools(){o({server:this.server,apiDescriptionsMap:this.dependencies.apiDescriptionsMap,baseUrl:this.dependencies.baseUrl,outdir:this.dependencies.outdir,headers:this.dependencies.headers,accessInfo:this.dependencies.accessInfo})}getServerType(){return p.Docs}}async function S({name:r,baseUrl:e,headers:s,apiDescriptionsMap:i,outdir:t,accessInfo:n}){return await new a({name:r,baseUrl:e,headers:s,apiDescriptionsMap:i,outdir:t,accessInfo:n}).initialize()}export{a as DocsMcpServer,S as createDocsMcpServer};
@@ -1,11 +1,35 @@
1
1
  import type { OpenAPIPath } from '@redocly/openapi-docs/src/types';
2
2
  import type { McpServer } from '@redocly/mcp-typescript-sdk/server/mcp.js';
3
3
  import type { StreamableHTTPServerTransport } from '@redocly/mcp-typescript-sdk/server/streamableHttp.js';
4
- import type { OpenAPIDefinition } from '@redocly/openapi-docs/lib/types/open-api.js';
4
+ import type { OpenAPIServer } from '@redocly/openapi-docs/lib/types/open-api.js';
5
5
  import type { McpErrorCodes, McpServerType } from './constants';
6
+ import type { RbacConfig, PageStaticData } from '@redocly/config';
6
7
  type ObjectValues<T> = T[keyof T];
7
8
  export type McpServerType = ObjectValues<typeof McpServerType>;
8
9
  export type McpErrorCodeTypes = ObjectValues<typeof McpErrorCodes>;
10
+ export type AccessInfo = {
11
+ isAuthenticated: boolean;
12
+ email?: string;
13
+ teams?: string[];
14
+ rbac: RbacConfig;
15
+ requiresLogin: boolean;
16
+ };
17
+ export type ApiDescriptionInfo = {
18
+ name: string;
19
+ relativePath: string;
20
+ description?: string;
21
+ version?: string;
22
+ servers?: OpenAPIServer[];
23
+ };
24
+ export type McpDocsStaticDataPropsConfig = {
25
+ mcpDocsServerName: string;
26
+ apiDescriptionsMap: Record<string, ApiDescriptionInfo>;
27
+ };
28
+ export type McpDocsStaticData = PageStaticData & {
29
+ props: {
30
+ config: McpDocsStaticDataPropsConfig;
31
+ };
32
+ };
9
33
  export type McpPath = {
10
34
  'x-mcp'?: XMcpConfig;
11
35
  } & OpenAPIPath;
@@ -32,7 +56,7 @@ export type McpPluginConfig = {
32
56
  };
33
57
  };
34
58
  export type DocsServerDependencies = {
35
- definitions: OpenAPIDefinition[];
59
+ apiDescriptionsMap: Record<string, ApiDescriptionInfo>;
36
60
  readonly name: string;
37
61
  };
38
62
  export type McpUserInfo = {
@@ -1,6 +1,7 @@
1
1
  import type { ApiFunctionsUser, RbacConfig, RedirectConfig } from '@redocly/config';
2
2
  import type { ProcessContentActions } from '../../types';
3
- export type Definitions = Awaited<ReturnType<ProcessContentActions['loadOpenApiDefinitions']>>;
3
+ import type { ApiDescriptionInfo } from './types.js';
4
+ export type ApiDescriptions = Awaited<ReturnType<ProcessContentActions['loadOpenApiDefinitions']>>;
4
5
  /**
5
6
  * Filters out localizations and definitions with no public paths.
6
7
  *
@@ -8,7 +9,7 @@ export type Definitions = Awaited<ReturnType<ProcessContentActions['loadOpenApiD
8
9
  * and definitions that don't have any public API paths. It also cleans up the remaining
9
10
  * definitions by removing internal parsing artifacts.
10
11
  *
11
- * @param definitions - Array of OpenAPI definitions to filter.
12
+ * @param apiDescriptions - Array of OpenAPI definitions to filter.
12
13
  * @returns Filtered array of definitions with only those containing public paths.
13
14
  *
14
15
  * @example
@@ -17,7 +18,7 @@ export type Definitions = Awaited<ReturnType<ProcessContentActions['loadOpenApiD
17
18
  * { relativePath: 'api.yaml', definition: { paths: { '/users': {} } } }
18
19
  * ]); // Returns only the api.yaml definition
19
20
  */
20
- export declare function getCleanedUpDefinitions(definitions: Definitions): Definitions;
21
+ export declare function getCleanedUpApiDescriptions(apiDescriptions: ApiDescriptions): ApiDescriptions;
21
22
  /**
22
23
  * Filters OpenAPI definitions based on user RBAC permissions.
23
24
  *
@@ -25,7 +26,7 @@ export declare function getCleanedUpDefinitions(definitions: Definitions): Defin
25
26
  * permissions and filters out definitions the user doesn't have access to. It also
26
27
  * applies deep filtering to the definition content based on the user's permissions.
27
28
  *
28
- * @param definitions - Array of OpenAPI definitions to filter.
29
+ * @param apiDescriptions - Array of OpenAPI definitions to filter.
29
30
  * @param user - The user object containing role and permission information.
30
31
  * @param rbac - RBAC configuration defining access rules.
31
32
  * @param requiresLogin - Whether login is required for access.
@@ -35,7 +36,7 @@ export declare function getCleanedUpDefinitions(definitions: Definitions): Defin
35
36
  * filterDefinitionsByRbac(definitions, user, rbac, true);
36
37
  * // Returns only definitions the user can access with filtered content
37
38
  */
38
- export declare function filterDefinitionsByRbac(definitions: Definitions, user: ApiFunctionsUser, rbac: RbacConfig, requiresLogin: boolean): Definitions;
39
+ export declare function filterApiDescriptionsByRbac(apiDescriptions: Record<string, ApiDescriptionInfo>, user: ApiFunctionsUser, rbac: RbacConfig, requiresLogin: boolean): Record<string, ApiDescriptionInfo>;
39
40
  /**
40
41
  * Filters out definitions that match ignored paths from redocly.yaml config.
41
42
  *
@@ -43,15 +44,15 @@ export declare function filterDefinitionsByRbac(definitions: Definitions, user:
43
44
  * any of the ignored path patterns specified in the redocly configuration.
44
45
  * Definitions matching these patterns will be excluded from the result.
45
46
  *
46
- * @param definitions - Array of OpenAPI definitions to filter.
47
+ * @param apiDescriptions - Array of OpenAPI definitions to filter.
47
48
  * @param ignoredPaths - Array of glob patterns for paths to ignore.
48
49
  * @returns Array of definitions that don't match any ignored path patterns.
49
50
  *
50
51
  * @example
51
- * filterIgnoredDefinitions(definitions, ['path/to/ignore']);
52
+ * filterIgnoredApiDescriptions(apiDescriptions, ['path/to/ignore']);
52
53
  * // Returns definitions not matching test or internal path patterns
53
54
  */
54
- export declare function filterIgnoredDefinitions(definitions: Definitions, ignoredPaths: string[]): Definitions;
55
+ export declare function filterIgnoredApiDescriptions(apiDescriptions: ApiDescriptions, ignoredPaths: string[]): ApiDescriptions;
55
56
  /**
56
57
  * Checks if the MCP route (/mcp) appears in redirect configuration.
57
58
  *
@@ -1 +1 @@
1
- import{join as c}from"node:path";import u from"picomatch";import{PUBLIC_API_DEFINITIONS_FOLDER as p,L10N_DIR_NAME as h,I18N_DIR_NAME as l}from"../../constants/common.js";import{RESERVED_ROUTES as f}from"../../plugins/get-reserved-routes.js";import{canDownloadApiDefinition as m,filterDataByAccessDeep as D}from"../../utils/rbac.js";function s(i){if(typeof i!="object"||i===null)return i;if(Array.isArray(i))return i.map(s);const n={};for(const t in i)if(Object.hasOwn(i,t)){if(t.toString().startsWith("x-parsed-"))continue;n[t]=s(i[t])}return n}function O(i){return i.reduce((n,t)=>(t.relativePath.startsWith(h)||t.relativePath.startsWith(l)||t.definition?.paths&&Object.keys(t.definition.paths).length>0&&n.push({...t,definition:s(t.definition)}),n),[])}function R(i,n,t,r){return i.reduce((e,o)=>{if(!m(c(p,o.relativePath),t,r,n))return e;const a=D(o.definition,n,t,r);return e.push({...o,definition:a}),e},[])}function _(i,n){return i.filter(({relativePath:t})=>!u(n||[])(t))}function g(i={}){for(const[n,t]of Object.entries(i))if(n===f.mcp||(typeof t=="string"?t:t.to)===f.mcp)return!0;return!1}export{R as filterDefinitionsByRbac,_ as filterIgnoredDefinitions,O as getCleanedUpDefinitions,g as isMcpInRedirects};
1
+ import{join as f}from"node:path";import a from"picomatch";import{PUBLIC_API_DEFINITIONS_FOLDER as u,L10N_DIR_NAME as h,I18N_DIR_NAME as l}from"../../constants/common.js";import{RESERVED_ROUTES as p}from"../../plugins/get-reserved-routes.js";import{canDownloadApiDefinition as m}from"../../utils/rbac.js";function n(i){if(typeof i!="object"||i===null)return i;if(Array.isArray(i))return i.map(n);const r={};for(const t in i)if(Object.hasOwn(i,t)){if(t.toString().startsWith("x-parsed-"))continue;r[t]=n(i[t])}return r}function d(i){return i.reduce((r,t)=>(t.relativePath.startsWith(h)||t.relativePath.startsWith(l)||t.definition?.paths&&Object.keys(t.definition.paths).length>0&&r.push({...t,definition:n(t.definition)}),r),[])}function y(i,r,t,e){const o={};for(const[c,s]of Object.entries(i))m(f(u,s.relativePath),t,e,r)&&(o[c]=s);return o}function E(i,r){return i.filter(({relativePath:t})=>!a(r||[])(t))}function R(i={}){for(const[r,t]of Object.entries(i))if(r===p.mcp||(typeof t=="string"?t:t.to)===p.mcp)return!0;return!1}export{y as filterApiDescriptionsByRbac,E as filterIgnoredApiDescriptions,d as getCleanedUpApiDescriptions,R as isMcpInRedirects};
@@ -1 +1 @@
1
- import*as p from"workerpool";import{withPathPrefix as l}from"@redocly/theme/core/utils";import{TimeoutExceededError as f}from"../../../api-routes/errors/timeout-exceeded.js";import{logger as m}from"../../../tools/notifiers/logger.js";import{serializeRequest as S}from"../../../api-routes/helpers/serialize-request.js";import{API_ROUTES_WORKER_KEY as g}from"../../../workers/api-routes-worker-pool.js";import{mcpWorkers as h}from"../../../workers/mcp-worker-pool.js";const w=15;async function D(o,a,e){const t=a.get("auth"),i=await e.resolveRouteStaticData(o)||{},s=l(o.slug);try{const{status:r,headers:n,body:c,loggerStickyState:u}=await h.exec(g,[{serverOutDir:e.serverOutDir,slug:s,requestHandlerId:o.requestHandlerId,maxResponseSizeMB:w,ctxData:{user:{teams:t.teams,email:t.claims.email,claims:t.claims,idpAccessToken:t.idpAccessToken,idpId:t.claims.idpId,isAuthenticated:t.isAuthenticated},config:e.config},staticData:{...i,props:{...i.props,routeSlug:s,outdir:e.outdir}},req:await S(a.req.raw),loggerStickyState:m.getStickyState()}]);m.setStickyState(u);const d=c.data?Buffer.from(c.data):null;return new Response(d,{status:r,headers:n})}catch(r){throw r instanceof p.Promise.TimeoutError?new f("Timeout exceeded"):r}}export{D as runMcpWorker};
1
+ import*as u from"workerpool";import{withPathPrefix as d}from"@redocly/theme/core/utils";import{TimeoutExceededError as p}from"../../../api-routes/errors/timeout-exceeded.js";import{serializeRequest as l}from"../../../api-routes/helpers/serialize-request.js";import{API_ROUTES_WORKER_KEY as f}from"../../../workers/api-routes-worker-pool.js";import{mcpWorkers as h}from"../../../workers/mcp-worker-pool.js";const w=15;async function A(o,a,t){const e=a.get("auth"),i=await t.resolveRouteStaticData(o)||{},s=d(o.slug);try{const{status:r,headers:m,body:c}=await h.exec(f,[{serverOutDir:t.serverOutDir,slug:s,requestHandlerId:o.requestHandlerId,maxResponseSizeMB:w,ctxData:{user:{teams:e.teams,email:e.claims.email,claims:e.claims,idpAccessToken:e.idpAccessToken,idpId:e.claims.idpId,isAuthenticated:e.isAuthenticated},config:t.config},staticData:{...i,props:{...i.props,routeSlug:s,outdir:t.outdir}},req:await l(a.req.raw)}]),n=c.data?Buffer.from(c.data):null;return new Response(n,{status:r,headers:m})}catch(r){throw r instanceof u.Promise.TimeoutError?new p("Timeout exceeded"):r}}export{A as runMcpWorker};