Norma by Quality Clouds
Deterministic code governance for AI coding agents.
What it can do
- Get Rules For Ruleset: Returns the rules in one Norma ruleset: each rule's id, name, severity, impact area, description and fix guidance. These are the standards your code is judged against, not sugge
- Get Rulesets: Returns the Norma rulesets available for this repository's tech stack, detected automatically with no configuration. One ruleset per language or framework, for example typescript-norma-r
- Live Check: Runs a deterministic Norma Livecheck on one file against your organization's rules and returns the violations found. Same file, same rules, same verdict every time. Nothing is stored: file
What data it sees
Do you need an account
No: the server works without sign-in
Deterministic code governance for AI coding agents. Norma checks code against your organization's rules as the agent writes and returns a fixed verdict: rule ID, severity, line, fix. Same file, same rules, same answer, whichever agent is driving. One ruleset, versioned centrally, with an audit trail of every check.
Connect from Claude Code, Cursor, Copilot or any MCP client. OAuth sign-in, no configuration.
How to connect
How to connect Norma by Quality Clouds to Claude
The server address to paste into Claude settings:
https://norma--qualityclouds.run.tools
- Open Claude (claude.ai or the desktop app).
- Go to Settings → Connectors.
- Click Add custom connector.
- Paste the server address copied below into Remote MCP server URL and click Add.
- In a chat, click + → Connectors and switch the new connector on.
Custom connectors are available on Free, Pro, Max, Team and Enterprise plans (Free is limited to one). On Team and Enterprise an organization Owner adds the connector first under Organization settings → Connectors.
Authorization
After you click Add, a sign-in window for the service opens. Sign in with your own account and approve access. Claude never sees your password.
How to connect Norma by Quality Clouds to ChatGPT
The server address to paste into ChatGPT settings:
https://norma--qualityclouds.run.tools
- Open ChatGPT in a browser (chatgpt.com). A Plus, Pro, Business, Enterprise or Edu plan is required.
- Turn on developer mode once: Settings → Apps → Advanced settings → Developer mode.
- Open Settings → Connectors and click Create.
- Fill in the form: Name (anything), Description (one line about what the service does), MCP server URL (copy it below).
- Under Authentication choose OAuth if the service requires sign-in, otherwise None. Click Create.
- In a new chat open + → Apps/Connectors and enable the connector.
OpenAI has renamed this section before (Connectors → Apps/Plugins). If the label differs, search settings for "developer mode". On Business/Enterprise workspaces an admin must allow custom connectors first.
Authorization
On first use ChatGPT opens the service's sign-in window. Sign in and approve access.
How to connect Norma by Quality Clouds to Cursor
The server address to paste into Cursor settings:
https://norma--qualityclouds.run.tools
Fastest: click Open in Cursor below and confirm the prompt.
Manually:
- In Cursor open Settings → Cursor Settings → MCP and click Add new global MCP server.
- Paste the JSON copied below into
~/.cursor/mcp.json(per project:.cursor/mcp.jsonin the repo root). - Save the file. The server appears in the MCP list; authorize it there if asked.
Authorization
If the service needs sign-in, an authorize button appears next to the server in the MCP list.
Server tool list (6)
Raw names from tools/list. Only developers need these.
| get_rules_for_ruleset | Returns the rules in one Norma ruleset: each rule's id, name, severity, impact area, description and fix guidance. These are the standards your code is judged against, not suggestions. ruleset_id is a value returned by get_rulesets. The rule ids returned here are the values register_applied_actions records. remote_url is optional — the workspace git remote (`git remote get-url origin`). It is accepted for symmetry with get_rulesets but never scopes a ruleset's rules, so it is ignored here and rules are always served regardless of repository state. |
| get_rulesets | Returns the Norma rulesets available for this repository's tech stack, detected automatically with no configuration. One ruleset per language or framework, for example typescript-norma-ruleset for TypeScript, react-norma-ruleset for React, nodejs-norma-ruleset for Node.js. Call this first in any review or governance task. The ruleset_id values returned here are the inputs accepted by get_rules_for_ruleset. Each entry carries ruleset_id, name, version and rule group ids. remote_url is optional — the workspace git remote (`git remote get-url origin`). When given, the catalog is scoped to that repository (resolved within your organizations); when omitted, your organization's generic, tier-entitled catalog is returned. This tool always answers, even with no resolvable repository: for OAuth sessions the response carries a "repository_context" with status "linked" (repository-scoped), "unlinked" (no repository — generic catalog), or "unresolved" (a remote was sent but could not be parsed or matched — generic catalog plus guidance). It is never an error to lack a repository. |
| live_check | Runs a deterministic Norma Livecheck on one file against your organization's rules and returns the violations found. Same file, same rules, same verdict every time. Nothing is stored: file_content is held in memory only, and the file extension selects the applicable ruleset. Call before proposing code, again after editing to confirm the fix landed, then record the outcome with register_applied_actions. Optional: max_issues (cap on findings returned; a server hard maximum still applies) and min_severity (info < low < medium < high < critical; "total_issues" still counts all). One outcome: "clean" (no issues; "coverage" flags a reduced check), "issues" (a "rules" map keyed by rule_id plus per-finding entries with rule_id, location and snippet), "not_checkable" (no rules for the type, or empty content), "refused" (too large / binary / rate-limited), or "error". |
| get_open_issues | Returns the violations Norma recorded for this repository in its last completed full scan, each with the context to fix it. These are standing violations of your organization's rules, not suggestions. Optionally pass files (exact repository-relative paths) to scope the result to those files. Each issue carries rule_id, rule_name, severity, impact_area, file, line, description, the fix action and the rule's good/bad code examples — everything needed to fix it without further calls. Returns the top 25 by severity; when more exist the response includes total_open and a portal_url to the rest in Norma. An empty result is never bare — the outcome says why, so you must not report the code as clean unless it truly is: "issues" (fixable issues returned), "no_open_issues" (a scan completed and found none — genuinely clean), "no_completed_scan" (no full scan has completed yet — NOT the same as clean), "no_issues_in_files" (your files have none but the repository has open issues elsewhere; total_open tells how many), "no_linked_repository" (link a repository first with link_repository), or "error". Each issue's file and line are as of the scan, so the code may have moved: re-locate the offending pattern from the rule and description instead of trusting the line number, and skip any issue whose code no longer exists or whose file was renamed or deleted (the next full scan reconciles — this imprecision is expected). When you apply fixes from this tool, make ONE commit containing only the files your fixes changed and do NOT push it (the developer reviews and pushes), ending the commit message with these git trailers, filled from your own identity: Fixed-by: Norma MCP (proactive issue fixing) LLM: <your model name> <your model version> IDE: <the MCP client / IDE you run in> Then record the fixes with register_applied_actions as violations_fixed. |
| register_applied_actions | Writes the outcome of a coding task into your Norma compliance audit trail. An external, timestamped record of which rules were verified, which violations were fixed, which were prevented, and which model did the work. This is the record a reviewer or auditor reads later, so register at the end of every task, not only when something was fixed. Append-only. Fields: llm_name/llm_version, plus verified_compliant / violations_fixed / violations_prevented, each item referencing a rule by rule_id from get_rules_for_ruleset. Returns "registered", or "failed" with reason "oauth_required" or "invalid_input" (with a detail message). |
| link_repository | Associates this session's workspace with its repository in your Norma organization, so rulesets, Livechecks and audit records resolve to the right repo. Call once at the start of a session if the workspace is not already linked. Inputs: remote_url (the git remote, as `git remote get-url origin` reports it) and default_branch (optional — a hint; the organization's own record wins). Re-linking overwrites the existing association. Returns outcome "linked" (id, name, reference branch), or "failed" with reason "auto_import_not_available", "oauth_required" or "invalid_input". |