@redocly/revel 0.138.0 → 0.139.0-next.2
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 +29 -0
- package/dist/client/app/markdoc/custom-components/openapi/openapi-example.js +1 -1
- package/dist/client/templates/api-docs/template.js +8 -8
- 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/server/plugins/api-docs/search/create-indexer.d.ts +9 -2
- package/dist/server/plugins/api-docs/search/create-indexer.js +1 -1
- package/dist/server/plugins/api-docs/search/get-ai-search-documents.js +68 -68
- package/dist/server/plugins/api-docs/search/search-resolver.js +1 -1
- package/dist/server/plugins/config-parser/loaders/utils/read-and-validate-config.js +1 -1
- package/dist/server/plugins/mcp/codemode/capabilities/utils.js +4 -4
- package/dist/server/plugins/mcp/codemode/constants.js +1 -1
- package/dist/server/plugins/mcp/codemode/prompts.d.ts +2 -1
- package/dist/server/plugins/mcp/codemode/prompts.js +8 -8
- package/dist/server/plugins/mcp/codemode/tools/describe-tools.js +2 -2
- package/dist/server/plugins/mcp/codemode/tools/execute-schema.d.ts +2 -0
- package/dist/server/plugins/mcp/codemode/tools/execute-schema.js +1 -1
- package/dist/server/plugins/mcp/constants.d.ts +2 -0
- package/dist/server/plugins/mcp/constants.js +1 -1
- package/dist/server/plugins/mcp/docs-mcp/tool-schemas.js +1 -1
- package/dist/server/plugins/mcp/docs-mcp/tools/core/create-anonymous-session.js +1 -1
- package/dist/server/plugins/mcp/docs-mcp/tools/core/submit-feedback.js +2 -2
- package/dist/server/plugins/mcp/gateway-mcp/callable-apis.d.ts +3 -2
- package/dist/server/plugins/mcp/gateway-mcp/callable-apis.js +1 -1
- package/dist/server/plugins/mcp/handlers/docs-mcp-handler.js +1 -1
- package/dist/server/plugins/mcp/servers/docs-server.js +1 -1
- package/dist/server/plugins/mcp/utils/docs-site-url.d.ts +6 -0
- package/dist/server/plugins/mcp/utils/docs-site-url.js +1 -0
- package/dist/server/web-server/routes/mcp-routes/mcp-server-card.js +1 -1
- package/package.json +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
import{logger as A}from"../../../tools/notifiers/logger.js";import{getFeedbackClientIp as N}from"../../../web-server/utils/feedback-ip.js";import{getForwardedOrigin as M,getInternalOrigin as
|
|
1
|
+
import{logger as A}from"../../../tools/notifiers/logger.js";import{getFeedbackClientIp as N}from"../../../web-server/utils/feedback-ip.js";import{getForwardedOrigin as M,getInternalOrigin as L}from"../../../web-server/utils/get-request-origin.js";import{GATEWAY_FETCH_LIMIT_DEFAULTS as B,DEFAULT_ANONYMOUS_VISITOR_TEAM as H,RbacFeatures as j}from"../../../../constants/common.js";import{isObject as V}from"../../../../utils/guards/is-object.js";import{getAccessibleSkills as $}from"../../../utils/skills/get-accessible-skills.js";import{getSkillUrl as G}from"../../../utils/skills/get-skill-url.js";import{createMcpHandler as J}from"@modelcontextprotocol/server";import{createDocsMcpServer as K}from"../servers/docs-server.js";import{filterApiDescriptionsByRbac as Y,filterGraphqlDescriptionsByRbac as z}from"../utils.js";import{userSubject as W}from"../gateway-mcp/subject.js";import{ipRateLimitKey as X}from"../gateway-mcp/rate-limit/utils/ip-key.js";import{McpClientInputError as Q,createMethodNotAllowedError as Z,withErrorHandling as q}from"./errors.js";import{constructForbiddenResponse as x,constructInvalidTokenResponse as ee,constructUnauthorizedResponse as re,handleMcpAuth as oe}from"../auth/auth-handlers.js";import{isAssistantAnonymousToken as se}from"../auth/assistant-anonymous-token.js";import{shouldHandleMcpAuth as ne}from"../../../utils/rbac/should-handle-mcp-auth.js";import{extractTokenFromAuthHeader as ie}from"../utils/jwt.js";import{resolveMcpClient as te}from"../utils/mcp-client.js";import{randomUUID as ce}from"../../../utils/crypto/random-uuid.js";import{getPublicMcpEndpointStatus as ae}from"../utils/public-endpoint.js";import{narrowMcpConfigForCaller as pe}from"../gateway-mcp/caller-api-calls.js";import{DEFAULT_DOCS_MCP_SERVER_NAME as de,SSE_KEEPALIVE_INTERVAL_MS as me}from"../constants.js";import{withPathPrefix as le}from"@redocly/theme/core/utils";import{PUBLIC_MCP_ROUTE as ue}from"@redocly/theme/core/constants/mcp";import{canAccessFeature as fe}from"../../../utils/rbac.js";import{ANONYMOUS_AUTH_DETAILS as ge}from"../../../constants/rbac.js";const E="X-Redocly-AI-Metadata";function he(r){if(r)try{const e=JSON.parse(r);if(V(e))return e;A.warn(`Ignoring ${E} header: not a JSON object.`)}catch{A.warn(`Ignoring ${E} header: invalid JSON.`)}}function Ae(r,e){return new URL(r).searchParams.get("mode")==="tools"?"tools":e}function I(){return{...ge,email:"",idpAccessToken:void 0,idpId:void 0}}const Me=async(r,e,i)=>{const t=!!e?.config?.access?.requiresLogin,c=e?.config?.access?.rbac||{},y=i?.props?.config?.mcpMode??"tools",p=Ae(r.url,y),C=i?.props?.config?.gatewayFetchBudgetPerExec??B.budgetPerExec,U=i?.props?.config?.searchIgnoredRoutes??[],s=i,R=!!s?.props?.config?.isPublicEndpoint;let f;const T=r.headers.get("Authorization");if(R)e.user=I();else if(ne(t,c)){const{isAuthenticated:n,isTokenValid:d,isFirstPartyAnonymous:g,currentUser:m,accessToken:h}=await oe(r,e);if(g)e.user=I();else if(n)m&&(e.user=m),f=h;else{const a=M(r),l=ae(e.config)==="served"?`${a}${le(ue)}`:void 0;return d===!1?ee(a,l):re(a,l)}}else if(T){const n=ie(T)??void 0;f=(n?await se(n):!1)?void 0:n}const w={isAuthenticated:!!e.user?.isAuthenticated,teams:e.user?.teams||[H],claims:e.user?.claims??{}};return fe(j.MCP,w,c,t)?await q(async()=>{const n=p==="code"&&(i?.props?.config?.elicitationEnabled??!1);if(r.method==="GET")return new Response(JSON.stringify({error:"Method Not Allowed",message:`In order to use this MCP server, you need to register it in your MCP client (VS Code, Cursor, Claude Code, etc.) using this URL: ${r.url}`}),{status:405,headers:{"Content-Type":"application/json"}});if(r.method!=="POST")return Z();const d=s?.props?.config?.apiDescriptionsMap||{},g=s?.props?.config?.graphqlDescriptions||[],m=s?.props?.config?.mcpDocsServerName||de,{config:{mcp:h={}}}=e,a=Y(d,e.user,c,t),l=z(g,e.user,c,t),P=e.config.products?Object.values(e.config.products).map(o=>o?.name):[],D=h.docs?.name||m,u=he(r.headers.get(E)),_=s?.props?.tools||[],O=s?.props?.skillsBaseUrl||M(r),k=$(s?.props?.skills||[],e.user,c,t).map(o=>({slug:o.slug,name:o.name,description:o.description,content:o.content,uri:G(O,o.slug)})),S=await Ee(r),b=s?.props?.fetchCountSecret,v={name:D,tools:_,skills:k,context:{...e,config:{...e.config,mcp:pe(e.config.mcp,u)},accessToken:f,outdir:e.outdir||"",baseUrl:e.baseUrl||M(r),internalBaseUrl:L(r),apiDescriptionsMap:a,graphqlDescriptions:l,products:P,metadata:u,mcpMode:p,elicitationEnabled:n,gatewayFetchBudgetPerExec:C,fetchCountRequest:p==="code"&&b?{caller:{subject:W(e.user),ip:X(r)},secret:b}:void 0,searchIgnoredRoutes:U,clientIp:N(r),...te(r),requestId:ce(),messageId:typeof u?.messageId=="string"?u.messageId:void 0}},F=await K({...v,getKv:e.getKv});return await J(async()=>F,{keepAliveMs:me,onerror:o=>A.warn(`MCP handler: ${o.message}`)}).fetch(r,S!==void 0?{parsedBody:S}:void 0)},p):x()};async function Ee(r){try{return await r.json()}catch(e){throw new Q(e instanceof Error?e.message:String(e),{cause:e})}}var ze=Me;export{ze as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{logger as
|
|
1
|
+
import{logger as N}from"../../../tools/notifiers/logger.js";import{mcpToolWorkers as y,MCP_TOOL_IS_AVAILABLE_KEY as U}from"../../../workers/mcp-tool-worker-pool.js";import{CREATE_ANONYMOUS_SESSION_TOOL_NAME as S,MANAGE_API_CREDENTIALS_TOOL_NAME as w,SUBMIT_FEEDBACK_TOOL_NAME as h}from"../constants.js";import{isAnonymousSessionToolAvailable as I}from"../docs-mcp/tools/core/create-anonymous-session.js";import{isManageApiCredentialsToolAvailable as x,manageApiCredentials as H,manageApiCredentialsSchema as B}from"../codemode/tools/manage-credentials.js";import{EXECUTE_TOOL_SCHEMA as M,executeToolTitle as F}from"../codemode/tools/execute-schema.js";import{EXECUTE_TOOL_NAME as P,CODE_MODE_TOOL_NAMES as g,FETCH_TOOL_NAME as R}from"../codemode/constants.js";import{buildCodeModeInstructions as Y,buildExecuteDescription as z}from"../codemode/prompts.js";import{toToolListEntries as K}from"../codemode/build-tool-list.js";import{composeExecuteAnnotations as W,getActiveCapabilities as X}from"../codemode/capabilities/index.js";import{describeToolsSchema as $,describeTools as j}from"../codemode/tools/describe-tools.js";import{availableSandboxTools as G}from"../utils/available-sandbox-tools.js";import{resolveDocsSiteUrl as V}from"../utils/docs-site-url.js";import{isToolDisabledByCaller as b}from"../utils/disabled-tools.js";import{toRegisterToolConfig as L}from"../utils/tool-registration.js";import{createMcpServer as q,createToolDispatch as J,extractSerializableContext as Q}from"./mcp-server.js";const Z=new Set([...g].filter(s=>s!==h));function v(s,a){const o=a.schema;if(s)return o;const{sessionHandle:u,...f}=o.properties;return{...o,properties:f}}function ee(s){return Object.fromEntries(s.map(a=>[a.name,a.schema]))}async function ue({name:s,tools:a,context:o,skills:u=[],getKv:f}){const l=Q(o),r=o.mcpMode==="code",c=r?X(o):[],_=c.some(e=>e.id===R),m=r?await G(a.filter(e=>!g.has(e.name)),l):[],A=K(m,c),T=I(o)&&!b(S,o.metadata),D=r&&x(o)&&!b(w,o.metadata),p=q(s,r?Y(_,A):void 0),O={getClientCapabilities:()=>p.server.getClientCapabilities(),getKv:f},d=J(r?{...l,sandboxToolSchemas:ee(m)}:l,O),C=async e=>{try{return await y.exec(U,[{toolName:e,context:l}],{timeout:1e4})}catch(i){return N.error(`Failed to check MCP tool availability for "${e}": ${i instanceof Error?i.message:String(i)}`),!1}};if(r){const e=W(m,c,o.config?.mcp),i=[{tool:{...M,title:F(e),description:z(_,A,V(o.config?.seo?.siteUrl,o.baseUrl)),schema:v(T,M),annotations:e},callback:d(P)},{tool:$(m,c),callback:j(m,C,c,o)}],n=a.find(t=>t.name===h);n&&!b(n.name,o.metadata)&&i.push({tool:n,callback:d(n.name)});const E=a.find(t=>t.name===S);if(E&&T&&i.push({tool:E,callback:d(E.name)}),D){const t=B(o);i.push({tool:{...t,schema:v(T,t)},callback:H(l,O)})}for(const{tool:t,callback:k}of i)p.registerTool(t.name,L(t),k)}else{const e=a.filter(i=>!Z.has(i.name));await Promise.all(e.map(async i=>{const n=p.registerTool(i.name,L({...i,outputSchema:void 0}),d(i.name));await C(i.name)||n.disable()}))}for(const e of u)p.registerResource(e.slug,e.uri,{title:e.name,description:e.description,mimeType:"text/markdown"},async()=>({contents:[{uri:e.uri,mimeType:"text/markdown",text:e.content}]}));return p}export{ue as createDocsMcpServer};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The first http(s) URL of `seo.siteUrl`, `REDOCLY_PUBLIC_URL`, and the request origin, without a
|
|
3
|
+
* trailing slash. The request origin gives only its origin. Undefined when none of them is valid.
|
|
4
|
+
*/
|
|
5
|
+
export declare function resolveDocsSiteUrl(siteUrl: string | undefined, requestOrigin: string | undefined): string | undefined;
|
|
6
|
+
//# sourceMappingURL=docs-site-url.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{envConfig as e}from"../../../config/env-config.js";import{removeTrailingSlash as i}from"../../../../utils/url/remove-trailing-slash.js";function t(r){if(!r||!URL.canParse(r))return;const n=new URL(r);return n.protocol==="http:"||n.protocol==="https:"?n:void 0}function c(r,n){const o=t(r)??t(e.REDOCLY_PUBLIC_URL);return o?i(`${o.origin}${o.pathname}`):t(n)?.origin}export{c as resolveDocsSiteUrl};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{combineUrls as
|
|
1
|
+
import{combineUrls as O,withPathPrefix as h}from"@redocly/theme/core/utils";import{DEFAULT_DOCS_MCP_SERVER_NAME as M,MCP_PROTOCOL_VERSION as R}from"../../../plugins/mcp/constants.js";import{RESERVED_ROUTES as L}from"../../../plugins/get-reserved-routes.js";import{isMcpCodeModeEnabled as y}from"../../../plugins/mcp/utils/mode.js";import{CODE_MODE_TOOL_NAMES as A,EXECUTE_TOOL_NAME as D,FETCH_TOOL_NAME as U}from"../../../plugins/mcp/codemode/constants.js";import{EXECUTE_TOOL_SCHEMA as I,executeToolTitle as P}from"../../../plugins/mcp/codemode/tools/execute-schema.js";import{describeToolsSchema as x}from"../../../plugins/mcp/codemode/tools/describe-tools.js";import{normalizeToolDisplayName as V}from"../../../plugins/mcp/utils/tool-registration.js";import{buildCodeModeInstructions as H,buildExecuteDescription as N}from"../../../plugins/mcp/codemode/prompts.js";import{toToolListEntries as w}from"../../../plugins/mcp/codemode/build-tool-list.js";import{composeExecuteAnnotations as q}from"../../../plugins/mcp/codemode/capabilities/index.js";import{ALL_CAPABILITIES as j}from"../../../plugins/mcp/codemode/capabilities/registry.js";import{isGatewayCapabilityEnabled as k}from"../../../plugins/mcp/gateway-mcp/eligibility.js";import{shouldHandleMcpAuth as B}from"../../../utils/rbac/should-handle-mcp-auth.js";import{resolvePublicBaseUrl as F}from"../../../web-server/utils/resolve-public-base-url.js";import{getRequestOrigin as G}from"../../../web-server/utils/get-request-origin.js";import{resolveDocsSiteUrl as X}from"../../../plugins/mcp/utils/docs-site-url.js";import{telemetryTraceStep as z}from"../../../telemetry/helpers/trace-step.js";import{MCP_AUTH_SCHEMES as $}from"./constants.js";const J="https://static.modelcontextprotocol.io/schemas/mcp-server-card/v1.json",K="1.0";function fe(r){const s=y(),T=new Date().toISOString().slice(0,10);return async n=>await z("com.redocly.mcpServerCard.served",async t=>{t?.setAttribute("id","mcpServerCardId"),t?.setAttribute("object","mcpServerCard"),t?.setAttribute("uri","urn:redocly:realm:api:mcpServerCard:mcpServerCardId");const o=r.getConfig(),a=o.mcp?.docs?.name||M,l=r.getMcpTools().filter(e=>e.name!==D),m=l.filter(e=>!e.hasAvailabilityGate),d=l.filter(e=>!A.has(e.name)),p=d.filter(e=>!e.hasAvailabilityGate),i=k(o.mcp)?[...j]:[],u=i.some(e=>e.id===U),E=w(p,i),C=q(d,i,o.mcp),c=(s?[{...I,title:P(C),description:N(u,E,X(o.seo?.siteUrl,G(n))),annotations:C},x(p,i),...m.filter(e=>A.has(e.name))]:m).map(V).map(({name:e,title:b,description:S,schema:g,annotations:v})=>({name:e,title:b,description:S,inputSchema:g,annotations:v})),_=o.skills?.hide===!0?[]:r.getSkills(),f={$schema:J,version:K,protocolVersion:R,serverInfo:{name:a,title:a,version:T},description:o.seo?.description,documentationUrl:O(F(r,n),h("/")),transport:{type:"streamable-http",endpoint:h(L.mcp)},capabilities:{logging:{},tools:{listChanged:!0},..._.length>0?{resources:{listChanged:!0},completions:{}}:{}},authentication:B(!!o.access?.requiresLogin,o.access?.rbac)?{required:!0,schemes:$}:void 0,instructions:s?H(u,E):void 0,tools:c.length>0?c:["dynamic"]};return t?.setAttribute("mode",s?"code":"tools"),t?.setAttribute("toolsCount",c.length),t?.setAttribute("authRequired",f.authentication!==void 0),n.json(f,200,{"Access-Control-Allow-Origin":"*","Cache-Control":"public, max-age=3600"})})}export{fe as mcpServerCardHandler};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@redocly/revel",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.139.0-next.2",
|
|
4
4
|
"description": "",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -33,13 +33,13 @@
|
|
|
33
33
|
"@opentelemetry/sdk-trace-web": "2.8.0",
|
|
34
34
|
"@opentelemetry/semantic-conventions": "1.40.0",
|
|
35
35
|
"@redocly/ajv": "8.18.0",
|
|
36
|
-
"@redocly/api-docs": "0.
|
|
36
|
+
"@redocly/api-docs": "0.4.0-next.2",
|
|
37
37
|
"@redocly/config": "0.65.0",
|
|
38
38
|
"@redocly/openapi-core": "2.62.1",
|
|
39
39
|
"@redocly/portal-legacy-ui": "0.19.0",
|
|
40
40
|
"@redocly/portal-plugin-mock-server": "0.23.0",
|
|
41
41
|
"@redocly/realm-asyncapi-sdk": "0.16.0",
|
|
42
|
-
"@redocly/theme": "0.
|
|
42
|
+
"@redocly/theme": "0.71.0-next.0",
|
|
43
43
|
"@shikijs/transformers": "3.21.0",
|
|
44
44
|
"@tanstack/react-query": "5.62.3",
|
|
45
45
|
"@tanstack/react-table": "8.21.3",
|
|
@@ -50,7 +50,7 @@
|
|
|
50
50
|
"ajv-formats": "^3.0.1",
|
|
51
51
|
"anser": "^2.3.2",
|
|
52
52
|
"babel-plugin-styled-components": "2.1.4",
|
|
53
|
-
"chokidar": "3.6.0",
|
|
53
|
+
"chokidar": "npm:@redocly/chokidar@3.6.0",
|
|
54
54
|
"colorette": "2.0.20",
|
|
55
55
|
"copy-to-clipboard": "3.3.3",
|
|
56
56
|
"dotenv": "16.4.5",
|