Rilvo is an MCP server your own agent connects to: Claude Code, Codex, or Cursor. It gives that agent a methodology, a legal corpus, and a results registry. The compliance work itself is done by your agent, and the facts about your company are collected by it and stay on your own machine. There is no Rilvo client to install and nowhere else to do the work. What you open in the browser is the dashboard below: where results land, and where the decisions that are yours to make are recorded.
MCP endpoint: https://mcp.rilvo.io/mcp · Dashboard: https://rilvo.io/app
1. Account and workspace
Create a workspace at https://rilvo.io/app/signup: your work email and a password of at least 12 characters. The address is confirmed by email before the workspace exists, and you land in the dashboard right after. Your agent will use this same email and password to sign in on the authorization screen, so the password is needed before you connect MCP, not after.
The owner then invites the rest of the team under Settings → People and assigns roles. The role decides both what is visible in the dashboard and what the agent is allowed to do:
| Role | In the dashboard | What the agent can do |
|---|---|---|
| Owner | People, roles, all workspaces | Full cycle: research and implementation |
| Admin | Assigned workspaces (tenants) | Full cycle in accessible workspaces |
| Member | Assigned workspaces | Full cycle in their own workspaces |
| Viewer | Read only | Read only. Write tools never appear in tools/list |
An organization can own one or more workspaces (tenants). If it owns more than one, pick the right one from the workspace switcher in the dashboard.
2. Connect MCP to your agent
One command on your machine. There is no Rilvo client CLI. Your agent talks to https://mcp.rilvo.io/mcp directly and walks itself through the rest.
Claude Code
claude mcp add --transport http rilvo https://mcp.rilvo.io/mcp # check connection status claude mcp list
The browser opens by itself on the first tool call. Nothing needs to be pasted by hand: no keys, no tokens.
Codex
codex mcp add rilvo \ --url https://mcp.rilvo.io/mcp \ --oauth-client-id codex-cli codex mcp login rilvo # the Auth column will show whether access was granted codex mcp list
--oauth-client-id codex-cliconnects a pre-registered client, and the consent screen shows a green "Verified" badge.codex mcp add --urlwithout it starts OAuth itself and waits for the callback. If sign-in isn't finished in the browser, the command fails withtimed out waiting for OAuth callback. The entry is still saved in~/.codex/config.toml, so just runcodex mcp login rilvoagain.- The loopback listener only lives while the command is running, so a link from a previous attempt can't be reused.
Cursor
// ~/.cursor/mcp.json
"mcpServers": {
"rilvo": { "type": "http", "url": "https://mcp.rilvo.io/mcp" }
}The server then turns on under Settings → MCP, where sign-in and consent also happen.
Old address: leoncomply.compliance.apli.tech/mcp now returns 403. If your agent was connected before the move, replace the URL with https://mcp.rilvo.io/mcp. Until then no tool will work.
4. First prompts: one kickoff, four returns
You don't need to build the cycle by hand. The server hands the agent a twelve-step sequence the moment it connects. It only stops where you can't be skipped: questions about company facts, a decision on a gray area, or picking a domain to implement.
Kickoff
The only prompt you have to give. The agent then sets up a working folder, runs a fact interview with you, opens a baseline, and starts working through the matrix. No domain is named up front: jurisdictions come from the interview, and the facts stay with you.
Make us compliant. Connect to Rilvo and follow the order it hands you, on your own, until you hit something you need me for.
When the agent is waiting on a gray-area decision
That decision is yours, in the dashboard: no tool can accept a client's position for them, and the agent will honestly stop.
I've gone through the positions in the dashboard. Continue. Re-read the status: rejected ones have my reasoning attached, redo those.
When it's time to pick a domain to implement
Research is done and findings are sorted into domains. This is where "we only need GDPR" finally makes sense.
Open the implementation cycle for the GDPR domain. From here, work as usual: top to bottom by traffic-light priority.
When you start a new session
A full cycle runs longer than one conversation. The agent restores state from the server status and its working-folder notes.
Pick up the Rilvo work where we left off: check the status and the working folder, tell me where we are.
When you want to know what's needed from you
A standing question for any day: where is the bottleneck. It writes nothing, only builds a picture and sorts it by traffic-light priority.
Check the current research status and, if an implementation cycle is open, its assignment. Give me one short summary, no new writes.
5. What stays with you, and what goes to Rilvo
The boundary runs along the data. The server is built so that it cannot learn the facts about your company on its own. It only sees what your agent explicitly sends.
Never leaves your machine
company-profile.md/product-fact-sheet.md- Everything you said in the interview
research-notes/- Queries, source excerpts, reasoning trail
research-notes/positions/- The reasoning behind each position. Only its hash goes to the server
exclusions.md- Why a candidate act was dropped
evidence/- Contracts, screenshots, exports, configs
Goes to Rilvo
- Verdicts, nexus-test confidence, domain coverage
- Act identifiers and citations, verified server-side
- Positions on gray areas, and your decisions on them
- Policies, procedures, controls, and their assessments
- SHA-256 of evidence files, never the files themselves
Guard: the server rejects a write if free-text fields contain an email, phone number, IBAN, card number, or an Estonian personal ID code.
6. Glossary
Legal research
- Fact interview
- The conversation the work starts with: your agent collects facts about the company and product. It is not a checkbox form, and our team doesn't run it. Your agent runs it, and the answers stay with you.
- Nexus test
- Whether a norm actually reaches your company, judged on your facts rather than on industry-wide assumptions.
- Legal corpus
- The shared base of legal acts Rilvo maintains: texts, versions, article structure.
- Research matrix
- The full set of "jurisdiction × area of law" cells the agent must cover.
- Baseline
- One legal-research run for your company: a set of jurisdictions, an assessment date, a methodology version. An audit is something narrower: domain-scoped work inside a baseline.
- Finding
- One assessed pair of legal act and your company: an applicability verdict with reasoning and citation. A finding is a verdict on a norm's fate. It is neither a requirement nor a task.
- Verdict
- How a norm's review ended: applies, partially applies, doesn't apply, or gray area. A verdict says nothing about record status.
- Nexus confidence
- A 1–5 rating of how reliable the verdict itself is, independent of the verdict.
- Gray area
- A verdict of "objectively unresolved": good-faith arguments exist on both sides. It is a different thing from low confidence, and from a question that hasn't been researched yet.
- Position
- Your documented choice among the gray area's interpretations. It is your decision, neither a lawyer's opinion nor a policy draft.
- Duty acceptance
- Part of a position: whether the chosen interpretation takes on the obligation. If not, the finding closes without implementation.
- Re-evaluation trigger
- A required field on a gray area: what has to change or become known for the question to resolve.
Implementation
- Domain
- A named section of baseline findings, such as GDPR, sanctions, or NIS2. A domain is a research result, so you don't name it up front.
- Implementation cycle
- Work on one domain: policies, procedures, and technical controls on top of its findings.
- Traffic-light priority
- A norm's priority specifically for your company, calculated from verdict and impact.
- L1 · L2 · L3 · L4
- Four layers of work. L1 is law: which acts reach you at all, each verdict carrying its reasoning and a citation. L2 is policy: the documents your applicable acts require, written against your own findings rather than a template. L3 is procedure: the steps your team follows in practice, written down so they can be handed over, repeated and checked. L4 is technical control: Rilvo specifies the control and the evidence that proves it works, and wiring it into your product stays with your team.
- Evidence
- A file proving a control actually works: a contract, screenshot, export, config.
Connection and access
- MCP
- Model Context Protocol, the standard your agent uses to connect to an external service and get tools from it.
- Workspace
- A distinct company or product inside your organization, with its own baseline and cycles.
- Scope
- A permission the agent requests on the consent screen. Tools without a granted scope simply don't register.
7. If it's not working
- The agent only sees read tools, no write tools
- Either the role is Viewer, or consent wasn't granted the full scope set. Check Settings → People and make sure
l1:write/impl:writewere actually granted. - Every call returns 403
- Almost always the old address. Confirm the server is registered at
https://mcp.rilvo.io/mcp, notleoncomply.compliance.apli.tech. - Codex: "timed out waiting for OAuth callback"
- Sign-in has to finish in the browser while the command is still running. The loopback listener only lives that long. Run
codex mcp login rilvoagain, thencodex mcp list. - All write tools refuse on this baseline
- The baseline is frozen, and a frozen run isn't meant to be edited. Have the agent open a new run.
- A write was rejected because of field contents
- The PII guard fired: personal data or a secret landed in free text. The server names the field.
- Not sure whether the server is up
- Discovery answers without a token, so one curl call is enough. Expect a
401with aWWW-Authenticateheader:curl -si -X POST https://mcp.rilvo.io/mcp \ -H 'content-type: application/json' \ -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}' | head -1 # expected: HTTP/2 401