Skip to main content
Glama
jlg-formation

mcp-server-sqlite

README.md
# mcp-server-sqlite

Serveur **MCP (Model Context Protocol)** en Python exposant une base **SQLite** à un
assistant IA via un unique outil : `execute_sql`. Usage **local et personnel**.

L'IA peut exécuter n'importe quelle requête SQL (`SELECT`, `INSERT`, `UPDATE`,
`DELETE`, DDL…) et récupérer les résultats au format JSON.

> ⚠️ **Aucun garde-fou de sécurité** : le SQL est totalement libre, il n'y a ni
> mode lecture seule, ni authentification, ni limite. Destiné à un usage local
> par un utilisateur unique.

## Prérequis

- Python **3.12+**
- [`uv`](https://docs.astral.sh/uv/)

## Installation

```bash
uv sync
```

## Lancement

Le chemin de la base SQLite est fourni via `--db-path` **ou** la variable
d'environnement `SQLITE_DB_PATH`. Le fichier est **créé automatiquement** s'il
n'existe pas.

### Mode stdio (usage local standard)

```bash
uv run mcp-server-sqlite --db-path ./ma_base.db
```

### Mode HTTP (JSON, sans SSE)

```bash
uv run mcp-server-sqlite --transport http --db-path ./ma_base.db --host 127.0.0.1 --port 8000
```

Le transport HTTP répond en `application/json` (pas de flux SSE), adapté aux
clients incapables de streamer. Par défaut : `127.0.0.1:8000`.

**Accès navigateur** : le serveur fonctionne sans aucune configuration d'origine.
La protection anti DNS-rebinding du SDK MCP est désactivée (sinon les origines
non-localhost sont rejetées avec « Invalid Origin header ») et le CORS autorise
par défaut toutes les origines (`*`). Si vous souhaitez malgré tout restreindre
le CORS, utilisez `--cors-origin` (répétable) :

```bash
uv run mcp-server-sqlite --transport http --cors-origin http://localhost:3000 --cors-origin https://mon-app.example
```

L'en-tête `Mcp-Session-Id` est exposé pour permettre aux clients navigateurs de
lire l'identifiant de session MCP.

## L'outil `execute_sql`

- **Entrée** : `sql` — une chaîne contenant du SQL arbitraire. Plusieurs
  instructions peuvent être séparées par `;` (exécution de type `executescript`).
- **Sortie** (chaîne JSON) :
  - Requête renvoyant des lignes (`SELECT`) : `{"rows": [{"colonne": valeur, ...}, ...]}`
  - Requête de modification / DDL : `{"rowcount": <nombre de lignes affectées>}`
  - Erreur SQL : `{"error": "<message>"}`
- Les types non natifs JSON sont convertis en chaîne : `BLOB` décodé en UTF-8
  (repli en hexadécimal), dates au format ISO.
- **Commit automatique** après chaque appel réussi.

## Configuration côté client MCP

Deux cas de figure : le client lance lui-même le serveur (**mode stdio**), ou le
client se connecte à un serveur **HTTP** déjà démarré.

### Mode stdio (le client lance le serveur)

#### Claude Desktop (`claude_desktop_config.json`)

```json
{
  "mcpServers": {
    "sqlite": {
      "command": "uv",
      "args": [
        "run",
        "--directory",
        "d:/___AGENTS/mcp-server-sqlite-uv",
        "mcp-server-sqlite",
        "--db-path",
        "d:/___AGENTS/mcp-server-sqlite-uv/ma_base.db"
      ]
    }
  }
}
```

#### VS Code (`.vscode/mcp.json`)

```json
{
  "servers": {
    "sqlite": {
      "command": "uv",
      "args": [
        "run",
        "--directory",
        "d:/___AGENTS/mcp-server-sqlite-uv",
        "mcp-server-sqlite",
        "--db-path",
        "d:/___AGENTS/mcp-server-sqlite-uv/ma_base.db"
      ]
    }
  }
}
```

### Mode HTTP (le serveur est démarré à part)

Démarrez d'abord le serveur en mode HTTP :

```bash
uv run mcp-server-sqlite --transport http --db-path ./ma_base.db --host 127.0.0.1 --port 8000
```

Le point de terminaison MCP est alors disponible sur **`http://127.0.0.1:8000/mcp`**.
Configurez ensuite le client pour s'y connecter par URL.

#### VS Code (`.vscode/mcp.json`)

```json
{
  "servers": {
    "sqlite": {
      "type": "http",
      "url": "http://127.0.0.1:8000/mcp"
    }
  }
}
```

#### Claude Desktop (`claude_desktop_config.json`)

Claude Desktop ne se connecte qu'en stdio ; on passe par le proxy
[`mcp-remote`](https://www.npmjs.com/package/mcp-remote) pour atteindre un
serveur HTTP :

```json
{
  "mcpServers": {
    "sqlite": {
      "command": "npx",
      "args": ["mcp-remote", "http://127.0.0.1:8000/mcp"]
    }
  }
}
```

> ℹ️ Si le client tourne dans un navigateur, autorisez son origine avec
> `--cors-origin` au lancement du serveur (voir la section Lancement).

## Tests

```bash
uv run pytest
```

## Développement avec mise

Le projet fournit un [mise.toml](mise.toml) qui gère les outils (Python 3.12, uv)
et expose des tâches. `uv` est configuré pour utiliser le Python fourni par mise.

```bash
mise install       # installe Python + uv
mise run install   # uv sync
mise run test      # tests pytest
mise run serve     # serveur en mode stdio
mise run serve-http # serveur en mode HTTP (JSON)
```

## Licence

MIT — voir [LICENSE](LICENSE).

TDQS

A4.4/5.0

Scored across 1 tool

Disambiguation5/5

With only one tool, there is no ambiguity; the agent cannot confuse it with any other tool.

Naming Consistency5/5

The single tool name 'execute_sql' follows a clear verb_noun pattern, consistent with best practices.

Tool Count4/5

One tool is minimal but fully capable for a SQLite database server, covering all operations via arbitrary SQL queries.

Completeness5/5

The tool accepts any SQL statement, enabling full CRUD, DDL, and other database operations without gaps.

Maintenance

ActivityStale
ResponsivenessNo issues