@redocly/reef 0.132.0-next.5 → 0.132.0-next.7
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/CHANGELOG.md +44 -0
- package/dist/cli/telemetry/index.js +1 -1
- package/dist/client/App.js +1 -1
- package/dist/client/app/CircularProgress.js +8 -8
- package/dist/client/app/hooks/utils/match-banner-target.d.ts +23 -1
- package/dist/client/app/hooks/utils/match-banner-target.js +1 -1
- package/dist/client/mcp-tool-handlers-entry.d.ts +3 -0
- package/dist/client/mcp-tool-handlers-entry.js +1 -0
- package/dist/client/templates/asyncapi-docs/helpers.d.ts +1 -1
- package/dist/client/types/ai-search.d.ts +5 -3
- package/dist/constants/l10n/langs/ar.js +1 -1
- package/dist/constants/l10n/langs/de.js +1 -1
- package/dist/constants/l10n/langs/en.js +1 -1
- package/dist/constants/l10n/langs/es.js +1 -1
- package/dist/constants/l10n/langs/fr.js +1 -1
- package/dist/constants/l10n/langs/hi.js +1 -1
- package/dist/constants/l10n/langs/it.js +1 -1
- package/dist/constants/l10n/langs/ja.js +1 -1
- package/dist/constants/l10n/langs/ko.js +1 -1
- package/dist/constants/l10n/langs/pl.js +1 -1
- package/dist/constants/l10n/langs/pt-BR.js +1 -1
- package/dist/constants/l10n/langs/pt.js +1 -1
- package/dist/constants/l10n/langs/ru.js +1 -1
- package/dist/constants/l10n/langs/uk.js +1 -1
- package/dist/constants/l10n/langs/zh.js +1 -1
- package/dist/markdoc/nodes/fence/index.js +1 -1
- package/dist/markdoc/nodes/index.d.ts +1 -1
- package/dist/markdoc/nodes/index.js +1 -1
- package/dist/server/api-routes/run-api-routes-worker.js +1 -1
- package/dist/server/config/env-schema.d.ts +6 -3
- package/dist/server/config/env-schemas/api-urls.d.ts +3 -3
- package/dist/server/config/env-schemas/api-urls.js +1 -1
- package/dist/server/config/env-schemas/auth.d.ts +3 -0
- package/dist/server/config/env-schemas/auth.js +1 -1
- package/dist/server/esbuild/esbuild.js +3 -3
- package/dist/server/esbuild/plugins/codegen/index.d.ts +1 -0
- package/dist/server/esbuild/plugins/codegen/index.js +7 -3
- package/dist/server/esbuild/plugins/mcp-tool-handlers-resolver.d.ts +7 -0
- package/dist/server/esbuild/plugins/mcp-tool-handlers-resolver.js +1 -0
- package/dist/server/plugins/catalog-entities/plugin.js +1 -1
- package/dist/server/plugins/config-parser/index.js +1 -1
- package/dist/server/plugins/config-parser/loaders/content-slugs-loader.js +1 -1
- package/dist/server/plugins/default-theme/resolve-products-config.js +1 -1
- package/dist/server/plugins/dev-onboarding/api/adapter-factory.d.ts +10 -3
- package/dist/server/plugins/dev-onboarding/api/adapter-factory.js +1 -1
- package/dist/server/plugins/dev-onboarding/api/adapters/apigee/adapter.d.ts +5 -4
- package/dist/server/plugins/dev-onboarding/api/adapters/apigee/adapter.js +4 -4
- package/dist/server/plugins/dev-onboarding/api/adapters/gravitee/client.d.ts +3 -3
- package/dist/server/plugins/dev-onboarding/api/adapters/gravitee/client.js +1 -1
- package/dist/server/plugins/dev-onboarding/api/middlewares/integrations.d.ts +3 -2
- package/dist/server/plugins/dev-onboarding/api/middlewares/integrations.js +1 -1
- package/dist/server/plugins/dev-onboarding/api/routes/index.js +1 -1
- package/dist/server/plugins/dev-onboarding/api/types.d.ts +8 -0
- package/dist/server/plugins/dev-onboarding/template/components/ApiLogsActions.js +5 -5
- package/dist/server/plugins/dev-onboarding/template/components/DialogStyledComponents.js +1 -1
- package/dist/server/plugins/dev-onboarding/template/components/MultiSelect.js +1 -1
- package/dist/server/plugins/dev-onboarding/template/components/TextField.js +3 -3
- package/dist/server/plugins/enforce-login/index.js +1 -1
- package/dist/server/plugins/lifecycle.js +2 -2
- package/dist/server/plugins/markdown/attribute-resolvers/index.js +1 -1
- package/dist/server/plugins/markdown/attribute-resolvers/resolve-diagram-from-file.d.ts +4 -0
- package/dist/server/plugins/markdown/attribute-resolvers/resolve-diagram-from-file.js +1 -0
- package/dist/server/plugins/markdown/attribute-resolvers/resolve-native-md-link.js +1 -1
- package/dist/server/plugins/markdown/markdoc/markdoc-options.d.ts +1 -1
- package/dist/server/plugins/markdown/markdoc/plugins/render-diagrams.d.ts +16 -0
- package/dist/server/plugins/markdown/markdoc/plugins/render-diagrams.js +1 -0
- package/dist/server/plugins/markdown/runtime-transform.js +1 -1
- package/dist/server/plugins/markdown/search/to-markdown.js +24 -16
- package/dist/server/plugins/markdown/search/walk-sections.js +1 -1
- package/dist/server/plugins/mcp/docs-mcp/tool-schemas.d.ts +7 -0
- package/dist/server/plugins/mcp/docs-mcp/tool-schemas.js +1 -0
- package/dist/server/plugins/mcp/docs-mcp/tools/get-endpoint-info.d.ts +5 -9
- package/dist/server/plugins/mcp/docs-mcp/tools/get-endpoint-info.js +1 -1
- package/dist/server/plugins/mcp/docs-mcp/tools/get-endpoints.d.ts +5 -9
- package/dist/server/plugins/mcp/docs-mcp/tools/get-endpoints.js +1 -1
- package/dist/server/plugins/mcp/docs-mcp/tools/get-full-api-description.d.ts +5 -9
- package/dist/server/plugins/mcp/docs-mcp/tools/get-full-api-description.js +1 -1
- package/dist/server/plugins/mcp/docs-mcp/tools/get-security-schemes.d.ts +5 -9
- package/dist/server/plugins/mcp/docs-mcp/tools/get-security-schemes.js +1 -1
- package/dist/server/plugins/mcp/docs-mcp/tools/helpers/load-api-description.d.ts +4 -0
- package/dist/server/plugins/mcp/docs-mcp/tools/helpers/load-api-description.js +1 -0
- package/dist/server/plugins/mcp/docs-mcp/tools/index.d.ts +10 -7
- package/dist/server/plugins/mcp/docs-mcp/tools/index.js +1 -1
- package/dist/server/plugins/mcp/docs-mcp/tools/list-apis.d.ts +5 -9
- package/dist/server/plugins/mcp/docs-mcp/tools/list-apis.js +1 -1
- package/dist/server/plugins/mcp/docs-mcp/tools/search.d.ts +5 -10
- package/dist/server/plugins/mcp/docs-mcp/tools/search.js +3 -3
- package/dist/server/plugins/mcp/docs-mcp/tools/utils.d.ts +6 -3
- package/dist/server/plugins/mcp/docs-mcp/tools/utils.js +6 -6
- package/dist/server/plugins/mcp/docs-mcp/tools/whoami.d.ts +5 -9
- package/dist/server/plugins/mcp/docs-mcp/tools/whoami.js +1 -1
- package/dist/server/plugins/mcp/handlers/docs-mcp-handler.js +1 -1
- package/dist/server/plugins/mcp/handlers/handle-mcp-request.js +1 -1
- package/dist/server/plugins/mcp/index.js +1 -1
- package/dist/server/plugins/mcp/servers/docs-server.d.ts +13 -22
- package/dist/server/plugins/mcp/servers/docs-server.js +1 -1
- package/dist/server/plugins/mcp/types.d.ts +24 -56
- package/dist/server/plugins/mcp/workers/execute-mcp-tool.d.ts +2 -2
- package/dist/server/plugins/mcp/workers/execute-mcp-tool.js +1 -1
- package/dist/server/plugins/openapi-docs/index.js +1 -1
- package/dist/server/plugins/openapi-docs/search-indexer.js +1 -1
- package/dist/server/store.d.ts +5 -2
- package/dist/server/store.js +1 -1
- package/dist/server/telemetry/index.js +1 -1
- package/dist/server/types/plugins/common.d.ts +15 -2
- package/dist/server/types/redirects.d.ts +6 -0
- package/dist/server/utils/rbac.js +1 -1
- package/dist/server/utils/redirects/find-redirect.d.ts +8 -31
- package/dist/server/utils/redirects/find-redirect.js +1 -1
- package/dist/server/utils/redirects/follow-redirect-chain.d.ts +9 -0
- package/dist/server/utils/redirects/follow-redirect-chain.js +1 -0
- package/dist/server/utils/redirects/validate-redirects.d.ts +8 -0
- package/dist/server/utils/redirects/validate-redirects.js +1 -0
- package/dist/server/web-server/routes/otel/otel.js +1 -1
- package/dist/server/workers/types.d.ts +2 -2
- package/dist/server/workers/worker-pool.js +1 -1
- package/dist/types/global-data.d.ts +7 -2
- package/package.json +10 -10
- package/dist/server/plugins/markdown/markdoc/plugins/render-mermaid.d.ts +0 -4
- package/dist/server/plugins/markdown/markdoc/plugins/render-mermaid.js +0 -1
- package/dist/server/plugins/mcp/docs-mcp/tools/docs-mcp-tool.d.ts +0 -55
- package/dist/server/plugins/mcp/docs-mcp/tools/docs-mcp-tool.js +0 -1
- package/dist/server/plugins/mcp/handlers/mcp-request-handler.d.ts +0 -11
- package/dist/server/plugins/mcp/handlers/mcp-request-handler.js +0 -1
- package/dist/server/plugins/mcp/servers/base-server.d.ts +0 -17
- package/dist/server/plugins/mcp/servers/base-server.js +0 -1
|
@@ -1,10 +1,6 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
readonly requiredContext: readonly ContextKey[];
|
|
7
|
-
constructor();
|
|
8
|
-
protected executeAction(args: ToolArgsMap['get-endpoints'], context: McpToolWorkerParams['context']): Promise<McpToolWorkerResponse>;
|
|
9
|
-
}
|
|
1
|
+
import type { McpToolHandler } from '../../types.js';
|
|
2
|
+
declare const _default: {
|
|
3
|
+
'get-endpoints': McpToolHandler;
|
|
4
|
+
};
|
|
5
|
+
export default _default;
|
|
10
6
|
//# sourceMappingURL=get-endpoints.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{loadApiDescription as s}from"./helpers/load-api-description.js";import{getEndpointsFromPaths as p}from"./utils.js";const c=async(n,r)=>{const{name:o}=n;let t;try{t=await s(o,r)}catch(i){return{content:[{type:"text",text:i.message}],isError:!0}}const e=p(t);return e.length===0?{content:[{type:"text",text:"No endpoints found"}]}:{content:[{type:"text",text:JSON.stringify({api:t.info?.title||"",version:t.info?.version||"",servers:t.servers||[],endpoints:e},null,2)}]}};var f={"get-endpoints":c};export{f as default};
|
|
@@ -1,10 +1,6 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
readonly requiredContext: readonly ContextKey[];
|
|
7
|
-
constructor();
|
|
8
|
-
protected executeAction(args: ToolArgsMap['get-full-api-description'], context: McpToolWorkerParams['context']): Promise<McpToolWorkerResponse>;
|
|
9
|
-
}
|
|
1
|
+
import type { McpToolHandler } from '../../types.js';
|
|
2
|
+
declare const _default: {
|
|
3
|
+
'get-full-api-description': McpToolHandler;
|
|
4
|
+
};
|
|
5
|
+
export default _default;
|
|
10
6
|
//# sourceMappingURL=get-full-api-description.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{loadApiDescription as o}from"./helpers/load-api-description.js";const s=async(e,i)=>{const{name:n}=e;let t;try{t=await o(n,i)}catch(r){return{content:[{type:"text",text:r.message}],isError:!0}}return{content:[{type:"text",text:JSON.stringify({api:t.info?.title||"",version:t.info?.version||"",definition:t},null,2)}]}};var c={"get-full-api-description":s};export{c as default};
|
|
@@ -1,10 +1,6 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
readonly requiredContext: readonly ContextKey[];
|
|
7
|
-
constructor();
|
|
8
|
-
protected executeAction(args: ToolArgsMap['get-security-schemes'], context: McpToolWorkerParams['context']): Promise<McpToolWorkerResponse>;
|
|
9
|
-
}
|
|
1
|
+
import type { McpToolHandler } from '../../types.js';
|
|
2
|
+
declare const _default: {
|
|
3
|
+
'get-security-schemes': McpToolHandler;
|
|
4
|
+
};
|
|
5
|
+
export default _default;
|
|
10
6
|
//# sourceMappingURL=get-security-schemes.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{loadApiDescription as n}from"./helpers/load-api-description.js";const c=async(t,r)=>{const{name:s}=t;let e;try{e=await n(s,r)}catch(i){return{content:[{type:"text",text:i.message}],isError:!0}}return{content:[{type:"text",text:JSON.stringify({name:e.info?.title,version:e.info?.version,securitySchemes:e.components?.securitySchemes||[],security:e.security||[]},null,2)}]}};var u={"get-security-schemes":c};export{u as default};
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { OpenAPIDefinition } from '@redocly/openapi-docs';
|
|
2
|
+
import type { McpToolContext } from '../../../types.js';
|
|
3
|
+
export declare function loadApiDescription(name: string, context: McpToolContext): Promise<OpenAPIDefinition>;
|
|
4
|
+
//# sourceMappingURL=load-api-description.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{findApiDescriptionByName as c}from"../../utils.js";import{getApiDescriptionFromFs as t}from"../utils.js";async function f(r,i){const o=c(i.apiDescriptionsMap,r);if(!o)throw new Error(`No API found matching "${r}".`);const n=!!i?.config?.access?.requiresLogin,e=i?.config?.access?.rbac||{},s=await t({relativePath:o.relativePath||"",outdir:i.outdir||"",user:i.user,rbac:e,requiresLogin:n});if(!s)throw new Error(`No API found matching "${r}".`);return s}export{f as loadApiDescription};
|
|
@@ -1,8 +1,11 @@
|
|
|
1
|
-
|
|
2
|
-
import
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
1
|
+
declare const _default: {
|
|
2
|
+
whoami: import("../../types.js").McpToolHandler;
|
|
3
|
+
search: import("../../types.js").McpToolHandler;
|
|
4
|
+
'get-full-api-description': import("../../types.js").McpToolHandler;
|
|
5
|
+
'get-security-schemes': import("../../types.js").McpToolHandler;
|
|
6
|
+
'get-endpoint-info': import("../../types.js").McpToolHandler;
|
|
7
|
+
'get-endpoints': import("../../types.js").McpToolHandler;
|
|
8
|
+
'list-apis': import("../../types.js").McpToolHandler;
|
|
9
|
+
};
|
|
10
|
+
export default _default;
|
|
8
11
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import
|
|
1
|
+
import o from"./list-apis.js";import r from"./get-endpoints.js";import t from"./get-endpoint-info.js";import i from"./get-security-schemes.js";import m from"./get-full-api-description.js";import p from"./search.js";import e from"./whoami.js";var d={...o,...r,...t,...i,...m,...p,...e};export{d as default};
|
|
@@ -1,10 +1,6 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
readonly requiredContext: readonly ContextKey[];
|
|
7
|
-
constructor();
|
|
8
|
-
protected executeAction(args: ToolArgsMap['list-apis'], context: McpToolWorkerParams['context']): Promise<McpToolWorkerResponse>;
|
|
9
|
-
}
|
|
1
|
+
import type { McpToolHandler } from '../../types.js';
|
|
2
|
+
declare const _default: {
|
|
3
|
+
'list-apis': McpToolHandler;
|
|
4
|
+
};
|
|
5
|
+
export default _default;
|
|
10
6
|
//# sourceMappingURL=list-apis.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{filterApiDescriptionsByName as
|
|
1
|
+
import{filterApiDescriptionsByName as f}from"../utils.js";const x=async(a,l)=>{const{filter:i,page:n=1,limit:e=300}=a;let t=Object.values(l.apiDescriptionsMap);i&&(t=f(t,i));const s=(n-1)*e,o=s+e,r=Math.ceil(t.length/e),c=t.length;return t=t.slice(s,o),t.length===0?{content:[{type:"text",text:"No APIs available"}]}:{content:[{type:"text",text:JSON.stringify({items:t.map(({relativePath:g,...p})=>p),limit:e,total:c,page:n,totalPages:r})}]}};var m={"list-apis":x};export{m as default};
|
|
@@ -1,11 +1,6 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
readonly requiredContext: readonly ContextKey[];
|
|
7
|
-
constructor(products?: string[]);
|
|
8
|
-
register(options: DocsMcpToolRegistrationOptions): void;
|
|
9
|
-
protected executeAction(args: ToolArgsMap['search'], context: McpToolWorkerParams['context']): Promise<McpToolWorkerResponse>;
|
|
10
|
-
}
|
|
1
|
+
import type { McpToolHandler } from '../../types.js';
|
|
2
|
+
declare const _default: {
|
|
3
|
+
search: McpToolHandler;
|
|
4
|
+
};
|
|
5
|
+
export default _default;
|
|
11
6
|
//# sourceMappingURL=search.d.ts.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import{withPathPrefix as
|
|
1
|
+
import{withPathPrefix as l}from"@redocly/theme/core/utils";import{ServerRoutes as h}from"../../../../../constants/common.js";const d=async(c,t)=>{const{query:a,product:u}=c,p=JSON.stringify({query:a,product:u});let e=`${t.baseUrl}${l(h.SEMANTIC_SEARCH)}`;e.startsWith("http://")&&(e=e.replace(/^http:\/\//,"https://"));const o=t.user.idpAccessToken?`authorization=${String(t.user.idpAccessToken).replace(/^Bearer /,"")}`:"";try{const s=await fetch(e,{method:"POST",credentials:"include",headers:{"Content-Type":"application/json",...o?{Cookie:o}:{}},body:p});if(!s.ok)return{content:[{type:"text",text:"Error retrieving search results."}],isError:!0};const r=await s.json();if(!r||r.length===0)return{content:[{type:"text",text:"No results found."}]};const i=r.map(n=>`### [${n.title}](${new URL(n.url,t.baseUrl).toString()})
|
|
2
2
|
|
|
3
|
-
${
|
|
3
|
+
${n.content}
|
|
4
4
|
`).join(`
|
|
5
5
|
|
|
6
|
-
`).trim();return{content:[{type:"text",text:
|
|
6
|
+
`).trim();return{content:[{type:"text",text:i.length?i:"No results found."}]}}catch{return{content:[{type:"text",text:"Error retrieving search results."}],isError:!0}}};var m={search:d};export{m as default};
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { OpenAPIDefinition, OpenAPIOperation } from '@redocly/openapi-docs';
|
|
2
2
|
import type { SearchItemData } from '@redocly/theme/core/types';
|
|
3
|
-
import type {
|
|
3
|
+
import type { ApiFunctionsUser, RbacConfig } from '@redocly/config';
|
|
4
|
+
import type { McpEndpoint } from '../../types';
|
|
4
5
|
export declare function isMcpEndpoint(value: unknown): value is McpEndpoint;
|
|
5
6
|
type EndpointInfo = Pick<OpenAPIOperation, 'summary' | 'description' | 'security'> & {
|
|
6
7
|
method: string;
|
|
@@ -8,10 +9,12 @@ type EndpointInfo = Pick<OpenAPIOperation, 'summary' | 'description' | 'security
|
|
|
8
9
|
};
|
|
9
10
|
export declare function getEndpointsFromPaths(def: OpenAPIDefinition): EndpointInfo[];
|
|
10
11
|
export declare function processDocuments(documents: Record<string, SearchItemData[]>, outdir: string): string;
|
|
11
|
-
export declare function getApiDescriptionFromFs({ relativePath, outdir,
|
|
12
|
+
export declare function getApiDescriptionFromFs({ relativePath, outdir, user, rbac, requiresLogin, }: {
|
|
12
13
|
relativePath: string;
|
|
13
14
|
outdir: string;
|
|
14
|
-
|
|
15
|
+
user: ApiFunctionsUser;
|
|
16
|
+
rbac?: RbacConfig;
|
|
17
|
+
requiresLogin?: boolean;
|
|
15
18
|
}): Promise<OpenAPIDefinition | undefined>;
|
|
16
19
|
export {};
|
|
17
20
|
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import y from"node:fs";import
|
|
1
|
+
import y from"node:fs";import d from"node:path";import{existsSync as D}from"node:fs";import{readFile as j}from"node:fs/promises";import{replaceFileExtension as O}from"../../../../plugins/openapi-docs/store-definition-bundles";import{PUBLIC_API_DEFINITIONS_FOLDER as b}from"../../../../constants/common";import{filterDataByAccessDeep as g}from"../../../../utils/rbac";import{checkEndpointAndDeleteXMcp as A}from"../../utils/xmcp-utils.js";import{MAX_DOCUMENTS_PER_CATEGORY as F}from"../../constants.js";function N(e){return typeof e=="object"&&e!==null&&"responses"in e&&typeof e.responses=="object"}function T(e){const{paths:s={}}=e,o=[];for(const[c,i]of Object.entries(s)){const r=!A(i,"docs");for(const[p,t]of Object.entries(i))r||!A(t,"docs")||o.push({path:c,method:p.toUpperCase(),summary:t.summary,description:t.description,security:t.security})}return o}function R(e,s){return Object.entries(e).map(([c,i])=>{if(!i||i.length===0)return"";const r=i.slice(0,F).map(p=>{const{document:t,highlight:f}=p,h=f?.title||(Array.isArray(t.title)?t.title[0]:t.title);let a=`Document: ${t.title}`;a+=`### [${h}](${t.url})
|
|
2
2
|
|
|
3
|
-
`;let
|
|
3
|
+
`;let m;if(t.url)try{let n=t.url.startsWith("/")?t.url.slice(1):t.url;const l=n.indexOf("#");l!==-1&&(n=n.substring(0,l));const u=d.extname(n);u&&(n=n.slice(0,-u.length));let E=n+".md";const x=d.join(s,E);y.existsSync(x)&&(m=y.readFileSync(x,"utf8"))}catch{}return m||(m=f?.text||(Array.isArray(t.text)?t.text[0]:t.text)),a+=m,t.facets&&(a+=`
|
|
4
4
|
|
|
5
5
|
**Categories:**
|
|
6
|
-
`,Object.entries(t.facets).forEach(([n,l])=>{
|
|
7
|
-
`})),
|
|
6
|
+
`,Object.entries(t.facets).forEach(([n,l])=>{a+=`- ${n}: ${l}
|
|
7
|
+
`})),a});return`## ${c}
|
|
8
8
|
|
|
9
|
-
${
|
|
9
|
+
${r}`}).join(`
|
|
10
10
|
|
|
11
|
-
`).trim()}async function U({relativePath:e,outdir:
|
|
11
|
+
`).trim()}async function U({relativePath:e,outdir:s,user:o,rbac:c={},requiresLogin:i=!1}){const r=d.join(s||"",b,O(e,".json"));if(!D(r))return;const t=await j(r,"utf-8"),f=JSON.parse(t);return g(f,{isAuthenticated:o?.isAuthenticated,email:o?.email,teams:o?.teams},c,i)}export{U as getApiDescriptionFromFs,T as getEndpointsFromPaths,N as isMcpEndpoint,R as processDocuments};
|
|
@@ -1,10 +1,6 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
readonly requiredContext: readonly ContextKey[];
|
|
7
|
-
constructor();
|
|
8
|
-
protected executeAction(_args: ToolArgsMap['whoami'], context: McpToolWorkerParams['context']): Promise<McpToolWorkerResponse>;
|
|
9
|
-
}
|
|
1
|
+
import type { McpToolHandler } from '../../types.js';
|
|
2
|
+
declare const _default: {
|
|
3
|
+
whoami: McpToolHandler;
|
|
4
|
+
};
|
|
5
|
+
export default _default;
|
|
10
6
|
//# sourceMappingURL=whoami.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
const s=async(i,e)=>e.user?.isAuthenticated?{content:[{type:"text",text:JSON.stringify({email:e.user.email,name:e.user.claims?.name,subject:e.user.claims?.sub,clientId:e.user.claims?.client_id,scope:e.user.claims?.scope,issuedAt:e.user.claims?.iat?new Date(Number(e.user.claims.iat)*1e3).toISOString():void 0,expiresAt:e.user.claims?.exp?new Date(Number(e.user.claims.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};var r={whoami:s};export{r as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{toFetchResponse as R,toReqRes as w}from"fetch-to-node";import{createDocsMcpServer as y}from"../servers/docs-server.js";import{filterApiDescriptionsByRbac as C}from"../utils.js";import{createMethodNotAllowedError as D,withErrorHandling as v}from"./errors.js";import{McpServerType as A}from"../constants.js";import{constructInvalidTokenResponse as S,constructUnauthorizedResponse as T,handleMcpAuth as U,shouldHandleMcpAuth as b}from"../auth/auth-handlers.js";const L=async(o,e,p)=>{const t=!!e?.config?.access?.requiresLogin,a=e?.config?.access?.rbac||{};if(b(t,a)){const{isAuthenticated:s,isTokenValid:i,currentUser:n}=await U(o,e);if(!s)return T(new URL(o.url).origin);if(!i)return S();n&&(e.user=n)}let r;const d=async()=>{r&&(await r.cleanup(),r=void 0)};return await v(async()=>{if(o.method==="GET")return new Response(JSON.stringify({error:"Method Not Allowed",message:`In order to use this MCP server, you need register it in your MCP Client (VS Code, Cursor, Claude Code, etc.) using that URL: ${o.url}`}),{status:405,headers:{"Content-Type":"application/json"}});if(o.method!=="POST")return D();const s=p,i=s?.props?.config?.apiDescriptionsMap||{},n=s?.props?.config?.mcpDocsServerName||"Docs MCP server",{config:{mcp:u={}}}=e,l=C(i,e.user,a,t),f=e.config.products?Object.values(e.config.products).map(M=>M?.name):[],m=u.docs?.name||n;r=await y({name:m,tools:s?.props?.tools||[],context:{...e,outdir:e.outdir||"",baseUrl:e.baseUrl||new URL(o.url).origin,apiDescriptionsMap:l,products:f}});const g=await o.json(),{req:h,res:c}=w(o);return await r.transport.handleRequest(h,c,g),R(c)},A.Docs,d)};var O=L;export{O as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{withPathPrefix as d}from"@redocly/theme/core/utils";import{importApiRoutesHandler as f}from"../../../api-routes/import-api-routes-handlers.js";import{enhanceContext as h}from"../../../api-routes/helpers/enhance-context.js";import{telemetry as A}from"../../../telemetry/index.js";import{KvService as D}from"../../../persistence/kv/services/kv-service.js";import{envConfig as
|
|
1
|
+
import{withPathPrefix as d}from"@redocly/theme/core/utils";import{importApiRoutesHandler as f}from"../../../api-routes/import-api-routes-handlers.js";import{enhanceContext as h}from"../../../api-routes/helpers/enhance-context.js";import{telemetry as A}from"../../../telemetry/index.js";import{KvService as D}from"../../../persistence/kv/services/kv-service.js";import{envConfig as s}from"../../../config/env-config.js";async function v(i,a,e){const t=a.get("auth"),r=await e.resolveRouteStaticData(i)||{},o=d(i.slug),{requestHandlers:c}=await f(e.serverOutDir),p=c[i.requestHandlerId],u=(await p()).default,l=async()=>await D.getInstance({baseDbDir:e.serverOutDir,sqldRemoteDatabaseUrl:s.SQLD_REMOTE_DATABASE_URL,sqldRemoteDatabaseAuthToken:s.SQLD_REMOTE_DATABASE_AUTH_TOKEN}),m=h({honoCtx:a,ctx:{user:{teams:t.teams,email:t.claims.email,claims:t.claims,idpAccessToken:t.idpAccessToken,idpId:t.claims.idpId,isAuthenticated:t.isAuthenticated},config:e.config,outdir:e.outdir,baseUrl:new URL(a.req.url).origin},telemetry:A,getKv:l}),n=await u(a.req.raw,m,{...r,props:{...r.props,routeSlug:o,outdir:e.outdir}});return n instanceof Response?n:typeof n=="string"?new Response(n,{headers:{"Content-Type":"text/plain"}}):new Response(JSON.stringify(n),{headers:{"Content-Type":"application/json"}})}export{v as handleMcpRequest};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{fileURLToPath as
|
|
1
|
+
import{fileURLToPath as M}from"node:url";import{dirname as P,join as p}from"node:path";import{logger as d}from"../../tools/notifiers/logger.js";import{reporter as y}from"../../tools/notifiers/reporter.js";import{isDefined as S}from"../../../utils/guards/is-defined.js";import{filterIgnoredApiDescriptions as b,getCleanedUpApiDescriptions as R,isMcpInRedirects as w}from"./utils.js";import{getDefaultToolSchemas as O}from"./docs-mcp/tool-schemas.js";import{telemetryTraceStep as A}from"../../../cli/telemetry/helpers/trace-step.js";const f="mcp-docs-server-handler",m=P(M(import.meta.url));async function T(){let i=!1;return{id:"mcp",async processContent(r,o){i||await A("build.plugin.mcp",async c=>{const t=await r.loadOpenApiDefinitions(o),n=await o.getConfig(),{mcp:s,redirects:l}=n;if(c?.setAttribute("config",JSON.stringify(s||{})),!(s?.hide||s?.docs?.hide)&&(w(l)&&await y.panicOnBuildContentError('The reserved route "/mcp" cannot be used in redirect configuration. Please remove any redirects involving "/mcp" from your redocly.yaml config.'),!s?.docs?.hide)){d.info("Configuring MCP servers...");const u=p(m,"./handlers/docs-mcp-handler.js"),g=R(b(t,s?.docs?.ignore||[])),a=new Map;for(const e of g)a.set(e.definition.info?.title?.toLowerCase()||"",{name:e.definition.info?.title||"",description:e.definition.info?.description||"",version:e.definition.info?.version||"",servers:e.definition.servers||[],relativePath:e.relativePath});const D=Object.values(n.products||{}).map(e=>e?.name).filter(S),h=!!n?.access?.requiresLogin,v=n?.access?.rbac||{},C=O({products:D,requiresLogin:h,rbac:v});r.addMcpTools(p(m,"./docs-mcp/tools/index.js"),C),await j({actions:r,handlerPath:u,apiDescriptionsMap:Object.fromEntries(a),mcpConfig:s}),i=!0}})},async afterRoutesCreated(r,o){const c=await o.getConfig(),{mcp:t}=c;r.setGlobalData({mcpData:{docs:{enabled:!t?.hide&&!t?.docs?.hide,name:t?.docs?.name}}})}}}var U=T;async function j({actions:i,handlerPath:r,apiDescriptionsMap:o,mcpConfig:c}){i.createRequestHandler(f,r),i.addApiRoute({slug:"/mcp",requestHandlerId:f,httpMethod:"all",getStaticData:async()=>({props:{config:{apiDescriptionsMap:o,mcpDocsServerName:c?.docs?.name||"Docs MCP Server"},serverOutDir:i.serverOutDir,tools:i.getMcpTools().map(({importPath:t,...n})=>n)}})}),d.info("Registered Docs MCP Server endpoint at /mcp")}export{f as MCP_DOCS_SERVER_HANDLER_ID,U as default,T as mcpServerPlugin};
|
|
@@ -1,24 +1,15 @@
|
|
|
1
|
-
import
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
});
|
|
12
|
-
protected registerTools(): void;
|
|
13
|
-
protected getServerType(): McpServerType;
|
|
14
|
-
}
|
|
15
|
-
export declare function createDocsMcpServer({ name, baseUrl, headers, apiDescriptionsMap, outdir, accessInfo, products, }: {
|
|
1
|
+
import { McpServer } from '@redocly/mcp-typescript-sdk/server/mcp.js';
|
|
2
|
+
import { StreamableHTTPServerTransport } from '@redocly/mcp-typescript-sdk/server/streamableHttp.js';
|
|
3
|
+
import type { McpToolSchema } from '../../../types';
|
|
4
|
+
import type { McpToolContext } from '../types.js';
|
|
5
|
+
export type DocsMcpServerInstance = {
|
|
6
|
+
server: McpServer;
|
|
7
|
+
transport: StreamableHTTPServerTransport;
|
|
8
|
+
cleanup: () => Promise<void>;
|
|
9
|
+
};
|
|
10
|
+
export declare function createDocsMcpServer({ name, tools, context, }: {
|
|
16
11
|
name: string;
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
outdir: string;
|
|
21
|
-
accessInfo: AccessInfo;
|
|
22
|
-
products: string[];
|
|
23
|
-
}): Promise<import("../types.js").McpServerInstance>;
|
|
12
|
+
tools: McpToolSchema[];
|
|
13
|
+
context: McpToolContext;
|
|
14
|
+
}): Promise<DocsMcpServerInstance>;
|
|
24
15
|
//# sourceMappingURL=docs-server.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{McpServer as p}from"@redocly/mcp-typescript-sdk/server/mcp.js";import{StreamableHTTPServerTransport as l}from"@redocly/mcp-typescript-sdk/server/streamableHttp.js";import{logger as m}from"../../../tools/notifiers/logger.js";import{mcpToolWorkers as f,MCP_TOOL_WORKER_KEY as d}from"../../../workers/mcp-tool-worker-pool.js";async function v({name:e,tools:a,context:n}){const o=new p({name:e,version:new Date().toISOString().slice(0,10)},{capabilities:{logging:{}}}),s=new l({sessionIdGenerator:void 0});for(const r of a){const t=async(i,c)=>{m.info(`MCP tool called: ${r.name}`);const u={toolName:r.name,args:i,context:g(n),extra:I(c)};return await f.exec(d,[u],{timeout:6e4})};o.tool(r.name,r.description,r.schema,t)}return await o.connect(s),{server:o,transport:s,cleanup:async()=>{s.close()}}}function I(e){return{sessionId:e.sessionId,authInfo:e.authInfo,requestId:e.requestId,requestInfo:e.requestInfo,_meta:e._meta}}function g(e){return{user:e.user,config:e.config,outdir:e.outdir,baseUrl:e.baseUrl,params:e.params,query:e.query,cookies:e.cookies,apiDescriptionsMap:e.apiDescriptionsMap,products:e.products}}export{v as createDocsMcpServer};
|
|
@@ -1,20 +1,13 @@
|
|
|
1
1
|
import type { OpenAPIPath } from '@redocly/openapi-docs/src/types';
|
|
2
|
-
import type {
|
|
3
|
-
import type {
|
|
4
|
-
import type {
|
|
2
|
+
import type { ApiFunctionsContext, ApiFunctionsContextMethods, PageStaticData } from '@redocly/config';
|
|
3
|
+
import type { CallToolResult, RequestId, RequestInfo, RequestMeta } from '@redocly/mcp-typescript-sdk/types.js';
|
|
4
|
+
import type { AuthInfo } from '@redocly/mcp-typescript-sdk/server/types.js';
|
|
5
5
|
import type { OpenAPIServer } from '@redocly/openapi-docs/lib/types/open-api.js';
|
|
6
6
|
import type { McpErrorCodes, McpServerType } from './constants';
|
|
7
|
-
import type {
|
|
7
|
+
import type { McpToolSchema } from '../../types';
|
|
8
8
|
type ObjectValues<T> = T[keyof T];
|
|
9
9
|
export type McpServerType = ObjectValues<typeof McpServerType>;
|
|
10
10
|
export type McpErrorCodeTypes = ObjectValues<typeof McpErrorCodes>;
|
|
11
|
-
export type AccessInfo = {
|
|
12
|
-
isAuthenticated: boolean;
|
|
13
|
-
email?: string;
|
|
14
|
-
teams?: string[];
|
|
15
|
-
rbac: RbacConfig;
|
|
16
|
-
requiresLogin: boolean;
|
|
17
|
-
};
|
|
18
11
|
export type ApiDescriptionInfo = {
|
|
19
12
|
name: string;
|
|
20
13
|
relativePath: string;
|
|
@@ -29,6 +22,8 @@ export type McpDocsStaticDataPropsConfig = {
|
|
|
29
22
|
export type McpDocsStaticData = PageStaticData & {
|
|
30
23
|
props: {
|
|
31
24
|
config: McpDocsStaticDataPropsConfig;
|
|
25
|
+
serverOutDir?: string;
|
|
26
|
+
tools?: McpToolSchema[];
|
|
32
27
|
};
|
|
33
28
|
};
|
|
34
29
|
export type McpPath = {
|
|
@@ -43,11 +38,6 @@ export type McpEndpoint = {
|
|
|
43
38
|
'x-mcp'?: XMcpConfig;
|
|
44
39
|
[key: string]: any;
|
|
45
40
|
};
|
|
46
|
-
export type McpServerInstance = {
|
|
47
|
-
readonly server: McpServer;
|
|
48
|
-
readonly transport: StreamableHTTPServerTransport;
|
|
49
|
-
cleanup(): Promise<void>;
|
|
50
|
-
};
|
|
51
41
|
export type McpPluginConfig = {
|
|
52
42
|
readonly hide: boolean;
|
|
53
43
|
readonly docs: {
|
|
@@ -71,51 +61,29 @@ export type McpUserInfo = {
|
|
|
71
61
|
exp?: number;
|
|
72
62
|
[key: string]: any;
|
|
73
63
|
};
|
|
74
|
-
export type ToolArgsMap = {
|
|
75
|
-
'list-apis': {
|
|
76
|
-
filter?: string;
|
|
77
|
-
page?: number;
|
|
78
|
-
limit?: number;
|
|
79
|
-
};
|
|
80
|
-
'get-endpoints': {
|
|
81
|
-
name: string;
|
|
82
|
-
};
|
|
83
|
-
'get-endpoint-info': {
|
|
84
|
-
name: string;
|
|
85
|
-
path: string;
|
|
86
|
-
method: string;
|
|
87
|
-
};
|
|
88
|
-
'get-security-schemes': {
|
|
89
|
-
name: string;
|
|
90
|
-
};
|
|
91
|
-
'get-full-api-description': {
|
|
92
|
-
name: string;
|
|
93
|
-
};
|
|
94
|
-
search: {
|
|
95
|
-
query: string;
|
|
96
|
-
product?: string;
|
|
97
|
-
};
|
|
98
|
-
whoami: Record<string, never>;
|
|
99
|
-
};
|
|
100
|
-
export type McpToolWorkerParams = {
|
|
101
|
-
[K in keyof ToolArgsMap]: {
|
|
102
|
-
toolName: K;
|
|
103
|
-
args: ToolArgsMap[K];
|
|
104
|
-
context: {
|
|
105
|
-
apiDescriptionsMap: Record<string, ApiDescriptionInfo>;
|
|
106
|
-
outdir?: string;
|
|
107
|
-
accessInfo?: AccessInfo;
|
|
108
|
-
baseUrl?: string;
|
|
109
|
-
headers?: Record<string, string | string[] | undefined>;
|
|
110
|
-
products?: string[];
|
|
111
|
-
};
|
|
112
|
-
};
|
|
113
|
-
}[keyof ToolArgsMap];
|
|
114
64
|
export type SemanticSearchResult = {
|
|
115
65
|
title: string;
|
|
116
66
|
url: string;
|
|
117
67
|
content: string;
|
|
118
68
|
};
|
|
119
69
|
export type McpToolWorkerResponse = CallToolResult;
|
|
70
|
+
export type McpToolExtra = {
|
|
71
|
+
sessionId?: string;
|
|
72
|
+
authInfo?: AuthInfo;
|
|
73
|
+
requestId: RequestId;
|
|
74
|
+
requestInfo?: RequestInfo;
|
|
75
|
+
_meta?: RequestMeta;
|
|
76
|
+
};
|
|
77
|
+
export type McpToolContext = Omit<ApiFunctionsContext, 'telemetry' | 'getKv' | keyof ApiFunctionsContextMethods> & {
|
|
78
|
+
apiDescriptionsMap: Record<string, ApiDescriptionInfo>;
|
|
79
|
+
products?: string[];
|
|
80
|
+
};
|
|
81
|
+
export type McpToolHandler<TArgs extends Record<string, unknown> = Record<string, unknown>> = (args: TArgs, context: McpToolContext, extra: McpToolExtra) => Promise<McpToolWorkerResponse>;
|
|
82
|
+
export type McpToolExecutionParams = {
|
|
83
|
+
toolName: string;
|
|
84
|
+
args: Record<string, unknown>;
|
|
85
|
+
context: McpToolContext;
|
|
86
|
+
extra: McpToolExtra;
|
|
87
|
+
};
|
|
120
88
|
export {};
|
|
121
89
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
export declare function executeMcpTool(params:
|
|
1
|
+
import type { McpToolExecutionParams, McpToolWorkerResponse } from '../types.js';
|
|
2
|
+
export declare function executeMcpTool(params: McpToolExecutionParams): Promise<McpToolWorkerResponse>;
|
|
3
3
|
//# sourceMappingURL=execute-mcp-tool.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{telemetry as s}from"../../../telemetry/index.js";import{mcpToolHandlers as p}from"../../../../client/mcp-tool-handlers-entry.js";async function w(o){s.initialize();const{toolName:e,args:c,context:a,extra:l}=o;try{const r=p[e];if(!r)throw new Error(`Unknown MCP tool: ${e}`);const{default:i}=await r(),n=i[e];if(!n)throw new Error(`MCP tool module does not export a handler for "${e}". Expected \`export default { '${e}': handler }\`.`);const t=await n(c,a,l);if(!f(t))throw new Error(`MCP tool "${e}" returned an invalid result.`);return t.isError?s.sendMcpErrorMessage([{object:"mcp_server",server_type:"docs",tool:e,message:`${t.content.map(({text:d})=>d).join(" ")}`,stack:""}]):s.sendMcpToolCalledMessage([{object:"mcp_server",server_type:"docs",tool:e}]),t}catch(r){throw s.sendMcpErrorMessage([{object:"mcp_server",server_type:"docs",tool:e,message:r instanceof Error?r.message:String(r),stack:r instanceof Error&&r.stack||""}]),r}}function f(o){return!o||typeof o!="object"?!1:Array.isArray(o.content)}export{w as executeMcpTool};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{simplifyAstStructure as
|
|
1
|
+
import{simplifyAstStructure as te}from"@redocly/openapi-docs";import{REDOCLY_ROUTE_RBAC as E,REDOCLY_TEAMS_RBAC as P}from"@redocly/config";import{OPENAPI_DOCS_TEMPLATE_ID as U,PUBLIC_RBAC_SCOPE_ITEM as V}from"../../../constants/common.js";import{DEPRECATED_PUBLIC_API_DEFINITIONS_FOLDER as oe,PUBLIC_API_DEFINITIONS_FOLDER as ae}from"../../constants/common.js";import{OPENAPI_CUSTOM_FIELDS_SERVER_PROPS_GETTER_ID as re,OPENAPI_SHARED_DATA_PREFIX as $}from"../../constants/plugins/openapi-docs.js";import{envConfig as q}from"../../config/env-config.js";import{isRbacScopeItems as se}from"../../utils/rbac/is-rbac-scope-items.js";import{getRouteSlugsForPath as ie}from"../utils.js";import{searchResolver as ne}from"./search/search-resolver.js";import{convertOpenAPIDocs2Sidebar as pe,shouldAddRoute as ce}from"./utils.js";import{getTemplatePath as M}from"./get-template-path.js";import{storeDefinitionBundles as de}from"./store-definition-bundles.js";import{definitionLoader as le,definitionsLoader as ue}from"./load-definition.js";import{getAiDocumentsStore as fe}from"./search/get-ai-search-documents.js";import{fromCurrentDir as me}from"../../utils/paths.js";import{telemetryTraceStep as ge}from"../../../cli/telemetry/helpers/trace-step.js";import{getApiConfigByPath as he}from"../get-api-config.js";const B="openapi-spec-download";async function Me(){let k=[],_={},N=new Set,f={};return{id:"openapi",requiredEntitlements:["openapi"],loaders:{"load-oas-docs":ue,"load-oas":le},processContent:async(e,c)=>{await ge("build.plugin.openapi_docs",async m=>{e.createRequestHandler(B,me(import.meta.url,"./spec-download.api.js")),e.addApiRoute({slug:ae+"/*",requestHandlerId:B,httpMethod:"all",[P]:V,getStaticData:async()=>({props:{}})}),e.addApiRoute({slug:oe+"/*",requestHandlerId:B,httpMethod:"all",[P]:V,getStaticData:async()=>({props:{}})});const C=e.createTemplate(U,M("../../../client/templates/openapi-docs/template.js")),o=e.registerServerPropsGetter(U,M("./get-server-props.js")),a=e.registerServerPropsGetter(re,M("./get-server-props-custom-fields.js")),s=await c.getConfig();m?.setAttribute("config",JSON.stringify(s.openapi||{}));const d=s.rules?.["custom-fields-schema"];_={},f={};const g=await e.loadOpenApiDefinitions(c);k=g.map(({markdocChunks:p,relativePath:l,customOutputRelativeFile:i,isVirtual:n,realRelativePath:h})=>({chunks:p,relativePath:l,realRelativePath:h,isVirtual:i!=null||n})),de(g,e.outdir);for(const p of g||[]){const{definition:l,config:i,relativePath:n,customOutputRelativeFile:h,contentItems:I,flatItems:D,parser:v,options:x,rawOptions:Y,hash:J}=p,O=h||n,r=[],G={},{definition:Q}=v||{},{info:u}=Q||{},b=u?.["x-metadata"],y=!!i.openapi?.excludeFromSearch||!!i.theme?.openapi?.excludeFromSearch||!!s.openapi?.excludeFromSearch||!!s.theme?.openapi?.excludeFromSearch,j={title:u?.title,description:u?.description,summary:u?.summary,...i.metadata,...b},S={untagged:[],tagged:new Map};for(const t of D){const{id:F,href:R,operationDefinition:T}=t;if(T){const{tags:A}=T;if(A)for(const L of A)S.tagged.has(L)||S.tagged.set(L,[]),S.tagged.get(L)?.push(t);else S.untagged.push(t);q.isDevelopMode&&(G[`#${T.pointer}`]=t.href)}if(!ce({item:t}))continue;const w=t,z=w.type==="section"&&!!w.infoDefinition,K=R.split("#")[0]+"/",Z=t?.operationDefinition?.[P],ee=se(i.access?.rbac)?i.access.rbac:void 0;r.push({excludeFromSearch:y,slugSuffix:K,fsPath:O,metadata:{subType:"openapi-operation"},httpVerb:t?.httpVerb||"",path:n,templateId:C,[P]:Z||ee,getAiDocumentsStore:fe({parser:v,options:x,info:u,tagOperations:S,openapiContentItem:w,metadata:j,relativePath:n,getSearchFacets:e.getSearchFacets,includeInLLMsTxt:z,excludeFromSearch:y}),getStaticData:async A=>({props:{dynamicMarkdocComponents:["openapi"],baseSlug:A.baseSlug,seo:t["x-metadata"]?.seo||{title:t.name,description:t.description},itemId:F,disableAutoScroll:!0}})})}if(r[0]={...r[0],metadata:{type:"openapi",...j},hasClientRoutes:!0,getSidebar:(t,F)=>{const R=[];return pe({contentItems:I,sidebarItems:R,routeSlug:t.slug,navItem:F}),R},getNavText:()=>u?.title,getSearchDocuments:ne(v,x,D,e.getSearchFacets,e.setSearchFacets,y)},b?.apiId&&!p.isVirtual){const t=he(p.config.apis,p.realRelativePath);f[b.apiId]={[P]:t.rbac,[E]:{fsPath:O}}}const W=r[0];r[0]=r[r.length-1],r[r.length-1]=W;for(const t of r)e.addRoute({...t,serverPropsGetterIds:d?[o,a]:[o]});const X=q.isDevelopMode?n:void 0,H=`${$}${n}`;_[H]={fsPath:O,definition:l,options:Y,sourcePath:X,routesMapping:G,hash:J};for(const t of r)e.addRoute({...t,sharedData:[{id:H,key:"openAPIDocsStore"}],serverPropsGetterIds:d?[o,a]:[o]})}})},afterRoutesCreated:async(e,c)=>{const m=new Set;for(const{chunks:o,relativePath:a,isVirtual:s,realRelativePath:d}of k){const g=ie(e.getAllRoutes(),a),p=(await c.cache.load(d,"load-oas")).compoundHash;await c.cache.load(a,{loader:async function(){for(const{node:i,markdown:n,key:h,relativePath:I}of o){const{ast:D}=await e.parseMarkdoc({input:{content:n,relativePath:I,isVirtual:s},context:c,deps:{sharedDataIds:[`${$}${I}`],routeSlugs:g}});i[`x-parsed-md-${h}`]={result:te(D)}}},name:"openapi-markdoc-inline-parser"},[p]);for(const{pointer:l}of o)m.add(l)}const C=N.difference(m);for(const o of C)c.cache.delete(o);N=m;for(const[o,a]of Object.entries(_))await e.createSharedData(o,{...a,baseSlug:e.getRouteByFsPath(a.fsPath)?.baseSlug},a.hash);Object.entries(f).forEach(([o,a])=>{const s=a[E]?.fsPath;if(!s)return;const d=e.getRouteByFsPath(s)?.baseSlug;f[o]={...a,[E]:{...a[E],slug:d},slug:d}}),e.setGlobalData({apiProducts:f})}}}export{Me as openAPIDocsPlugin};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import*as y from"@redocly/openapi-docs";import{REDOCLY_TEAMS_RBAC as
|
|
1
|
+
import*as y from"@redocly/openapi-docs";import{REDOCLY_TEAMS_RBAC as c}from"@redocly/config";import{combineUrls as l}from"@redocly/theme/core/utils";import{SEARCH_DOCUMENT_METADATA_KEY as k}from"../../constants/plugins/search.js";import{removeMarkdownLinks as p,stripFormatting as a}from"./utils.js";import{normalizeFrontmatterKeywords as O}from"../helpers/normalize-frontmatter-keywords.js";const h=y.default||y;class q{#n=[];#s;#r;#e;#i;constructor(e,t,n){this.#s=e,this.#r=t,this.#e=n}addItem(e){const{result:t}=O(e.keywords||e.operationDefinition?.keywords);t?.excludes&&e.type==="section"&&e.id===""&&(this.#i=t.excludes);try{let n;switch(e.type){case"tag":n=this.#c(e);break;case"operation":const d=this.getOperation(e);n=this.#d(d,e[c]);break;case"section":n=this.#p(e);break;case"rsrc":case"prompt":case"tool":n=this.#o(e);break}if(!n)return;const s=[...new Set([...t?.excludes?t.excludes:[],...this.#i?this.#i:[]])];return(t||s.length)&&(n[k]={curated:!0,...t,excludes:s}),this.#n.push(n),n}catch(n){console.error("Cannot add item to search indexer",n.message)}}addInfo(e,t){const n=this.#e,s={id:n,url:n,text:a(p(e.description||"")),title:a(`${e.title} (${e.version})`),metadata:t};return this.#n.push(s),s}#o(e){const t=l(this.#e,e.href);return{id:t,url:t,text:a(p(e.description||"")),title:e.name}}getResult(){return this.#n}getOperation(e){return h.getOperation(this.#s,e.operationDefinition,e.parent,{...this.#r,internal_skipSamples:!0},e.href)}#a(e){return[...e.path||[],e.name.toString()].join(".")+e.description+e.place}#d(e,t){if(e.type!=="operation")return;let n={};for(let r of e.parameters){if(r[c])continue;const o=r.schema?.example||r.example,i={name:r.name,description:a(p(r.description)),place:r.in+" parameters",mediaType:void 0,type:r.schema?.type.toString()||"unknown",deepLink:h.generateDeepLink(r),[c]:r[c],required:r.required,example:o?JSON.stringify(o):void 0,enum:r.schema?.enum?.length?r.schema.enum:void 0};n[this.#a(i)]=i}const s=new Set;this.#t(n,e.requestBody?.content?.mediaTypes[0]?.schema,e.requestBody?.content?.mediaTypes[0]?.name,"request fields",!1,[],s);for(let r of e.responses){const o=`response ${r.code} fields`;this.#t(n,r.content?.mediaTypes[0]?.schema,r.content?.mediaTypes[0]?.name,o,!0,[],s)}let d=l(this.#e,e.href);return{id:d,url:d,title:a(e.name),text:a(p(e.description||"")),httpMethod:e.httpVerb,httpPath:e.path,deprecated:e.deprecated,isAdditionalOperation:e.isAdditionalOperation,security:e.security.map(r=>r.schemes.map(o=>o.id)).flat().filter(Boolean),parameters:Object.values(n),badges:e.badges.length?e.badges:void 0,[c]:t}}#t(e,t,n,s,d,u=[],r=new Set,o=0){if(!(!t||t.isCircular)){if(t.pointer){if(r.has(t.pointer))return;r.add(t.pointer)}if(!(o>this.#r.generatedSamplesMaxDepth)){if(t?.fields)for(let i of t.fields){if(t[c]||i.kind==="additionalProperties"||i.schema?.readOnly&&!d||i.schema?.writeOnly&&d)continue;const m=i.schema?.example||i.example,f=i.schema?.enum,g={name:i.name,description:a(i.description),place:s,mediaType:n,path:u,deepLink:h.generateDeepLink(i),type:i.schema?.type.toString()||"unknown",required:i.required||t.schema.required?.includes(i.name)||!1,example:m?JSON.stringify(m):void 0,enum:f?.length?f:void 0},x=this.#a(g);e[x]==null&&(e[x]=g,this.#t(e,i.schema,n,s,d,u.concat([i.name]),r,o+1))}t?.items&&this.#t(e,t.items,n,s,d,u,r,o+1)}}}#c(e){const t=l(this.#e,e.href);return{id:t,url:t,text:a(p(e.description||"")),title:a(e.name)}}#p(e){const t=l(this.#e,e.href);return{id:t,url:t,text:a(p(e.description||"")),title:a(e.name)}}}export{q as SearchIndexer};
|
package/dist/server/store.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { Node } from '@markdoc/markdoc';
|
|
2
2
|
import type { JSX } from 'react';
|
|
3
3
|
import type { CommonError, GlobalData } from '../types/index.js';
|
|
4
|
-
import type { MiddlewareDetails, PageRouteInit, PageRouteDetails, RouteDetails, LifecycleContext, ApiRoute, ParseMarkdocOpts, WildcardRedirectsTree } from './types';
|
|
4
|
+
import type { MiddlewareDetails, PageRouteInit, PageRouteDetails, RouteDetails, LifecycleContext, ApiRoute, ParseMarkdocOpts, WildcardRedirectsTree, RedirectOptions, McpToolRegistration, McpToolSchema } from './types';
|
|
5
5
|
import type { RedoclyConfig, RedirectConfig, CompilationError, PageStaticData } from '@redocly/config';
|
|
6
6
|
import type { SearchFacet } from '@redocly/theme/core/types';
|
|
7
7
|
import type { BundledDefinition as OpenApiBundledDefinition } from './plugins/openapi-docs/load-definition.js';
|
|
@@ -55,6 +55,7 @@ export declare class Store {
|
|
|
55
55
|
templates: Map<string, string>;
|
|
56
56
|
browserPlugins: Set<string>;
|
|
57
57
|
apiRoutesRequestHandlers: Map<string, string>;
|
|
58
|
+
mcpToolHandlers: Map<string, McpToolRegistration>;
|
|
58
59
|
serverPropsGetters: Map<string, string>;
|
|
59
60
|
pagePropsGetters: Map<string, string>;
|
|
60
61
|
listeners: Map<string, Set<(...args: any[]) => void>>;
|
|
@@ -140,7 +141,7 @@ export declare class Store {
|
|
|
140
141
|
getConfig: () => RedoclyConfig;
|
|
141
142
|
getGlobalConfig: <T = unknown>(key: string) => T;
|
|
142
143
|
getSearchFacets: () => Map<string, SearchFacet>;
|
|
143
|
-
addRedirect: (from: string, to: RedirectConfig) => void;
|
|
144
|
+
addRedirect: (from: string, to: RedirectConfig, options?: RedirectOptions) => void;
|
|
144
145
|
getRedirect: (from: string) => WithRequired<RedirectConfig, "to"> | null;
|
|
145
146
|
createSharedData: (id: string, data: unknown, hash?: string) => Promise<string>;
|
|
146
147
|
addRouteSharedData: (routeSlug: string, dataKey: string, dataId: string) => void;
|
|
@@ -149,6 +150,8 @@ export declare class Store {
|
|
|
149
150
|
addRoute: (route: PageRouteInit) => void;
|
|
150
151
|
addRouteSharedDataToAllLocales: (slug: string, dataKey: string, dataId: string) => void;
|
|
151
152
|
addApiRoute: (route: ApiRoute) => void;
|
|
153
|
+
addMcpTools: (importPath: string, tools: McpToolSchema[]) => void;
|
|
154
|
+
getMcpTools: () => McpToolRegistration[];
|
|
152
155
|
addMiddleware: (middleware: MiddlewareDetails) => void;
|
|
153
156
|
getRouteByFsPath: (relativePath: string) => PageRouteDetails | undefined;
|
|
154
157
|
getRouteBySlug: (slug: string, opts?: {
|