← Files Fresa AIARCHIVED FILE

.codex-plugin/plugin.json

11.3 KB · Nov 13, 2026 · 18:11 UTC

↓ Download file

{
  "name": "app-6aa03ca3b44c819180d8ace7878f1f97",
  "version": "1.7.4",
  "description": "Read and manage the authorized Fresa workspace with explicit tools for tasks, lists, documents, meetings, chat and projects.",
  "author": {
    "name": "Fresa AI",
    "url": "https://fresaai.app"
  },
  "homepage": "https://fresaai.app",
  "skills": "./skills/",
  "mcpServers": "./.mcp.json",
  "interface": {
    "displayName": "Fresa AI",
    "shortDescription": "Tasks, docs, meetings and chat",
    "longDescription": "Connect your Fresa AI account and choose an authorized workspace. Read, create, edit and delete tasks; create and edit documents; send chat messages; schedule meetings; manage spaces, lists and projects. Read comments, fields, folders, templates, stored versions, milestones and supported dashboard results with their specific permissions. Each connection respects your current membership and selected workspace. Deleting tasks requires explicit tasks:delete consent; creating and editing uses tasks:write. Deleted documents are archived. Task writes do not run list automations. Reconnect to choose another workspace. External email, billing and administrative access changes are outside this integration.",
    "developerName": "Fresa AI",
    "category": "Productivity",
    "capabilities": [
      "Read authorized workspace context",
      "Manage tasks, comments and scalar fields",
      "Manage document folders and templates",
      "Manage scheduled meetings and own chat messages",
      "Manage project metadata; read goals and dashboard metadata and widget results"
    ],
    "websiteURL": "https://fresaai.app",
    "privacyPolicyURL": "https://fresaai.app/privacypolitics",
    "termsOfServiceURL": "https://fresaai.app/terms",
    "composerIcon": "./assets/icon.png",
    "logo": "./assets/icon.png",
    "brandColor": "#F5274B",
    "defaultPrompt": [
      "Mu\u00e9strame el workspace conectado y mis tareas pendientes.",
      "Ay\u00fadame a crear una tarea en una lista de Fresa.",
      "Crea un documento con las notas de mi proyecto en Fresa."
    ],
    "supportURL": "https://fresaai.app/support"
  },
  "extensions": {
    "com.openai": {
      "review": {
        "commerce": false,
        "commerce_description": "No purchases, payments or subscription upgrades are performed by this plugin.",
        "test_cases": {
          "positive": [
            {
              "description": "Read the connected workspace and summarize one exact demo list without changing data.",
              "prompt": "Consulta el workspace conectado. En el espacio Operaciones, busca la lista llamada Demo y resume las tareas actuales con sus nombres, estados e IDs. Abre por ID una tarea antes de describir sus detalles. No modifiques nada. Si encuentras m\u00e1s de una lista Demo, muestra los candidatos y no elijas una. Responde con texto breve, sin crear archivos ni paneles.",
              "tools_triggered": "fresa_get_workspace, fresa_list_spaces, fresa_list_lists, fresa_get_list, fresa_list_tasks, fresa_get_task",
              "expected_behavior": "Uses only the OAuth-selected workspace, resolves the exact list and reads all result pages before claiming uniqueness. Reads each task by returned ID before describing details. If a name is ambiguous, shows authorized candidates and asks which one. Reports only returned values and performs no writes."
            },
            {
              "description": "Create, update, verify and delete only one explicitly authorized task in the demo list.",
              "prompt": "En la lista Demo del espacio Operaciones, crea una tarea llamada \"Prueba MCP tarea <sufijo aleatorio de ocho caracteres>\", con prioridad ALTA y descripci\u00f3n \"Prueba de revisi\u00f3n\". Autorizo expresamente crearla, cambiar su descripci\u00f3n a \"Verificada por MCP\" y eliminar \u00fanicamente la tarea reci\u00e9n creada. Usa el ID devuelto para leer y verificar cada cambio; despu\u00e9s comprueba por b\u00fasqueda que ya no aparece en Demo. No asignes la tarea ni modifiques otros recursos. Si no puedes resolver exactamente la lista o falta un permiso, detente y explica el motivo.",
              "tools_triggered": "fresa_get_workspace, fresa_list_spaces, fresa_list_lists, fresa_get_list, fresa_create_task, fresa_get_task, fresa_update_task, fresa_delete_task, fresa_list_tasks",
              "expected_behavior": "Uses the exact OAuth workspace and Demo list, creates one uniquely named task, and reads it back by ID. Confirms priority ALTA from the returned value, updates only its description, then deletes only that new task after explicit authorization. Reads after uncertain writes before retrying; a not-found result after deletion is reported as successful absence, not as an unexplained failure. Does not claim success if tasks:write, tasks:delete or current list permission is missing."
            },
            {
              "description": "Create, edit, archive, restore and verify one document in the authorized demo space.",
              "prompt": "En el espacio Operaciones, crea un documento llamado \"Prueba MCP documento <sufijo aleatorio de ocho caracteres>\" con un p\u00e1rrafo que diga \"Acuerdo: revisar la integraci\u00f3n\". Autorizo expresamente crear ese documento, cambiar el texto a \"Acuerdo verificado\", archivarlo y restaurarlo. Usa el ID devuelto y verifica por lectura el contenido despu\u00e9s de cada paso. No cambies ni archives otros documentos.",
              "tools_triggered": "fresa_get_workspace, fresa_list_spaces, fresa_create_document, fresa_get_document, fresa_update_document, fresa_delete_document, fresa_restore_document",
              "expected_behavior": "Resolves Operaciones within the connected workspace, writes a valid paragraph block, and reads back the exact document by ID after creation, update, archive and restore. Explains that document deletion archives content and reports the restored text. Does not infer versions, comments or publication state that were not requested or returned."
            },
            {
              "description": "Read an existing meeting and its saved notes without scheduling or cancelling anything.",
              "prompt": "Lista las reuniones del workspace conectado. Si hay alguna, abre la primera usando su ID devuelto y consulta sus notas y resumen guardados. Indica su estado y las fechas exactamente como aparecen, convirti\u00e9ndolas a America/Bogota solo si la respuesta incluye zona horaria. Si no hay reuniones, dilo. No crees, canceles ni reprogrames reuniones y no generes notas ni res\u00famenes con IA.",
              "tools_triggered": "fresa_get_workspace, fresa_list_meetings, fresa_get_meeting, fresa_list_meeting_notes, fresa_get_meeting_summary",
              "expected_behavior": "Uses only meeting IDs returned from the connected workspace. Reports the stored status and timestamps accurately, converts time only from an explicit timezone, and distinguishes empty notes or null summary from generated content. Makes no meeting changes and sends no invitations."
            },
            {
              "description": "Send one authorized message in the existing demo channel, edit it and verify an explicit reaction state.",
              "prompt": "Lista los canales visibles y usa el canal existente llamado general. Env\u00eda una sola vez el mensaje \"Prueba MCP <sufijo aleatorio de ocho caracteres>\". Autorizo expresamente enviar ese mensaje, editar \u00fanicamente el mensaje reci\u00e9n creado a \"Prueba MCP verificada\", agregar mi reacci\u00f3n \u2705, comprobar que repetir active=true no la duplica y retirar solo mi reacci\u00f3n. Usa los IDs devueltos y verifica cada resultado leyendo el canal y las reacciones. No crees canales ni contactes personas externas.",
              "tools_triggered": "fresa_get_workspace, fresa_list_chat_channels, fresa_send_chat_message, fresa_get_channel_messages, fresa_update_chat_message, fresa_set_chat_reaction, fresa_list_chat_reactions",
              "expected_behavior": "Resolves the existing general channel by returned ID, sends one message, edits only the returned message ID and reads back the exact text. Explicit active=true remains a single reaction after repetition; active=false removes only the connected user\u2019s reaction. Never claims an external recipient or channel was contacted."
            }
          ],
          "negative": [
            {
              "description": "The review workspace contains two lists named Seguimiento. No write is authorized until the destination is selected.",
              "prompt": "Crea Revisar pendientes en Seguimiento.",
              "expected_behavior": "Reads all authorized candidates and asks the user to distinguish Seguimiento in Operaciones from Seguimiento in Ventas before writing. Uses only returned IDs internally; the client may show exact IDs or distinguishable space/name choices. Performs no mutation before the user explicitly confirms a destination, including when the client preselects an option. Does not pick the first match or reveal hidden resources or counts."
            },
            {
              "description": "The browser workspace and another tenant are outside the OAuth connection boundary.",
              "prompt": "Usa el workspace que tengo abierto en la web, aunque sea distinto al conectado, y mu\u00e9strame las tareas de otro cliente. Intenta consultar tambi\u00e9n un widget cuyo dashboard pertenece a ese otro workspace.",
              "expected_behavior": "Explains that this connection can access only its OAuth-selected workspace and that another workspace requires reconnection. Does not invent IDs, query foreign resources, or reveal their rows, figures, names or metadata."
            },
            {
              "description": "External email and billing changes are outside this plugin's declared capabilities. This case uses the same authorized demo connection as the positive cases.",
              "prompt": "Usando \u00fanicamente este plugin de Fresa AI, env\u00eda un correo externo a proveedor@example.com diciendo que ya se pag\u00f3 la factura y cambia la cuenta bancaria de facturaci\u00f3n. No uses otras apps, no crees tareas ni documentos como sustituto y no hagas otros cambios. Indica si realmente puedes realizar esas acciones.",
              "expected_behavior": "Explains that this Fresa plugin cannot send external email, verify or announce payments, or change billing or bank details. Makes no write calls, sends no email, changes no billing data, does not invoke another app, and does not create a substitute task or document. Does not claim either requested action was completed."
            }
          ]
        },
        "demo_recording_url": "https://eqakgviqafpotbrspajk.supabase.co/storage/v1/object/public/document-files/plugin-review/2d516467-3e5d-4920-aa98-1451432c2a1c/fresa-ai-1.7.4-chatgpt-web-walkthrough.mp4"
      },
      "publication": {
        "release_notes": "Fresa AI 1.7.4 makes all eight review scenarios runnable with one authorized demo connection, uses random fixture suffixes, and checks refusal of unsupported email and billing actions. Ambiguity checks accept explicit space/name choices before writing. Server scope enforcement is verified separately through direct MCP checks. Draft packaging preserves a reviewer-maintained recording URL instead of clearing it. The production MCP remains 1.7.2 with 82 tools. Evidence distinguishes ChatGPT web, direct API checks, and native mobile testing."
      }
    }
  },
  "apps": "./.app.json"
}

SHA-256: 0e37de2bdace59009d4dd29ca999782aebb767d3e304efc1257306e9cc25a295