PageSourceSearch

https://verificate.ai/_next/static/chunks/pages/articles/claude-code-review-mcp-server-2fc45e9474b0a1a4.js

js verificate.ai collected 2026-10-05 13:58:38 UTC 13,772 bytes, 1 lines download raw bytes

1(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[1718],{2174:(e,t,s)=>{"use strict";s.r(t),s.d(t,{default:()=>l});var a=s(7876),i=s(8230),n=s.n(i),r=s(5543);let o={slug:"/articles/claude-code-review-mcp-server",title:"How to Add a Code-Review Gate to Claude Code with an MCP Server — Verificate",h1:"How to add a code-review gate to Claude Code with an MCP server",description:"A step-by-step guide to wiring a validation MCP server into Claude Code, Cursor or Windsurf, so every AI-generated change is reviewed — and can be vetoed — before it's presented as done.",datePublished:"2026-07-27",readMinutes:6,faq:[{q:"Does an MCP validation server slow the assistant down?",a:"Each validation call takes seconds and happens inside the assistant's loop, before work is presented. Compare that with the alternative: a defect discovered in CI or production, plus the context-switch to fix it. In practice gating is net-faster for any change that matters."},{q:"Do I need different setups for Claude Code, Cursor and Windsurf?",a:"No. MCP is a shared protocol; the same server URL and token work in all three, plus any other MCP-capable client. Only the location of the config file differs per client."},{q:"Can the gate block the assistant from claiming work is finished?",a:"Yes — that's the point. Deterministic gates (mock/placeholder detection, completion claims, reality validation) each have veto power. A standing instruction tells the assistant to validate before declaring completion, so a REJECTED verdict sends it back to fix findings instead of presenting broken work."}]};function l(){return(0,a.jsxs)(r.m7,{meta:o,children:[(0,a.jsxs)(r.P,{children:["Claude Code, Cursor and Windsurf all ship with the same architectural gap: the model that writes the code is the only thing checking the code. The fix is a ",(0,a.jsx)(r.OH,{children:"validation gate the assistant must call"})," — wired in through the Model Context Protocol (MCP), which all three clients support natively. This guide walks through the setup end to end. Total time: about five minutes."]}),(0,a.jsx)(r.H2,{children:"1. Get a token"}),(0,a.jsxs)(r.P,{children:[(0,a.jsx)(n(),{href:"/auth/signup",className:"text-[#8CCB43] hover:underline",children:"Create a Verificate account"})," — the 30-day trial needs no card — and copy the MCP token from your dashboard. The token authenticates your client to the gateway; access simply stops at trial end unless you subscribe (US$30/month after that)."]}),(0,a.jsx)(r.H2,{children:"2. Add the server to your client"}),(0,a.jsxs)(r.P,{children:["For ",(0,a.jsx)(r.OH,{children:"Claude Code"}),", one command:"]}),(0,a.jsx)(r.Cy,{label:"terminal",code:'claude mcp add --transport http verificate \\\n  "https://<gateway>/mcp" \\\n  --header "Authorization: Bearer <YOUR_TRIAL_TOKEN>"'}),(0,a.jsxs)(r.P,{children:["Or drop the equivalent JSON into your client's MCP config — the same block works in"," ",(0,a.jsx)(r.OH,{children:"Cursor"})," (",(0,a.jsx)("code",{className:"font-mono text-[13px] text-[#8CCB43]",children:"~/.cursor/mcp.json"}),") and"," ",(0,a.jsx)(r.OH,{children:"Windsurf"})," (",(0,a.jsx)("code",{className:"font-mono text-[13px] text-[#8CCB43]",children:"~/.codeium/windsurf/mcp_config.json"}),"):"]}),(0,a.jsx)(r.Cy,{label:"mcp config — identical across clients",code:'{\n  "mcpServers": {\n    "verificate": {\n      "url": "https://<gateway>/mcp",\n      "transport": "http",\n      "headers": { "Authorization": "Bearer <YOUR_TRIAL_TOKEN>" }\n    }\n  }\n}'}),(0,a.jsxs)(r.P,{children:["The exact gateway URL is shown with a copy button on the ",(0,a.jsx)(n(),{href:"/gate",className:"text-[#8CCB43] hover:underline",children:"Gate page"})," and in your dashboard."]}),(0,a.jsx)(r.H2,{children:"3. Know the four tools you just added"}),(0,a.jsx)(r.UL,{items:[(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("code",{className:"font-mono text-[13px] text-[#8CCB43]",children:"validate_ai_output"})," — the main gate. Deterministic reality checks first (any one can veto), then an enterprise-grade review to ISO/IEC 25010 scores what survives."]}),(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("code",{className:"font-mono text-[13px] text-[#8CCB43]",children:"analyze_code"})," — the deep-review pass on demand: performance, scalability, reliability, tech debt."]}),(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("code",{className:"font-mono text-[13px] text-[#8CCB43]",children:"val
1idate_plan"})," — review the approach before any code is written; the cheapest place to catch a bad design."]}),(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("code",{className:"font-mono text-[13px] text-[#8CCB43]",children:"generate_code"})," — generation that goes through the same gates on the way out."]})]}),(0,a.jsx)(r.H2,{children:"4. Make gating the default, not a favour"}),(0,a.jsxs)(r.P,{children:["Tools the assistant ",(0,a.jsx)("em",{children:"may"})," call are tools it will skip under pressure. Add a standing instruction to your project (for Claude Code, ",(0,a.jsx)("code",{className:"font-mono text-[13px] text-[#8CCB43]",children:"CLAUDE.md"}),"; for Cursor, a rule file) along these lines:"]}),(0,a.jsx)(r.Cy,{label:"CLAUDE.md / project rules",code:"Before presenting any substantive code change as complete:\n1. Call validate_ai_output on the change.\n2. If the verdict is REJECTED, fix the findings and re-validate.\n3. Never claim tests pass or systems are deployed without proof."}),(0,a.jsx)(r.Pq,{children:"The first time the gate vetoes something, read the findings rather than overriding them. A verdict like “N+1 synchronous calls — 100 items ≈ 100 roundtrips, ~10–20 s, blocks the worker thread” is the review a senior engineer would have given you — it arrived in seconds instead of at the next incident."}),(0,a.jsx)(r.H2,{children:"5. Verify it's working"}),(0,a.jsx)(r.P,{children:"Ask your assistant to “validate this function with verificate” on any nontrivial snippet. You should see a tool call go out and a structured verdict come back — severity-ranked findings and a score, or a veto with the reason. If the tool doesn't appear, restart the client (MCP servers are loaded at startup) and check the token."}),(0,a.jsx)(r.H2,{children:"Where this leaves you"}),(0,a.jsxs)(r.P,{children:["Your assistant still writes at AI speed — but nothing it writes reaches you unchecked. Plans get reviewed before code exists, code gets gated before it's claimed done, and completion claims must be provable. That is the difference between ",(0,a.jsx)("em",{children:"delivery"})," and ",(0,a.jsx)("em",{children:"quality delivery"}),"."]})]})}},4124:(e,t,s)=>{(window.__NEXT_P=window.__NEXT_P||[]).push(["/articles/claude-code-review-mcp-server",function(){return s(2174)}])},5543:(e,t,s)=>{"use strict";s.d(t,{Cy:()=>f,H2:()=>x,OH:()=>u,P:()=>m,Pq:()=>g,UL:()=>p,m7:()=>w});var a=s(7876),i=s(8230),n=s.n(i),r=s(8419),o=s(6075),l=s(6887),d=s(1298),c=s(8558),h=s(8300);function x(e){let{children:t}=e;return(0,a.jsx)("h2",{className:"mt-12 text-2xl md:text-[28px] font-bold text-white tracking-tight",children:t})}function m(e){let{children:t}=e;return(0,a.jsx)("p",{className:"mt-5 text-[15.5px] text-white/60 leading-relaxed",children:t})}function u(e){let{children:t}=e;return(0,a.jsx)("strong",{className:"text-white font-semibold",children:t})}function p(e){let{items:t}=e;return(0,a.jsx)("ul",{className:"mt-5 space-y-2.5",children:t.map((e,t)=>(0,a.jsxs)("li",{className:"flex gap-3 text-[15.5px] text-white/60 leading-relaxed",children:[(0,a.jsx)("span",{className:"mt-[9px] w-1.5 h-1.5 rounded-full bg-[#8CCB43] shrink-0"}),(0,a.jsx)("span",{children:e})]},t))})}function f(e){let{label:t,code:s}=e;return(0,a.jsxs)("div",{className:"mt-6 rounded-2xl border border-white/[0.08] bg-[#0C0F0A] overflow-hidden",children:[(0,a.jsx)("div",{className:"px-5 py-2.5 border-b border-white/[0.06] font-mono text-xs text-white/45",children:t}),(0,a.jsx)("pre",{className:"px-5 py-4 overflow-x-auto text-[13px] leading-relaxed font-mono text-white/80",children:(0,a.jsx)("code",{children:s})})]})}function g(e){let{children:t}=e;return(0,a.jsx)("div",{className:"mt-6 rounded-2xl border border-[#2C3D1B] bg-[#12190C] px-6 py-5 text-[15px] text-white/70 leading-relaxed",children:t})}function w(e){var t,s,i,x,m;let{meta:u,children:p}=e,f=[{"@context":"https://schema.org","@type":null!=(m=u.type)?m:"TechArticle",headline:u.h1,description:u.description,url:"".concat(h.W6).concat(u.slug),datePublished:u.datePublished,dateModified:u.datePublished,author:u.author?{"@type":"Person",name:u.author.name,...u.author.url?{url:u.author.url}:{},worksFor:{"@type":"Organization",name:"Verificate Pty Ltd",url:h.W6}}:{"@type":"Organization",name:"Verificate Pty Ltd",url:h.W6},publisher:{"@type":"Organization",name:"Verificate Pty Ltd",url:h.W6},mainEntityOfPage:"".concat(h.W6).concat(u.slug),...(null==(i=u.keywords)?void 0:i.length)?{keywords:u.keywords.join(", ")}:{},...(null==(x=u.citation)?void 0:x.length)?{citation:u.citation.map(e=>({"@type":"CreativeWork",name:e.name,url:e.url})),isBasedOn:u.citation.map(e=>e.url)}:{}}];return(null==(t=u.faq)?void 0:t.length)&&f.push((0,h.P$)(u.faq)),(0,a.jsxs)("div",{className:"bg-[#080A08] text-white/85 min-h-screen antialiased",children:[(0,a.jsx)(c.A,{title:u.title,path:u.slug,description:u.description,image:u.image,type:"article",jsonLd:f}),(0,a.jsx)(d.Nv,{}),(0,a.jsxs)("main",{id:"main-content",children:[(0,a.jsx)(d.wn,{className:"pt-28 sm:pt-36 pb-4",children:(0,a.jsxs)("div",{className:"max-w-3xl",children:[(0,a.jsxs)("div",{className:"flex items-center gap-3 text-white/40 font-mono text-xs",children:[(0,a.jsx)(n(),{href:"/articles",className:"text-[#8CCB43] hover:underline",children:"Articles"}),(0,a.jsx)("span",{children:"\xb7"}),(0,a.jsx)(n(),{href:"/news",className:"hover:text-[#8CCB43] hover:underline",children:"News & press"}),(0,a.jsx)("span",{children:"\xb7"}),(0,a.jsx)("span",{children:new Date(u.datePublished).toLocaleDateString("en-AU",{year:"numeric",month:"short",day:"numeric"})}),(0,a.jsx)("span",{children:"\xb7"}),(0,a.jsxs)("span",{children:[u.readMinutes," min read"]})]}),(0,a.jsx)("h1",{className:"mt-5 text-3xl sm:text-4xl md:text-[44px] font-bold tracking-tight text-white leading-tight",children:u.h1})]})}),(0,a.jsx)(d.wn,{className:"pb-10",children:(0,a.jsx)("article",{className:"max-w-3xl",children:p})}),(null==(s=u.faq)?void 0:s.length)?(0,a.jsx)(d.wn,{className:"py-10 border-t border-white/[0.06]",children:(0,a.jsxs)("div",{className:"max-w-3xl",children:[(0,a.jsx)(d.YZ,{children:"FAQ"}),(0,a.jsx)("div",{className:"mt-6 space-y-6",children:u.faq.map(e=>(0,a.jsxs)("div",{children:[(0,a.jsx)("h3",{className:"font-bold text-white",children:e.q}),(0,a.jsx)("p",{className:"mt-2 text-[15px] text-white/55 leading-relaxed",children:e.a})]},e.q))})]})}):null,"cti"===u.cta?(0,a.jsx)(d.wn,{className:"py-16",children:(0,a.jsxs)("div",{className:"rounded-3xl border border-[#2C3D1B] bg-gradient-to-b from-[#12190C] to-[#0B0F0A] px-8 md:px-14 py-12 text-center",children:[(0,a.jsx)("h2",{className:"text-2xl md:text-3xl font-bold text-white tracking-tight",children:"Bring a question your AI needs to get right."}),(0,a.jsx)("p",{className:"mt-4 text-white/60 max-w-2xl mx-auto",children:"Compile-Time Inference prepares your records before questions arrive, so supported answers and decisions can be checked against their evidence. Start with the questions where a wrong answer costs the most."}),(0,a.jsxs)("div",{className:"mt-8 flex flex-wrap justify-center gap-4",children:[(0,a.jsxs)(n(),{href:"/compile-time-inference",className:"inline-flex items-center gap-2 px-5 py-3 rounded-lg bg-[#8CCB43] hover:bg-[#7cbb37] text-[#0A0D0A] font-semibold transition-colors",children:["See Compile-Time Inference ",(0,a.jsx)(r.A,{className:"w-4 h-4"})]}),(0,a.jsxs)("a",{href:"/Verificate_Compile-Time_Inference_Brochure.pdf",download:"Verificate_Compile-Time_Inference_Brochure.pdf",className:"inline-flex items-center gap-2 px-5 py-3 rounded-lg border border-white/15 hover:border-[#8CCB43]/50 text-white font-semibold transition-colors",children:[(0,a.jsx)(o.A,{className:"w-4 h-4"})," Download the brochure (PDF)"]}),(0,a.jsxs)(n(),{href:"/contact?interest=compile-time-inference",className:"inline-flex items-center gap-2 px-5 py-3 rounded-lg border border-white/15 hover:border-[#8CCB43]/50 text-white font-semibold transition-colors",children:["Talk to us ",(0,a.jsx)(r.A,{className:"w-4 h-4"})]})]})]})}):(0,a.jsx)(d.wn,{className:"py-16",children:(0,a.jsxs)("div",{className:"rounded-3xl border border-[#2C3D1B] bg-gradient-to-b from-[#12190C] to-[#0B0F0A] px-8 md:px-14 py-12 text-center",children:[(0,a.jsx)("h2",{className:"text-2xl md:text-3xl font-bold text-white tracking-tight",children:"Put a real gate on your AI output."}),(0,a.jsx)("p",{className:"mt-4 text-white/60 max-w-2xl mx-auto",children:"Verificate Gate (available via MCP) runs deterministic checks plus an engineering-quality review on every AI output — in Claude Code, Cursor, Windsurf or any MCP client. 30-day free trial, no card required."}),(0,a.jsxs)("div",{className:"mt-8 flex flex-wrap justify-center gap-4",children:[(0,a.jsxs)(n(),{href:"/auth/signup",className:"inline-flex items-center gap-2 px-5 py-3 rounded-lg bg-[#8CCB43] hover:bg-[#7cbb37] text-[#0A0D0A] font-semibold transition-colors",children:[(0,a.jsx)(l.A,{className:"w-4 h-4"})," Start 30-day free trial"]}),(0,a.jsxs)(n(),{href:"/gate",className:"inline-flex items-center gap-2 px-5 py-3 rounded-lg border border-white/15 hover:border-[#8CCB43]/50 text-white font-semibold transition-colors",children:["See how the Gate works ",(0,a.jsx)(r.A,{className:"w-4 h-4"})]})]})]})})]})]})}}},e=>{e.O(0,[8096,8799,636,8792],()=>e(e.s=4124)),_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.