Blog / ia

Usando Inteligencia Artificial con un MCP en SQL Server

Usando Inteligencia Artificial con un MCP en SQL Server

Hace unos días terminé haciendo algo que probablemente muchos desarrolladores hacemos cuando estamos probando una idea: buscar datos, juntarlos y empezar a jugar con ellos.

En este caso, la búsqueda terminó siendo bastante curiosa.

Me encontré con personas que compartían mi nombre, pero que vivían en ciudades diferentes, trabajaban en industrias completamente distintas y, en algunos casos, tenían nombres bastante más largos que el mío.

Así que terminé armando una pequeña colección de registros con nombres, ciudades y empresas.

Al principio no tenía ningún propósito especial. Simplemente quería ver qué tan fácil sería encontrar relaciones entre ellos.

Y entonces apareció una pregunta que parecía bastante sencilla:

¿Qué pasaría si en lugar de hacer yo las consultas, pudiera simplemente preguntárselo a una IA?

Normalmente, para trabajar con algo así, escribiría una consulta SQL, revisaría los resultados y después haría otra consulta para profundizar.

SELECT *
FROM Personas
WHERE Nombre LIKE '%Victor%Sosa%';

Pero esta vez quise probar algo diferente:

conectar un modelo de IA directamente con SQL Server mediante MCP y dejar que el agente descubriera cómo consultar los datos.

Ahí fue donde apareció MCP.

Y sí… la idea empezó con un inocente:

“Busca todos los Victor Sosa.”

Y terminó siendo bastante más interesante.

MCP + SQL Server

MCP, o Model Context Protocol, permite que un modelo de IA descubra y utilice herramientas externas.

En este caso, la arquitectura queda más o menos así:

Diagrama: arquitectura con MCP entre el modelo de IA y SQL Server

Pero aquí hay una diferencia importante.

No vamos a darle al modelo acceso directo a SQL Server.

Vamos a utilizar el SQL MCP Server de Microsoft, que forma parte de Data API Builder desde la versión 1.7 y que actualmente cuenta con la línea 2.0. Microsoft lo diseñó precisamente para que agentes de IA puedan trabajar con datos mediante una superficie controlada de herramientas, permisos y entidades (documentación oficial).

Y esto me gusta mucho más que simplemente darle a una IA un usuario y contraseña de SQL Server.

¿Qué vamos a construir?

Un pequeño laboratorio.

Tendremos una base:

PersonasDB

llena con nombres que me dio Google, como:

Victor Sosa
Víctor Hugo Sosa
Víctor Hugo Sosa Esquivel
Víctor Hugo Badillo Sosa
Víctor Adrián Sosa Hernández
Victor Manuel Sosa Piña
Victor Manuel Sosa Hernández
Victor Manuel Sosa Guzmán
Victor Manuel Sosa
Victor Manuel Sosa Moscoso
Victor Manuel Sosa Estrada
Victor Manuel Sosa León
Victor Manuel Sosa Valenzuela
Victor Sosa Toledo

Después conectaremos SQL Server con el SQL MCP Server de Microsoft.

Y finalmente podremos preguntarle a la IA cosas como:

¿Qué personas tienen nombres similares a Victor Sosa?

o:

Busca todos los posibles homónimos de Victor Sosa y agrúpalos por similitud.

La gracia es que nosotros no tendremos que escribir la consulta SQL.

1. Lo que necesitamos

Para este laboratorio necesitamos:

  • SQL Server 2016 o superior
  • .NET 9 o superior
  • Data API Builder
  • Visual Studio Code
  • GitHub Copilot Chat u otro cliente compatible con MCP

Microsoft utiliza precisamente estos requisitos en su quickstart actual para SQL MCP Server (quickstart).

Si ya tienes .NET instalado, primero puedes comprobarlo:

dotnet --version

La versión debe ser 9.0 o superior.

2. Crear nuestro proyecto

Creamos una carpeta:

mkdir sql-mcp-demo
cd sql-mcp-demo

Y creamos un manifiesto local para la herramienta de .NET:

dotnet new tool-manifest

Ahora instalamos Data API Builder:

dotnet tool install microsoft.dataapibuilder

Y restauramos las herramientas:

dotnet tool restore

Podemos comprobar que DAB está disponible:

dotnet tool run dab --version

Microsoft distribuye SQL MCP Server como parte de Data API Builder; no estamos instalando un servidor MCP de terceros (notas de la versión 1.7).

3. Crear nuestra base de datos

Ahora viene la parte importante.

Vamos a crear una base de datos de laboratorio.

CREATE DATABASE PersonasDB;
GO

USE PersonasDB;
GO

CREATE TABLE dbo.Personas
(
    Id INT IDENTITY PRIMARY KEY,
    Nombre NVARCHAR(150) NOT NULL,
    Ciudad NVARCHAR(100),
    Profesion NVARCHAR(150)
);
GO

Y así quedó la base, llena con los nombres que me dio Google:

INSERT INTO dbo.Personas
    (Nombre, Ciudad, Profesion)
VALUES
    ('Victor Sosa', 'Monterrey', ''),
    ('Victor Sosa', 'Querétaro', 'FieldCore'),
    ('Victor Sosa', 'Querétaro', 'CONTACT Automation'),
    ('Victor Sosa', 'Playa del Carmen', 'Mayakoba Experiences'),
    ('Victor Sosa', 'Chihuahua', 'Signify'),
    ('Victor Sosa', 'Mérida', 'Magnon Group'),
    ('Victor Sosa', 'Aguascalientes', 'Bachoco'),
    ('Victor Sosa', 'Saltillo', 'Woodbridge'),
    ('Victor Sosa', 'CDMX', 'Copachisa'),
    ('Victor Sosa', 'Zamora, Michoacán', ''),
    ('Victor Sosa', 'Tamaulipas', ''),
    ('Victor Sosa', 'Torreón', ''),
    ('Victor Sosa', 'Apatzingán', 'Tecnología'),
    ('Victor Sosa', 'Acapulco', 'Integrity Mexico'),
    ('Victor Sosa', 'CDMX', 'Comunicación / diseño estratégico'),
    ('Victor Sosa', 'CDMX', 'BBVA'),
    ('Victor Sosa', 'CDMX', 'Industrial Proximity Services'),
    ('Víctor Adrián Sosa Hernández', 'CDMX', 'Tecnológico de Monterrey / IA / Ciencias Computacionales'),
    ('Victor Manuel Sosa Piña', 'Iztapalapa, CDMX', 'HITSS México'),
    ('Victor Manuel Sosa Hernández', 'CDMX', 'GNP Seguros'),
    ('Victor Manuel Sosa Guzmán', 'Benito Juárez, CDMX', 'Sam''s Club México'),
    ('Victor Manuel Sosa', 'Toluca', 'FIRA'),
    ('Victor Manuel Sosa', 'Oaxaca', ''),
    ('Victor Manuel Sosa', 'San Luis Potosí', ''),
    ('Victor Manuel Sosa', 'Puebla', 'COBAEP'),
    ('Victor Manuel Sosa', 'Monclova', 'Maxion Inmagusa'),
    ('Victor Manuel Sosa Moscoso', 'Palenque, Chiapas', 'Profesional independiente'),
    ('Victor Manuel Sosa Estrada', 'Guadalajara', ''),
    ('Victor Manuel Sosa León', 'Zumpango', 'SEGU S.A. de C.V.'),
    ('Victor Manuel Sosa Valenzuela', 'Taipei', 'TutorABC'),
    ('Victor Manuel Sosa', 'Gainesville, Florida', 'King Risk Partners'),
    ('Victor Manuel Sosa', 'Bogotá', 'Concentrix'),
    ('Victor Manuel Sosa', 'España', 'PUBLICOM'),
    ('Victor Manuel Sosa', 'Argentina', 'Radio del Plata San Luis'),
    ('Víctor Hugo Sosa', 'CDMX', 'Contratista'),
    ('Víctor Hugo Sosa Esquivel', 'Monterrey', 'Exel del Norte'),
    ('Victor Sosa Toledo', 'CDMX', 'PepsiCo'),
    ('Victor Gabriel Mares Sosa', 'Iztacalco', 'Corteva Agriscience'),
    ('Victor Adán Sosa Luna', 'Benito Juárez, CDMX', 'Linguatec México'),
    ('Víctor Hugo Badillo Sosa', 'Faja de Oro', 'GSisTI'),
    ('Víctor Raúl Reyes Sosa', 'Orizaba', 'Rovianda'),
    ('Víctor Sosa Martínez', 'París', 'Max Mara Fashion Group'),
    ('Victor Zapata-Sosa', 'Jersey City, NJ', 'Revlon'),
    ('Victor Sosa', 'Carrollton, Texas', 'Safran Helicopter Engines USA'),
    ('Victor Sosa', 'Boynton Beach, Florida', 'Caperion Computing'),
    ('Victor Sosa', 'Salinas, California', 'Language Access Consultant'),
    ('Victor Sosa', 'Durham, New Hampshire', 'University of New Hampshire'),
    ('Victor Sosa', 'Greensboro, North Carolina', 'The Lane Construction Corporation'),
    ('Victor Sosa', 'Fort Worth, Texas', 'CEC'),
    ('Victor Sosa', 'Salt Lake City', 'TireHub'),
    ('Victor Sosa', 'Toronto', 'Rogers Communications'),
    ('Victor Sosa', 'São Paulo', 'BTG Pactual'),
    ('Victor Sosa', 'Buenos Aires', 'SecurityPack'),
    ('Victor Sosa', 'Argentina', 'President Energy PLC'),
    ('Victor Sosa', 'Argentina', 'Empresa Nueve de Julio S.A.T.'),
    ('Victor Sosa', 'Dallas, Texas', 'vsvideoservices'),
    ('Victor Sosa', 'Paraguay', 'Banco Atlas'),
    ('Victor Sosa', 'Paraguay', 'Banco Interamericano de Desarrollo'),
    ('Victor Sosa', 'Paraguay', 'Benini Transporte y Logística'),
    ('Victor Sosa', 'Paraguay', 'Tafirel Paraguay'),
    ('Victor Sosa', 'Paraguay', 'ASM Paraguay'),
    ('Victor Sosa', 'Honduras', 'CVS'),
    ('Victor Sosa', 'Brasil', 'Sosa Perícia'),
    ('Victor Sosa', 'Buenos Aires', 'Millanel Cosmética'),
    ('Victor Sosa', 'Hartford, Connecticut', 'Pratt & Whitney'),
    ('Victor Sosa', 'Hawthorne, New Jersey', 'Ohm Labs'),
    ('Victor Sosa', 'Atibaia, Brasil', 'Uniexame'),
    ('Victor Sosa', 'Milwaukee', 'La Causa'),
    ('Victor Sosa', 'Philadelphia', 'FINRA'),
    ('Victor Sosa', 'Phoenix', 'Choice Hotels International'),
    ('Victor Sosa', 'Edwards, Colorado', ''),
    ('Victor Sosa', 'Lafayette, Louisiana', ''),
    ('Victor Sosa', 'San Miguel', 'ITLS');
GO

Y aquí empieza nuestro pequeño experimento.

4. Configurar Data API Builder

Ahora inicializamos la configuración:

dotnet tool run dab init \
  --database-type mssql \
  --connection-string "<TU_CONNECTION_STRING>" \
  --config dab-config.json \
  --host-mode development

Esto genera:

dab-config.json

Ese archivo es fundamental.

Aquí definimos la conexión y, sobre todo, qué entidades puede utilizar nuestro agente.

La documentación de Microsoft recomienda precisamente utilizar el archivo de configuración de DAB como punto central para conexiones, entidades, permisos y capacidades MCP (documentación oficial).

5. No vamos a exponer toda la base

Y aquí está una de las cosas que más me gustan de esta implementación.

No queremos esto:

Diagrama: IA con acceso a todo SQL Server

Queremos esto:

Diagrama: IA a través de MCP y entidades permitidas hacia SQL Server

Por ejemplo, podemos exponer:

Personas

pero dejar fuera:

Usuarios
Credenciales
Pagos
InformaciónConfidencial

La configuración de DAB utiliza entidades y permisos para determinar qué puede consultar el agente. SQL MCP Server hereda esa misma capa de control (documentación oficial).

6. Activar MCP

En dab-config.json habilitamos MCP:

{
  "runtime": {
    "mcp": {
      "enabled": true
    }
  }
}

Y configuramos nuestra entidad Personas.

La idea es que DAB conozca:

Diagrama: estructura de la entidad Personas

Además podemos agregar descripciones semánticas.

Por ejemplo:

Nombre:
"Nombre completo de la persona"

Ciudad:
"Ciudad donde reside la persona"

Profesion:
"Profesión u ocupación de la persona"

Esto parece un detalle menor.

No lo es.

Estamos dándole contexto al agente sobre nuestros datos.

Microsoft recomienda precisamente agregar descripciones semánticas para ayudar a los modelos a interpretar correctamente las entidades y sus campos (documentación oficial).

7. ¿Qué herramientas recibe la IA?

Aquí viene algo interesante.

SQL MCP Server no simplemente le entrega SQL libre al modelo.

En su versión actual expone una serie de herramientas DML, entre ellas:

describe_entities
read_records
create_record
update_record
delete_record
execute_entity
aggregate_records

Estas herramientas respetan la configuración, los permisos y las políticas definidas en Data API Builder (documentación oficial).

Esto significa que el modelo trabaja con una interfaz controlada, no con una conexión directa e irrestricta a SQL Server.

8. Conectarlo con Visual Studio Code

Para este laboratorio podemos utilizar el transporte stdio.

La ventaja es que VS Code puede administrar directamente el proceso de DAB.

Creamos:

.vscode/mcp.json

Y configuramos el servidor:

{
  "servers": {
    "sql-mcp-server": {
      "type": "stdio",
      "command": "dab",
      "args": [
        "start",
        "--mcp-stdio",
        "role:anonymous",
        "--config",
        "${workspaceFolder}/dab-config.json"
      ]
    }
  }
}

El quickstart oficial de Microsoft utiliza este enfoque para ejecutar SQL MCP Server localmente desde VS Code (quickstart).

9. Encender el MCP

Abrimos el proyecto en VS Code.

Después:

Ctrl + Shift + P

y buscamos:

MCP: List Servers

Deberíamos encontrar:

sql-mcp-server

Lo iniciamos.

Una vez conectado, VS Code puede descubrir las herramientas que proporciona el servidor.

Entre ellas encontraremos herramientas como:

describe_entities
read_records

dependiendo de nuestra configuración (quickstart).

10. Primera conversación con nuestra base

Ahora abrimos Copilot Chat.

Y en lugar de escribir SQL…

preguntamos:

¿Qué información tienes disponible en la base de datos?

El agente puede utilizar MCP para descubrir las entidades disponibles.

Después:

¿Qué campos tiene la entidad Personas?

Y finalmente:

Muéstrame las personas cuyo nombre contiene Victor.

La IA puede decidir utilizar read_records.

Nosotros no escribimos el SQL.

Estamos hablando con el agente.

11. Ahora sí…

Llegó el momento.

Le preguntamos:

Busca todos los posibles homónimos de Victor Sosa.

Y podemos pedirle algo más:

No busques solamente coincidencias exactas. Considera también variantes del nombre y explícame por qué cada registro podría ser un posible homónimo.

Podríamos obtener algo parecido a:

Coincidencia exacta: 47
Victor Sosa — Monterrey
Victor Sosa — Querétaro · FieldCore
Victor Sosa — Querétaro · CONTACT Automation
...

Victor Hugo Sosa: 3
Víctor Hugo Sosa — CDMX · Contratista
Víctor Hugo Sosa Esquivel — Monterrey · Exel del Norte
Víctor Hugo Badillo Sosa — Faja de Oro · GSisTI

Victor Sosa Hernández: 1
Víctor Adrián Sosa Hernández — CDMX · Tecnológico de Monterrey / IA / Ciencias Computacionales

Victor Manuel Sosa: 16
Victor Manuel Sosa Piña — Iztapalapa, CDMX · HITSS México
Victor Manuel Sosa Hernández — CDMX · GNP Seguros
...

Otras variantes: 6
Victor Sosa Toledo — CDMX · PepsiCo
Victor Gabriel Mares Sosa — Iztacalco · Corteva Agriscience
...

El agente agrupó los 73 registros por similitud de nombre.

Y aquí es donde empieza a ponerse interesante.

SQL recupera. La IA interpreta.

Una consulta tradicional podría hacer:

WHERE Nombre LIKE '%Victor%Sosa%'

Pero el agente puede hacer algo diferente.

Puede consultar los registros disponibles y después razonar sobre ellos.

Por ejemplo:

Diagrama: árbol de posibles homónimos de Victor Sosa

No significa que el modelo sepa que dos personas son la misma persona.

Y aquí hay que tener cuidado.

Un nombre similar no demuestra identidad.

El experimento solamente busca posibles homónimos.

12. Y podemos seguir preguntando

Por ejemplo:

¿Cuántos posibles homónimos encontraste?

Después:

¿En qué ciudades viven?

Después:

¿Cuáles tienen profesiones relacionadas con tecnología?

Y finalmente:

Hazme un resumen de los posibles homónimos de Victor Sosa.

Todo esto sin que nosotros escribamos manualmente cada consulta.

Los Victor Sosa del mundo

Y aquí está lo curioso: no son tres ni cuatro. Encontré 73 Victor Sosa en distintos países, cada uno con su propia historia, ciudad y empresa.

Nombre Lugar Empresa / actividad
Victor Sosa Monterrey
Victor Sosa Querétaro FieldCore
Victor Sosa Querétaro CONTACT Automation
Victor Sosa Playa del Carmen Mayakoba Experiences
Victor Sosa Chihuahua Signify
Victor Sosa Mérida Magnon Group
Victor Sosa Aguascalientes Bachoco
Victor Sosa Saltillo Woodbridge
Victor Sosa CDMX Copachisa
Victor Sosa Zamora, Michoacán
Victor Sosa Tamaulipas
Victor Sosa Torreón
Victor Sosa Apatzingán Tecnología
Victor Sosa Acapulco Integrity Mexico
Victor Sosa CDMX Comunicación / diseño estratégico
Victor Sosa CDMX BBVA
Victor Sosa CDMX Industrial Proximity Services
Víctor Adrián Sosa Hernández CDMX Tecnológico de Monterrey / IA / Ciencias Computacionales
Victor Manuel Sosa Piña Iztapalapa, CDMX HITSS México
Victor Manuel Sosa Hernández CDMX GNP Seguros
Victor Manuel Sosa Guzmán Benito Juárez, CDMX Sam’s Club México
Victor Manuel Sosa Toluca FIRA
Victor Manuel Sosa Oaxaca
Victor Manuel Sosa San Luis Potosí
Victor Manuel Sosa Puebla COBAEP
Victor Manuel Sosa Monclova Maxion Inmagusa
Victor Manuel Sosa Moscoso Palenque, Chiapas Profesional independiente
Victor Manuel Sosa Estrada Guadalajara
Victor Manuel Sosa León Zumpango SEGU S.A. de C.V.
Victor Manuel Sosa Valenzuela Taipei TutorABC
Victor Manuel Sosa Gainesville, Florida King Risk Partners
Victor Manuel Sosa Bogotá Concentrix
Victor Manuel Sosa España PUBLICOM
Victor Manuel Sosa Argentina Radio del Plata San Luis
Víctor Hugo Sosa CDMX Contratista
Víctor Hugo Sosa Esquivel Monterrey Exel del Norte
Victor Sosa Toledo CDMX PepsiCo
Victor Gabriel Mares Sosa Iztacalco Corteva Agriscience
Victor Adán Sosa Luna Benito Juárez, CDMX Linguatec México
Víctor Hugo Badillo Sosa Faja de Oro GSisTI
Víctor Raúl Reyes Sosa Orizaba Rovianda
Víctor Sosa Martínez París Max Mara Fashion Group
Victor Zapata-Sosa Jersey City, NJ Revlon
Victor Sosa Carrollton, Texas Safran Helicopter Engines USA
Victor Sosa Boynton Beach, Florida Caperion Computing
Victor Sosa Salinas, California Language Access Consultant
Victor Sosa Durham, New Hampshire University of New Hampshire
Victor Sosa Greensboro, North Carolina The Lane Construction Corporation
Victor Sosa Fort Worth, Texas CEC
Victor Sosa Salt Lake City TireHub
Victor Sosa Toronto Rogers Communications
Victor Sosa São Paulo BTG Pactual
Victor Sosa Buenos Aires SecurityPack
Victor Sosa Argentina President Energy PLC
Victor Sosa Argentina Empresa Nueve de Julio S.A.T.
Victor Sosa Dallas, Texas vsvideoservices
Victor Sosa Paraguay Banco Atlas
Victor Sosa Paraguay Banco Interamericano de Desarrollo
Victor Sosa Paraguay Benini Transporte y Logística
Victor Sosa Paraguay Tafirel Paraguay
Victor Sosa Paraguay ASM Paraguay
Victor Sosa Honduras CVS
Victor Sosa Brasil Sosa Perícia
Victor Sosa Buenos Aires Millanel Cosmética
Victor Sosa Hartford, Connecticut Pratt & Whitney
Victor Sosa Hawthorne, New Jersey Ohm Labs
Victor Sosa Atibaia, Brasil Uniexame
Victor Sosa Milwaukee La Causa
Victor Sosa Philadelphia FINRA
Victor Sosa Phoenix Choice Hotels International
Victor Sosa Edwards, Colorado
Victor Sosa Lafayette, Louisiana
Victor Sosa San Miguel ITLS

Hay Victor Sosa en Monterrey, en Querétaro, en Paraguay, en São Paulo, hasta en Taipei. Y todos comparten el mismo nombre.

Lo realmente interesante de MCP

Para mí, la parte más interesante no es encontrar a los Victor Sosa.

Eso solamente es el pretexto. 😂

Lo interesante es el cambio de paradigma.

Antes:

Diagrama: flujo tradicional del usuario al desarrollador y la base de datos

Ahora podemos tener:

Diagrama: flujo del usuario al agente, MCP, herramientas y datos

Y el agente decide qué herramienta necesita utilizar.

Eso es justamente una de las ideas fuertes detrás de MCP: permitir que los modelos descubran y utilicen herramientas externas mediante un protocolo estándar (documentación oficial).

¿Y qué pasa con NL2SQL?

Aquí hay otra cosa que me llamó mucho la atención.

Uno podría pensar:

“Entonces la IA genera SQL.”

Pero SQL MCP Server de Microsoft deliberadamente no utiliza NL2SQL como mecanismo principal.

En lugar de pedirle al modelo que genere SQL arbitrario, utiliza la abstracción de entidades de Data API Builder y su Query Builder para producir consultas T-SQL de forma determinista (documentación oficial).

Y eso tiene bastante sentido.

Porque una cosa es:

“Genera un SELECT.”

Y otra:

“Permite que un agente opere sobre datos empresariales.”

Cuando hablamos de producción, la segunda necesita controles.

¿Podríamos hacerlo con un modelo local?

Sí.

Y aquí es donde el experimento se pone todavía más interesante.

SQL MCP Server es compatible con clientes MCP y Microsoft también documenta su utilización con modelos locales mediante herramientas como Ollama (documentación oficial).

Entonces podríamos terminar con algo así:

Diagrama: arquitectura con modelo local Qwen, MCP y SQL Server

Y ahí tenemos un agente capaz de consultar nuestros datos sin enviar esos datos a un modelo externo.

Pero hay una regla

No hagas esto con producción:

Diagrama: IA con usuario SA y acceso a toda la base

😂

La implementación de Microsoft está pensada precisamente para trabajar con entidades, permisos, roles y políticas.

Para un laboratorio:

Diagrama: base de pruebas con entidades seleccionadas, solo lectura y MCP

Mucho mejor.

Y cuando pasemos a producción:

mínimo privilegio, autenticación, separación de ambientes y monitoreo.

SQL MCP Server además incorpora telemetría mediante OpenTelemetry para rastrear las operaciones realizadas a través de MCP (documentación oficial).

Y todo empezó con algo bastante simple

“Buscar datos, juntarlos y empezar a jugar con ellos.”

Quién iba a decir que una búsqueda inocente iba a terminar en un laboratorio de MCP con SQL Server.

Pero terminó mostrando algo mucho más interesante:

un agente de IA puede interactuar con nuestros datos mediante herramientas, sin que tengamos que convertir cada pregunta en una consulta SQL escrita manualmente.

Y eso cambia bastante la forma en que podemos imaginar las aplicaciones empresariales.

Porque quizá el futuro no sea:

“La IA escribe SQL por nosotros.”

Quizá sea:

“La IA utiliza herramientas seguras para trabajar con nuestros sistemas.”

Y ahí es donde MCP empieza a ponerse realmente interesante.

Anterior ¿Qué demonios es un grafo de conocimiento?