IR
irwinrodriguez.dev
Volver a documentación

Primeros pasos

Antes de esto necesitas FoxAgent instalado (Instalación). Al terminar tendrás tu aplicación VFP en marcha y un agente capaz de mirar dentro de ella.

Paso 1: comprobar que el Broker está corriendo

El instalador dejó el Broker como servicio de Windows con arranque automático. Para comprobarlo:

Comprobar que el servicio del Broker está corriendo
# En PowerShell o CMD:
sc query FoxAgentBroker

# Debería decir: STATE: 4 RUNNING

Si el servicio no está corriendo, arráncalo desde la consola de servicios de Windows (services.msc) o con este comando:

Arrancar el servicio del Broker a mano
# Arrancar el servicio a mano:
net start FoxAgentBroker

Paso 2: conectar tu aplicación VFP

La integración son tres puntos de inyección: registrar la aplicación al arrancar, registrar tus herramientas justo después, y desconectar al salir. El tercero es el que se olvida, y el coste no lo pagas tú: lo paga tu cliente.

Conectar la aplicación al arrancar y desconectarla al salir
* --- 1. Al arrancar, con _VFP ya disponible y ANTES de READ EVENTS ---
PUBLIC goBridge
goBridge = CREATEOBJECT("FoxAgent.Bridge")

* Obligatorio antes de Connect: es lo que permite mirar dentro.
goBridge.SetInstance(_VFP)

* Connect(id, nombre, peldaño) devuelve una CADENA JSON, no un lógico.
* El 10 (operator) es el peldaño de un usuario de negocio: el agente
* llega exactamente hasta donde llega esa persona a mano, porque todo
* pasa por tus formularios y sus validaciones.
LOCAL lcRes
lcRes = goBridge.Connect("mi-app-001", "Mi Aplicación VFP", 10)
IF !('"ok":true' $ lcRes)
    * Si el Broker está parado o no hay asiento libre, tu aplicación
    * tiene que seguir funcionando: FoxAgent es un accesorio, no una
    * dependencia. Anótalo y sigue.
    goBridge = .NULL.
ENDIF

* El Bridge manda heartbeats solo, cada 15 segundos. No llames a
* Heartbeat() a mano.

* --- 3. Al salir, en tu rutina de cierre o en ON SHUTDOWN ---
IF VARTYPE(goBridge) = "O" AND !ISNULL(goBridge)
    TRY
        goBridge.Disconnect("mi-app-001")
    CATCH
        * Un fallo aquí nunca puede impedir que la aplicación cierre.
    ENDTRY
    goBridge = .NULL.
ENDIF
Disconnect() no es opcional Una aplicación que no desconecta deja un hilo de FoxAgent vivo mientras VFP se desmonta, y al usuario le puede salir «Mismatched pushjmp/popjmp call» al cerrar el programa. Además retiene el asiento de la licencia hasta que caduca, así que volver a abrir enseguida puede rechazarse con «instance limit reached». Está medido en campo, con y sin la llamada, sobre la misma aplicación y el mismo día. El ejemplo completo, con los tres puntos comentados, viene en SDK\quickstart.prg.

Paso 3: registrar tus herramientas (UDTs)

Una llamada a RegisterTool() por herramienta, inmediatamente después de un Connect correcto. Nada se lee del disco, y eso es el modelo de seguridad, no una limitación: el agente solo puede ejecutar lo que tú escribiste, revisaste y compilaste.

Cargar el SDK y registrar tus herramientas
* Las dos clases base del SDK, antes del primer CREATEOBJECT de una
* tool. Son DOS ficheros: FoxAgentTool hereda de FoxToolIsolated, que
* vive en FoxTool.prg. Si falta, sale
* "Class definition FOXTOOLISOLATED is not found".
SET PROCEDURE TO "C:\Program Files\FoxAgent\SDK\FoxTool.prg"      ADDITIVE
SET PROCEDURE TO "C:\Program Files\FoxAgent\SDK\FoxAgentTool.prg" ADDITIVE
SET PROCEDURE TO "MisTools.prg" ADDITIVE

* Una llamada por herramienta, después de Connect.
goBridge.RegisterTool(CREATEOBJECT("BuscarClienteTool"))
goBridge.RegisterTool(CREATEOBJECT("SaldoClienteTool"))

Cómo se escribe una de esas clases está en Configuración. Cuando cambia el usuario que ha iniciado sesión puedes rehacer la lista con ClearTools() y UnregisterTool(nombre): las herramientas que existen las decide tu aplicación, por usuario.

Paso 4: conectar tu cliente de IA

El instalador configura Claude Desktop y OpenCode si los encuentra. Para cualquier otro cliente deja el bloque ya montado, con la ruta real puesta, en C:\Program Files\FoxAgent\mcp-foxagent.json. Es este:

Bloque MCP de FoxAgent (mcp-foxagent.json)
{
  "mcpServers": {
    "foxagent": {
      "command": "C:\\Program Files\\FoxAgent\\FoxAgent.McpHost.exe",
      "args": []
    }
  }
}
ClienteDónde se pega
Claude Desktopclaude_desktop_config.json (Configuración ▸ Desarrollador ▸ Editar config)
Claude Codeclaude mcp add foxagent -- "C:\Program Files\FoxAgent\FoxAgent.McpHost.exe"
Cursor%USERPROFILE%\.cursor\mcp.json
OpenCode%USERPROFILE%\.config\opencode\opencode.jsonc (otro formato: mira su documentación)
Usa la ruta tal cual No la acortes a nombre 8.3. En esa carpeta hay dos ejecutables de FoxAgent que colisionan en 8.3, y el sufijo ~1 / ~2 lo reparte el orden de creación: una reinstalación puede dejar a tu cliente arrancando el Broker, que no habla MCP, y se queda colgado sin decir por qué. Los espacios no son problema mientras dupliques cada barra invertida. Reinicia el cliente después de editar la configuración.

Paso 5: preguntar

Con el Broker en marcha, tu aplicación conectada y el cliente MCP configurado, el orden de arranque importa: Broker → tu aplicación → el cliente de IA. Prueba a preguntar:

  • «Lista las instancias VFP conectadas»
  • «¿Qué formularios hay abiertos en mi-app-001?»
  • «Toma una captura de la aplicación»
  • «¿Qué herramientas propias tiene registradas esa instancia?»
  • «Busca el cliente 1042 con la herramienta buscar_cliente»

Las dos últimas funcionan desde el peldaño 0. Leer variables y cursores pide el 20, y VFP crudo el 90: si el agente contesta que no puede, la negativa nombra el peldaño que falta y quién puso el techo. Los peldaños están explicados en Configuración.

Siguientes pasos