Condividi tramite


Strumenti DML (Data Manipulation Language) in SQL MCP Server

Importante

Il server MCP (SQL Model Context Protocol) è disponibile in Generatore API dati versione 1.7 e successive.

Il server MCP (SQL Model Context Protocol) espone sette strumenti DML (Data Manipulation Language) agli agenti di intelligenza artificiale. Questi strumenti forniscono una superficie CRUD tipizzata per le operazioni di database, ovvero la creazione, la lettura, l'aggiornamento e l'eliminazione di record, l'aggregazione dei dati e l'esecuzione di stored procedure. Tutti gli strumenti rispettano il controllo degli accessi in base al ruolo, le autorizzazioni delle entità e i criteri definiti nella configurazione.

Che cosa sono gli strumenti DML?

Gli strumenti DML (Data Manipulation Language) gestiscono le operazioni dei dati: creazione, lettura, aggiornamento ed eliminazione di record, aggregazione dei dati e esecuzione di stored procedure. A differenza di DDL (Data Definition Language) che modifica lo schema, DML funziona esclusivamente sul piano dati in tabelle e viste esistenti.

I sette strumenti DML sono:

  • describe_entities - Individua le entità e le operazioni disponibili
  • create_record - Inserisce nuove righe
  • read_records - Interroga tabelle e viste
  • update_record - Modifica le righe esistenti
  • delete_record - Rimuove le righe
  • execute_entity - Esegue procedure memorizzate
  • aggregate_records - Esegue query di aggregazione

Annotazioni

La funzionalità SQL MCP Server 2.0 descritta in questa sezione è attualmente in anteprima e potrebbe cambiare prima della disponibilità generale. Per altre informazioni, vedere Novità della versione 2.0.

Quando gli strumenti DML sono abilitati a livello globale e per un'entità, SQL MCP Server li espone tramite il protocollo MCP. Gli agenti non interagiscono mai direttamente con lo schema del database. Funzionano tramite il livello di astrazione del generatore di API dati.

Strumenti

list_tools risposta

Quando un agente chiama list_tools, SQL MCP Server restituisce:

{
  "tools": [
    { "name": "describe_entities" },
    { "name": "create_record" },
    { "name": "read_records" },
    { "name": "update_record" },
    { "name": "delete_record" },
    { "name": "execute_entity" },
    { "name": "aggregate_records" }
  ]
}

descrivi_entità

Restituisce le entità disponibili per il ruolo corrente. Ogni voce include i nomi di campo, le descrizioni e le operazioni consentite. Questo strumento non esegue query sul database. Invece, legge dalla configurazione in memoria creata dal file di configurazione.

Importante

Le fields informazioni in describe_entities derivano dai fields dati forniti nella configurazione. Poiché i metadati dei campi sono facoltativi, se non lo si include, gli agenti visualizzano solo i nomi di entità con una matrice vuota fields . È consigliabile includere sia i nomi dei campi che le descrizioni dei campi nella configurazione. Questi metadati offrono agli agenti più contesto per generare query e aggiornamenti accurati. Altre informazioni sulle descrizioni dei campi sono disponibili qui.

Annotazioni

La risposta include i valori dei campi name e description dalla tua configurazione. I tipi di dati e gli indicatori di chiave primaria non sono inclusi nella risposta corrente. Anche i parametri della stored procedure non sono elencati. Gli agenti si basano sulle descrizioni delle entità e dei campi, insieme al feedback degli errori, per determinare l'utilizzo corretto.

Parametri

Parametro Tipo Obbligatorio Descrizione
nameOnly boolean No Quando true, restituisce un elenco leggero di nomi e descrizioni di entità senza metadati di campo.
entities matrice di stringhe No Limita la risposta alle entità specificate. Se omesso, vengono restituite tutte le entità abilitate per MCP.

Richiesta di esempio

{
  "method": "tools/call",
  "params": {
    "name": "describe_entities",
    "arguments": {
      "entities": ["Products"]
    }
  }
}

Risposta di esempio

{
  "entities": [
    {
      "name": "Products",
      "description": "Product catalog with pricing and inventory",
      "fields": [
        {
          "name": "ProductId",
          "description": "Unique product identifier"
        },
        {
          "name": "ProductName",
          "description": "Display name of the product"
        },
        {
          "name": "Price",
          "description": "Retail price in USD"
        }
      ],
      "operations": [
        "read_records",
        "update_record"
      ]
    }
  ]
}

Annotazioni

Le opzioni di entità usate da uno qualsiasi degli strumenti CRUD o degli strumenti di esecuzione DML derivano direttamente da describe_entities. La descrizione semantica interna associata a ogni strumento applica questo flusso in due passaggi.

create_record

Crea una nuova riga in una tabella. È richiesta l'autorizzazione di creazione sull'entità per il ruolo corrente. Lo strumento convalida l'input sullo schema dell'entità, applica le autorizzazioni a livello di campo, applica i criteri di creazione e restituisce il record creato con tutti i valori generati.

Parametri

Parametro Tipo Obbligatorio Descrizione
entity string Nome dell'entità in cui creare un record.
data oggetto Coppie chiave-valore di nomi e valori di campo per il nuovo record.

read_records

Esegue una query su una tabella o una vista. Supporta il filtro, l'ordinamento, la paginazione e la selezione dei campi. Lo strumento compila SQL deterministico da parametri strutturati, applica autorizzazioni di lettura e proiezioni di campo e applica criteri di sicurezza a livello di riga.

Parametri

Parametro Tipo Obbligatorio Descrizione
entity string Nome dell'entità da cui leggere.
select string No Elenco delimitato da virgole di nomi di campo da restituire , ad esempio "id,title,price".
filter string No Espressione di filtro in stile OData , ad esempio "Price gt 10 and Category eq 'Books'".
orderby matrice di stringhe No Ordinare le espressioni. Ogni elemento è un nome di campo con direzione facoltativa , ad esempio ["Price desc", "Name asc"].
first numero intero No Numero massimo di record da restituire.
after string No Cursore di continuazione da una risposta precedente per la paginazione.

Avviso

Il orderby parametro deve essere una matrice di stringhe, non una singola stringa. Se si passa un valore stringa, viene generato un oggetto UnexpectedError. Usare ["Name asc"] anziché "Name asc".

Risposta di paginazione

Quando sono disponibili più risultati, la risposta include un after cursore. Passare questo valore come after parametro nella richiesta successiva per recuperare la pagina successiva.

{
  "value": [ ... ],
  "after": "W3siRW50aXR5TmFtZ..."
}

La presenza del after campo indica che esistono più pagine. Quando after è assente, è stata raggiunta l'ultima pagina.

Importante

I risultati di read_records vengono memorizzati automaticamente nella cache usando il sistema di memorizzazione nella cache di Data API Builder. È possibile configurare la durata (TTL) della cache a livello globale o per entità per ridurre il carico del database.

Operazioni JOIN

Lo read_records strumento è progettato per una singola tabella o vista. Di conseguenza, le operazioni JOIN non sono supportate in questo strumento. Questa progettazione consente di isolare responsabilità, migliorare le prestazioni e limitare l'impatto sulla finestra di contesto della sessione.

Tuttavia, le operazioni JOIN non sono un caso perimetrale e Il generatore di API dati (DAB) supporta già query sofisticate tramite l'endpoint GraphQL. Per query più complesse, è consigliabile usare una vista anziché una tabella. È anche possibile usare il execute_entity strumento per eseguire stored procedure per incapsulare query con parametri.

update_record

Modifica una riga esistente. Richiede l'aggiornamento della chiave primaria e dei campi. Lo strumento convalida l'esistenza della chiave primaria, applica le autorizzazioni di aggiornamento e i criteri e aggiorna solo i campi che il ruolo corrente può modificare.

Parametri

Parametro Tipo Obbligatorio Descrizione
entity string Nome dell'entità da aggiornare.
keys oggetto Coppie chiave-valore che identificano il record , ad esempio {"id": 42}.
fields oggetto Coppie di chiavi-valore per i nomi dei campi e i nuovi valori.

delete_record

Rimuove una riga esistente. Richiede la chiave primaria. Lo strumento convalida l'esistenza della chiave primaria, applica autorizzazioni e criteri di eliminazione ed esegue l'eliminazione sicura con il supporto delle transazioni.

Parametri

Parametro Tipo Obbligatorio Descrizione
entity string Nome dell'entità da cui eliminare.
keys oggetto Coppie chiave-valore che identificano il record , ad esempio {"id": 42}.

Annotazioni

Alcuni scenari di produzione disabilitano questo strumento a livello globale per vincolare i modelli su larga scala. Questa scelta spetta all'utente e vale la pena ricordare che le autorizzazioni a livello di entità rimangono il modo più importante per controllare l'accesso. Anche con delete-record abilitato, se un ruolo non dispone dell'autorizzazione di eliminazione per un'entità, tale ruolo non può usare questo strumento per tale entità.

execute_entity

Esegue una procedura memorizzata. Supporta parametri di input e risultati di output. Lo strumento convalida i parametri di input rispetto alla firma della procedura, applica le autorizzazioni di esecuzione e passa i parametri in modo sicuro.

Parametri

Parametro Tipo Obbligatorio Descrizione
entity string Nome dell'entità stored-procedure.
parameters oggetto No Coppie chiave-valore di nomi e valori dei parametri di input.

aggregate_records

Esegue query di aggregazione su tabelle e viste. Supporta funzioni di aggregazione comuni, ad esempio count, sum, average, minimum e maximum. Lo strumento compila SQL deterministico da parametri strutturati, applica autorizzazioni di lettura e proiezioni di campo e applica criteri di sicurezza a livello di riga.

Parametri

Parametro Tipo Obbligatorio Descrizione
entity string Nome dell'entità da aggregare.
function string Funzione di aggregazione: count, sum, avgmin, o max.
field string Campo da aggregare. Usare "*" per count.
filter string No Filtro in stile OData applicato prima dell'aggregazione.
distinct boolean No Quando true, rimuove i valori duplicati prima dell'aggregazione.
groupby matrice di stringhe No Nomi di campo per raggruppare i risultati (ad esempio, ["Category", "Status"]).
having oggetto No Filtra i gruppi in base al valore aggregato. Usa gli operatori: eq, neq, gtgte, lt, , lte, . in
orderby matrice di stringhe No Ordinare le espressioni per i risultati raggruppati , ad esempio ["count desc"].
first numero intero No Numero massimo di risultati raggruppati da restituire.
after string No Cursore di continuazione per la paginazione dei risultati raggruppati.

Esempio: conteggio con groupby e having

{
  "method": "tools/call",
  "params": {
    "name": "aggregate_records",
    "arguments": {
      "entity": "Todo",
      "function": "count",
      "field": "*",
      "groupby": ["UserId"],
      "having": { "gt": 2 }
    }
  }
}

Lo aggregate-records strumento può essere configurato come valore booleano o come oggetto con altre impostazioni:

{
  "runtime": {
    "mcp": {
      "dml-tools": {
        "aggregate-records": {
          "enabled": true,
          "query-timeout": 30
        }
      }
    }
  }
}

La query-timeout proprietà specifica il tempo di esecuzione massimo in secondi (intervallo: 1-600). Questa impostazione consente di evitare che le query di aggregazione a esecuzione prolungata consumino risorse eccessive.

Configurazione del runtime

Configurare gli strumenti DML a livello globale nella sezione runtime di dab-config.json:

{
  "runtime": {
    "mcp": {
      "enabled": true,
      "path": "/mcp",
      "dml-tools": {
        "describe-entities": true,
        "create-record": true,
        "read-records": true,
        "update-record": true,
        "delete-record": true,
        "execute-entity": true,
        "aggregate-records": true
      }
    }
  }
}

Ogni proprietà dello strumento in runtime.mcp.dml-tools accetta true o false. Lo aggregate-records strumento supporta anche un formato di oggetto con enabled e query-timeout:

{
  "runtime": {
    "mcp": {
      "enabled": true,
      "dml-tools": {
        "describe-entities": true,
        "create-record": true,
        "read-records": true,
        "update-record": true,
        "delete-record": true,
        "execute-entity": true,
        "aggregate-records": {
          "enabled": true,
          "query-timeout": 30
        }
      }
    }
  }
}

Per abilitare o disabilitare tutti gli strumenti DML contemporaneamente, impostare su "dml-tools"true o false.

Uso dell'CLI

Impostare le proprietà singolarmente usando l'interfaccia della riga di comando di Generatore API dati:

dab configure --runtime.mcp.enabled true
dab configure --runtime.mcp.path "/mcp"
dab configure --runtime.mcp.dml-tools.describe-entities true
dab configure --runtime.mcp.dml-tools.create-record true
dab configure --runtime.mcp.dml-tools.read-records true
dab configure --runtime.mcp.dml-tools.update-record true
dab configure --runtime.mcp.dml-tools.delete-record true
dab configure --runtime.mcp.dml-tools.execute-entity true
dab configure --runtime.mcp.dml-tools.aggregate-records.enabled true
dab configure --runtime.mcp.dml-tools.aggregate-records.query-timeout 30

Disabilitazione degli strumenti

Quando si disabilita uno strumento a livello di runtime, non viene mai visualizzato dagli agenti, indipendentemente dalle autorizzazioni dell'entità o dalla configurazione del ruolo. Questa impostazione è utile quando sono necessari limiti operativi rigorosi.

Scenari comuni

  • Disabilitare delete-record per evitare la perdita di dati nell'ambiente di produzione
  • Disabilitare create-record per gli endpoint di report di sola lettura
  • Disabilitare execute-entity quando le stored procedure non sono utilizzate
  • Disabilitare aggregate-records quando le query di aggregazione non sono necessarie

Quando uno strumento è disabilitato a livello globale, lo strumento viene nascosto dalla list_tools risposta e non può essere richiamato.

Impostazioni entità

Le entità partecipano automaticamente a MCP, a meno che non venga esplicitamente applicata una restrizione. La proprietà mcp di un'entità ne controlla la partecipazione MCP. Usare il formato dell'oggetto per il controllo esplicito.

Formato oggetto

{
  "entities": {
    "Products": {
      "mcp": {
        "dml-tools": true
      }
    },
    "SensitiveData": {
      "mcp": {
        "dml-tools": false
      }
    }
  }
}

Se non si specifica mcp in un'entità, per impostazione predefinita gli strumenti DML sono abilitati quando MCP è abilitato a livello globale.

Strumenti personalizzati per procedure memorizzate

Per le entità stored procedure, usare la custom-tool proprietà per registrare la routine come strumento MCP denominato:

{
  "entities": {
    "GetBookById": {
      "source": {
        "type": "stored-procedure",
        "object": "dbo.get_book_by_id"
      },
      "mcp": {
        "custom-tool": true
      }
    }
  }
}

Importante

La custom-tool proprietà è valida solo per le entità stored procedure. L'impostazione su una tabella o vista dell'entità genera un errore di configurazione.

Ambito del controllo per strumento

Le opzioni per ogni strumento vengono configurate solo a livello di esecuzione globale in runtime.mcp.dml-tools.

A livello di entità, mcp è una porta booleana o un oggetto con le proprietà dml-tools e custom-tool.

{
  "entities": {
    "AuditLogs": {
      "mcp": {
        "dml-tools": false
      }
    }
  }
}
{
  "runtime": {
    "mcp": {
      "dml-tools": {
        "describe-entities": true,
        "create-record": true,
        "read-records": true,
        "update-record": true,
        "delete-record": false,
        "execute-entity": true,
        "aggregate-records": true
      }
    }
  }
}

Uno strumento è disponibile solo se abilitato a livello globale e l'entità consente strumenti DML.

Integrazione RBAC (controllo degli accessi in base al ruolo)

Ogni operazione dello strumento DML applica le regole di controllo degli accessi in base al ruolo. Il ruolo di un agente determina quali entità sono visibili, quali operazioni sono consentite, quali campi sono inclusi e se si applicano criteri a livello di riga.

Se il ruolo consente solo l'autorizzazione anonymous di lettura per Products:

  • describe_entities mostra read_records solo nelle operazioni
  • create_record, update_recorde delete_record non sono disponibili
  • Solo i campi consentiti per anonymous vengono visualizzati nello schema

Configura i ruoli in dab-config.json:

{
  "entities": {
    "Products": {
      "permissions": [
        {
          "role": "anonymous",
          "actions": [
            {
              "action": "read",
              "fields": {
                "include": ["ProductId", "ProductName", "Price"],
                "exclude": ["Cost"]
              }
            }
          ]
        },
        {
          "role": "admin",
          "actions": [
            {
              "action": "*"
            }
          ]
        }
      ]
    }
  }
}