Skip to main content
Glama
Proivonz001

directa-mcp

by Proivonz001
README.md
# directa-mcp

Server MCP (Python, trasporto stdio) che collega Claude alla Trading API (dAPI)
del broker Directa tramite la piattaforma Darwin in esecuzione sul PC.

- **Lettura** (prima versione): stato Darwin, conto, disponibilità, posizioni, ordini,
  scheda strumento, quotazioni, candele, report di portafoglio, ricerca strumenti.
- **Scrittura**: ordini limite/mercato, modifica, revoca. Disabilitata di default
  (`DIRECTA_ENABLE_TRADING=false`); anche se abilitata richiede un'anteprima e poi
  `confirm=true`, e rispetta i limiti hard-coded in `config.py`.
- **Prezzi**: da Yahoo Finance (ritardo ~15 min), perché il datafeed Directa a pagamento
  non è attivo. Il canale trading Directa è gratuito e funziona.

Dettagli di architettura, protocollo e decisioni: [CLAUDE.md](CLAUDE.md).

## Requisiti

- Windows, Python 3.11+ (testato con 3.12.1)
- Conto Directa con **Trading API abilitate** (sito Directa → icona utente → Servizi e Prodotti → API)
- Darwin aperto con l'utente loggato: apre i socket locali 10001/10002/10003

## Setup

```bash
python -m venv .venv
.venv\Scripts\python -m pip install -r requirements.txt
```

Verifica rapida che Darwin risponda (porte e `DARWINSTATUS`):

```bash
.venv\Scripts\python -c "from directa.client import read_port_settings; print(read_port_settings())"
```

## Test

```bash
.venv\Scripts\python -m pytest -q tests
.venv\Scripts\python smoke_test.py ENI
```

`tests/` usa risposte reali registrate in `tests/fixtures/`; `smoke_test.py` esercita
tutti i tool di lettura contro Darwin reale e Yahoo, senza inviare ordini.

## Registrazione in Claude Code

```bash
claude mcp add --scope user directa -e DIRECTA_ENABLE_TRADING=false -- "C:\path\to\directa-mcp\.venv\Scripts\python.exe" "C:\path\to\directa-mcp\server.py"
```

Già eseguito su questa macchina (scope utente, stato Connected). Verifica con
`claude mcp list` e, in una sessione, con `/mcp`. Se `claude` non è nel PATH, l'eseguibile
bundlato nell'app desktop è in
`%LOCALAPPDATA%\Packages\Claude_pzs8sxrjxfjjc\LocalCache\Roaming\Claude\claude-code\<versione>\claude.exe`.
Per abilitare il trading: `claude mcp remove directa -s user` e ri-aggiungere con
`-e DIRECTA_ENABLE_TRADING=true`.

## Registrazione in Claude Desktop

Aggiungere a `%APPDATA%\Claude\claude_desktop_config.json`:

```json
{
  "mcpServers": {
    "directa": {
      "command": "C:\\path\\to\\directa-mcp\\.venv\\Scripts\\python.exe",
      "args": ["C:\\path\\to\\directa-mcp\\server.py"],
      "env": {
        "DIRECTA_ENABLE_TRADING": "false",
        "DIRECTA_LOG_DIR": "C:\\path\\to\\directa-mcp\\logs",
        "DIRECTA_DATA_DIR": "C:\\path\\to\\directa-mcp\\data"
      }
    }
  }
}
```

## Uso da script Python

```python
import asyncio
from directa.client import TradingClient

async def main():
    async with TradingClient() as t:
        print(await t.info_account())
        print(await t.info_stocks())

asyncio.run(main())
```

Il modulo `directa/` non dipende da `mcp` e si può usare da `strategies/` o da un
report serale schedulato. I log grezzi TX/RX sono in `logs/directa_<canale>.log`.

## Ticker

Directa usa i ticker senza suffisso (`ENI`, `ISP`, `SWDA`); `ENI.MI` viene normalizzato.
La conversione verso Yahoo (`ENI.MI`) usa l'anagrafica locale di Darwin
(`~/.directa/anag_json/ANAG_TOTALE.json`).