Skip to main content
Glama
office31

surfer-mcp

by office31
README.md
# surfer-mcp

Serveur [MCP](https://modelcontextprotocol.io) local qui connecte **Claude** (Claude Desktop ou Claude Code) à **Golden Software Surfer 13+** sous Windows.

Il permet à Claude de piloter Surfer : interpoler des données XYZ en grille, produire des cartes structurales, tracer des **coupes géologiques**, générer des vues 3D et exporter les résultats en PNG, JPG, PDF, TIF, SVG ou EMF.

> Testé avec Surfer **13.06.618** et Python 3.14 sous Windows 10/11.
>
> Dépôt : <https://github.com/office31/claude-surfer13-mcp>

## Fonctionnalités

- **Grille** : interpolation de points XYZ (kriging, IDW, courbure minimale, plus proche voisin, triangulation…)
- **Carte structurale** : raster coloré + lignes de contours superposées
- **Coupe géologique** : profil le long d'une ligne A–A′, avec carte de localisation, axes, titre et exagération verticale
- **Vue 3D** : surface à partir d'une grille
- **Exports** : PNG, JPG, PDF vectoriel, TIF, SVG, EMF, et fichiers de projet `.srf`
- **Gestion des documents** : liste, export, sauvegarde et fermeture des documents ouverts dans Surfer

## Prérequis

- Windows 10 ou 11
- Golden Software **Surfer 13 ou plus récent**, installé et licencié (l'interface COM `Surfer.Application` doit être disponible)
- **Python 3.10+** (64 bits)

## Installation

```powershell
git clone https://github.com/office31/claude-surfer13-mcp.git
cd claude-surfer13-mcp

python -m venv .venv
.\.venv\Scripts\Activate.ps1
python -m pip install --upgrade pip
pip install -e .
```

Vérification rapide :

```powershell
python -c "import surfer_mcp; print('ok')"
```

## Configuration de Claude Desktop

1. Ouvrez (ou créez) le fichier `%APPDATA%\Claude\claude_desktop_config.json`.
2. Ajoutez le serveur en adaptant les chemins :

```json
{
  "mcpServers": {
    "surfer": {
      "command": "C:\\Users\\VOTRE_NOM\\claude-surfer13-mcp\\.venv\\Scripts\\python.exe",
      "args": ["-m", "surfer_mcp"],
      "env": {
        "SURFER_MCP_WORKSPACE": "C:\\Users\\VOTRE_NOM\\Documents\\SurferMCP",
        "SURFER_MCP_VISIBLE": "1"
      }
    }
  }
}
```

3. Redémarrez Claude Desktop. Le serveur `surfer` doit apparaître dans la liste des outils (icône MCP).

Un modèle est fourni : [`claude_desktop_config.example.json`](claude_desktop_config.example.json).

## Configuration de Claude Code

```powershell
claude mcp add surfer -e SURFER_MCP_WORKSPACE="C:\Users\VOTRE_NOM\Documents\SurferMCP" -- "C:\Users\VOTRE_NOM\claude-surfer13-mcp\.venv\Scripts\python.exe" -m surfer_mcp
```

Puis vérifiez avec `/mcp` dans Claude Code.

## Variables d'environnement

| Variable | Défaut | Rôle |
|---|---|---|
| `SURFER_MCP_WORKSPACE` | `%USERPROFILE%\Documents\SurferMCP` (ou `~/SurferMCP`) | Dossier de travail : les chemins relatifs des outils y sont résolus. |
| `SURFER_MCP_VISIBLE` | `1` | `1` affiche Surfer, `0` le lance en arrière-plan. |

Surfer est démarré automatiquement au premier appel d'outil. Le serveur ne ferme **jamais** une instance de Surfer qu'il n'a pas lancée.

## Démarrage rapide

Le dépôt contient un jeu de données synthétique : [`examples/sample_points.csv`](examples/sample_points.csv) (X 0–5000 m, Y 0–4000 m, Z en mètres, séparé par virgules avec en-tête).

Exemples de demandes à Claude :

> Crée une grille par kriging (300 × 300) à partir de `examples/sample_points.csv`, puis une carte colorée intitulée « Carte structurale » et exporte-la dans `output/carte.png`.

> Trace la coupe A–A′ de (500, 500) à (4500, 3200) sur `grids/sample_points.grd`, avec une exagération verticale de 2.5. Exporte l'image dans `output/coupe.png` et les données dans `output/coupe.dat`.

> Fais une vue 3D de la grille et exporte `output/surface.png`.

> Liste les documents ouverts, exporte le premier en PDF, puis ferme-le.

Après exécution, les fichiers générés se trouvent dans `%USERPROFILE%\Documents\SurferMCP` (ou dans le dossier défini par `SURFER_MCP_WORKSPACE`).

## Outils MCP

| Outil | Description |
|---|---|
| `surfer_status` | Version de Surfer, état, visibilité, dossier de travail, nombre de documents. |
| `list_documents` | Liste des documents ouverts (index, nom, chemin, état de sauvegarde). |
| `set_surfer_visible` | Affiche ou masque la fenêtre Surfer. |
| `create_grid` | Interpole un fichier XYZ en grille `.grd`. |
| `create_contour_map` | Crée une carte (colorée, contours seuls ou contours remplis). |
| `create_cross_section` | Crée une coupe géologique le long d'une ligne droite. |
| `create_surface_map` | Crée une vue 3D de la grille. |
| `export_document` | Exporte un document ouvert (format déduit de l'extension). |
| `save_plot` | Enregistre un document en `.srf`. |
| `close_document` | Ferme un document, avec sauvegarde optionnelle. |

### Paramètres utiles

- **Colonnes** : indices **à partir de 1** (`x_col=1`, `y_col=2`, `z_col=3`).
- **Algorithmes de grille** : `kriging` (défaut), `idw`, `min_curvature`, `shepards`, `natural_neighbor`, `nearest_neighbor`, `regression`, `radial_basis`, `triangulation`, `moving_average`, `data_metrics`, `local_polynomial`.
- **Styles de carte** :
  - `color` (recommandé) : raster coloré + lignes de contours ;
  - `lines` : contours noirs uniquement ;
  - `filled` : contours remplis — Surfer 13 les rend en niveaux de gris.
- **Formats d'export** : `.png`, `.jpg`, `.pdf`, `.tif`, `.svg`, `.emf`.

## Format des données

- Fichiers `.csv`, `.txt`, `.tsv`, `.dat`, `.xyz`.
- Séparateur détecté automatiquement : virgule, point-virgule, tabulation ou espace.
- Ligne d'en-tête facultative, lignes non numériques ignorées, commentaires `#` ignorés.
- Au moins **4 points** numériques.
- Les coordonnées sont exprimées dans les **unités cartographiques** de votre projet ; les libellés d'axes par défaut sont `Distance (m)` et `Elevation (m)`.

## Chemins de fichiers

- Les chemins relatifs sont résolus dans `SURFER_MCP_WORKSPACE`.
- Les chemins absolus sont acceptés.
- Les dossiers de sortie sont créés automatiquement **à l'intérieur** du dossier de travail ; hors de ce dossier, le dossier parent doit déjà exister.

## Dépannage

| Symptôme | Cause probable / solution |
|---|---|
| `pywin32 is required…` | `pip install pywin32` dans l'environnement virtuel. |
| `ActiveX component can't create object` | Surfer n'est pas installé, non licencié, ou son interface COM n'est pas enregistrée. Lancez Surfer une fois manuellement. |
| `Insufficient data in worksheet` | Moins de 4 lignes numériques, mauvais séparateur ou colonnes mal indiquées. |
| Carte remplie en gris | Comportement de Surfer 13 pour `style="filled"` ; utilisez `style="color"`. |
| Accès refusé à l'écriture | Choisissez un dossier accessible dans `SURFER_MCP_WORKSPACE`. |
| Le serveur ne démarre pas dans Claude | Vérifiez le chemin de `python.exe` dans la configuration et redémarrez Claude Desktop. |

## Limites connues

- Windows uniquement (automatisation COM).
- Coupes le long d'une **ligne droite** uniquement dans cette version.
- Une seule opération Surfer à la fois (les appels sont sérialisés).
- Après `SaveAs`, Surfer renomme le document : les outils renvoient le nom final.
- Le serveur ne ferme pas les documents que vous avez ouverts vous-même.

## Développement et tests

```powershell
pip install -e ".[dev]"
pytest -q

# Tests d'intégration réels (lance Surfer)
$env:SURFER_MCP_TEST_COM = "1"
pytest -q
```

Structure :

```
src/surfer_mcp/surfer.py   # session COM, grille, cartes, coupes, exports
src/surfer_mcp/server.py   # outils MCP
tests/                     # tests unitaires et d'intégration (Surfer + stdio MCP)
examples/                  # jeu de données de démonstration
```

## Licence

MIT — voir [LICENSE](LICENSE).