PageSourceSearch

https://app.cloudfix.com/_next/static/chunks/pages/settings/mcp-8af588c6111ec7b4.js

js cloudfix.com collected 2026-09-24 18:30:04 UTC 22,567 bytes, 1 lines download raw bytes

1(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[9168],{12720:function(e,t,s){(window.__NEXT_P=window.__NEXT_P||[]).push(["/settings/mcp",function(){return s(58182)}])},83840:function(e,t,s){"use strict";s.d(t,{v:function(){return r},e:function(){return b}});var n,r,o=s(53704),a=s(15388),l=s.n(a),i=s(39094),d=s(88407),c=s(21902),u=s(83537),m=s.n(u),x=s(97910),p=e=>{let{tabs:t,selectedTab:s}=e,n=(0,c.useRef)(null),[r,a]=(0,c.useState)(!1),[l,i]=(0,c.useState)(!1),u=()=>{if(n.current){let{scrollLeft:e,scrollWidth:t,clientWidth:s}=n.current;a(e>0),i(Math.ceil(e+s)<t-1)}};(0,c.useEffect)(()=>{let e=n.current;if(e){e.addEventListener("scroll",u),u();let t=new ResizeObserver(u);return t.observe(e),()=>{e.removeEventListener("scroll",u),t.disconnect()}}},[]);let p=e=>e?"bg-white p-2 rounded-t-lg select-none w-52":"bg-[#C0EBF2] p-2 rounded-t-lg w-52 hover:bg-[#A8E2EB] transition-colors";return(0,o.jsx)("div",{className:"relative mx-auto mt-4 max-w-[1756px] 6xl:w-[1756px]",children:(0,o.jsxs)("div",{className:"relative px-12",children:[r&&(0,o.jsx)("button",{"aria-label":"Scroll tabs left",onClick:()=>{n.current&&n.current.scrollBy({left:-200,behavior:"smooth"})},className:"pointer-events-auto absolute inset-y-0 left-12 z-10 flex w-20 cursor-pointer items-center justify-start rounded-t-lg bg-gradient-to-r from-[#ffffff] via-[#ffffff] to-transparent pl-2",type:"button",children:(0,o.jsx)(x.wyc,{className:"size-5 text-gray-600",size:16})}),l&&(0,o.jsx)("button",{"aria-label":"Scroll tabs right",onClick:()=>{n.current&&n.current.scrollBy({left:200,behavior:"smooth"})},className:"pointer-events-auto absolute inset-y-0 right-12 z-10 flex w-20 cursor-pointer items-center justify-end rounded-t-lg bg-gradient-to-l from-[#ffffff] via-[#ffffff] to-transparent pr-2",type:"button",children:(0,o.jsx)(x.XCv,{className:"size-5 text-gray-600",size:16})}),(0,o.jsx)("div",{ref:n,className:"scrollbar-hide relative overflow-x-auto rounded-t-lg",children:(0,o.jsx)(d.O.List,{className:"flex min-w-full space-x-2 whitespace-nowrap border-b-0 text-sm",children:t.map((e,t)=>(0,o.jsx)(m(),{href:e.href,children:(0,o.jsx)(d.O,{className:"".concat(p(e.type===s)," rounded-t-lg"),children:e.name})},"".concat(t,"-").concat(e.type)))})})]})})},h=s(7099),g=s(73030);(n=r||(r={}))[n.FindersFixers=0]="FindersFixers",n[n.OUsOnboarding=1]="OUsOnboarding",n[n.Integrations=2]="Integrations",n[n.Users=3]="Users",n[n.ExcludedAccounts=4]="ExcludedAccounts",n[n.ResourceTagging=5]="ResourceTagging",n[n.APITokens=6]="APITokens",n[n.MCP=7]="MCP";let f=[{type:0,name:"Finders & Fixers",href:"/settings/finders"},{type:1,name:"OUs Onboarding",href:"/settings/onboarding"},{type:2,name:"Integrations",href:"/settings/integrations"},{type:3,name:"Users",href:"/settings/users"},{type:4,name:"Excluded Accounts",href:"/settings/excludedAccounts"},{type:5,name:"Resource Tagging",href:"/settings/resourceTagging"},{type:6,name:"API Tokens",href:"/settings/apiTokens"},{type:7,name:"MCP",href:"/settings/mcp",requiredPermission:g.y3.MCP_READ}];function b(e){let{children:t,selectedTab:s}=e,{hasPermission:n,permissions:r}=(0,h.T)(),a=r.length>0,c=f.filter(e=>{let t="requiredPermission"in e?e.requiredPermission:null;return null===t||a&&n(t)});return(0,o.jsxs)(i.Z,{children:[(0,o.jsx)(l(),{children:(0,o.jsx)("title",{children:"CloudFix - Settings"})}),(0,o.jsx)("main",{className:"h-screen p-10 pt-[70px]","data-benchid":"deshboard-id",children:(0,o.jsxs)(d.O.Group,{children:[(0,o.jsx)(p,{tabs:c,selectedTab:s}),(0,o.jsx)(d.O.Panels,{className:"-mt-8 h-full",children:t})]})})]})}},23072:function(e,t,s){"use strict";s.d(t,{Z:function(){return m}});var n=s(53704),r=s(46653),o=s(21902),a=s(3015),l=s(30921),i=s(64144),d=s(22581),c=s(22833),u=s(30222);function m(e){return()=>{let t=(0,r.useRouter)(),[s,m]=(0,o.useState)(!0),x=(0,c.usePathname)(),p=(0,c.useSearchParams)(),{redirectByOnboardingStats:h,isRecommendationsQuery:g,getRecommendationsQuery:f,processTokenExpiration:b}=(0,l.a)(),y=(0,o.useMemo)(()=>Array.from(p).map(e=>{let[t,s]=e;return"".concat(t,"=").concat(s)}).join("&"),[p]);return((0,o.useEffect)(()=>{let e=localStorage.getItem(i.T),s={};p.forEach((e,t)=>{(0,u.EN)(s[t])||(s[t]=[]),s[t].push(e)});let n=(0,d.Ie)(x,s);if(null===e){if(t.pathname.includes("admin")){t.push("/admin/login");return}if(g()){let e={recommendations:f()};t.push({pathname:"/login",query:e})}else t.isReady&&t.push({pathname:"/login",query:{redirect:n}});return}b(e,t),h(),m(!1)},[x,y,t.isReady]),s)?(0,n.jsx)(a.gb,{}):(e.defaultProps={query:t.query},(0,n.jsx)(e,{}))}}},91927:function(e,t,s){"use strict";var n=s(53704),r=s(21902),o=s(3015);t.Z=e=>{let{isActive:t,onClose:s,onCreateToken:a,onCreatedToken:l}=e,[i,d]=(0,r.useState)(""),[c,u]=(0,r.useState)("Reader"),[m,x]=(0,r.useState)(3),[p,h]=(0,r.useState)(!1),[g,f]=(0,r.useState)(""),[b,y]=(0,r.useState)(!1),[v,j]=(0,r.useState)("idle"),N=()=>{d(""),u("Reader"),x(3),h(!1),f(""),j("idle"),s()};return(0,n.jsx)(o.u_,{isActive:t,onEscKeyDown:N,children:(0,n.jsx)("div",{className:"mx-auto w-full max-w-md rounded-lg bg-white p-6 shadow-lg",children:p?(0,n.jsx)(n.Fragment,{children:(0,n.jsxs)("div",{className:"text-center",children:[(0,n.jsx)("h2",{className:"text-lg font-semibold",children:"Token Created"}),(0,n.jsxs)("div",{className:"mt-4",children:[(0,n.jsx)("p",{className:"mb-2 text-sm font-medium text-yellow-700",children:"Important: Copy your API token now"}),(0,n.jsx)("p",{className:"mb-2 text-xs text-gray-500",children:"This is the only time you will be able to see this token. It cannot be recovered later."}),(0,n.jsx)("div",{className:"mb-4 break-all rounded-md bg-gray-100 p-3",children:(0,n.jsx)("code",{className:"text-sm",children:g})}),(0,n.jsx)(o.zx,{type:"button",styleType:"purple",onClick:()=>{navigator.clipboard.writeText(g).then(()=>{j("copied"),setTimeout(()=>j("idle"),2e3)},e=>{console.error("Failed to copy to clipboard:",e),j("error")})},children:"copied"===v?"Copied!":"Copy to Clipboard"}),"error"===v&&(0,n.jsx)("p",{className:"mt-2 text-xs text-red-600",children:"Couldn't copy automatically — select the token above and copy it manually."})]}),(0,n.jsx)("div",{className:"mt-6",children:(0,n.jsx)(o.zx,{type:"button",styleType:"white",onClick:N,children:"Close"})})]})}):(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)("h2",{className:"text-lg font-semibold",children:"Create API Token"}),(0,n.jsxs)("form",{onSubmit:e=>{e.preventDefault(),i.trim()&&(y(!0),a({name:i,role:c,expiresInDays:30*m}).then(e=>{f(e.plainTextToken),h(!0),l&&l({id:String(e.token.id),name:e.token.name,role:e.token.role,description:e.token.description,createdBy:e.token.createdBy,createdAt:e.token.createdAt,expiresAt:e.token.expiresAt,isRevoked:e.token.isRevoked},e.plainTextToken)}).catch(e=>{console.error("Error creating token:",e)}).finally(()=>{y(!1)}))},className:"mt-4",children:[(0,n.jsxs)("div",{className:"mb-4",children:[(0,n.jsx)("label",{htmlFor:"tokenName",className:"block text-sm font-medium text-gray-700",children:"Token Name"}
1),(0,n.jsx)(o.II,{id:"tokenName",type:"text",onChange:e=>d(e),placeholder:"Enter token name",required:!0,className:"mt-1 block w-full",externalValue:i})]}),(0,n.jsxs)("div",{className:"mb-4",children:[(0,n.jsx)("label",{htmlFor:"role",className:"block text-sm font-medium text-gray-700",children:"Role"}),(0,n.jsxs)("select",{id:"role",name:"role",value:c,onChange:e=>u(e.target.value),className:"mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:text-sm",children:[(0,n.jsx)("option",{value:"Reader",children:"Reader"}),(0,n.jsx)("option",{value:"ResourceManager",children:"Resource Manager"}),(0,n.jsx)("option",{value:"RunbookManager",children:"Runbook Manager"})]})]}),(0,n.jsxs)("div",{className:"mb-4",children:[(0,n.jsx)("label",{htmlFor:"expirationMonths",className:"block text-sm font-medium text-gray-700",children:"Expiration"}),(0,n.jsxs)("select",{id:"expirationMonths",value:m,onChange:e=>x(Number(e.target.value)),className:"mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:text-sm",children:[(0,n.jsx)("option",{value:1,children:"1 Month"}),(0,n.jsx)("option",{value:3,children:"3 Months"}),(0,n.jsx)("option",{value:6,children:"6 Months"}),(0,n.jsx)("option",{value:12,children:"12 Months"})]})]}),(0,n.jsxs)("div",{className:"flex justify-end",children:[(0,n.jsx)(o.zx,{type:"button",styleType:"white",onClick:N,className:"mr-2",children:"Cancel"}),(0,n.jsx)(o.zx,{type:"submit",styleType:"purple",disabled:b,children:b?"Creating...":"Create Token"})]})]})]})})})}},39094:function(e,t,s){"use strict";var n=s(53704),r=s(46653),o=s(21902),a=s(3015),l=s(46695),i=s(30921),d=s(11347),c=s(64144),u=s(22581),m=s(7099),x=s(16771);t.Z=e=>{let{children:t,hideRoutesMainPages:s=!1}=e,p=(0,r.useRouter)(),{getUserQuery:h}=(0,d.h)(),{validateAuth:g}=(0,i.a)(),{data:f,isLoading:b,isError:y}=h({refetchOnWindowFocus:!1}),v=(0,o.useMemo)(()=>(0,u._w)(f),[f]),j=(0,o.useMemo)(()=>null==f?void 0:f.companyName,[f]),N=(0,o.useMemo)(()=>null==f?void 0:f.role,[f]),C=(0,o.useMemo)(()=>{var e;return null!==(e=null==f?void 0:f.permissions)&&void 0!==e?e:[]},[f]);return((0,o.useEffect)(()=>{let e=localStorage.getItem(c.T),t=void 0===f,s=g(f);if(!t){if(null===e){localStorage.removeItem(c.T),p.push("/login");return}s||(p.push("/login"),localStorage.removeItem(c.T))}},[f]),b||!f)?(0,n.jsx)(a.gb,{}):(null==f?void 0:f.role)==="SYS_ADMIN"?(p.push("/admin/customers"),(0,n.jsx)(a.gb,{})):y?(0,n.jsx)("div",{children:"Error!"}):(0,n.jsx)(m.W,{permissions:C,children:(0,n.jsx)(x.z,{availableTenants:null==f?void 0:f.tenants,currentTenantId:null==f?void 0:f.tenantId,children:(0,n.jsxs)("div",{className:"background_gradient h-screen w-full overflow-x-hidden",children:[(0,n.jsx)(l.Z,{name:v,companyName:j,hideRoutesMainPages:s,role:N}),t]})})})}},58182:function(e,t,s){"use strict";s.r(t),s.d(t,{default:function(){return S}});var n=s(53704),r=s(9669),o=s.n(r),a=s(17561),l=s(21902),i=s(3015),d=s(98929),c=s(7099),u=s(73030),m=s(11347),x=s(54512),p=s(91927);let h={External:new Set(["get_resource_validations"])},g=new Set(["Dev","Test","Internal"]);function f(e,t){var s,n;let r=g.has(t)?t:"External";return null!==(n=null===(s=h[r])||void 0===s?void 0:s.has(e))&&void 0!==n&&n}let b={list_recommendations:"List Recommendations",get_recommendation_details:"Get Recommendation Details",get_resource_validations:"Get Resource Validations",get_recommendation_report:"Get Recommendation Report",get_recommendations_summary:"Get Recommendations Summary"},y="bg-purple-600 text-white",v="bg-white text-gray-700",j="<paste-your-cft-token-here>",N="cloudfix-recommendations";var C=function(){var e,t,s,r;let{hasPermission:h}=(0,c.T)(),{alert:g,setAlert:C}=(0,d.V)(),{getMcpSettingsQuery:k}=(0,m.h)(),{updateMcpSettingsMutation:w,createApiTokenMutation:T}=(0,x.Z)(),M=(0,a.NL)(),S=h(u.y3.MCP_WRITE),E=h(u.y3.API_TOKENS_WRITE),{data:P,isLoading:_}=k(),A=w(),R=T(),[I,z]=(0,l.useState)(null),[F,O]=(0,l.useState)(null),[D,L]=(0,l.useState)(!1),[B,Z]=(0,l.useState)(null),[q,U]=(0,l.useState)("claude"),G=null===(e=null!=F?F:null==P?void 0:P.mcpEnabled)||void 0===e||e,K=null!==(t=null!=I?I:null==P?void 0:P.overrides)&&void 0!==t?t:{},W=null!==(s=null==P?void 0:P.tenantClassification)&&void 0!==s?s:"",V=(null!==(r=null==P?void 0:P.knownTools)&&void 0!==r?r:[]).filter(e=>
1!f(e,W)),H=G?"enabled":S?"disabled-admin-can-enable":"disabled-empty-state",J=(0,l.useMemo)(()=>"https://mcp.app.cloudfix.com/mcp",[]),X=(0,l.useMemo)(()=>JSON.stringify({mcpServers:{[N]:{type:"http",url:J,headers:{Authorization:"Bearer ".concat(null!=B?B:j)}}}},null,2),[J,B]),Y=(0,l.useMemo)(()=>JSON.stringify({mcpServers:{[N]:{url:J,headers:{Authorization:"Bearer ".concat(null!=B?B:j)}}}},null,2),[J,B]),Q=(0,l.useMemo)(()=>JSON.stringify({mcpServers:{[N]:{command:"npx",args:["-y","mcp-remote",J,"--header","Authorization: Bearer ".concat(null!=B?B:j)]}}},null,2),[J,B]),$=e=>{var t;return e in K?K[e]:null!==(t=null==P?void 0:P.effectiveTools[e])&&void 0!==t&&t},ee=e=>{if(!S||f(e,W))return;let t=$(e);z({...K,[e]:!t})},et=async()=>{try{let e=await A.mutateAsync({mcpEnabled:null!=F?F:null==P?void 0:P.mcpEnabled,overrides:null!=I?I:null==P?void 0:P.overrides});M.setQueryData(["mcpSettings"],e),O(null),z(null),C({type:"success",messages:["MCP settings saved"]})}catch(n){var e;console.error("Error saving MCP settings:",n);let t=o().isAxiosError(n)?null===(e=n.response)||void 0===e?void 0:e.data:void 0,s=t&&"object"==typeof t&&"message"in t&&"string"==typeof t.message?t.message:void 0;C({type:"error",messages:[null!=s?s:"Failed to save MCP settings"]})}},es=async e=>R.mutateAsync(e),en=null!==F||null!==I,er="curl -fsSL ".concat(window.location.origin,"/install-mcp.sh | API_KEY=").concat(null!=B?B:"cft_<your-api-token>"," sh"),eo=(e,t)=>{navigator.clipboard.writeText(e).then(()=>C({type:"success",messages:[t]}),()=>C({type:"error",messages:["Copy failed — select the text and copy manually"]}))};return _?(0,n.jsx)("div",{id:"MCP-Settings",className:"m-8 rounded-xl bg-white 6xl:mx-auto 6xl:w-[1756px]",children:(0,n.jsx)("div",{className:"flex min-h-96 items-center justify-center p-8","data-testid":"mcp-settings-loader",children:(0,n.jsx)(i.aN,{})})}):(0,n.jsxs)("div",{id:"MCP-Settings",className:"m-8 rounded-xl bg-white 6xl:mx-auto 6xl:w-[1756px]",children:[g&&(0,n.jsx)(i.bZ,{type:g.type,messages:g.messages,onClickClose:()=>C({type:"success",messages:[]}),className:"mb-4"}),(0,n.jsxs)("div",{className:"p-8",children:[(0,n.jsx)("h1",{className:"mb-2 text-xl font-semibold",children:"MCP Settings"}),(0,n.jsx)("p",{className:"mb-6 text-sm font-normal text-gray-600",children:"Configure which CloudFix tools are available via the Model Context Protocol (MCP) integration."}),(0,n.jsxs)("div",{className:"mb-6 flex items-center justify-between rounded-lg border border-gray-200 p-4",children:[(0,n.jsxs)("div",{children:[(0,n.jsx)("div",{className:"font-medium",children:"Enable MCP Integration"}),(0,n.jsx)("div",{className:"text-sm text-gray-500",children:"Allow AI assistants to connect to CloudFix via MCP"})]}),(0,n.jsx)("button",{type:"button",role:"switch","aria-checked":G,disabled:!S,onClick:()=>{S&&O(!G)},className:"relative inline-flex h-6 w-11 shrink-0 cursor-pointer rounded-full border-2 border-transparent transition-colors duration-200 ease-in-out focus:outline-none ".concat(G?"bg-purple-600":"bg-gray-200"," ").concat(S?"":"cursor-not-allowed opacity-50"),children:(0,n.jsx)("span",{className:"pointer-events-none inline-block size-5 rounded-full bg-white shadow ring-0 transition duration-200 ease-in-out ".concat(G?"translate-x-5":"translate-x-0")})})]}),"disabled-empty-state"===H?(0,n.jsx)("div",{"data-testid":"mcp-disabled-empty-state",className:"mb-6 rounded-lg border border-gray-200 bg-gray-50 p-6 text-sm text-gray-600",children:"MCP is disabled for your account — contact your administrator to enable it."}):(0,n.jsxs)("div",{className:"mb-6 space-y-3 ".concat(G?"":"pointer-events-none opacity-40"),children:[(0,n.jsx)("div",{className:"text-sm font-medium text-gray-700",children:"Available Tools"}),V.map(e=>{var t,s;let r=f(e,W),o=function(e,t,s,n){var r;if(void 0!==n&&f(e,n))return{state:"Disabled",source:"locked"};let o=t[e];if("boolean"==typeof o)return{state:o?"Enabled":"Disabled",source:"override"};let a=null!==(r=s[e])&&void 0!==r&&r;return{state:a?"Enabled":"Disabled",source:"default"}}(e,K,null!==(t=null==P?void 0:P.effectiveTools)&&void 0!==t?t:{},W),a=!r&&$(e),l=!S||r;return(0,n.jsxs)("div",{className:"flex items-center justify-between rounded-lg border border-gray-100 p-3",children:[(0,n.jsxs)("div",{className:"flex flex-col",children:[(0,n.jsx)("div",{className:"font-[monospace] text-sm",children:null!==(s=b[e])&&void 0!==s?s:e}),(0,n.jsx)("div",{"data-testid":"tool-effective-".concat(e),className:"text-xs text-gray-500",children:function(e){if("locked"===e.source)return"Effective: Disabled (locked for your account type)";let t="override"===e.source?"your override":"default for your account type";return"Effective: ".concat(e.state," (").concat(t,")")}(o)})]}),(0,n.jsx)("button",{type:"button",role:"switch","aria-checked":a,disabled:l,onClick:()=>ee(e),className:"relative inline-flex h-5 w-9 shrink-0 cursor-pointer rounded-full border-2 border-transparent transition-colors duration-200 ease-in-out focus:outline-none ".concat(a?"bg-purple-600":"bg-gray-200"," ").concat(l?"cursor-not-allowed opacity-50":""),children:(0,n.jsx)("span",{className:"pointer-events-none inline-block size-4 rounded-full bg-white shadow ring-0 transition duration-200 ease-in-out ".concat(a?"translate-x-4":"translate-x-0")})})]},e)})]}),S&&(0,n.jsx)("div",{className:"mb-8",children:(0,n.jsx)(i.zx,{styleType:"purple",onClick:()=>void et(),disabled:!en||A.isLoading,children:A.isLoading?"Saving…":"Save Changes"})}),(0,n.jsxs)("div",{className:"mb-6 rounded-lg border border-gray-200 p-4",children:[(0,n.jsx)("div",{className:"mb-2 font-medium",children:"Generate MCP Key"}),(0,n.jsx)("p",{className:"mb-3 text-sm text-gray-500",children:"Mint a Reader API token for use with MCP clients. The token will be shown once;
1 copy it before closing the dialog."}),E?(0,n.jsx)(i.zx,{styleType:"purple",onClick:()=>L(!0),children:"Generate Key"}):(0,n.jsx)("div",{className:"text-sm text-gray-500",children:"You do not have permission to create API tokens."})]}),(0,n.jsx)(p.Z,{isActive:D,onClose:()=>L(!1),onCreateToken:es,onCreatedToken:(e,t)=>{Z(t)}}),(0,n.jsxs)("div",{className:"mb-6 rounded-lg border border-gray-200 p-4",children:[(0,n.jsx)("div",{className:"mb-2 font-medium",children:"Configure your client"}),(0,n.jsxs)("p",{className:"mb-3 text-sm text-gray-500",children:["Choose your MCP client and paste the snippet into its config file. The snippets target this stage's MCP server URL (",J,")."]}),(0,n.jsxs)("div",{className:"mb-3 inline-flex rounded-md border border-gray-200",children:[(0,n.jsx)("button",{type:"button",onClick:()=>U("claude"),className:"rounded-l-md px-3 py-1 text-sm ".concat("claude"===q?y:v),children:"Claude Code"}),(0,n.jsx)("button",{type:"button",onClick:()=>U("cursor"),className:"border-x border-gray-200 px-3 py-1 text-sm ".concat("cursor"===q?y:v),children:"Cursor"}),(0,n.jsx)("button",{type:"button",onClick:()=>U("desktop"),className:"rounded-r-md px-3 py-1 text-sm ".concat("desktop"===q?y:v),children:"Claude Desktop"})]}),"claude"===q&&(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)("p",{className:"mb-2 text-xs text-gray-500",children:["Merge this into your ",(0,n.jsx)("code",{children:"~/.claude.json"})," (or a project ",(0,n.jsx)("code",{children:".mcp.json"}),"). If you already have an ",(0,n.jsx)("code",{children:"mcpServers"})," block, add just the ",(0,n.jsx)("code",{children:"cloudfix-recommendations"})," entry to it."]}),(0,n.jsxs)("div",{className:"flex items-start gap-2",children:[(0,n.jsx)("pre",{"data-testid":"claude-snippet",className:"flex-1 overflow-x-auto rounded-md border border-gray-200 bg-gray-50 p-3 font-[monospace] text-xs",children:X}),(0,n.jsx)(i.zx,{styleType:"white",onClick:()=>eo(X,"Copied Claude Code snippet"),children:"Copy"})]})]}),"cursor"===q&&(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)("p",{className:"mb-2 text-xs text-gray-500",children:["Merge this into your ",(0,n.jsx)("code",{children:"~/.cursor/mcp.json"})," (or a project ",(0,n.jsx)("code",{children:".cursor/mcp.json"}),"). If you already have an ",(0,n.jsx)("code",{children:"mcpServers"})," block, add just the ",(0,n.jsx)("code",{children:"cloudfix-recommendations"})," ","entry to it."]}),(0,n.jsxs)("div",{className:"flex items-start gap-2",children:[(0,n.jsx)("pre",{"data-testid":"cursor-snippet",className:"flex-1 overflow-x-auto rounded-md border border-gray-200 bg-gray-50 p-3 font-[monospace] text-xs",children:Y}),(0,n.jsx)(i.zx,{styleType:"white",onClick:()=>eo(Y,"Copied Cursor snippet"),children:"Copy"})]})]}),"desktop"===q&&(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)("p",{className:"mb-2 text-xs text-gray-500",children:["Add this to your ",(0,n.jsx)("code",{children:"claude_desktop_config.json"})," (Settings → Developer → Edit Config). Claude Desktop cannot use a raw HTTP server, so this uses the ",(0,n.jsx)("code",{children:"mcp-remote"})," bridge — Node.js must be installed."]}),(0,n.jsxs)("div",{className:"flex items-start gap-2",children:[(0,n.jsx)("pre",{"data-testid":"desktop-snippet",className:"flex-1 overflow-x-auto rounded-md border border-gray-200 bg-gray-50 p-3 font-[monospace] text-xs",children:Q}),(0,n.jsx)(i.zx,{styleType:"white",onClick:()=>eo(Q,"Copied Claude Desktop snippet"),children:"Copy"})]}),(0,n.jsxs)("p",{className:"mt-2 text-xs text-gray-400",children:["Windows: if you hit a ",(0,n.jsx)("code",{children:"'C:\\Program' is not recognized"})," error, run"," ",(0,n.jsx)("code",{children:"npm install -g mcp-remote"}),", set ",(0,n.jsx)("code",{children:'"command": "mcp-remote"'}),", and remove the first two args (",(0,n.jsx)("code",{children:'"-y"'})," and ",(0,n.jsx)("code",{children:'"mcp-remote"'}),") so"," ",(0,n.jsx)("code",{children:"args"})," starts at the URL."]})]})]}),(0,n.jsxs)("div",{className:"rounded-lg border border-gray-200 p-4",children:[(0,n.jsx)("div",{className:"mb-2 font-medium",children:"Or run the installer"}),(0,n.jsxs)("p",{className:"mb-3 text-sm text-gray-500",children:["One-liner alternative that wraps the ",(0,n.jsx)("code",{children:"claude mcp add"})," CLI invocation for you (macOS / Linux)."]}),(0,n.jsxs)("div",{className:"flex items-center gap-2",children:[(0,n.jsx)("div",{"data-testid":"installer-command",className:"flex-1 overflow-x-auto rounded-md border border-gray-200 bg-gray-50 px-3 py-2 font-[monospace] text-xs",children:er}),(0,n.jsx)("button",{type:"button",title:"Copy",className:"rounded-md bg-gray-100 p-2 hover:bg-gray-200",onClick:()=>
1eo(er,"Copied to clipboard"),children:(0,n.jsxs)("svg",{xmlns:"http://www.w3.org/2000/svg",className:"size-4",viewBox:"0 0 20 20",fill:"currentColor",children:[(0,n.jsx)("path",{d:"M8 3a1 1 0 011-1h2a1 1 0 110 2H9a1 1 0 01-1-1z"}),(0,n.jsx)("path",{d:"M6 3a2 2 0 00-2 2v11a2 2 0 002 2h8a2 2 0 002-2V5a2 2 0 00-2-2 3 3 0 01-3 3H9a3 3 0 01-3-3z"})]})})]})]})]})]})},k=s(39094),w=s(23072),T=s(83840),M=s(33441),S=(0,w.Z)(function(){return(0,n.jsx)(k.Z,{children:(0,n.jsx)(M.e,{permissions:[u.y3.MCP_READ],children:(0,n.jsx)(T.e,{selectedTab:T.v.MCP,children:(0,n.jsx)(C,{})})})})})}},function(e){e.O(0,[911,8385,8848,5730,3537,5636,100,5249,3015,8774,921,6695,9774,2888,179],function(){return e(e.s=12720)}),_N_E=e.O()}]);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.