{
  "schema_version": "1.0.29",
  "app": {
    "name": "MailSenpai",
    "slug": "mailsenpai",
    "company_name": "Octotech Solutions",
    "legal_entity": "Octotech Solutions / MailSenpai",
    "primary_language": "en",
    "supported_languages": [
      "en",
      "it"
    ],
    "category": "Productivity / Marketing Automation",
    "short_description": "Orchestrate MailSenpai email marketing from ChatGPT and MCP-compatible AI assistants.",
    "long_description": "MailSenpai MCP lets authorized users manage email marketing workflows from AI assistants: lists, fields, segments, subscribers, templates, campaigns, reports and transactional email. Access is controlled by OAuth, consent, customer plans, roles, scopes, operational limits, confirmations, audit logs and rate limits.",
    "logo_url": "https://www.mailsenpai.com/wp-content/uploads/2024/06/MailSenpai-Logo-5-400x182.png",
    "website_url": "https://www.mailsenpai.com",
    "support_email": "supporto@mailsenpai.com",
    "privacy_email": "privacy@mailsenpai.com",
    "support_url": "https://mcp-claude.mailsenpai.com/support",
    "privacy_policy_url": "https://mcp-claude.mailsenpai.com/privacy",
    "terms_of_service_url": "https://mcp-claude.mailsenpai.com/terms",
    "consent_evidence_url": "https://mcp-claude.mailsenpai.com/consent",
    "install_url": "https://mcp-claude.mailsenpai.com/install",
    "rate_limits_url": "https://mcp-claude.mailsenpai.com/rate-limits",
    "mcp_server_url": "https://mcp-claude.mailsenpai.com/mcp",
    "oauth_authorization_server_metadata_url": "https://mcp-claude.mailsenpai.com/.well-known/oauth-authorization-server",
    "oauth_protected_resource_metadata_url": "https://mcp-claude.mailsenpai.com/.well-known/oauth-protected-resource"
  },
  "data_safety": {
    "authentication": "OAuth 2.0 with customer-scoped authorization.",
    "consent": "Marketplace/client-level consent is complemented by MailSenpai OAuth consent evidence recorded as JSON Lines in data/oauth_consents.log.",
    "least_privilege": "Only the scopes and plan limits granted to the MailSenpai customer are exposed to the MCP session.",
    "secrets": "MailSenpai API keys, OAuth secrets, JWT secrets, passwords and internal service secrets are not returned by MCP tools.",
    "high_impact_actions": "Send, delete, tracking, bounce and customer-management operations require explicit permissions and confirmations.",
    "rate_limits": {
      "schema_version": "1.0.27",
      "enforcement": "Per connected AI client session, authenticated MailSenpai user and customer. Limits are applied by tool class before the MCP tool executes.",
      "what_counts": "One MCP tool call counts as one request in the matching class. Pagination, bulk size and recipient count may be additionally constrained by plan limits such as maxPerPage and maxBulkImportRows.",
      "what_does_not_count": "The number of final campaign recipients does not consume MCP calls. Mail delivery throughput is governed separately by MailSenpai sending infrastructure and plan rules.",
      "response": "HTTP 429 with Retry-After, X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset when a limit is exceeded.",
      "defaults": {
        "read": {
          "requests_per_minute": 60,
          "label": "Read/search",
          "it_label": "Lettura/ricerca",
          "purpose": "Browsing existing MailSenpai data without changing it.",
          "it_purpose": "Consultazione di dati MailSenpai esistenti senza modificarli.",
          "examples": [
            "list_lists",
            "get_list",
            "list_campaigns",
            "get_campaign",
            "search_subscriber_by_email"
          ],
          "real_world": "An assistant lists your campaigns, opens one campaign and checks whether a subscriber is already in a list. This normally consumes a few read calls.",
          "it_real_world": "Un assistente elenca le campagne, apre una campagna e verifica se un contatto e' gia' presente in lista. Normalmente consuma poche chiamate di lettura.",
          "customer_effect": "If the limit is reached, the assistant should pause browsing and retry after the Retry-After value. No email sending is affected."
        },
        "report": {
          "requests_per_minute": 30,
          "label": "Reports/statistics",
          "it_label": "Report/statistiche",
          "purpose": "Campaign performance and analytics queries.",
          "it_purpose": "Interrogazioni su performance e statistiche campagne.",
          "examples": [
            "get_campaign_stats",
            "get_campaign_opens",
            "get_campaign_clicks",
            "get_campaign_bounces"
          ],
          "real_world": "A weekly report comparing 10 campaigns can consume 10 report calls plus read calls for campaign metadata.",
          "it_real_world": "Un report settimanale che confronta 10 campagne puo' consumare 10 chiamate report piu' chiamate di lettura per i metadati.",
          "customer_effect": "Report limits protect database-heavy statistics endpoints. Reading lists or subscribers may still be available if their separate read limit is not exhausted."
        },
        "write": {
          "requests_per_minute": 30,
          "label": "General write",
          "it_label": "Scrittura generale",
          "purpose": "Non-sending changes such as contacts, fields, segments and templates.",
          "it_purpose": "Modifiche non legate all'invio, come contatti, campi, segmenti e template.",
          "examples": [
            "create_subscriber",
            "update_subscriber",
            "create_list_segment",
            "update_template"
          ],
          "real_world": "Creating one segment and then adding three test contacts usually consumes four write calls.",
          "it_real_world": "Creare un segmento e poi aggiungere tre contatti test normalmente consuma quattro chiamate di scrittura.",
          "customer_effect": "The operation is rejected with 429 when the plan threshold is reached; already completed writes are not rolled back."
        },
        "campaign": {
          "requests_per_minute": 20,
          "label": "Campaign create/update",
          "it_label": "Creazione/modifica campagne",
          "purpose": "Campaign draft creation and campaign metadata/template changes.",
          "it_purpose": "Creazione bozze campagna e modifiche a metadati/template campagna.",
          "examples": [
            "create_campaign",
            "update_campaign",
            "duplicate_campaign",
            "copy_campaign",
            "pause_unpause_campaign"
          ],
          "real_world": "A campaign workflow can create a template, create a campaign, update targeting and pause/resume it. Those campaign-specific steps consume campaign calls.",
          "it_real_world": "Un flusso campagna puo' creare un template, creare una campagna, aggiornare il targeting e sospenderla/riattivarla. Questi passaggi consumano chiamate campagna.",
          "customer_effect": "This separates campaign orchestration from ordinary writes, so marketing plans can allow contact edits while limiting campaign automation."
        },
        "bulk": {
          "requests_per_minute": 6,
          "label": "Bulk/import/export",
          "it_label": "Bulk/import/export",
          "purpose": "Large operations that process many records in one request.",
          "it_purpose": "Operazioni grandi che processano molti record in una sola richiesta.",
          "examples": [
            "bulk_create_subscribers",
            "bulk_update_subscribers",
            "export_campaign_report"
          ],
          "real_world": "Importing 500 subscribers in one allowed bulk request also remains subject to maxBulkImportRows, for example 500 or 1000 rows per request depending on plan.",
          "it_real_world": "Importare 500 iscritti in una richiesta bulk consentita resta soggetto anche a maxBulkImportRows, ad esempio 500 o 1000 righe per richiesta in base al piano.",
          "customer_effect": "Bulk limits are intentionally lower because each call can affect many subscribers and database rows."
        },
        "send": {
          "requests_per_minute": 10,
          "requests_per_hour": 60,
          "label": "Send/schedule",
          "it_label": "Invio/schedulazione",
          "purpose": "Operations that can place campaigns or transactional emails into a send path.",
          "it_purpose": "Operazioni che possono portare campagne o email transazionali verso l'invio.",
          "examples": [
            "create_scheduled_campaign",
            "schedule_campaign_send",
            "send_transactional_email"
          ],
          "real_world": "Scheduling three campaigns consumes three send calls and also counts against the hourly send/schedule ceiling.",
          "it_real_world": "Schedulare tre campagne consuma tre chiamate di invio e conta anche nel limite orario di invio/schedulazione.",
          "customer_effect": "This is independent from MailSenpai delivery throughput. It limits AI-triggered scheduling requests, not the number of recipients processed by the MailSenpai sending engine."
        },
        "destructive": {
          "requests_per_minute": 6,
          "label": "Delete/destructive",
          "it_label": "Eliminazione/distruttive",
          "purpose": "Deletes and other high-impact data removal actions.",
          "it_purpose": "Cancellazioni e altre azioni ad alto impatto sui dati.",
          "examples": [
            "delete_campaign",
            "delete_subscriber",
            "delete_template",
            "blacklist_subscriber"
          ],
          "real_world": "Deleting five obsolete test campaigns consumes five destructive calls and also requires confirm_delete=true.",
          "it_real_world": "Eliminare cinque campagne test obsolete consuma cinque chiamate distruttive e richiede anche confirm_delete=true.",
          "customer_effect": "Destructive actions remain protected by explicit confirmation and plan permissions even when rate-limit capacity is available."
        },
        "admin": {
          "requests_per_minute": 3,
          "label": "Admin/customer management",
          "it_label": "Admin/gestione customer",
          "purpose": "Rare administrative operations, normally disabled for ordinary customer plans.",
          "it_purpose": "Operazioni amministrative rare, normalmente disabilitate per i piani cliente ordinari.",
          "examples": [
            "create_customer"
          ],
          "real_world": "An internal operator creating demo customers for review consumes admin calls and requires canManageCustomers.",
          "it_real_world": "Un operatore interno che crea customer demo per review consuma chiamate admin e richiede canManageCustomers.",
          "customer_effect": "This category should normally be enabled only for internal or agency-supervised accounts."
        },
        "burst": {
          "requests_per_second": 3,
          "label": "Burst ceiling",
          "it_label": "Limite burst",
          "purpose": "Short-term anti-spike protection applied before category-specific limits.",
          "it_purpose": "Protezione anti-picco a brevissimo termine applicata prima dei limiti per categoria.",
          "examples": [
            "any rapid sequence of MCP calls"
          ],
          "real_world": "If an AI client retries too aggressively, the burst ceiling stops the spike and asks it to wait a few seconds.",
          "it_real_world": "Se un client AI ritenta troppo velocemente, il limite burst ferma il picco e chiede di attendere alcuni secondi.",
          "customer_effect": "Burst limiting protects stability and does not change plan permissions."
        }
      },
      "plan_override_limit_keys": {
        "read": "rateLimitReadPerMinute",
        "report": "rateLimitReportPerMinute",
        "write": "rateLimitWritePerMinute",
        "campaign": "rateLimitCampaignPerMinute",
        "bulk": "rateLimitBulkPerMinute",
        "send": "rateLimitSendPerMinute",
        "sendHour": "rateLimitSendPerHour",
        "destructive": "rateLimitDeletePerMinute",
        "admin": "rateLimitAdminPerMinute",
        "burst": "rateLimitBurstPerSecond"
      },
      "practical_examples": [
        {
          "title": "Weekly performance summary",
          "calls": [
            "list_campaigns",
            "get_campaign_stats x 10"
          ],
          "consumed_classes": {
            "read": 1,
            "report": 10
          },
          "explanation": "The assistant first finds campaigns, then reads statistics for each selected campaign."
        },
        {
          "title": "Create a test segment and import contacts",
          "calls": [
            "create_list_segment",
            "bulk_create_subscribers"
          ],
          "consumed_classes": {
            "write": 1,
            "bulk": 1
          },
          "explanation": "The bulk request is additionally limited by maxBulkImportRows."
        },
        {
          "title": "Create and schedule one campaign",
          "calls": [
            "create_template",
            "create_campaign",
            "schedule_campaign_send"
          ],
          "consumed_classes": {
            "write": 1,
            "campaign": 1,
            "send": 1
          },
          "explanation": "Sending/scheduling still requires confirm_send and respects requiresApprovalForSend."
        },
        {
          "title": "Clean up old test assets",
          "calls": [
            "delete_campaign x 3",
            "delete_template x 2"
          ],
          "consumed_classes": {
            "destructive": 5
          },
          "explanation": "Destructive calls require confirm_delete and canDelete, even when rate-limit capacity is available."
        }
      ]
    }
  },
  "support": {
    "user_support_email": "supporto@mailsenpai.com",
    "privacy_email": "privacy@mailsenpai.com",
    "security_email": "supporto@mailsenpai.com"
  },
  "legal": {
    "last_updated": "2026-05-13",
    "terms_url": "https://mcp-claude.mailsenpai.com/terms",
    "privacy_url": "https://mcp-claude.mailsenpai.com/privacy",
    "gdpr_contact": "privacy@mailsenpai.com"
  }
}