Install guide / Windsurf (Devin Desktop)

Connect Normi to Windsurf (Devin Desktop)

Windsurf has been called Devin Desktop since June 2026. Add Normi to its mcp_config.json file: the agent can then query DVF sales, DPE energy ratings and the BDNB from the editor.

https://mcp.normi.fr/mcp

Configuration checked on 10 October 2026 against the official Devin Desktop documentation (current format, and the older Windsurf/Cascade format). Devin 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).
Windsurf is now Devin Desktop
Cognition renamed Windsurf to Devin Desktop on 2 June 2026. Existing installs were updated automatically, but the MCP configuration file changed. Both formats are described below.

Remote connection (HTTP Streamable)Recommended

Add this block and save. With no header, Devin Desktop detects Normi's OAuth sign-in: click Authenticate on the server's entry, sign in to normi.fr and approve the application.

File: ~/.config/devin/mcp_config.json (Windows: %APPDATA%\devin\mcp_config.json)

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

For a single project, use .devin/mcp_config.json at the repository root (or .devin/mcp_config.local.json, which Git ignores).

API-key variant

Export NORMI_API_KEY in your environment, then reference it with ${env:…}: the key never appears in clear text in the file.

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

Older Windsurf format (Cascade)

Installs still named Windsurf read ~/.codeium/windsurf/mcp_config.json and expect the serverUrl field. Open it from the … menu of the Cascade panel → MCPs section → “Open MCP config file”.

File: ~/.codeium/windsurf/mcp_config.json

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

Alternative: STDIO package

If remote servers are blocked, run the npm package @normi/mcp-dvf locally. It relays calls to the same Normi server.

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

A first prompt to try

“Using Normi, give me the price per m² of apartments in Nantes (44000) 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": {
    "A": { "count": 329,  "median_prix_m2": 3571, "vs_median_pct": 4 },
    "C": { "count": 2474, "median_prix_m2": 3526, "vs_median_pct": 2.7 },
    "D": { "count": 4671, "median_prix_m2": 3395, "vs_median_pct": -1.1 },
    "F": { "count": 1103, "median_prix_m2": 3303, "vs_median_pct": -3.8 },
    "G": { "count": 418,  "median_prix_m2": 3440, "vs_median_pct": 0.2 }
  },
  "summary": "Class A homes sell at +4% vs. median; class F at -3.8%"
}

In central Nantes the gap between classes is clear: +4% above the median for class A, -3.8% for class F. These medians describe the market; they are not adjusted for location or year of sale.

Troubleshooting

The server doesn't appear after editing the file↓
Check the path: ~/.config/devin/mcp_config.json on macOS and Linux, %APPDATA%\devin\mcp_config.json on Windows. An install still named Windsurf reads the older file (see above). Fully restart the application after the change.
“Needs auth” next to Normi↓
The OAuth sign-in has expired or was never done. Open the Normi server's entry in the MCP list and click “Authenticate” to restart the sign-in in your browser.
Too many active tools (older Cascade agent)↓
The Cascade agent caps the total number of active MCP tools (100). Normi exposes about thirty: disable the ones you don't need with the server's disabledTools list, or turn off other servers.
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