Install guide / Cursor

Connect Normi to Cursor

Declare Normi in Cursor's mcp.json: the agent can then query DVF sales joined to DPE energy ratings and the BDNB, right from the editor.

https://mcp.normi.fr/mcp

Configuration checked on 10 October 2026 against Cursor's official MCP documentation. Cursor MCP documentation

Before you start

  • A Normi account: sign in with Google, 500 free credits a month.
  • For the API-key connection or the STDIO package: a normi_… key, created in Dashboard → Tokens. It is shown only once.
  • For the STDIO package: Node.js 18 or later (npx).

Remote connection (HTTP Streamable)Recommended

Add this block to the configuration file. With no header, Cursor detects Normi's OAuth sign-in: on first use it opens normi.fr, you sign in and approve Cursor. No key to copy; if your account doesn't have one yet, a free key is created on approval.

File: ~/.cursor/mcp.json (all projects) or .cursor/mcp.json (this project)

{
  "mcpServers": {
    "normi": {
      "url": "https://mcp.normi.fr/mcp"
    }
  }
}

API-key variant

For a machine without a browser, or if you prefer a key: export NORMI_API_KEY in your shell, then reference it with Cursor's ${env:…} syntax. Never paste the key in clear text into a committed .cursor/mcp.json.

{
  "mcpServers": {
    "normi": {
      "url": "https://mcp.normi.fr/mcp",
      "headers": {
        "Authorization": "Bearer ${env:NORMI_API_KEY}"
      }
    }
  }
}

Alternative: STDIO package

If your environment doesn't allow remote servers, run the npm package @normi/mcp-dvf locally. It relays calls to the same Normi server.

{
  "mcpServers": {
    "normi": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "@normi/mcp-dvf"],
      "env": {
        "NORMI_API_KEY": "${env:NORMI_API_KEY}"
      }
    }
  }
}

A first prompt to try

“Using Normi, compare the price per m² of apartments in Lyon 6 by DPE class.”

The agent calls analyze_dpe_price_premium (10 credits). An excerpt of the real response, captured on 10 October 2026 against the 2014–2025 DVF data:

{
  "classes": {
    "B": { "count": 192,  "median_prix_m2": 5479, "vs_median_pct": 18.5 },
    "C": { "count": 827,  "median_prix_m2": 4788, "vs_median_pct": 3.6 },
    "D": { "count": 1421, "median_prix_m2": 4547, "vs_median_pct": -1.6 },
    "F": { "count": 239,  "median_prix_m2": 4619, "vs_median_pct": -0.1 },
    "G": { "count": 94,   "median_prix_m2": 4679, "vs_median_pct": 1.2 }
  },
  "summary": "Class B homes sell at +18.5% vs. median; class A at -3%"
}

In Lyon 6 (69006), B-rated apartments sell 18.5% above the area median, while F and G stay roughly at the median. This sale × DPE join doesn't exist as such in any public source.

Troubleshooting

Normi doesn't show up in the agent's tools↓
Check that the file is .cursor/mcp.json (project) or ~/.cursor/mcp.json (global) and that the JSON is valid. In Customize, the server must be enabled. Logs are in the Output panel (Cmd+Shift+U), “MCP Logs” channel.
${env:NORMI_API_KEY} stays empty↓
Cursor reads its own process's environment variables. Export NORMI_API_KEY in your shell profile (~/.zshrc, ~/.bashrc), then quit and relaunch Cursor. Remote servers don't accept envFile.
The Normi sign-in window doesn't open (OAuth)↓
Disable then re-enable the server in Customize to restart authentication. If your network blocks the redirect back to localhost, switch to the API-key variant.
Error 401 — Unauthorized↓
API key: it is missing, mistyped or revoked (the normi_ prefix is part of the key). Check that the environment variable is visible to the client. OAuth: access has expired or been revoked; reconnect from the client.
“no active API key” (403) on every call↓
Your account no longer has an active key. Create one in the dashboard: an OAuth connection resumes on the next call, a key-based config needs the new key.
Insufficient credits↓
The message comes back in the tool response, not as HTTP 402. The free plan tops up to 500 credits on the 1st of each month; you can also buy credits from the dashboard.
Error 429 — Rate limited↓
You are over your plan's requests-per-minute limit. Wait a few seconds, or cap how many calls your agent makes in parallel.

Next steps