Saltar al contenido principal

Integration SDK

Fyso soporta integraciones de terceros que extienden la plataforma con acciones personalizadas, herramientas y almacenamiento de datos.

Descripcion general

Una integracion es un paquete con:

  • Un manifiesto (fyso-integration.json) que describe la integracion
  • Handlers de herramientas que ejecutan acciones
  • Migraciones SQL para tablas especificas de la integracion (con prefijo automatico)
  • Un esquema de configuracion que define las credenciales requeridas

Manifiesto

{
"slug": "discord",
"name": "Discord Webhooks",
"version": "1.0.0",
"description": "Send messages and embeds to Discord channels",
"configSchema": {
"type": "object",
"properties": {
"webhook_url": {
"type": "string",
"pattern": "^https://discord\\.com/api/webhooks/",
"description": "Discord webhook URL"
}
},
"required": ["webhook_url"]
},
"tools": [
{
"slug": "send-message",
"name": "Send Message",
"description": "Send a text message to a Discord channel",
"handler": "tools/send-message.ts",
"inputSchema": {
"type": "object",
"properties": {
"content": { "type": "string", "maxLength": 2000 }
},
"required": ["content"]
}
}
]
}

La validacion del manifiesto exige: patron de slug valido, version semver, JSON Schema valido para la configuracion e inputs, y los archivos de handlers deben existir.

Escribir un handler de herramienta

import { defineAction, IntegrationContext } from '@fyso/integrations-sdk';

export default defineAction(async (ctx: IntegrationContext, input: { content: string }) => {
const config = await ctx.getConfig();

const res = await fetch(config.webhook_url + '?wait=true', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ content: input.content }),
});

if (!res.ok) {
throw new IntegrationError('Discord API error', { statusCode: res.status, retryable: res.status === 429 });
}

return { success: true, messageId: (await res.json()).id };
});

defineAction envuelve su handler con logging estructurado y un limite de errores.

Ciclo de vida

Las integraciones pasan por estos estados:

registered → installed → active ↔ deactivated → uninstalled
EstadoDescripcion
registeredManifiesto validado, disponible en el catalogo
installedMigraciones ejecutadas, configuracion almacenada (encriptada)
activeHerramientas disponibles para agentes y reglas
deactivatedHerramientas deshabilitadas, configuracion preservada
uninstalledConfiguracion y datos eliminados

Herramientas MCP

HerramientaDescripcion
list_integrationsListar integraciones disponibles y su estado
install_integrationInstalar y configurar una integracion
configure_integrationActualizar la configuracion de una integracion
activate_integrationHabilitar las herramientas de una integracion
test_integrationProbar la conectividad de una integracion
uninstall_integrationEliminar una integracion
list_integration_logsVer los logs de salud de una integracion

Almacen de credenciales

Los campos con format: "secret" en el esquema de configuracion se encriptan con AES-256-GCM antes de almacenarse. Las credenciales se guardan en tenant_registry.integration_installations, fuera de los esquemas del tenant.

El aislamiento entre tenants se aplica de forma estricta — todas las consultas estan delimitadas por (tenant_id, integration_slug).

Herramientas de integracion en agentes

Las integraciones activas inyectan sus herramientas en el ejecutor del agente como integration:<slug>:<tool-slug>. Por ejemplo, cuando la integracion de Discord esta activa, los agentes pueden llamar a integration:discord:send-message.

Circuit breaker

El runtime rastrea fallos consecutivos. Despues de 10 fallos consecutivos, la integracion se desactiva automaticamente. Una ejecucion exitosa reinicia el contador.

Pruebas

El SDK incluye una bateria de pruebas de 3 niveles:

NivelEnfoqueVerificaciones
EstructuralValidez del manifiestoArchivos existen, handlers exportan, sin imports prohibidos
FuncionalComportamiento de herramientasFormas de respuesta exitosa/error, guarda de timeout de 5s
SeguridadAislamientoSin SQL directo, sin SET search_path, sin configuracion entre integraciones
bun run test:integration packages/integrations/discord

Incluida: Discord

La integracion de webhooks de Discord viene incluida con Fyso:

Herramientas:

  • send-message — Enviar un mensaje de texto (maximo 2000 caracteres, manejo de rate limit 429)
  • send-embed — Enviar un embed enriquecido (titulo, descripcion, color, campos, pie de pagina, marca de tiempo)

Configuracion: Requiere una URL de webhook de Discord.