AXA Capabilities

Naftiko 0.5 capability definitions for AXA - 100 capabilities showing integration workflows and service orchestrations.

Sort
Expand

Runs IBNR model in Snowflake and publishes results to Power BI.

naftiko: "0.5"
info:
  label: "Actuarial IBNR Reserve Estimation"
  description: "Runs IBNR model in Snowflake and publishes results to Power BI."
  tags:
    - insurance
    - actuarial
    - claims
    - snowflake
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: ibnr-ops
      port: 8080
      tools:
        - name: estimate-ibnr
          description: "Estimate IBNR reserves."
          inputParameters:
            - name: lob
              in: body
              type: string
              description: "LOB."
            - name: year
              in: body
              type: integer
              description: "Accident year."
          steps:
            - name: model
              type: call
              call: "snowflake.query"
              with:
                query: "CALL ESTIMATE_IBNR('{{lob}}',{{year}})"
            - name: refresh
              type: call
              call: "powerbi.refresh"
              with:
                group_id: "$secrets.pbi_actuarial"
                dataset_id: "$secrets.pbi_ibnr"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://axa.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: query
              method: POST
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/groups/{{group_id}}/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: group_id
              in: path
            - name: dataset_id
              in: path
          operations:
            - name: refresh
              method: POST

Queries Snowflake for loss and premium data and refreshes Power BI dashboard.

naftiko: "0.5"
info:
  label: "Actuarial Loss Ratio Dashboard Sync"
  description: "Queries Snowflake for loss and premium data and refreshes Power BI dashboard."
  tags:
    - insurance
    - actuarial
    - snowflake
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: lossratio-ops
      port: 8080
      tools:
        - name: sync-ratios
          description: "Sync loss ratios."
          inputParameters:
            - name: lob
              in: body
              type: string
              description: "LOB."
            - name: period
              in: body
              type: string
              description: "YYYY-MM."
          steps:
            - name: query
              type: call
              call: "snowflake.query"
              with:
                query: "SELECT SUM(loss),SUM(premium) FROM LOSS_TRIANGLE WHERE lob='{{lob}}'"
            - name: refresh
              type: call
              call: "powerbi.refresh"
              with:
                group_id: "$secrets.pbi_actuarial"
                dataset_id: "$secrets.pbi_lossratio"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://axa.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: query
              method: POST
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/groups/{{group_id}}/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: group_id
              in: path
            - name: dataset_id
              in: path
          operations:
            - name: refresh
              method: POST

Retrieves mortality rate data for age, gender, and table version for life insurance pricing.

naftiko: "0.5"
info:
  label: "Actuarial Mortality Table Lookup"
  description: "Retrieves mortality rate data for age, gender, and table version for life insurance pricing."
  tags:
    - insurance
    - actuarial
    - life
capability:
  exposes:
    - type: mcp
      namespace: mortality-ops
      port: 8080
      tools:
        - name: get-rate
          description: "Look up mortality rate. Returns rate and expectancy."
          inputParameters:
            - name: age
              in: body
              type: integer
              description: "Insured age."
            - name: gender
              in: body
              type: string
              description: "Gender."
            - name: table
              in: body
              type: string
              description: "Table version."
          call: "actuarial-api.get-rate"
          with:
            age: "{{age}}"
            gender: "{{gender}}"
            table: "{{table}}"
          outputParameters:
            - name: rate
              type: number
              mapping: "$.annualMortalityRate"
            - name: expectancy
              type: number
              mapping: "$.lifeExpectancy"
  consumes:
    - type: http
      namespace: actuarial-api
      baseUri: "https://api.axa.com/actuarial/v1"
      authentication:
        type: bearer
        token: "$secrets.actuarial_api_token"
      resources:
        - name: mortality
          path: "/mortality-tables/{{table}}/rates"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: get-rate
              method: GET

Triggers quarterly reserve calculations in Snowflake, validates results, and publishes to Power BI.

naftiko: "0.5"
info:
  label: "Actuarial Reserve Calculation Trigger"
  description: "Triggers quarterly reserve calculations in Snowflake, validates results, and publishes to Power BI."
  tags:
    - insurance
    - actuarial
    - snowflake
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: reserve-ops
      port: 8080
      tools:
        - name: run-reserves
          description: "Run quarterly reserves. Executes and refreshes dashboard."
          inputParameters:
            - name: lob
              in: body
              type: string
              description: "LOB."
            - name: quarter
              in: body
              type: string
              description: "YYYY-Q."
          steps:
            - name: calc
              type: call
              call: "snowflake.query"
              with:
                query: "CALL CALCULATE_RESERVES('{{lob}}','{{quarter}}')"
            - name: validate
              type: call
              call: "snowflake.query"
              with:
                query: "SELECT * FROM RESERVE_VALIDATION WHERE lob='{{lob}}'"
            - name: refresh
              type: call
              call: "powerbi.refresh"
              with:
                group_id: "$secrets.pbi_group"
                dataset_id: "$secrets.pbi_reserves"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://axa.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: query
              method: POST
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/groups/{{group_id}}/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: group_id
              in: path
            - name: dataset_id
              in: path
          operations:
            - name: refresh
              method: POST

Retrieves active insurance licenses for an agent including states, authority, and expirations.

naftiko: "0.5"
info:
  label: "Agent License Status Lookup"
  description: "Retrieves active insurance licenses for an agent including states, authority, and expirations."
  tags:
    - insurance
    - compliance
    - agent
capability:
  exposes:
    - type: mcp
      namespace: license-ops
      port: 8080
      tools:
        - name: get-licenses
          description: "Look up agent licenses. Returns states, authority, expirations."
          inputParameters:
            - name: agent_id
              in: body
              type: string
              description: "Agent identifier."
          call: "compliance-api.get-licenses"
          with:
            agent_id: "{{agent_id}}"
          outputParameters:
            - name: licenses
              type: array
              mapping: "$.licenses"
            - name: next_expiry
              type: string
              mapping: "$.nearestExpiration"
            - name: count
              type: integer
              mapping: "$.activeCount"
  consumes:
    - type: http
      namespace: compliance-api
      baseUri: "https://api.axa.com/compliance/v1"
      authentication:
        type: bearer
        token: "$secrets.compliance_api_token"
      resources:
        - name: licenses
          path: "/agents/{{agent_id}}/licenses"
          inputParameters:
            - name: agent_id
              in: path
          operations:
            - name: get-licenses
              method: GET

Given a SharePoint document URL containing an insurance policy or claim document, retrieves the content and generates a concise executive summary using OpenAI, returning it for agent or advisor consumption.

naftiko: "0.5"
info:
  label: "AI-Assisted Insurance Document Summarization"
  description: "Given a SharePoint document URL containing an insurance policy or claim document, retrieves the content and generates a concise executive summary using OpenAI, returning it for agent or advisor consumption."
  tags:
    - ai
    - openai
    - sharepoint
    - document-processing
    - insurance
    - automation
capability:
  exposes:
    - type: mcp
      namespace: doc-ai
      port: 8080
      tools:
        - name: summarize-insurance-document
          description: "Given a SharePoint document site ID and item ID, retrieve the document content and generate a structured summary using OpenAI GPT-4o. Returns a 5-point executive summary suitable for advisors."
          inputParameters:
            - name: site_id
              in: body
              type: string
              description: "The SharePoint site ID where the document is stored."
            - name: item_id
              in: body
              type: string
              description: "The SharePoint drive item ID for the document to summarize."
            - name: document_type
              in: body
              type: string
              description: "The type of document: 'policy', 'claim', 'endorsement', or 'report'."
          steps:
            - name: get-document
              type: call
              call: "sharepoint.get-document-content"
              with:
                site_id: "{{site_id}}"
                item_id: "{{item_id}}"
            - name: generate-summary
              type: call
              call: "openai.create-chat-completion"
              with:
                model: "gpt-4o"
                system_prompt: "You are an expert insurance document analyst. Summarize the following {{document_type}} document in 5 bullet points, highlighting key terms, coverage limits, exclusions, and dates."
                user_message: "{{get-document.content}}"
  consumes:
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: document-content
          path: "/sites/{{site_id}}/drive/items/{{item_id}}/content"
          inputParameters:
            - name: site_id
              in: path
            - name: item_id
              in: path
          operations:
            - name: get-document-content
              method: GET
    - type: http
      namespace: openai
      baseUri: "https://api.openai.com/v1"
      authentication:
        type: bearer
        token: "$secrets.openai_api_key"
      resources:
        - name: chat-completions
          path: "/chat/completions"
          operations:
            - name: create-chat-completion
              method: POST

Initiates the annual performance review cycle in Workday for a given department, notifies managers via Microsoft Teams, and creates tracking tasks in ServiceNow.

naftiko: "0.5"
info:
  label: "Annual Performance Review Cycle Trigger"
  description: "Initiates the annual performance review cycle in Workday for a given department, notifies managers via Microsoft Teams, and creates tracking tasks in ServiceNow."
  tags:
    - hr
    - performance
    - workday
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-performance
      port: 8080
      tools:
        - name: trigger-performance-review-cycle
          description: "Given a department ID and review cycle year, initiate the Workday performance review process, create ServiceNow tracking tasks for each manager, and notify managers via Teams."
          inputParameters:
            - name: department_id
              in: body
              type: string
              description: "The Workday department ID for the review cycle."
            - name: review_year
              in: body
              type: string
              description: "The performance review year, e.g. '2026'."
          steps:
            - name: initiate-review
              type: call
              call: "workday.initiate-performance-review"
              with:
                department_id: "{{department_id}}"
                review_period: "{{review_year}}"
            - name: create-tracking-task
              type: call
              call: "servicenow.create-task"
              with:
                short_description: "Performance review cycle {{review_year}} — {{department_id}}"
                assignment_group: "HR_Operations"
                due_date: "{{initiate-review.deadline}}"
            - name: notify-managers
              type: call
              call: "msteams.post-channel-message"
              with:
                channel: "hr-announcements"
                message: "Performance review cycle {{review_year}} started for department {{department_id}}. Deadline: {{initiate-review.deadline}}."
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: performance-reviews
          path: "/axa/performanceReviews"
          operations:
            - name: initiate-performance-review
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://axa.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: create-task
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Monitors Datadog latency, creates PagerDuty incident, and alerts engineering.

naftiko: "0.5"
info:
  label: "API Latency Alert Workflow"
  description: "Monitors Datadog latency, creates PagerDuty incident, and alerts engineering."
  tags:
    - engineering
    - datadog
    - pagerduty
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: latency-ops
      port: 8080
      tools:
        - name: check-latency
          description: "Check API latency."
          inputParameters:
            - name: service
              in: body
              type: string
              description: "Service."
            - name: threshold
              in: body
              type: integer
              description: "Threshold ms."
          steps:
            - name: get
              type: call
              call: "datadog.query"
              with:
                query: "p99:trace.http.request{service:{{service}}}"
            - name: incident
              type: call
              call: "pagerduty.create-incident"
              with:
                service_id: "$secrets.eng_pd"
                title: "Latency: {{service}}"
            - name: notify
              type: call
              call: "msteams.post"
              with:
                channel_id: "$secrets.eng_channel"
                text: "Latency: {{service}} > {{threshold}}ms"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apiKey
        key: "$secrets.datadog_api_key"
      resources:
        - name: metrics
          path: "/query"
          operations:
            - name: query
              method: GET
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: bearer
        token: "$secrets.pagerduty_token"
      resources:
        - name: incidents
          path: "/incidents"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post
              method: POST

Gathers data from Snowflake, compiles Confluence package, and notifies compliance.

naftiko: "0.5"
info:
  label: "Compliance Audit Preparation Workflow"
  description: "Gathers data from Snowflake, compiles Confluence package, and notifies compliance."
  tags:
    - insurance
    - compliance
    - snowflake
    - confluence
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: audit-ops
      port: 8080
      tools:
        - name: prepare-audit
          description: "Prepare audit."
          inputParameters:
            - name: state
              in: body
              type: string
              description: "State."
            - name: start
              in: body
              type: string
              description: "Start."
            - name: end
              in: body
              type: string
              description: "End."
          steps:
            - name: gather
              type: call
              call: "snowflake.query"
              with:
                query: "CALL PREPARE_AUDIT('{{state}}','{{start}}','{{end}}')"
            - name: package
              type: call
              call: "confluence.create-page"
              with:
                space_key: "COMPLIANCE"
                title: "Audit: {{state}}"
            - name: notify
              type: call
              call: "msteams.post"
              with:
                channel_id: "$secrets.compliance_channel"
                text: "Audit ready: {{state}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://axa.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: query
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://axa.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: pages
          path: "/content"
          operations:
            - name: create-page
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post
              method: POST

Queries Azure costs and publishes allocation to Confluence.

naftiko: "0.5"
info:
  label: "Azure Cost Allocation Report Workflow"
  description: "Queries Azure costs and publishes allocation to Confluence."
  tags:
    - cloud
    - finance
    - microsoft-azure
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: cost-ops
      port: 8080
      tools:
        - name: gen-report
          description: "Generate cost report."
          inputParameters:
            - name: period
              in: body
              type: string
              description: "YYYY-MM."
          steps:
            - name: costs
              type: call
              call: "azure-cost.get-usage"
              with:
                period: "{{period}}"
            - name: publish
              type: call
              call: "confluence.create-page"
              with:
                space_key: "FINOPS"
                title: "Azure Costs {{period}}"
  consumes:
    - type: http
      namespace: azure-cost
      baseUri: "https://management.azure.com"
      authentication:
        type: bearer
        token: "$secrets.azure_token"
      resources:
        - name: usage
          path: "/subscriptions/$secrets.azure_sub/providers/Microsoft.CostManagement/query"
          operations:
            - name: get-usage
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://axa.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: pages
          path: "/content"
          operations:
            - name: create-page
              method: POST

Calculates BI reserve, updates claim, and notifies manager.

naftiko: "0.5"
info:
  label: "Bodily Injury Reserve Calculator"
  description: "Calculates BI reserve, updates claim, and notifies manager."
  tags:
    - insurance
    - claims
    - actuarial
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: bi-reserve
      port: 8080
      tools:
        - name: calc-bi
          description: "Calculate BI reserve."
          inputParameters:
            - name: claim_id
              in: body
              type: string
              description: "Claim."
            - name: injury
              in: body
              type: string
              description: "Injury."
            - name: jurisdiction
              in: body
              type: string
              description: "State."
          steps:
            - name: calc
              type: call
              call: "reserve-engine.calc"
              with:
                injury: "{{injury}}"
                jurisdiction: "{{jurisdiction}}"
            - name: update
              type: call
              call: "servicenow.update"
              with:
                claim_id: "{{claim_id}}"
                reserve: "{{calc.amount}}"
            - name: notify
              type: call
              call: "msteams.post"
              with:
                channel_id: "$secrets.claims_mgr"
                text: "BI: {{claim_id}} = ${{calc.amount}}"
  consumes:
    - type: http
      namespace: reserve-engine
      baseUri: "https://api.axa.com/actuarial/v1"
      authentication:
        type: bearer
        token: "$secrets.actuarial_api_token"
      resources:
        - name: bi-reserves
          path: "/reserves/bodily-injury"
          operations:
            - name: calc
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://axa.snowflakecomputing.com/api/v2"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: reserves
          path: "/table/sn_claim_reserve/{{claim_id}}"
          inputParameters:
            - name: claim_id
              in: path
          operations:
            - name: update
              method: PATCH
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post
              method: POST

Queries affected policies in Snowflake, creates ServiceNow incident, and broadcasts alerts via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Catastrophe Event Response Handler"
  description: "Queries affected policies in Snowflake, creates ServiceNow incident, and broadcasts alerts via Microsoft Teams."
  tags:
    - insurance
    - claims
    - catastrophe
    - snowflake
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: cat-ops
      port: 8080
      tools:
        - name: activate-cat
          description: "Activate CAT response."
          inputParameters:
            - name: event
              in: body
              type: string
              description: "Event name."
            - name: zips
              in: body
              type: string
              description: "Affected ZIPs."
            - name: type
              in: body
              type: string
              description: "Event type."
          steps:
            - name: count
              type: call
              call: "snowflake.query"
              with:
                query: "SELECT COUNT(*) FROM POLICIES WHERE zip IN ('{{zips}}')"
            - name: incident
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "CAT: {{event}}"
                priority: "1"
            - name: broadcast
              type: call
              call: "msteams.post"
              with:
                channel_id: "$secrets.cat_channel"
                text: "CAT: {{event}}. Incident: {{incident.number}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://axa.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: query
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://axa.snowflakecomputing.com/api/v2"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post
              method: POST

Executes CAT model in Snowflake and publishes PML to Power BI.

naftiko: "0.5"
info:
  label: "Catastrophe Model Run Workflow"
  description: "Executes CAT model in Snowflake and publishes PML to Power BI."
  tags:
    - insurance
    - actuarial
    - catastrophe
    - snowflake
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: cat-model
      port: 8080
      tools:
        - name: run-cat
          description: "Run CAT model."
          inputParameters:
            - name: peril
              in: body
              type: string
              description: "Peril."
            - name: region
              in: body
              type: string
              description: "Region."
          steps:
            - name: execute
              type: call
              call: "snowflake.query"
              with:
                query: "CALL RUN_CAT_MODEL('{{peril}}','{{region}}')"
            - name: refresh
              type: call
              call: "powerbi.refresh"
              with:
                group_id: "$secrets.pbi_cat"
                dataset_id: "$secrets.pbi_cat_model"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://axa.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: query
              method: POST
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/groups/{{group_id}}/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: group_id
              in: path
            - name: dataset_id
              in: path
          operations:
            - name: refresh
              method: POST

Evaluates loss type and adjuster workload, assigns optimal adjuster in Salesforce, and notifies via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Claims Adjuster Assignment Router"
  description: "Evaluates loss type and adjuster workload, assigns optimal adjuster in Salesforce, and notifies via Microsoft Teams."
  tags:
    - insurance
    - claims
    - salesforce
    - workday
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: claims-route
      port: 8080
      tools:
        - name: route-claim
          description: "Route claim to best adjuster. Checks capacity, assigns, notifies."
          inputParameters:
            - name: claim_id
              in: body
              type: string
              description: "Claim ID."
            - name: loss_type
              in: body
              type: string
              description: "Loss type."
          steps:
            - name: get-capacity
              type: call
              call: "workday.get-capacity"
              with:
                department: "claims-{{loss_type}}"
            - name: assign
              type: call
              call: "salesforce.assign"
              with:
                claim_id: "{{claim_id}}"
                adjuster: "{{get-capacity.id}}"
            - name: notify
              type: call
              call: "msteams.post"
              with:
                channel_id: "$secrets.claims_channel"
                text: "Claim {{claim_id}} ({{loss_type}}) assigned."
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd5-impl-services1.workday.com/ccx/api/v1/axa"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: capacity
          path: "/staffing/teamCapacity"
          operations:
            - name: get-capacity
              method: GET
    - type: http
      namespace: salesforce
      baseUri: "https://axa.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: claims
          path: "/sobjects/Claim__c/{{claim_id}}"
          inputParameters:
            - name: claim_id
              in: path
          operations:
            - name: assign
              method: PATCH
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post
              method: POST

Places litigation hold on documents, creates legal case, and notifies legal team.

naftiko: "0.5"
info:
  label: "Claims Litigation Hold Workflow"
  description: "Places litigation hold on documents, creates legal case, and notifies legal team."
  tags:
    - insurance
    - claims
    - compliance
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: lit-ops
      port: 8080
      tools:
        - name: initiate-hold
          description: "Place litigation hold."
          inputParameters:
            - name: claim_id
              in: body
              type: string
              description: "Claim."
            - name: attorney
              in: body
              type: string
              description: "Opposing counsel."
          steps:
            - name: hold
              type: call
              call: "document-api.create-hold"
              with:
                claim_id: "{{claim_id}}"
                type: "litigation"
            - name: case
              type: call
              call: "servicenow.create-case"
              with:
                short_description: "Litigation: {{claim_id}}"
            - name: notify
              type: call
              call: "msteams.post"
              with:
                channel_id: "$secrets.legal_channel"
                text: "Hold: {{claim_id}}. Case: {{case.number}}"
  consumes:
    - type: http
      namespace: document-api
      baseUri: "https://api.axa.com/documents/v1"
      authentication:
        type: bearer
        token: "$secrets.document_api_token"
      resources:
        - name: holds
          path: "/holds"
          operations:
            - name: create-hold
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://axa.snowflakecomputing.com/api/v2"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: cases
          path: "/table/sn_legal_case"
          operations:
            - name: create-case
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post
              method: POST

Generates medical record request, creates tracking, and sets Jira follow-up.

naftiko: "0.5"
info:
  label: "Claims Medical Record Request Workflow"
  description: "Generates medical record request, creates tracking, and sets Jira follow-up."
  tags:
    - insurance
    - claims
    - servicenow
    - jira
capability:
  exposes:
    - type: mcp
      namespace: medrecord-ops
      port: 8080
      tools:
        - name: request-records
          description: "Request medical records."
          inputParameters:
            - name: claim_id
              in: body
              type: string
              description: "Claim."
            - name: provider
              in: body
              type: string
              description: "Provider."
            - name: claimant
              in: body
              type: string
              description: "Claimant."
          steps:
            - name: gen
              type: call
              call: "document-api.generate"
              with:
                claim_id: "{{claim_id}}"
                provider: "{{provider}}"
            - name: track
              type: call
              call: "servicenow.create-record"
              with:
                table: "u_med_request"
                claim_id: "{{claim_id}}"
            - name: followup
              type: call
              call: "jira.create-issue"
              with:
                project_key: "CLAIMS"
                issuetype: "Task"
                summary: "Med records: {{claim_id}}"
  consumes:
    - type: http
      namespace: document-api
      baseUri: "https://api.axa.com/documents/v1"
      authentication:
        type: bearer
        token: "$secrets.document_api_token"
      resources:
        - name: medical
          path: "/generate/medical-request"
          operations:
            - name: generate
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://axa.snowflakecomputing.com/api/v2"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: records
          path: "/table/u_med_request"
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://axa.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Validates payment against limits, processes disbursement, and updates claim in ServiceNow.

naftiko: "0.5"
info:
  label: "Claims Payment Processing Workflow"
  description: "Validates payment against limits, processes disbursement, and updates claim in ServiceNow."
  tags:
    - insurance
    - claims
    - payments
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: payment-ops
      port: 8080
      tools:
        - name: process-payment
          description: "Process claims payment."
          inputParameters:
            - name: claim_id
              in: body
              type: string
              description: "Claim ID."
            - name: amount
              in: body
              type: number
              description: "Amount."
            - name: payee
              in: body
              type: string
              description: "Recipient."
          steps:
            - name: validate
              type: call
              call: "claims-api.validate"
              with:
                claim_id: "{{claim_id}}"
                amount: "{{amount}}"
            - name: disburse
              type: call
              call: "payment-api.disburse"
              with:
                claim_id: "{{claim_id}}"
                amount: "{{amount}}"
            - name: update
              type: call
              call: "servicenow.update"
              with:
                claim_id: "{{claim_id}}"
                status: "disbursed"
  consumes:
    - type: http
      namespace: claims-api
      baseUri: "https://api.axa.com/claims/v2"
      authentication:
        type: bearer
        token: "$secrets.claims_api_token"
      resources:
        - name: validation
          path: "/payments/validate"
          operations:
            - name: validate
              method: POST
    - type: http
      namespace: payment-api
      baseUri: "https://api.axa.com/payments/v1"
      authentication:
        type: bearer
        token: "$secrets.payment_api_token"
      resources:
        - name: disbursements
          path: "/disbursements"
          operations:
            - name: disburse
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://axa.snowflakecomputing.com/api/v2"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: cases
          path: "/table/sn_customerservice_case/{{claim_id}}"
          inputParameters:
            - name: claim_id
              in: path
          operations:
            - name: update
              method: PATCH

Validates adjuster authority, updates reserve in ServiceNow, and notifies claims manager.

naftiko: "0.5"
info:
  label: "Claims Reserve Adjustment Workflow"
  description: "Validates adjuster authority, updates reserve in ServiceNow, and notifies claims manager."
  tags:
    - insurance
    - claims
    - actuarial
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: reserve-adj
      port: 8080
      tools:
        - name: adjust-reserve
          description: "Adjust claim reserve."
          inputParameters:
            - name: claim_id
              in: body
              type: string
              description: "Claim."
            - name: amount
              in: body
              type: number
              description: "New reserve."
            - name: adjuster
              in: body
              type: string
              description: "Adjuster."
          steps:
            - name: check
              type: call
              call: "claims-api.check-auth"
              with:
                adjuster: "{{adjuster}}"
                amount: "{{amount}}"
            - name: update
              type: call
              call: "servicenow.update-reserve"
              with:
                claim_id: "{{claim_id}}"
                reserve: "{{amount}}"
            - name: notify
              type: call
              call: "msteams.post"
              with:
                channel_id: "$secrets.claims_mgr"
                text: "Reserve: {{claim_id}} = ${{amount}}"
  consumes:
    - type: http
      namespace: claims-api
      baseUri: "https://api.axa.com/claims/v2"
      authentication:
        type: bearer
        token: "$secrets.claims_api_token"
      resources:
        - name: authority
          path: "/authority/check"
          operations:
            - name: check-auth
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://axa.snowflakecomputing.com/api/v2"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: reserves
          path: "/table/sn_claim_reserve/{{claim_id}}"
          inputParameters:
            - name: claim_id
              in: path
          operations:
            - name: update-reserve
              method: PATCH
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post
              method: POST

Retrieves current claim status from ServiceNow including state, adjuster, and last update.

naftiko: "0.5"
info:
  label: "Claims Status Inquiry"
  description: "Retrieves current claim status from ServiceNow including state, adjuster, and last update."
  tags:
    - insurance
    - claims
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: claims-ops
      port: 8080
      tools:
        - name: get-claim-status
          description: "Look up claim status by number. Returns state, adjuster, last activity. Use for claim inquiries."
          inputParameters:
            - name: claim_number
              in: body
              type: string
              description: "AXA claim number."
          call: "servicenow.get-case"
          with:
            claim_number: "{{claim_number}}"
          outputParameters:
            - name: state
              type: string
              mapping: "$.state"
            - name: adjuster
              type: string
              mapping: "$.assigned_to.display_value"
            - name: last_activity
              type: string
              mapping: "$.sys_updated_on"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://axa.snowflakecomputing.com/api/v2"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: cases
          path: "/table/sn_customerservice_case/{{claim_number}}"
          inputParameters:
            - name: claim_number
              in: path
          operations:
            - name: get-case
              method: GET

When an Azure cost anomaly is detected, annotates the event in Datadog, opens a ServiceNow change request for cost review, and notifies the FinOps team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Cloud Cost Anomaly Response"
  description: "When an Azure cost anomaly is detected, annotates the event in Datadog, opens a ServiceNow change request for cost review, and notifies the FinOps team in Microsoft Teams."
  tags:
    - finops
    - cloud
    - azure
    - datadog
    - servicenow
    - cost-management
capability:
  exposes:
    - type: mcp
      namespace: finops
      port: 8080
      tools:
        - name: handle-cost-anomaly
          description: "Given an Azure cost anomaly alert with service name and overage amount, create a Datadog event annotation, open a ServiceNow change request, and alert the FinOps Teams channel."
          inputParameters:
            - name: azure_service
              in: body
              type: string
              description: "The Azure service reporting the cost anomaly, e.g. 'Azure Kubernetes Service'."
            - name: overage_eur
              in: body
              type: number
              description: "Estimated cost overage in EUR."
            - name: subscription_id
              in: body
              type: string
              description: "The Azure subscription ID where the anomaly occurred."
          steps:
            - name: annotate-datadog
              type: call
              call: "datadog.create-event"
              with:
                title: "Azure Cost Anomaly: {{azure_service}}"
                text: "Subscription {{subscription_id}} — overage: €{{overage_eur}}"
                alert_type: "warning"
            - name: open-change-request
              type: call
              call: "servicenow.create-change"
              with:
                short_description: "Cost review: {{azure_service}} overage €{{overage_eur}}"
                category: "finops"
                justification: "Azure anomaly detected on subscription {{subscription_id}}"
            - name: notify-finops
              type: call
              call: "msteams.post-channel-message"
              with:
                channel: "finops-alerts"
                message: "Cost anomaly on {{azure_service}} | Overage: €{{overage_eur}} | SNOW: {{open-change-request.number}} | Datadog: {{annotate-datadog.url}}"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: events
          path: "/events"
          operations:
            - name: create-event
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://axa.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: changes
          path: "/table/change_request"
          operations:
            - name: create-change
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Screens applicants against AML watchlists, logs results, and escalates matches.

naftiko: "0.5"
info:
  label: "Compliance AML Screening Workflow"
  description: "Screens applicants against AML watchlists, logs results, and escalates matches."
  tags:
    - insurance
    - compliance
    - fraud
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: aml-ops
      port: 8080
      tools:
        - name: screen-aml
          description: "Screen for AML."
          inputParameters:
            - name: name
              in: body
              type: string
              description: "Applicant name."
            - name: app_id
              in: body
              type: string
              description: "Application ID."
          steps:
            - name: screen
              type: call
              call: "aml-api.screen"
              with:
                name: "{{name}}"
                ref: "{{app_id}}"
            - name: log
              type: call
              call: "servicenow.create-record"
              with:
                table: "u_aml"
                result: "{{screen.status}}"
            - name: alert
              type: call
              call: "msteams.post"
              with:
                channel_id: "$secrets.compliance_channel"
                text: "AML: {{name}} - {{screen.status}}"
  consumes:
    - type: http
      namespace: aml-api
      baseUri: "https://api.axa.com/compliance/aml/v1"
      authentication:
        type: bearer
        token: "$secrets.aml_api_token"
      resources:
        - name: screening
          path: "/screen"
          operations:
            - name: screen
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://axa.snowflakecomputing.com/api/v2"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: records
          path: "/table/u_aml"
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post
              method: POST

Monitors regulatory filing deadlines, generates Confluence summary, and alerts compliance via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Compliance Regulatory Filing Tracker"
  description: "Monitors regulatory filing deadlines, generates Confluence summary, and alerts compliance via Microsoft Teams."
  tags:
    - insurance
    - compliance
    - confluence
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: compliance-ops
      port: 8080
      tools:
        - name: check-filings
          description: "Check filing deadlines and notify."
          inputParameters:
            - name: days_ahead
              in: body
              type: integer
              description: "Days ahead."
            - name: state
              in: body
              type: string
              description: "State or ALL."
          steps:
            - name: get-filings
              type: call
              call: "compliance-api.get-filings"
              with:
                days: "{{days_ahead}}"
                state: "{{state}}"
            - name: create-page
              type: call
              call: "confluence.create-page"
              with:
                space_key: "COMPLIANCE"
                title: "Filings Next {{days_ahead}} Days"
            - name: notify
              type: call
              call: "msteams.post"
              with:
                channel_id: "$secrets.compliance_channel"
                text: "{{get-filings.count}} filings due."
  consumes:
    - type: http
      namespace: compliance-api
      baseUri: "https://api.axa.com/compliance/v1"
      authentication:
        type: bearer
        token: "$secrets.compliance_api_token"
      resources:
        - name: filings
          path: "/filings/upcoming"
          operations:
            - name: get-filings
              method: GET
    - type: http
      namespace: confluence
      baseUri: "https://axa.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: pages
          path: "/content"
          operations:
            - name: create-page
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post
              method: POST

Queries SAP Concur for expense reports pending manager approval beyond 5 days, and sends reminder notifications to approvers via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Concur Expense Report Approval Reminder"
  description: "Queries SAP Concur for expense reports pending manager approval beyond 5 days, and sends reminder notifications to approvers via Microsoft Teams."
  tags:
    - finance
    - expense-management
    - sap-concur
    - microsoft-teams
    - approval
capability:
  exposes:
    - type: mcp
      namespace: expense-management
      port: 8080
      tools:
        - name: send-expense-approval-reminders
          description: "Query SAP Concur for expense reports in Pending Manager Approval status older than 5 days, and send Teams reminders to each approver."
          inputParameters:
            - name: days_pending
              in: body
              type: integer
              description: "Number of days an expense report must be pending before sending a reminder. Default: 5."
          steps:
            - name: get-pending-reports
              type: call
              call: "concur.list-pending-reports"
              with:
                approvalStatus: "A_PEND"
                daysOld: "{{days_pending}}"
            - name: notify-approvers
              type: call
              call: "msteams.post-channel-message"
              with:
                channel: "finance-approvals"
                message: "{{get-pending-reports.count}} expense reports pending approval for more than {{days_pending}} days. Please review in SAP Concur."
  consumes:
    - type: http
      namespace: concur
      baseUri: "https://www.concursolutions.com/api/v3.0"
      authentication:
        type: bearer
        token: "$secrets.concur_token"
      resources:
        - name: expense-reports
          path: "/expense/reports"
          operations:
            - name: list-pending-reports
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Analyzes coverage in Salesforce, identifies gaps, and creates cross-sell opportunities.

naftiko: "0.5"
info:
  label: "Cross-Sell Opportunity Workflow"
  description: "Analyzes coverage in Salesforce, identifies gaps, and creates cross-sell opportunities."
  tags:
    - insurance
    - policy
    - salesforce
    - sales
capability:
  exposes:
    - type: mcp
      namespace: cross-sell
      port: 8080
      tools:
        - name: cross-sell
          description: "Create cross-sell opportunities."
          inputParameters:
            - name: customer_id
              in: body
              type: string
              description: "Customer ID."
          steps:
            - name: policies
              type: call
              call: "salesforce.get-policies"
              with:
                customer_id: "{{customer_id}}"
            - name: gaps
              type: call
              call: "analytics.identify-gaps"
              with:
                customer_id: "{{customer_id}}"
            - name: opp
              type: call
              call: "salesforce.create-opp"
              with:
                customer_id: "{{customer_id}}"
                product: "{{gaps.recommended}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://axa.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: policies
          path: "/query"
          operations:
            - name: get-policies
              method: GET
    - type: http
      namespace: analytics
      baseUri: "https://api.axa.com/analytics/v1"
      authentication:
        type: bearer
        token: "$secrets.analytics_token"
      resources:
        - name: gaps
          path: "/coverage-gaps"
          operations:
            - name: identify-gaps
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://axa.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opportunities
          path: "/sobjects/Opportunity"
          operations:
            - name: create-opp
              method: POST

Creates ServiceNow case, links to Salesforce policy, and notifies CX team.

naftiko: "0.5"
info:
  label: "Customer Complaint Tracking Workflow"
  description: "Creates ServiceNow case, links to Salesforce policy, and notifies CX team."
  tags:
    - insurance
    - compliance
    - servicenow
    - salesforce
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: complaint-ops
      port: 8080
      tools:
        - name: log-complaint
          description: "Log complaint."
          inputParameters:
            - name: policy
              in: body
              type: string
              description: "Policy."
            - name: category
              in: body
              type: string
              description: "Category."
            - name: desc
              in: body
              type: string
              description: "Description."
          steps:
            - name: case
              type: call
              call: "servicenow.create-case"
              with:
                short_description: "Complaint: {{category}} - {{policy}}"
                description: "{{desc}}"
            - name: link
              type: call
              call: "salesforce.create-note"
              with:
                policy: "{{policy}}"
                note: "Complaint: {{case.number}}"
            - name: notify
              type: call
              call: "msteams.post"
              with:
                channel_id: "$secrets.cx_channel"
                text: "Complaint: {{policy}}. Case: {{case.number}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://axa.snowflakecomputing.com/api/v2"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: cases
          path: "/table/sn_customerservice_case"
          operations:
            - name: create-case
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://axa.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: notes
          path: "/sobjects/CaseNote__c"
          operations:
            - name: create-note
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post
              method: POST

When a low NPS score is submitted through Salesforce Service Cloud, creates a HubSpot contact task for follow-up, and notifies the account manager via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Customer NPS Survey Follow-up Workflow"
  description: "When a low NPS score is submitted through Salesforce Service Cloud, creates a HubSpot contact task for follow-up, and notifies the account manager via Microsoft Teams."
  tags:
    - customer-service
    - nps
    - salesforce
    - hubspot
    - microsoft-teams
    - cx
capability:
  exposes:
    - type: mcp
      namespace: cx-nps
      port: 8080
      tools:
        - name: handle-low-nps-response
          description: "Given a Salesforce case ID with a low NPS score (0-6), retrieve customer contact details, create a HubSpot follow-up task, and notify the responsible account manager in Teams."
          inputParameters:
            - name: case_id
              in: body
              type: string
              description: "The Salesforce Service Cloud case ID linked to the NPS survey."
            - name: nps_score
              in: body
              type: integer
              description: "The NPS score submitted by the customer (0-10). Triggers follow-up if 0-6."
            - name: customer_email
              in: body
              type: string
              description: "The customer's email address from the survey submission."
          steps:
            - name: get-case
              type: call
              call: "salesforce.get-case"
              with:
                case_id: "{{case_id}}"
            - name: create-followup-task
              type: call
              call: "hubspot.create-task"
              with:
                subject: "NPS Follow-up (score {{nps_score}}): {{customer_email}}"
                contact_email: "{{customer_email}}"
                due_date: "2d"
                priority: "HIGH"
            - name: notify-account-manager
              type: call
              call: "msteams.post-channel-message"
              with:
                channel: "cx-alerts"
                message: "Low NPS ({{nps_score}}/10) from {{customer_email}} | Case: {{get-case.case_number}} | HubSpot task created."
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://axa.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: cases
          path: "/sobjects/Case/{{case_id}}"
          inputParameters:
            - name: case_id
              in: path
          operations:
            - name: get-case
              method: GET
    - type: http
      namespace: hubspot
      baseUri: "https://api.hubapi.com/crm/v3"
      authentication:
        type: bearer
        token: "$secrets.hubspot_token"
      resources:
        - name: tasks
          path: "/objects/tasks"
          operations:
            - name: create-task
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Processes GDPR/CCPA requests by querying systems and logging in ServiceNow.

naftiko: "0.5"
info:
  label: "Data Subject Request Workflow"
  description: "Processes GDPR/CCPA requests by querying systems and logging in ServiceNow."
  tags:
    - insurance
    - compliance
    - privacy
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: dsar-ops
      port: 8080
      tools:
        - name: process-dsar
          description: "Process DSAR."
          inputParameters:
            - name: email
              in: body
              type: string
              description: "Subject email."
            - name: type
              in: body
              type: string
              description: "Request type."
          steps:
            - name: sf
              type: call
              call: "salesforce.search"
              with:
                email: "{{email}}"
            - name: claims
              type: call
              call: "claims-api.search"
              with:
                email: "{{email}}"
            - name: log
              type: call
              call: "servicenow.create-record"
              with:
                table: "u_dsar"
                email: "{{email}}"
                type: "{{type}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://axa.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: search
          path: "/search"
          operations:
            - name: search
              method: GET
    - type: http
      namespace: claims-api
      baseUri: "https://api.axa.com/claims/v2"
      authentication:
        type: bearer
        token: "$secrets.claims_api_token"
      resources:
        - name: search
          path: "/claims/search"
          operations:
            - name: search
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://axa.snowflakecomputing.com/api/v2"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: records
          path: "/table/u_dsar"
          operations:
            - name: create-record
              method: POST

Queries the Datadog API for current SLI/SLO metrics across AXA's critical insurance platforms and posts a daily digest to the engineering Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Datadog Observability Dashboard Refresh"
  description: "Queries the Datadog API for current SLI/SLO metrics across AXA's critical insurance platforms and posts a daily digest to the engineering Microsoft Teams channel."
  tags:
    - observability
    - monitoring
    - datadog
    - microsoft-teams
    - slo
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: observability-reporting
      port: 8080
      tools:
        - name: digest-platform-slos
          description: "Query Datadog for SLO compliance metrics for a given time window and post a structured daily digest to the engineering Teams channel."
          inputParameters:
            - name: time_window_hours
              in: body
              type: integer
              description: "The look-back window in hours for SLO metrics. Typically 24."
            - name: environment
              in: body
              type: string
              description: "The target environment: 'production', 'staging', or 'dr'."
          steps:
            - name: get-slo-metrics
              type: call
              call: "datadog.list-slos"
              with:
                tags: "env:{{environment}}"
                limit: "50"
            - name: post-digest
              type: call
              call: "msteams.post-channel-message"
              with:
                channel: "engineering-ops"
                message: "Daily SLO Report ({{environment}}, last {{time_window_hours}}h): {{get-slo-metrics.summary}}"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: slos
          path: "/slo"
          operations:
            - name: list-slos
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Retrieves health metrics from Datadog including error rate, latency, and throughput.

naftiko: "0.5"
info:
  label: "Datadog Service Health Lookup"
  description: "Retrieves health metrics from Datadog including error rate, latency, and throughput."
  tags:
    - engineering
    - datadog
    - monitoring
capability:
  exposes:
    - type: mcp
      namespace: health-ops
      port: 8080
      tools:
        - name: get-health
          description: "Look up service health."
          inputParameters:
            - name: service
              in: body
              type: string
              description: "Service name."
          call: "datadog.get-metrics"
          with:
            service: "{{service}}"
          outputParameters:
            - name: error_rate
              type: number
              mapping: "$.errorRate"
            - name: latency
              type: number
              mapping: "$.p99Latency"
            - name: throughput
              type: number
              mapping: "$.throughput"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apiKey
        key: "$secrets.datadog_api_key"
      resources:
        - name: metrics
          path: "/query"
          operations:
            - name: get-metrics
              method: GET

Checks Snowflake for duplicate claims and flags matches in ServiceNow.

naftiko: "0.5"
info:
  label: "Duplicate Claims Detection Workflow"
  description: "Checks Snowflake for duplicate claims and flags matches in ServiceNow."
  tags:
    - insurance
    - fraud
    - claims
    - snowflake
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: dup-detect
      port: 8080
      tools:
        - name: detect-dupes
          description: "Detect duplicates."
          inputParameters:
            - name: claimant
              in: body
              type: string
              description: "Claimant."
            - name: loss_date
              in: body
              type: string
              description: "Loss date."
            - name: loss_type
              in: body
              type: string
              description: "Loss type."
          steps:
            - name: search
              type: call
              call: "snowflake.query"
              with:
                query: "SELECT * FROM CLAIMS WHERE claimant='{{claimant}}' AND loss_date NEAR '{{loss_date}}'"
            - name: flag
              type: call
              call: "servicenow.create-record"
              with:
                table: "u_fraud_alert"
                type: "duplicate"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://axa.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: query
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://axa.snowflakecomputing.com/api/v2"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: records
          path: "/table/u_fraud_alert"
          operations:
            - name: create-record
              method: POST

When an employee termination is processed in Workday, disables their Microsoft Graph account, revokes Okta sessions, and creates a ServiceNow offboarding ticket to track asset return.

naftiko: "0.5"
info:
  label: "Employee Offboarding Workflow"
  description: "When an employee termination is processed in Workday, disables their Microsoft Graph account, revokes Okta sessions, and creates a ServiceNow offboarding ticket to track asset return."
  tags:
    - hr
    - offboarding
    - workday
    - okta
    - servicenow
    - microsoft-graph
capability:
  exposes:
    - type: mcp
      namespace: hr-offboarding
      port: 8080
      tools:
        - name: trigger-employee-offboarding
          description: "Given a Workday employee ID and termination date, disable the Microsoft Graph account, revoke all Okta sessions, and open a ServiceNow offboarding checklist ticket."
          inputParameters:
            - name: workday_employee_id
              in: body
              type: string
              description: "The Workday worker ID for the departing employee."
            - name: termination_date
              in: body
              type: string
              description: "The employee's last day in ISO 8601 format (YYYY-MM-DD)."
          steps:
            - name: get-worker
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{workday_employee_id}}"
            - name: disable-ad-account
              type: call
              call: "msgraph.disable-user"
              with:
                user_id: "{{get-worker.work_email}}"
            - name: revoke-okta-sessions
              type: call
              call: "okta.revoke-user-sessions"
              with:
                user_login: "{{get-worker.work_email}}"
            - name: create-offboarding-ticket
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Offboarding: {{get-worker.full_name}} — last day {{termination_date}}"
                category: "hr_offboarding"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/axa/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: msgraph
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: users
          path: "/users/{{user_id}}"
          inputParameters:
            - name: user_id
              in: path
          operations:
            - name: disable-user
              method: PATCH
    - type: http
      namespace: okta
      baseUri: "https://axa.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_api_token"
        placement: header
      resources:
        - name: user-sessions
          path: "/users/{{user_login}}/sessions"
          inputParameters:
            - name: user_login
              in: path
          operations:
            - name: revoke-user-sessions
              method: DELETE
    - type: http
      namespace: servicenow
      baseUri: "https://axa.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST

Generates Jira backlog digest and posts to Microsoft Teams.

naftiko: "0.5"
info:
  label: "Engineering Backlog Digest Workflow"
  description: "Generates Jira backlog digest and posts to Microsoft Teams."
  tags:
    - engineering
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: backlog-ops
      port: 8080
      tools:
        - name: gen-digest
          description: "Generate digest."
          inputParameters:
            - name: board_id
              in: body
              type: string
              description: "Board ID."
          steps:
            - name: sprint
              type: call
              call: "jira.get-sprint"
              with:
                board_id: "{{board_id}}"
            - name: blockers
              type: call
              call: "jira.search"
              with:
                jql: "status=Blocked"
            - name: post
              type: call
              call: "msteams.post"
              with:
                channel_id: "$secrets.eng_channel"
                text: "Sprint: {{sprint.name}}. Blockers: {{blockers.total}}"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://axa.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: sprints
          path: "/board/{{board_id}}/sprint"
          inputParameters:
            - name: board_id
              in: path
          operations:
            - name: get-sprint
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post
              method: POST

Creates SIU case in ServiceNow and alerts team via PagerDuty when fraud scoring flags a claim.

naftiko: "0.5"
info:
  label: "Fraud Detection Alert to SIU"
  description: "Creates SIU case in ServiceNow and alerts team via PagerDuty when fraud scoring flags a claim."
  tags:
    - insurance
    - fraud
    - servicenow
    - pagerduty
capability:
  exposes:
    - type: mcp
      namespace: fraud-ops
      port: 8080
      tools:
        - name: escalate-fraud
          description: "Escalate fraud alert. Creates case and PagerDuty alert."
          inputParameters:
            - name: claim_id
              in: body
              type: string
              description: "Flagged claim."
            - name: fraud_score
              in: body
              type: number
              description: "Score 0-100."
            - name: indicators
              in: body
              type: string
              description: "Indicators."
          steps:
            - name: create-case
              type: call
              call: "servicenow.create-case"
              with:
                short_description: "Fraud: {{claim_id}} ({{fraud_score}})"
                category: "fraud"
            - name: alert
              type: call
              call: "pagerduty.create-incident"
              with:
                service_id: "$secrets.siu_service"
                title: "Fraud: {{claim_id}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://axa.snowflakecomputing.com/api/v2"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: cases
          path: "/table/sn_si_incident"
          operations:
            - name: create-case
              method: POST
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: bearer
        token: "$secrets.pagerduty_token"
      resources:
        - name: incidents
          path: "/incidents"
          operations:
            - name: create-incident
              method: POST

Runs graph analytics in Snowflake to detect fraud rings, creates cases, and alerts SIU.

naftiko: "0.5"
info:
  label: "Fraud Ring Detection Investigation"
  description: "Runs graph analytics in Snowflake to detect fraud rings, creates cases, and alerts SIU."
  tags:
    - insurance
    - fraud
    - snowflake
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: fraud-ring
      port: 8080
      tools:
        - name: detect-rings
          description: "Detect fraud rings."
          inputParameters:
            - name: start
              in: body
              type: string
              description: "Start date."
            - name: end
              in: body
              type: string
              description: "End date."
          steps:
            - name: detect
              type: call
              call: "snowflake.query"
              with:
                query: "CALL DETECT_FRAUD_RINGS('{{start}}','{{end}}')"
            - name: case
              type: call
              call: "servicenow.create-case"
              with:
                short_description: "Fraud rings: {{start}} to {{end}}"
            - name: alert
              type: call
              call: "msteams.post"
              with:
                channel_id: "$secrets.siu_channel"
                text: "Rings detected. Case: {{case.number}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://axa.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: query
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://axa.snowflakecomputing.com/api/v2"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: cases
          path: "/table/sn_si_incident"
          operations:
            - name: create-case
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post
              method: POST

When a GitHub Actions deployment workflow fails on main branch, creates a Jira incident ticket and posts a failure alert with context to the DevOps Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "GitHub Deployment Pipeline Failure Handler"
  description: "When a GitHub Actions deployment workflow fails on main branch, creates a Jira incident ticket and posts a failure alert with context to the DevOps Microsoft Teams channel."
  tags:
    - devops
    - ci-cd
    - github
    - jira
    - microsoft-teams
    - deployment
capability:
  exposes:
    - type: mcp
      namespace: devops-cicd
      port: 8080
      tools:
        - name: handle-deployment-failure
          description: "Given a GitHub Actions workflow run ID and repository, retrieve failure details, create a Jira incident, and alert the DevOps Teams channel with full context."
          inputParameters:
            - name: repo_full_name
              in: body
              type: string
              description: "The GitHub repository full name, e.g. 'axa-group/policy-service'."
            - name: run_id
              in: body
              type: integer
              description: "The GitHub Actions workflow run ID that failed."
            - name: branch
              in: body
              type: string
              description: "The branch the deployment was targeting, typically 'main'."
          steps:
            - name: get-run-details
              type: call
              call: "github.get-workflow-run"
              with:
                repo: "{{repo_full_name}}"
                run_id: "{{run_id}}"
            - name: create-jira-incident
              type: call
              call: "jira.create-issue"
              with:
                project_key: "OPS"
                issuetype: "Incident"
                summary: "Deployment failure: {{repo_full_name}} on {{branch}}"
                description: "Run ID: {{run_id}} | Status: {{get-run-details.conclusion}} | URL: {{get-run-details.html_url}}"
            - name: alert-devops-channel
              type: call
              call: "msteams.post-channel-message"
              with:
                channel: "devops-alerts"
                message: "Deployment FAILED: {{repo_full_name}} | Branch: {{branch}} | Jira: {{create-jira-incident.key}} | Run: {{get-run-details.html_url}}"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: workflow-runs
          path: "/repos/{{repo}}/actions/runs/{{run_id}}"
          inputParameters:
            - name: repo
              in: path
            - name: run_id
              in: path
          operations:
            - name: get-workflow-run
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://axa.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

On a GitHub pull request opened against a protected branch, triggers a security scan via Datadog SAST, reports findings back as a PR comment, and opens a Jira ticket for any critical issues.

naftiko: "0.5"
info:
  label: "GitHub Pull Request Security Scan Gating"
  description: "On a GitHub pull request opened against a protected branch, triggers a security scan via Datadog SAST, reports findings back as a PR comment, and opens a Jira ticket for any critical issues."
  tags:
    - devops
    - security
    - github
    - datadog
    - jira
    - ci-cd
    - code-quality
capability:
  exposes:
    - type: mcp
      namespace: pr-security
      port: 8080
      tools:
        - name: handle-pr-security-gate
          description: "Given a GitHub pull request number and repository, run a security analysis, post findings as a PR review comment on GitHub, and open a Jira bug for any critical vulnerabilities found."
          inputParameters:
            - name: repo_full_name
              in: body
              type: string
              description: "The GitHub repository full name, e.g. 'axa-group/claims-api'."
            - name: pr_number
              in: body
              type: integer
              description: "The pull request number to analyse."
            - name: commit_sha
              in: body
              type: string
              description: "The head commit SHA for the pull request."
          steps:
            - name: get-pr-details
              type: call
              call: "github.get-pull-request"
              with:
                repo: "{{repo_full_name}}"
                pull_number: "{{pr_number}}"
            - name: post-pr-comment
              type: call
              call: "github.create-pr-comment"
              with:
                repo: "{{repo_full_name}}"
                pull_number: "{{pr_number}}"
                body: "Security scan initiated for commit {{commit_sha}}."
            - name: create-jira-issue
              type: call
              call: "jira.create-issue"
              with:
                project_key: "SEC"
                issuetype: "Bug"
                summary: "Security finding: {{repo_full_name}} PR #{{pr_number}}"
                description: "Commit: {{commit_sha}} | PR: {{get-pr-details.html_url}}"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: pull-requests
          path: "/repos/{{repo}}/pulls/{{pull_number}}"
          inputParameters:
            - name: repo
              in: path
            - name: pull_number
              in: path
          operations:
            - name: get-pull-request
              method: GET
        - name: pr-comments
          path: "/repos/{{repo}}/issues/{{pull_number}}/comments"
          inputParameters:
            - name: repo
              in: path
            - name: pull_number
              in: path
          operations:
            - name: create-pr-comment
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://axa.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Creates Jira ticket and alerts engineering via Teams for critical vulnerabilities.

naftiko: "0.5"
info:
  label: "GitHub Security Advisory Workflow"
  description: "Creates Jira ticket and alerts engineering via Teams for critical vulnerabilities."
  tags:
    - security
    - github
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: sec-ops
      port: 8080
      tools:
        - name: handle-advisory
          description: "Handle security advisory."
          inputParameters:
            - name: repo
              in: body
              type: string
              description: "Repository."
            - name: advisory
              in: body
              type: string
              description: "Advisory ID."
            - name: severity
              in: body
              type: string
              description: "Severity."
          steps:
            - name: get
              type: call
              call: "github.get-advisory"
              with:
                repo: "{{repo}}"
                id: "{{advisory}}"
            - name: ticket
              type: call
              call: "jira.create-issue"
              with:
                project_key: "SEC"
                issuetype: "Bug"
                summary: "{{severity}} in {{repo}}"
            - name: notify
              type: call
              call: "msteams.post"
              with:
                channel_id: "$secrets.sec_channel"
                text: "{{severity}} in {{repo}}. Jira: {{ticket.key}}"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: advisories
          path: "/repos/{{repo}}/dependabot/alerts/{{advisory}}"
          inputParameters:
            - name: repo
              in: path
            - name: advisory
              in: path
          operations:
            - name: get-advisory
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://axa.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post
              method: POST

Verifies glass coverage, schedules vendor repair, and confirms to policyholder.

naftiko: "0.5"
info:
  label: "Glass Repair Fast Track Workflow"
  description: "Verifies glass coverage, schedules vendor repair, and confirms to policyholder."
  tags:
    - insurance
    - claims
    - auto
capability:
  exposes:
    - type: mcp
      namespace: glass-ops
      port: 8080
      tools:
        - name: fast-track
          description: "Fast-track glass claim."
          inputParameters:
            - name: policy
              in: body
              type: string
              description: "Policy."
            - name: damage
              in: body
              type: string
              description: "Damage type."
            - name: zip
              in: body
              type: string
              description: "ZIP."
          steps:
            - name: verify
              type: call
              call: "claims-api.verify"
              with:
                policy: "{{policy}}"
            - name: schedule
              type: call
              call: "glass-vendor.schedule"
              with:
                policy: "{{policy}}"
                damage: "{{damage}}"
            - name: confirm
              type: call
              call: "notification-api.send"
              with:
                policy: "{{policy}}"
                template: "glass-scheduled"
  consumes:
    - type: http
      namespace: claims-api
      baseUri: "https://api.axa.com/claims/v2"
      authentication:
        type: bearer
        token: "$secrets.claims_api_token"
      resources:
        - name: glass
          path: "/policies/{{policy}}/glass"
          inputParameters:
            - name: policy
              in: path
          operations:
            - name: verify
              method: GET
    - type: http
      namespace: glass-vendor
      baseUri: "https://api.axa.com/vendors/glass/v1"
      authentication:
        type: bearer
        token: "$secrets.glass_token"
      resources:
        - name: repairs
          path: "/schedule"
          operations:
            - name: schedule
              method: POST
    - type: http
      namespace: notification-api
      baseUri: "https://api.axa.com/notifications/v1"
      authentication:
        type: bearer
        token: "$secrets.notification_token"
      resources:
        - name: notifications
          path: "/send"
          operations:
            - name: send
              method: POST

Synchronizes HubSpot contact lifecycle stages with Salesforce opportunity stages for AXA's commercial insurance pipeline, ensuring CRM data consistency.

naftiko: "0.5"
info:
  label: "HubSpot Contact Lifecycle Stage Sync"
  description: "Synchronizes HubSpot contact lifecycle stages with Salesforce opportunity stages for AXA's commercial insurance pipeline, ensuring CRM data consistency."
  tags:
    - crm
    - salesforce
    - hubspot
    - data-sync
    - sales
capability:
  exposes:
    - type: mcp
      namespace: crm-sync
      port: 8080
      tools:
        - name: sync-contact-lifecycle-stage
          description: "Given a HubSpot contact email and new lifecycle stage, update the contact in HubSpot and sync the corresponding Salesforce contact record with the same stage."
          inputParameters:
            - name: contact_email
              in: body
              type: string
              description: "The email address of the contact to update."
            - name: lifecycle_stage
              in: body
              type: string
              description: "The new lifecycle stage: 'subscriber', 'lead', 'marketingqualifiedlead', 'salesqualifiedlead', 'opportunity', 'customer'."
          steps:
            - name: update-hubspot-contact
              type: call
              call: "hubspot.update-contact"
              with:
                email: "{{contact_email}}"
                lifecyclestage: "{{lifecycle_stage}}"
            - name: update-salesforce-contact
              type: call
              call: "salesforce.update-contact"
              with:
                email: "{{contact_email}}"
                lifecycle_stage: "{{lifecycle_stage}}"
  consumes:
    - type: http
      namespace: hubspot
      baseUri: "https://api.hubapi.com/crm/v3"
      authentication:
        type: bearer
        token: "$secrets.hubspot_token"
      resources:
        - name: contacts
          path: "/objects/contacts"
          operations:
            - name: update-contact
              method: PATCH
    - type: http
      namespace: salesforce
      baseUri: "https://axa.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: contacts
          path: "/sobjects/Contact"
          operations:
            - name: update-contact
              method: PATCH

Finds physician, books IME, and creates tracking in ServiceNow.

naftiko: "0.5"
info:
  label: "Independent Medical Exam Scheduling Workflow"
  description: "Finds physician, books IME, and creates tracking in ServiceNow."
  tags:
    - insurance
    - claims
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: ime-ops
      port: 8080
      tools:
        - name: schedule-ime
          description: "Schedule IME."
          inputParameters:
            - name: claim_id
              in: body
              type: string
              description: "Claim."
            - name: specialty
              in: body
              type: string
              description: "Specialty."
            - name: zip
              in: body
              type: string
              description: "ZIP."
          steps:
            - name: find
              type: call
              call: "medical-api.find"
              with:
                specialty: "{{specialty}}"
                zip: "{{zip}}"
            - name: book
              type: call
              call: "scheduling-api.book"
              with:
                provider: "{{find.id}}"
                claim: "{{claim_id}}"
            - name: track
              type: call
              call: "servicenow.create-record"
              with:
                table: "u_ime"
                claim_id: "{{claim_id}}"
  consumes:
    - type: http
      namespace: medical-api
      baseUri: "https://api.axa.com/medical-network/v1"
      authentication:
        type: bearer
        token: "$secrets.medical_token"
      resources:
        - name: providers
          path: "/ime-providers/search"
          operations:
            - name: find
              method: GET
    - type: http
      namespace: scheduling-api
      baseUri: "https://api.axa.com/scheduling/v1"
      authentication:
        type: bearer
        token: "$secrets.scheduling_token"
      resources:
        - name: appointments
          path: "/appointments"
          operations:
            - name: book
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://axa.snowflakecomputing.com/api/v2"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: records
          path: "/table/u_ime"
          operations:
            - name: create-record
              method: POST

When a new insurance claim is submitted via the customer portal, creates a Salesforce case, categorizes it using an AI triage call to OpenAI, and assigns it to the correct claims team in ServiceNow.

naftiko: "0.5"
info:
  label: "Insurance Claim Intake and Triage"
  description: "When a new insurance claim is submitted via the customer portal, creates a Salesforce case, categorizes it using an AI triage call to OpenAI, and assigns it to the correct claims team in ServiceNow."
  tags:
    - claims
    - insurance
    - salesforce
    - servicenow
    - openai
    - ai
    - customer-service
capability:
  exposes:
    - type: mcp
      namespace: claims-intake
      port: 8080
      tools:
        - name: handle-claim-intake
          description: "Given a new claim submission with policy number, claimant name, and incident description, create a Salesforce case, triage the claim type via OpenAI, and route to the correct ServiceNow assignment group."
          inputParameters:
            - name: policy_number
              in: body
              type: string
              description: "The AXA policy number associated with the claim."
            - name: claimant_name
              in: body
              type: string
              description: "Full name of the claimant submitting the claim."
            - name: incident_description
              in: body
              type: string
              description: "Free-text description of the incident triggering the claim."
            - name: claim_type
              in: body
              type: string
              description: "Preliminary claim type: 'auto', 'property', 'health', or 'liability'."
          steps:
            - name: create-sf-case
              type: call
              call: "salesforce.create-case"
              with:
                subject: "Claim: {{policy_number}} — {{claimant_name}}"
                description: "{{incident_description}}"
                type: "{{claim_type}}"
                origin: "Portal"
            - name: triage-claim
              type: call
              call: "openai.create-chat-completion"
              with:
                model: "gpt-4o"
                system_prompt: "You are an insurance claims triage assistant. Classify urgency and recommended team."
                user_message: "{{incident_description}}"
            - name: assign-servicenow-task
              type: call
              call: "servicenow.create-task"
              with:
                short_description: "Claims triage: {{policy_number}}"
                assignment_group: "{{triage-claim.recommended_team}}"
                priority: "{{triage-claim.urgency}}"
                correlation_id: "{{create-sf-case.id}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://axa.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: cases
          path: "/sobjects/Case"
          operations:
            - name: create-case
              method: POST
    - type: http
      namespace: openai
      baseUri: "https://api.openai.com/v1"
      authentication:
        type: bearer
        token: "$secrets.openai_api_key"
      resources:
        - name: chat-completions
          path: "/chat/completions"
          operations:
            - name: create-chat-completion
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://axa.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: create-task
              method: POST

When a critical Datadog alert fires, creates a ServiceNow incident, pages the on-call engineer via PagerDuty, and posts context to the Microsoft Teams ops channel.

naftiko: "0.5"
info:
  label: "IT Incident Response and Escalation"
  description: "When a critical Datadog alert fires, creates a ServiceNow incident, pages the on-call engineer via PagerDuty, and posts context to the Microsoft Teams ops channel."
  tags:
    - itsm
    - incident-response
    - datadog
    - servicenow
    - pagerduty
    - microsoft-teams
    - operations
capability:
  exposes:
    - type: mcp
      namespace: incident-ops
      port: 8080
      tools:
        - name: handle-critical-alert
          description: "Given a Datadog alert payload with monitor ID, severity, and affected service, create a ServiceNow incident, trigger a PagerDuty page, and post an alert to the Teams ops channel."
          inputParameters:
            - name: monitor_id
              in: body
              type: string
              description: "The Datadog monitor ID that triggered the alert."
            - name: severity
              in: body
              type: string
              description: "Alert severity: 'critical', 'warning', or 'info'."
            - name: affected_service
              in: body
              type: string
              description: "Name of the affected service or application."
            - name: alert_message
              in: body
              type: string
              description: "The Datadog alert message or condition description."
          steps:
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "{{severity}} alert on {{affected_service}} — {{alert_message}}"
                urgency: "1"
                impact: "1"
                category: "infrastructure"
            - name: page-oncall
              type: call
              call: "pagerduty.create-incident"
              with:
                title: "{{severity}}: {{affected_service}} — {{alert_message}}"
                service_id: "$secrets.pagerduty_service_id"
                severity: "{{severity}}"
                body: "Monitor: {{monitor_id}} | SNOW: {{create-incident.number}}"
            - name: post-ops-alert
              type: call
              call: "msteams.post-channel-message"
              with:
                channel: "ops-alerts"
                message: "INCIDENT: {{affected_service}} | Severity: {{severity}} | SNOW: {{create-incident.number}} | PD: {{page-oncall.id}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://axa.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.pagerduty_api_key"
        placement: header
      resources:
        - name: incidents
          path: "/incidents"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Retrieves completed sprint data from Jira, calculates velocity metrics, and publishes a sprint summary report to the Engineering Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Jira Sprint Velocity Report"
  description: "Retrieves completed sprint data from Jira, calculates velocity metrics, and publishes a sprint summary report to the Engineering Microsoft Teams channel."
  tags:
    - devops
    - jira
    - microsoft-teams
    - agile
    - reporting
    - engineering
capability:
  exposes:
    - type: mcp
      namespace: agile-reporting
      port: 8080
      tools:
        - name: publish-sprint-velocity-report
          description: "Given a Jira board ID and sprint ID, retrieve sprint metrics, calculate velocity, and post a formatted summary to the Engineering Teams channel."
          inputParameters:
            - name: board_id
              in: body
              type: integer
              description: "The Jira board ID to pull sprint data from."
            - name: sprint_id
              in: body
              type: integer
              description: "The completed Jira sprint ID to report on."
          steps:
            - name: get-sprint
              type: call
              call: "jira.get-sprint"
              with:
                board_id: "{{board_id}}"
                sprint_id: "{{sprint_id}}"
            - name: get-sprint-issues
              type: call
              call: "jira.list-sprint-issues"
              with:
                sprint_id: "{{sprint_id}}"
            - name: post-velocity-report
              type: call
              call: "msteams.post-channel-message"
              with:
                channel: "engineering-metrics"
                message: "Sprint {{get-sprint.name}} complete: {{get-sprint-issues.completed_points}} story points | Velocity: {{get-sprint-issues.velocity}} | Issues closed: {{get-sprint-issues.count}}"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://axa.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: sprints
          path: "/board/{{board_id}}/sprint/{{sprint_id}}"
          inputParameters:
            - name: board_id
              in: path
            - name: sprint_id
              in: path
          operations:
            - name: get-sprint
              method: GET
        - name: sprint-issues
          path: "/sprint/{{sprint_id}}/issue"
          inputParameters:
            - name: sprint_id
              in: path
          operations:
            - name: list-sprint-issues
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Retrieves Jira issue status including assignee and priority.

naftiko: "0.5"
info:
  label: "Jira Ticket Status Lookup"
  description: "Retrieves Jira issue status including assignee and priority."
  tags:
    - engineering
    - jira
capability:
  exposes:
    - type: mcp
      namespace: jira-ops
      port: 8080
      tools:
        - name: get-ticket
          description: "Look up Jira ticket."
          inputParameters:
            - name: key
              in: body
              type: string
              description: "Issue key."
          call: "jira.get-issue"
          with:
            key: "{{key}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.fields.status.name"
            - name: assignee
              type: string
              mapping: "$.fields.assignee.displayName"
            - name: priority
              type: string
              mapping: "$.fields.priority.name"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://axa.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue/{{key}}"
          inputParameters:
            - name: key
              in: path
          operations:
            - name: get-issue
              method: GET

Pulls AXA brand campaign performance metrics from LinkedIn Marketing, combines with HubSpot lead attribution data, and posts a weekly report to the Brand Marketing Teams channel.

naftiko: "0.5"
info:
  label: "LinkedIn Brand Campaign Performance Report"
  description: "Pulls AXA brand campaign performance metrics from LinkedIn Marketing, combines with HubSpot lead attribution data, and posts a weekly report to the Brand Marketing Teams channel."
  tags:
    - marketing
    - social
    - linkedin
    - hubspot
    - microsoft-teams
    - brand
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: brand-marketing
      port: 8080
      tools:
        - name: publish-linkedin-brand-report
          description: "Given a LinkedIn organization URN and date range, fetch campaign analytics and merge with HubSpot lead data attributed to LinkedIn, then post a weekly brand performance report to Teams."
          inputParameters:
            - name: org_urn
              in: body
              type: string
              description: "The LinkedIn organization URN for AXA, e.g. 'urn:li:organization:1234'."
            - name: start_date
              in: body
              type: string
              description: "Report start date in YYYY-MM-DD format."
            - name: end_date
              in: body
              type: string
              description: "Report end date in YYYY-MM-DD format."
          steps:
            - name: get-linkedin-metrics
              type: call
              call: "linkedin.get-organization-follower-statistics"
              with:
                organizationalEntity: "{{org_urn}}"
            - name: get-hubspot-attribution
              type: call
              call: "hubspot.list-leads"
              with:
                source: "LinkedIn"
                start: "{{start_date}}"
                end: "{{end_date}}"
            - name: post-report
              type: call
              call: "msteams.post-channel-message"
              with:
                channel: "brand-marketing"
                message: "LinkedIn Brand Report ({{start_date}} to {{end_date}}): Followers {{get-linkedin-metrics.followerCount}}, New HubSpot leads from LinkedIn: {{get-hubspot-attribution.count}}"
  consumes:
    - type: http
      namespace: linkedin
      baseUri: "https://api.linkedin.com/v2"
      authentication:
        type: bearer
        token: "$secrets.linkedin_token"
      resources:
        - name: organization-follower-statistics
          path: "/organizationalEntityFollowerStatistics"
          operations:
            - name: get-organization-follower-statistics
              method: GET
    - type: http
      namespace: hubspot
      baseUri: "https://api.hubapi.com/crm/v3"
      authentication:
        type: bearer
        token: "$secrets.hubspot_token"
      resources:
        - name: contacts
          path: "/objects/contacts/search"
          operations:
            - name: list-leads
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Retrieves campaign performance metrics from HubSpot Marketing, enriches with LinkedIn Ads data, and publishes a weekly performance digest to the Marketing Teams channel.

naftiko: "0.5"
info:
  label: "Marketing Campaign Performance Digest"
  description: "Retrieves campaign performance metrics from HubSpot Marketing, enriches with LinkedIn Ads data, and publishes a weekly performance digest to the Marketing Teams channel."
  tags:
    - marketing
    - hubspot
    - linkedin
    - microsoft-teams
    - reporting
    - campaign
capability:
  exposes:
    - type: mcp
      namespace: marketing-reporting
      port: 8080
      tools:
        - name: digest-campaign-performance
          description: "Given a campaign ID and date range, fetch HubSpot campaign metrics, pull LinkedIn Ads impressions for the same period, and post a consolidated weekly digest to the Marketing Teams channel."
          inputParameters:
            - name: campaign_id
              in: body
              type: string
              description: "The HubSpot campaign ID to report on."
            - name: start_date
              in: body
              type: string
              description: "Report start date in ISO 8601 format (YYYY-MM-DD)."
            - name: end_date
              in: body
              type: string
              description: "Report end date in ISO 8601 format (YYYY-MM-DD)."
          steps:
            - name: get-hubspot-metrics
              type: call
              call: "hubspot.get-campaign-stats"
              with:
                campaign_id: "{{campaign_id}}"
                start: "{{start_date}}"
                end: "{{end_date}}"
            - name: get-linkedin-ads
              type: call
              call: "linkedin.get-ad-analytics"
              with:
                dateRange_start: "{{start_date}}"
                dateRange_end: "{{end_date}}"
            - name: post-digest
              type: call
              call: "msteams.post-channel-message"
              with:
                channel: "marketing-performance"
                message: "Campaign {{campaign_id}} ({{start_date}} to {{end_date}}): Opens {{get-hubspot-metrics.opens}}, Clicks {{get-hubspot-metrics.clicks}}, LinkedIn Impressions {{get-linkedin-ads.impressions}}"
  consumes:
    - type: http
      namespace: hubspot
      baseUri: "https://api.hubapi.com/marketing/v3"
      authentication:
        type: bearer
        token: "$secrets.hubspot_token"
      resources:
        - name: campaigns
          path: "/campaigns/{{campaign_id}}/statistics"
          inputParameters:
            - name: campaign_id
              in: path
          operations:
            - name: get-campaign-stats
              method: GET
    - type: http
      namespace: linkedin
      baseUri: "https://api.linkedin.com/v2"
      authentication:
        type: bearer
        token: "$secrets.linkedin_token"
      resources:
        - name: ad-analytics
          path: "/adAnalytics"
          operations:
            - name: get-ad-analytics
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

When a new hire record is created in Workday, provisions an Active Directory account via Microsoft Graph, opens a ServiceNow IT onboarding ticket, and sends a Microsoft Teams welcome message to the new hire.

naftiko: "0.5"
info:
  label: "New Employee Onboarding Orchestrator"
  description: "When a new hire record is created in Workday, provisions an Active Directory account via Microsoft Graph, opens a ServiceNow IT onboarding ticket, and sends a Microsoft Teams welcome message to the new hire."
  tags:
    - hr
    - onboarding
    - workday
    - servicenow
    - microsoft-graph
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-onboarding
      port: 8080
      tools:
        - name: trigger-employee-onboarding
          description: "Given a Workday employee ID and start date, orchestrate the full onboarding sequence: provision Active Directory account via Microsoft Graph, create ServiceNow IT ticket, and send Teams welcome message."
          inputParameters:
            - name: workday_employee_id
              in: body
              type: string
              description: "The Workday worker ID for the new hire. Format: WID-XXXXXXXX."
            - name: start_date
              in: body
              type: string
              description: "The employee's start date in ISO 8601 format (YYYY-MM-DD)."
            - name: department
              in: body
              type: string
              description: "The department the new hire is joining, e.g. 'Claims Operations'."
          steps:
            - name: get-worker
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{workday_employee_id}}"
            - name: provision-ad-account
              type: call
              call: "msgraph.create-user"
              with:
                displayName: "{{get-worker.full_name}}"
                userPrincipalName: "{{get-worker.work_email}}"
                department: "{{department}}"
            - name: open-it-ticket
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "IT Onboarding: {{get-worker.full_name}} starting {{start_date}}"
                category: "hr_onboarding"
                assigned_to: "IT_Onboarding_Group"
            - name: send-welcome
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{get-worker.work_email}}"
                message: "Welcome to AXA, {{get-worker.first_name}}! Your IT setup is in progress. Ticket: {{open-it-ticket.number}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/axa/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: msgraph
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: users
          path: "/users"
          operations:
            - name: create-user
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://axa.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: chats
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Creates policy in Salesforce, generates documents, and sets up billing after underwriting approval.

naftiko: "0.5"
info:
  label: "New Policy Issuance Workflow"
  description: "Creates policy in Salesforce, generates documents, and sets up billing after underwriting approval."
  tags:
    - insurance
    - policy
    - underwriting
    - salesforce
capability:
  exposes:
    - type: mcp
      namespace: issuance-ops
      port: 8080
      tools:
        - name: issue-policy
          description: "Issue new policy."
          inputParameters:
            - name: app_id
              in: body
              type: string
              description: "Application ID."
            - name: product
              in: body
              type: string
              description: "Product type."
            - name: premium
              in: body
              type: number
              description: "Premium."
          steps:
            - name: create
              type: call
              call: "salesforce.create-policy"
              with:
                app_id: "{{app_id}}"
                product: "{{product}}"
                premium: "{{premium}}"
            - name: docs
              type: call
              call: "document-api.generate"
              with:
                policy: "{{create.policy_number}}"
            - name: billing
              type: call
              call: "billing-api.create-schedule"
              with:
                policy: "{{create.policy_number}}"
                premium: "{{premium}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://axa.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: policies
          path: "/sobjects/Policy__c"
          operations:
            - name: create-policy
              method: POST
    - type: http
      namespace: document-api
      baseUri: "https://api.axa.com/documents/v1"
      authentication:
        type: bearer
        token: "$secrets.document_api_token"
      resources:
        - name: generation
          path: "/generate"
          operations:
            - name: generate
              method: POST
    - type: http
      namespace: billing-api
      baseUri: "https://api.axa.com/billing/v1"
      authentication:
        type: bearer
        token: "$secrets.billing_api_token"
      resources:
        - name: schedules
          path: "/billing-schedules"
          operations:
            - name: create-schedule
              method: POST

Compares Okta access against Workday roles and creates Jira tickets for discrepancies.

naftiko: "0.5"
info:
  label: "Okta System Access Review Workflow"
  description: "Compares Okta access against Workday roles and creates Jira tickets for discrepancies."
  tags:
    - insurance
    - okta
    - workday
    - jira
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: access-rev
      port: 8080
      tools:
        - name: review-access
          description: "Review system access."
          inputParameters:
            - name: app
              in: body
              type: string
              description: "Application."
          steps:
            - name: okta
              type: call
              call: "okta.list-users"
              with:
                app: "{{app}}"
            - name: roles
              type: call
              call: "workday.get-roster"
              with:
                dept: "all"
            - name: ticket
              type: call
              call: "jira.create-issue"
              with:
                project_key: "SEC"
                issuetype: "Task"
                summary: "Access review: {{app}}"
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://axa.okta.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.okta_api_token"
      resources:
        - name: app-users
          path: "/apps/{{app}}/users"
          inputParameters:
            - name: app
              in: path
          operations:
            - name: list-users
              method: GET
    - type: http
      namespace: workday
      baseUri: "https://wd5-impl-services1.workday.com/ccx/api/v1/axa"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: roster
          path: "/staffing/departmentRoster"
          operations:
            - name: get-roster
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://axa.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Retrieves all Okta application assignments for a user, produces an access summary, and posts it to the Security Teams channel for review. Used for quarterly access certification.

naftiko: "0.5"
info:
  label: "Okta User Access Review"
  description: "Retrieves all Okta application assignments for a user, produces an access summary, and posts it to the Security Teams channel for review. Used for quarterly access certification."
  tags:
    - identity
    - security
    - okta
    - microsoft-teams
    - access-review
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: identity-security
      port: 8080
      tools:
        - name: get-user-access-summary
          description: "Given an Okta user login, retrieve all application assignments and group memberships, then post a formatted access summary to the Security Teams channel for quarterly certification."
          inputParameters:
            - name: user_login
              in: body
              type: string
              description: "The Okta user login (email format) to review."
          steps:
            - name: get-user-apps
              type: call
              call: "okta.list-user-apps"
              with:
                user_login: "{{user_login}}"
            - name: get-user-groups
              type: call
              call: "okta.list-user-groups"
              with:
                user_login: "{{user_login}}"
            - name: post-access-summary
              type: call
              call: "msteams.post-channel-message"
              with:
                channel: "security-access-reviews"
                message: "Access review for {{user_login}}: {{get-user-apps.count}} apps, {{get-user-groups.count}} groups. Apps: {{get-user-apps.names}}"
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://axa.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_api_token"
        placement: header
      resources:
        - name: user-apps
          path: "/users/{{user_login}}/appLinks"
          inputParameters:
            - name: user_login
              in: path
          operations:
            - name: list-user-apps
              method: GET
        - name: user-groups
          path: "/users/{{user_login}}/groups"
          inputParameters:
            - name: user_login
              in: path
          operations:
            - name: list-user-groups
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Retrieves Okta group memberships for a user returning groups and access.

naftiko: "0.5"
info:
  label: "Okta User Group Membership Lookup"
  description: "Retrieves Okta group memberships for a user returning groups and access."
  tags:
    - security
    - okta
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: identity-ops
      port: 8080
      tools:
        - name: get-groups
          description: "Look up Okta groups. Returns memberships."
          inputParameters:
            - name: email
              in: body
              type: string
              description: "User email."
          call: "okta.get-groups"
          with:
            email: "{{email}}"
          outputParameters:
            - name: groups
              type: array
              mapping: "$.groups"
            - name: count
              type: integer
              mapping: "$.totalGroups"
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://axa.okta.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.okta_api_token"
      resources:
        - name: user-groups
          path: "/users/{{email}}/groups"
          inputParameters:
            - name: email
              in: path
          operations:
            - name: get-groups
              method: GET

Retrieves current on-call engineer from PagerDuty returning primary and secondary contacts.

naftiko: "0.5"
info:
  label: "PagerDuty On-Call Lookup"
  description: "Retrieves current on-call engineer from PagerDuty returning primary and secondary contacts."
  tags:
    - engineering
    - pagerduty
capability:
  exposes:
    - type: mcp
      namespace: oncall-ops
      port: 8080
      tools:
        - name: get-oncall
          description: "Look up on-call schedule. Returns contacts."
          inputParameters:
            - name: schedule_id
              in: body
              type: string
              description: "PagerDuty schedule ID."
          call: "pagerduty.get-oncall"
          with:
            schedule_id: "{{schedule_id}}"
          outputParameters:
            - name: primary
              type: string
              mapping: "$.oncalls[0].user.name"
            - name: email
              type: string
              mapping: "$.oncalls[0].user.email"
  consumes:
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: bearer
        token: "$secrets.pagerduty_token"
      resources:
        - name: oncalls
          path: "/oncalls"
          operations:
            - name: get-oncall
              method: GET

Retrieves the current on-call engineer for a given PagerDuty escalation policy and returns their name and contact details for use in incident routing.

naftiko: "0.5"
info:
  label: "PagerDuty On-Call Schedule Lookup"
  description: "Retrieves the current on-call engineer for a given PagerDuty escalation policy and returns their name and contact details for use in incident routing."
  tags:
    - itsm
    - pagerduty
    - on-call
    - incident-response
    - lookup
capability:
  exposes:
    - type: mcp
      namespace: oncall-lookup
      port: 8080
      tools:
        - name: get-current-oncall
          description: "Given a PagerDuty escalation policy ID, return the name and email of the currently on-call engineer. Use when routing incidents to the correct responder."
          inputParameters:
            - name: escalation_policy_id
              in: body
              type: string
              description: "The PagerDuty escalation policy ID to look up the on-call engineer for."
          call: "pagerduty.get-oncall"
          with:
            escalation_policy_id: "{{escalation_policy_id}}"
          outputParameters:
            - name: oncall_name
              type: string
              mapping: "$.oncalls[0].user.summary"
            - name: oncall_email
              type: string
              mapping: "$.oncalls[0].user.email"
            - name: schedule_name
              type: string
              mapping: "$.oncalls[0].schedule.summary"
  consumes:
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.pagerduty_api_key"
        placement: header
      resources:
        - name: oncalls
          path: "/oncalls"
          operations:
            - name: get-oncall
              method: GET

Updates payment method in billing and sends confirmation.

naftiko: "0.5"
info:
  label: "Payment Method Update Workflow"
  description: "Updates payment method in billing and sends confirmation."
  tags:
    - insurance
    - policy
    - billing
capability:
  exposes:
    - type: mcp
      namespace: pay-ops
      port: 8080
      tools:
        - name: update-method
          description: "Update payment method."
          inputParameters:
            - name: policy
              in: body
              type: string
              description: "Policy."
            - name: method
              in: body
              type: string
              description: "Method."
          steps:
            - name: update
              type: call
              call: "billing-api.update"
              with:
                policy: "{{policy}}"
                method: "{{method}}"
            - name: confirm
              type: call
              call: "notification-api.send"
              with:
                policy: "{{policy}}"
                template: "payment-updated"
  consumes:
    - type: http
      namespace: billing-api
      baseUri: "https://api.axa.com/billing/v1"
      authentication:
        type: bearer
        token: "$secrets.billing_api_token"
      resources:
        - name: methods
          path: "/policies/{{policy}}/payment-method"
          inputParameters:
            - name: policy
              in: path
          operations:
            - name: update
              method: PUT
    - type: http
      namespace: notification-api
      baseUri: "https://api.axa.com/notifications/v1"
      authentication:
        type: bearer
        token: "$secrets.notification_token"
      resources:
        - name: notifications
          path: "/send"
          operations:
            - name: send
              method: POST

Exports current headcount by department and cost center from ADP, uploads the snapshot to SharePoint, and posts a digest to the Finance Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Payroll Headcount Snapshot"
  description: "Exports current headcount by department and cost center from ADP, uploads the snapshot to SharePoint, and posts a digest to the Finance Microsoft Teams channel."
  tags:
    - hr
    - finance
    - payroll
    - headcount
    - adp
    - sharepoint
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-finance
      port: 8080
      tools:
        - name: get-payroll-headcount-snapshot
          description: "Export current headcount and cost center data from ADP, upload the report to SharePoint, and post a summary to the Finance Teams channel. Use for monthly headcount reconciliation."
          inputParameters:
            - name: report_month
              in: body
              type: string
              description: "The report month in YYYY-MM format, e.g. '2026-03'."
            - name: cost_center_filter
              in: body
              type: string
              description: "Optional cost center code to filter results. Leave blank for all."
          steps:
            - name: export-headcount
              type: call
              call: "adp.export-workers"
              with:
                asOfDate: "{{report_month}}"
                costCenter: "{{cost_center_filter}}"
            - name: upload-to-sharepoint
              type: call
              call: "sharepoint.upload-file"
              with:
                site_id: "finance-reports"
                folder: "Payroll/Headcount"
                filename: "headcount-{{report_month}}.csv"
                content: "{{export-headcount.csv_data}}"
            - name: post-digest
              type: call
              call: "msteams.post-channel-message"
              with:
                channel: "finance-reporting"
                message: "Headcount snapshot for {{report_month}} uploaded to SharePoint. Total employees: {{export-headcount.total_count}}."
  consumes:
    - type: http
      namespace: adp
      baseUri: "https://api.adp.com"
      authentication:
        type: bearer
        token: "$secrets.adp_token"
      resources:
        - name: workers-export
          path: "/hr/v2/workers/export"
          operations:
            - name: export-workers
              method: GET
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: drive-items
          path: "/sites/{{site_id}}/drive/root:/{{folder}}/{{filename}}:/content"
          inputParameters:
            - name: site_id
              in: path
            - name: folder
              in: path
            - name: filename
              in: path
          operations:
            - name: upload-file
              method: PUT
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Retrieves current billing status including balance, next due date, and payment method.

naftiko: "0.5"
info:
  label: "Policy Billing Status Lookup"
  description: "Retrieves current billing status including balance, next due date, and payment method."
  tags:
    - insurance
    - policy
    - billing
capability:
  exposes:
    - type: mcp
      namespace: billing-ops
      port: 8080
      tools:
        - name: get-billing
          description: "Look up billing status. Returns balance, due date, method."
          inputParameters:
            - name: policy_number
              in: body
              type: string
              description: "AXA policy number."
          call: "billing-api.get-status"
          with:
            policy_number: "{{policy_number}}"
          outputParameters:
            - name: balance
              type: number
              mapping: "$.outstandingBalance"
            - name: next_due
              type: string
              mapping: "$.nextDueDate"
            - name: method
              type: string
              mapping: "$.paymentMethod"
  consumes:
    - type: http
      namespace: billing-api
      baseUri: "https://api.axa.com/billing/v1"
      authentication:
        type: bearer
        token: "$secrets.billing_api_token"
      resources:
        - name: status
          path: "/policies/{{policy_number}}/billing-status"
          inputParameters:
            - name: policy_number
              in: path
          operations:
            - name: get-status
              method: GET

Calculates pro-rata refund, updates status in Salesforce, and logs cancellation in ServiceNow.

naftiko: "0.5"
info:
  label: "Policy Cancellation Workflow"
  description: "Calculates pro-rata refund, updates status in Salesforce, and logs cancellation in ServiceNow."
  tags:
    - insurance
    - policy
    - salesforce
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: cancel-ops
      port: 8080
      tools:
        - name: process-cancel
          description: "Process cancellation."
          inputParameters:
            - name: policy
              in: body
              type: string
              description: "Policy number."
            - name: reason
              in: body
              type: string
              description: "Reason."
            - name: date
              in: body
              type: string
              description: "Effective date."
          steps:
            - name: refund
              type: call
              call: "billing-api.calc-refund"
              with:
                policy: "{{policy}}"
                date: "{{date}}"
            - name: update
              type: call
              call: "salesforce.cancel"
              with:
                policy: "{{policy}}"
                reason: "{{reason}}"
            - name: log
              type: call
              call: "servicenow.create-case"
              with:
                short_description: "Cancel: {{policy}}"
  consumes:
    - type: http
      namespace: billing-api
      baseUri: "https://api.axa.com/billing/v1"
      authentication:
        type: bearer
        token: "$secrets.billing_api_token"
      resources:
        - name: refunds
          path: "/refunds/calculate"
          operations:
            - name: calc-refund
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://axa.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: policies
          path: "/sobjects/Policy__c"
          operations:
            - name: cancel
              method: PATCH
    - type: http
      namespace: servicenow
      baseUri: "https://axa.snowflakecomputing.com/api/v2"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: cases
          path: "/table/sn_customerservice_case"
          operations:
            - name: create-case
              method: POST

Retrieves policy coverage details from Salesforce including limits, deductibles, and endorsements.

naftiko: "0.5"
info:
  label: "Policy Coverage Details Lookup"
  description: "Retrieves policy coverage details from Salesforce including limits, deductibles, and endorsements."
  tags:
    - insurance
    - policy
    - salesforce
capability:
  exposes:
    - type: mcp
      namespace: policy-ops
      port: 8080
      tools:
        - name: get-coverage
          description: "Look up coverage for a policy. Returns limits, deductibles, endorsements."
          inputParameters:
            - name: policy_number
              in: body
              type: string
              description: "AXA policy number."
          call: "salesforce.get-policy"
          with:
            policy_number: "{{policy_number}}"
          outputParameters:
            - name: limits
              type: object
              mapping: "$.coverageLimits"
            - name: deductible
              type: number
              mapping: "$.deductible"
            - name: endorsements
              type: array
              mapping: "$.endorsements"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://axa.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: policies
          path: "/sobjects/Policy__c/{{policy_number}}"
          inputParameters:
            - name: policy_number
              in: path
          operations:
            - name: get-policy
              method: GET

Retrieves a policy document by number and type returning URL and metadata.

naftiko: "0.5"
info:
  label: "Policy Document Retrieval"
  description: "Retrieves a policy document by number and type returning URL and metadata."
  tags:
    - insurance
    - policy
    - document-management
capability:
  exposes:
    - type: mcp
      namespace: doc-ops
      port: 8080
      tools:
        - name: get-document
          description: "Retrieve policy document. Returns URL and metadata."
          inputParameters:
            - name: policy_number
              in: body
              type: string
              description: "AXA policy number."
            - name: doc_type
              in: body
              type: string
              description: "Type: declaration, endorsement, certificate."
          call: "document-api.get-doc"
          with:
            policy_number: "{{policy_number}}"
            doc_type: "{{doc_type}}"
          outputParameters:
            - name: url
              type: string
              mapping: "$.documentUrl"
            - name: modified
              type: string
              mapping: "$.lastModified"
  consumes:
    - type: http
      namespace: document-api
      baseUri: "https://api.axa.com/documents/v1"
      authentication:
        type: bearer
        token: "$secrets.document_api_token"
      resources:
        - name: documents
          path: "/policies/{{policy_number}}/documents"
          inputParameters:
            - name: policy_number
              in: path
          operations:
            - name: get-doc
              method: GET

Validates endorsement, updates policy in Salesforce, and recalculates premium.

naftiko: "0.5"
info:
  label: "Policy Endorsement Processing Workflow"
  description: "Validates endorsement, updates policy in Salesforce, and recalculates premium."
  tags:
    - insurance
    - policy
    - salesforce
    - underwriting
capability:
  exposes:
    - type: mcp
      namespace: endorse-ops
      port: 8080
      tools:
        - name: process-endorsement
          description: "Process endorsement."
          inputParameters:
            - name: policy
              in: body
              type: string
              description: "Policy."
            - name: type
              in: body
              type: string
              description: "Endorsement type."
            - name: date
              in: body
              type: string
              description: "Effective date."
          steps:
            - name: validate
              type: call
              call: "underwriting.validate"
              with:
                policy: "{{policy}}"
                type: "{{type}}"
            - name: update
              type: call
              call: "salesforce.update"
              with:
                policy: "{{policy}}"
                type: "{{type}}"
            - name: recalc
              type: call
              call: "rating.recalc"
              with:
                policy: "{{policy}}"
  consumes:
    - type: http
      namespace: underwriting
      baseUri: "https://api.axa.com/underwriting/v2"
      authentication:
        type: bearer
        token: "$secrets.underwriting_api_token"
      resources:
        - name: endorsements
          path: "/endorsements/validate"
          operations:
            - name: validate
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://axa.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: policies
          path: "/sobjects/Policy__c"
          operations:
            - name: update
              method: PATCH
    - type: http
      namespace: rating
      baseUri: "https://api.axa.com/rating/v2"
      authentication:
        type: bearer
        token: "$secrets.rating_token"
      resources:
        - name: recalc
          path: "/recalculate"
          operations:
            - name: recalc
              method: POST

Identifies at-risk policies, triggers Marketo campaigns, and creates agent tasks in Jira.

naftiko: "0.5"
info:
  label: "Policy Lapse Prevention Workflow"
  description: "Identifies at-risk policies, triggers Marketo campaigns, and creates agent tasks in Jira."
  tags:
    - insurance
    - policy
    - salesforce
    - marketo
    - jira
capability:
  exposes:
    - type: mcp
      namespace: lapse-ops
      port: 8080
      tools:
        - name: prevent-lapse
          description: "Prevent policy lapse."
          inputParameters:
            - name: days
              in: body
              type: integer
              description: "Days until lapse."
          steps:
            - name: at-risk
              type: call
              call: "salesforce.query-lapsing"
              with:
                days: "{{days}}"
            - name: campaign
              type: call
              call: "marketo.trigger"
              with:
                campaign_id: "$secrets.lapse_campaign"
            - name: tasks
              type: call
              call: "jira.create-issue"
              with:
                project_key: "RETENTION"
                issuetype: "Task"
                summary: "Lapse prevention"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://axa.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: queries
          path: "/query"
          operations:
            - name: query-lapsing
              method: GET
    - type: http
      namespace: marketo
      baseUri: "https://axa.mktorest.com/rest/v1"
      authentication:
        type: bearer
        token: "$secrets.marketo_token"
      resources:
        - name: campaigns
          path: "/campaigns/trigger.json"
          operations:
            - name: trigger
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://axa.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Retrieves premium breakdown returning base rate, risk factors, and final premium.

naftiko: "0.5"
info:
  label: "Policy Premium Breakdown Lookup"
  description: "Retrieves premium breakdown returning base rate, risk factors, and final premium."
  tags:
    - insurance
    - policy
    - actuarial
capability:
  exposes:
    - type: mcp
      namespace: premium-ops
      port: 8080
      tools:
        - name: get-premium
          description: "Look up premium breakdown. Returns base rate, factors, final premium."
          inputParameters:
            - name: policy_number
              in: body
              type: string
              description: "AXA policy number."
          call: "rating-engine.get-premium"
          with:
            policy_number: "{{policy_number}}"
          outputParameters:
            - name: base_rate
              type: number
              mapping: "$.baseRate"
            - name: risk_factors
              type: array
              mapping: "$.riskFactors"
            - name: final_premium
              type: number
              mapping: "$.finalAnnualPremium"
  consumes:
    - type: http
      namespace: rating-engine
      baseUri: "https://api.axa.com/rating/v2"
      authentication:
        type: bearer
        token: "$secrets.rating_engine_token"
      resources:
        - name: premiums
          path: "/policies/{{policy_number}}/premium"
          inputParameters:
            - name: policy_number
              in: path
          operations:
            - name: get-premium
              method: GET

Runs rating engine and creates quote record in Salesforce.

naftiko: "0.5"
info:
  label: "Policy Quote Generation Workflow"
  description: "Runs rating engine and creates quote record in Salesforce."
  tags:
    - insurance
    - underwriting
    - policy
    - salesforce
capability:
  exposes:
    - type: mcp
      namespace: quote-ops
      port: 8080
      tools:
        - name: generate-quote
          description: "Generate quote."
          inputParameters:
            - name: product
              in: body
              type: string
              description: "Product."
            - name: data
              in: body
              type: string
              description: "Applicant data."
          steps:
            - name: rate
              type: call
              call: "rating.quote"
              with:
                product: "{{product}}"
                data: "{{data}}"
            - name: create
              type: call
              call: "salesforce.create-quote"
              with:
                product: "{{product}}"
                premium: "{{rate.premium}}"
  consumes:
    - type: http
      namespace: rating
      baseUri: "https://api.axa.com/rating/v2"
      authentication:
        type: bearer
        token: "$secrets.rating_token"
      resources:
        - name: quotes
          path: "/quote"
          operations:
            - name: quote
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://axa.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: quotes
          path: "/sobjects/Quote__c"
          operations:
            - name: create-quote
              method: POST

Verifies eligibility, calculates back premium, and reinstates in Salesforce.

naftiko: "0.5"
info:
  label: "Policy Reinstatement Workflow"
  description: "Verifies eligibility, calculates back premium, and reinstates in Salesforce."
  tags:
    - insurance
    - policy
    - salesforce
    - billing
capability:
  exposes:
    - type: mcp
      namespace: reinstate-ops
      port: 8080
      tools:
        - name: reinstate
          description: "Reinstate policy."
          inputParameters:
            - name: policy
              in: body
              type: string
              description: "Lapsed policy."
          steps:
            - name: check
              type: call
              call: "underwriting.check"
              with:
                policy: "{{policy}}"
            - name: calc
              type: call
              call: "billing-api.calc"
              with:
                policy: "{{policy}}"
            - name: reinstate
              type: call
              call: "salesforce.reinstate"
              with:
                policy: "{{policy}}"
                premium: "{{calc.amount}}"
  consumes:
    - type: http
      namespace: underwriting
      baseUri: "https://api.axa.com/underwriting/v2"
      authentication:
        type: bearer
        token: "$secrets.underwriting_api_token"
      resources:
        - name: reinstatement
          path: "/reinstatement/eligibility"
          operations:
            - name: check
              method: POST
    - type: http
      namespace: billing-api
      baseUri: "https://api.axa.com/billing/v1"
      authentication:
        type: bearer
        token: "$secrets.billing_api_token"
      resources:
        - name: back-premium
          path: "/back-premium/calculate"
          operations:
            - name: calc
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://axa.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: policies
          path: "/sobjects/Policy__c"
          operations:
            - name: reinstate
              method: PATCH

Queries Salesforce for insurance policies expiring within 60 days, enriches each account in HubSpot with renewal opportunity data, and alerts account managers via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Policy Renewal Opportunity Sync"
  description: "Queries Salesforce for insurance policies expiring within 60 days, enriches each account in HubSpot with renewal opportunity data, and alerts account managers via Microsoft Teams."
  tags:
    - sales
    - crm
    - renewal
    - salesforce
    - hubspot
    - microsoft-teams
    - insurance
capability:
  exposes:
    - type: mcp
      namespace: policy-renewals
      port: 8080
      tools:
        - name: sync-renewal-opportunities
          description: "Given a look-ahead window in days, query Salesforce for expiring policies, update HubSpot renewal opportunity records, and alert account managers in Teams."
          inputParameters:
            - name: days_ahead
              in: body
              type: integer
              description: "Number of days ahead to look for expiring policies. Typically 60."
            - name: product_line
              in: body
              type: string
              description: "Insurance product line filter, e.g. 'Life', 'Property', 'Health'."
          steps:
            - name: get-expiring-policies
              type: call
              call: "salesforce.query-expiring-policies"
              with:
                days_ahead: "{{days_ahead}}"
                product_line: "{{product_line}}"
            - name: update-hubspot-deals
              type: call
              call: "hubspot.upsert-deal"
              with:
                policy_ids: "{{get-expiring-policies.policy_ids}}"
                stage: "Renewal Pending"
            - name: notify-account-managers
              type: call
              call: "msteams.post-channel-message"
              with:
                channel: "policy-renewals"
                message: "{{get-expiring-policies.count}} policies expiring in {{days_ahead}} days in {{product_line}}. HubSpot updated."
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://axa.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: policy-query
          path: "/query"
          inputParameters:
            - name: q
              in: query
          operations:
            - name: query-expiring-policies
              method: GET
    - type: http
      namespace: hubspot
      baseUri: "https://api.hubapi.com/crm/v3"
      authentication:
        type: bearer
        token: "$secrets.hubspot_token"
      resources:
        - name: deals
          path: "/objects/deals"
          operations:
            - name: upsert-deal
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Pulls claims history from Snowflake, recalculates risk, updates renewal offer in Salesforce, and notifies agent.

naftiko: "0.5"
info:
  label: "Policy Renewal Underwriting Review"
  description: "Pulls claims history from Snowflake, recalculates risk, updates renewal offer in Salesforce, and notifies agent."
  tags:
    - insurance
    - underwriting
    - policy
    - snowflake
    - salesforce
capability:
  exposes:
    - type: mcp
      namespace: renewal-ops
      port: 8080
      tools:
        - name: process-renewal
          description: "Process renewal review. Pulls history, recalcs, updates."
          inputParameters:
            - name: policy_number
              in: body
              type: string
              description: "Policy number."
          steps:
            - name: history
              type: call
              call: "snowflake.query"
              with:
                query: "SELECT * FROM CLAIMS WHERE policy='{{policy_number}}'"
            - name: recalc
              type: call
              call: "underwriting.calculate"
              with:
                policy_number: "{{policy_number}}"
            - name: update
              type: call
              call: "salesforce.update-renewal"
              with:
                policy_number: "{{policy_number}}"
                premium: "{{recalc.premium}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://axa.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: query
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://axa.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: renewals
          path: "/sobjects/Renewal__c"
          operations:
            - name: update-renewal
              method: PATCH

Retrieves complete claims history from Snowflake including dates, types, and outcomes.

naftiko: "0.5"
info:
  label: "Policyholder Claims History Lookup"
  description: "Retrieves complete claims history from Snowflake including dates, types, and outcomes."
  tags:
    - insurance
    - claims
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: claims-hist
      port: 8080
      tools:
        - name: get-history
          description: "Look up claims history. Returns all claims."
          inputParameters:
            - name: customer_id
              in: body
              type: string
              description: "AXA customer ID."
          call: "snowflake.query-claims"
          with:
            customer_id: "{{customer_id}}"
          outputParameters:
            - name: total
              type: integer
              mapping: "$.totalClaims"
            - name: claims
              type: array
              mapping: "$.claims"
            - name: paid
              type: number
              mapping: "$.totalPaid"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://axa.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: queries
          path: "/statements"
          operations:
            - name: query-claims
              method: POST

Triggers a Power BI dataset refresh for the AXA executive dashboard and notifies the Finance team via Microsoft Teams when the refresh completes or fails.

naftiko: "0.5"
info:
  label: "Power BI Report Refresh Trigger"
  description: "Triggers a Power BI dataset refresh for the AXA executive dashboard and notifies the Finance team via Microsoft Teams when the refresh completes or fails."
  tags:
    - data
    - analytics
    - power-bi
    - microsoft-teams
    - reporting
    - finance
capability:
  exposes:
    - type: mcp
      namespace: bi-reporting
      port: 8080
      tools:
        - name: trigger-powerbi-refresh
          description: "Given a Power BI workspace ID and dataset ID, trigger a dataset refresh and post the refresh status to the Finance Teams channel when complete."
          inputParameters:
            - name: workspace_id
              in: body
              type: string
              description: "The Power BI workspace (group) ID containing the dataset."
            - name: dataset_id
              in: body
              type: string
              description: "The Power BI dataset ID to refresh."
          steps:
            - name: trigger-refresh
              type: call
              call: "powerbi.trigger-refresh"
              with:
                workspace_id: "{{workspace_id}}"
                dataset_id: "{{dataset_id}}"
            - name: notify-finance
              type: call
              call: "msteams.post-channel-message"
              with:
                channel: "finance-reporting"
                message: "Power BI dataset {{dataset_id}} refresh triggered. Status: {{trigger-refresh.status}}"
  consumes:
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: dataset-refreshes
          path: "/groups/{{workspace_id}}/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: workspace_id
              in: path
            - name: dataset_id
              in: path
          operations:
            - name: trigger-refresh
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Detects Confluence updates and broadcasts to staff via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Procedure Update Notifier Workflow"
  description: "Detects Confluence updates and broadcasts to staff via Microsoft Teams."
  tags:
    - insurance
    - confluence
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: proc-notify
      port: 8080
      tools:
        - name: notify-update
          description: "Notify procedure updates."
          inputParameters:
            - name: page_id
              in: body
              type: string
              description: "Page ID."
          steps:
            - name: history
              type: call
              call: "confluence.get-history"
              with:
                page_id: "{{page_id}}"
            - name: notify
              type: call
              call: "msteams.post"
              with:
                channel_id: "$secrets.all_staff"
                text: "Updated: {{history.title}}"
  consumes:
    - type: http
      namespace: confluence
      baseUri: "https://axa.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: history
          path: "/content/{{page_id}}/history"
          inputParameters:
            - name: page_id
              in: path
          operations:
            - name: get-history
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post
              method: POST

Looks up an SAP Ariba purchase order by number and returns header status, supplier name, and total value for use in finance reconciliation workflows.

naftiko: "0.5"
info:
  label: "Procurement Purchase Order Lookup"
  description: "Looks up an SAP Ariba purchase order by number and returns header status, supplier name, and total value for use in finance reconciliation workflows."
  tags:
    - procurement
    - finance
    - sap-ariba
    - purchase-order
capability:
  exposes:
    - type: mcp
      namespace: procurement
      port: 8080
      tools:
        - name: get-purchase-order
          description: "Given a purchase order number, retrieve PO header details from SAP Ariba including status, supplier, and total value. Use for procurement status checks and finance reconciliation."
          inputParameters:
            - name: po_number
              in: body
              type: string
              description: "The SAP Ariba purchase order number to look up."
          call: "sap-ariba.get-po"
          with:
            po_number: "{{po_number}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.status"
            - name: supplier_name
              type: string
              mapping: "$.supplier.name"
            - name: total_value
              type: number
              mapping: "$.totalCost.amount"
            - name: currency
              type: string
              mapping: "$.totalCost.currencyCode"
  consumes:
    - type: http
      namespace: sap-ariba
      baseUri: "https://openapi.ariba.com/api/purchase-orders/v1"
      authentication:
        type: bearer
        token: "$secrets.sap_ariba_token"
      resources:
        - name: purchase-orders
          path: "/{{po_number}}"
          inputParameters:
            - name: po_number
              in: path
          operations:
            - name: get-po
              method: GET

Checks flood and wildfire risk for a property and logs in underwriting.

naftiko: "0.5"
info:
  label: "Property Hazard Check Workflow"
  description: "Checks flood and wildfire risk for a property and logs in underwriting."
  tags:
    - insurance
    - underwriting
    - homeowner
capability:
  exposes:
    - type: mcp
      namespace: hazard-ops
      port: 8080
      tools:
        - name: check-hazards
          description: "Check property hazards."
          inputParameters:
            - name: app_id
              in: body
              type: string
              description: "Application."
            - name: address
              in: body
              type: string
              description: "Address."
            - name: zip
              in: body
              type: string
              description: "ZIP."
          steps:
            - name: flood
              type: call
              call: "hazard-api.check-flood"
              with:
                address: "{{address}}"
                zip: "{{zip}}"
            - name: wildfire
              type: call
              call: "hazard-api.check-wildfire"
              with:
                zip: "{{zip}}"
            - name: log
              type: call
              call: "underwriting.log"
              with:
                app_id: "{{app_id}}"
                flood: "{{flood.zone}}"
  consumes:
    - type: http
      namespace: hazard-api
      baseUri: "https://api.axa.com/hazards/v1"
      authentication:
        type: bearer
        token: "$secrets.hazard_token"
      resources:
        - name: flood
          path: "/flood-zones"
          operations:
            - name: check-flood
              method: GET
    - type: http
      namespace: underwriting
      baseUri: "https://api.axa.com/underwriting/v2"
      authentication:
        type: bearer
        token: "$secrets.underwriting_api_token"
      resources:
        - name: hazards
          path: "/hazard-assessments"
          operations:
            - name: log
              method: POST

Enriches Salesforce prospect with firmographic data from ZoomInfo.

naftiko: "0.5"
info:
  label: "Prospect Enrichment Workflow"
  description: "Enriches Salesforce prospect with firmographic data from ZoomInfo."
  tags:
    - insurance
    - sales
    - zoominfo
    - salesforce
capability:
  exposes:
    - type: mcp
      namespace: enrichment
      port: 8080
      tools:
        - name: enrich
          description: "Enrich prospect."
          inputParameters:
            - name: lead_id
              in: body
              type: string
              description: "Lead ID."
            - name: company
              in: body
              type: string
              description: "Company."
          steps:
            - name: search
              type: call
              call: "zoominfo.search"
              with:
                company: "{{company}}"
            - name: update
              type: call
              call: "salesforce.update-lead"
              with:
                lead_id: "{{lead_id}}"
                industry: "{{search.industry}}"
  consumes:
    - type: http
      namespace: zoominfo
      baseUri: "https://api.zoominfo.com"
      authentication:
        type: bearer
        token: "$secrets.zoominfo_token"
      resources:
        - name: companies
          path: "/search/company"
          operations:
            - name: search
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://axa.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: leads
          path: "/sobjects/Lead/{{lead_id}}"
          inputParameters:
            - name: lead_id
              in: path
          operations:
            - name: update-lead
              method: PATCH

When a compliance review is due, retrieves policy data from Salesforce, generates a summary document using OpenAI, and uploads it to SharePoint for regulatory filing.

naftiko: "0.5"
info:
  label: "Regulatory Compliance Document Generation"
  description: "When a compliance review is due, retrieves policy data from Salesforce, generates a summary document using OpenAI, and uploads it to SharePoint for regulatory filing."
  tags:
    - compliance
    - regulatory
    - salesforce
    - openai
    - sharepoint
    - insurance
    - ai
capability:
  exposes:
    - type: mcp
      namespace: compliance-docs
      port: 8080
      tools:
        - name: generate-compliance-report
          description: "Given a policy ID and review period, retrieve policy details from Salesforce, generate a regulatory summary via OpenAI, and upload the document to SharePoint."
          inputParameters:
            - name: policy_id
              in: body
              type: string
              description: "The Salesforce policy record ID for the compliance review."
            - name: review_period
              in: body
              type: string
              description: "The review period in YYYY-QX format, e.g. '2026-Q1'."
            - name: regulation_type
              in: body
              type: string
              description: "The applicable regulation framework, e.g. 'Solvency II', 'IFRS 17'."
          steps:
            - name: get-policy
              type: call
              call: "salesforce.get-policy"
              with:
                policy_id: "{{policy_id}}"
            - name: generate-summary
              type: call
              call: "openai.create-chat-completion"
              with:
                model: "gpt-4o"
                system_prompt: "You are a regulatory compliance specialist for insurance. Generate a concise compliance summary for the given regulation."
                user_message: "Policy: {{get-policy.name}} | Period: {{review_period}} | Regulation: {{regulation_type}} | Details: {{get-policy.details}}"
            - name: upload-report
              type: call
              call: "sharepoint.upload-file"
              with:
                site_id: "compliance-portal"
                folder: "Regulatory/{{regulation_type}}"
                filename: "{{policy_id}}-{{review_period}}-compliance.pdf"
                content: "{{generate-summary.content}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://axa.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: policies
          path: "/sobjects/Insurance_Policy__c/{{policy_id}}"
          inputParameters:
            - name: policy_id
              in: path
          operations:
            - name: get-policy
              method: GET
    - type: http
      namespace: openai
      baseUri: "https://api.openai.com/v1"
      authentication:
        type: bearer
        token: "$secrets.openai_api_key"
      resources:
        - name: chat-completions
          path: "/chat/completions"
          operations:
            - name: create-chat-completion
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: drive-items
          path: "/sites/{{site_id}}/drive/root:/{{folder}}/{{filename}}:/content"
          inputParameters:
            - name: site_id
              in: path
            - name: folder
              in: path
            - name: filename
              in: path
          operations:
            - name: upload-file
              method: PUT

Compiles actuarial data from Snowflake, generates filing documents, and logs submission.

naftiko: "0.5"
info:
  label: "Regulatory Rate Filing Workflow"
  description: "Compiles actuarial data from Snowflake, generates filing documents, and logs submission."
  tags:
    - insurance
    - compliance
    - actuarial
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: rate-filing
      port: 8080
      tools:
        - name: submit-filing
          description: "Submit rate filing."
          inputParameters:
            - name: product
              in: body
              type: string
              description: "Product."
            - name: state
              in: body
              type: string
              description: "State."
            - name: change
              in: body
              type: number
              description: "Rate change %"
          steps:
            - name: compile
              type: call
              call: "snowflake.query"
              with:
                query: "CALL COMPILE_RATE_FILING('{{product}}','{{state}}')"
            - name: gen
              type: call
              call: "document-api.generate"
              with:
                product: "{{product}}"
                state: "{{state}}"
            - name: log
              type: call
              call: "compliance-api.log"
              with:
                product: "{{product}}"
                state: "{{state}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://axa.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: query
              method: POST
    - type: http
      namespace: document-api
      baseUri: "https://api.axa.com/documents/v1"
      authentication:
        type: bearer
        token: "$secrets.document_api_token"
      resources:
        - name: filings
          path: "/generate/rate-filing"
          operations:
            - name: generate
              method: POST
    - type: http
      namespace: compliance-api
      baseUri: "https://api.axa.com/compliance/v1"
      authentication:
        type: bearer
        token: "$secrets.compliance_api_token"
      resources:
        - name: filings
          path: "/filings"
          operations:
            - name: log
              method: POST

Queries Snowflake for treaty data, validates terms, and publishes to Confluence.

naftiko: "0.5"
info:
  label: "Reinsurance Treaty Compliance Report"
  description: "Queries Snowflake for treaty data, validates terms, and publishes to Confluence."
  tags:
    - insurance
    - actuarial
    - compliance
    - snowflake
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: reinsurance-ops
      port: 8080
      tools:
        - name: treaty-report
          description: "Generate treaty report."
          inputParameters:
            - name: treaty
              in: body
              type: string
              description: "Treaty ID."
            - name: period
              in: body
              type: string
              description: "YYYY-Q."
          steps:
            - name: query
              type: call
              call: "snowflake.query"
              with:
                query: "SELECT * FROM TREATY WHERE treaty='{{treaty}}'"
            - name: validate
              type: call
              call: "reinsurance-api.validate"
              with:
                treaty: "{{treaty}}"
            - name: publish
              type: call
              call: "confluence.create-page"
              with:
                space_key: "REINSURANCE"
                title: "Treaty {{treaty}} - {{period}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://axa.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: query
              method: POST
    - type: http
      namespace: reinsurance-api
      baseUri: "https://api.axa.com/reinsurance/v1"
      authentication:
        type: bearer
        token: "$secrets.reinsurance_token"
      resources:
        - name: validation
          path: "/treaties/validate"
          operations:
            - name: validate
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://axa.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: pages
          path: "/content"
          operations:
            - name: create-page
              method: POST

Checks coverage, creates vendor auth, and updates claim in ServiceNow.

naftiko: "0.5"
info:
  label: "Rental Car Authorization Workflow"
  description: "Checks coverage, creates vendor auth, and updates claim in ServiceNow."
  tags:
    - insurance
    - claims
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: rental-ops
      port: 8080
      tools:
        - name: auth-rental
          description: "Authorize rental."
          inputParameters:
            - name: claim_id
              in: body
              type: string
              description: "Claim."
            - name: days
              in: body
              type: integer
              description: "Days."
          steps:
            - name: check
              type: call
              call: "claims-api.check-rental"
              with:
                claim_id: "{{claim_id}}"
            - name: auth
              type: call
              call: "rental-api.create-auth"
              with:
                claim_id: "{{claim_id}}"
                days: "{{days}}"
            - name: update
              type: call
              call: "servicenow.update"
              with:
                claim_id: "{{claim_id}}"
                rental: "{{auth.id}}"
  consumes:
    - type: http
      namespace: claims-api
      baseUri: "https://api.axa.com/claims/v2"
      authentication:
        type: bearer
        token: "$secrets.claims_api_token"
      resources:
        - name: rental
          path: "/claims/{{claim_id}}/rental"
          inputParameters:
            - name: claim_id
              in: path
          operations:
            - name: check-rental
              method: GET
    - type: http
      namespace: rental-api
      baseUri: "https://api.axa.com/rental/v1"
      authentication:
        type: bearer
        token: "$secrets.rental_token"
      resources:
        - name: auths
          path: "/authorizations"
          operations:
            - name: create-auth
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://axa.snowflakecomputing.com/api/v2"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: cases
          path: "/table/sn_customerservice_case/{{claim_id}}"
          inputParameters:
            - name: claim_id
              in: path
          operations:
            - name: update
              method: PATCH

Triggers Marketo retention campaigns and logs in Salesforce.

naftiko: "0.5"
info:
  label: "Retention Campaign Launcher"
  description: "Triggers Marketo retention campaigns and logs in Salesforce."
  tags:
    - insurance
    - policy
    - marketo
    - salesforce
capability:
  exposes:
    - type: mcp
      namespace: retention-ops
      port: 8080
      tools:
        - name: launch-retention
          description: "Launch retention campaign."
          inputParameters:
            - name: segment
              in: body
              type: string
              description: "Segment."
            - name: campaign
              in: body
              type: string
              description: "Campaign ID."
          steps:
            - name: trigger
              type: call
              call: "marketo.trigger"
              with:
                campaign_id: "{{campaign}}"
                segment: "{{segment}}"
            - name: log
              type: call
              call: "salesforce.create-log"
              with:
                campaign: "Retention: {{segment}}"
  consumes:
    - type: http
      namespace: marketo
      baseUri: "https://axa.mktorest.com/rest/v1"
      authentication:
        type: bearer
        token: "$secrets.marketo_token"
      resources:
        - name: campaigns
          path: "/campaigns/{{campaign}}/trigger.json"
          inputParameters:
            - name: campaign
              in: path
          operations:
            - name: trigger
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://axa.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: logs
          path: "/sobjects/CampaignLog__c"
          operations:
            - name: create-log
              method: POST

Retrieves customer account from Salesforce including contact details and policy count.

naftiko: "0.5"
info:
  label: "Salesforce Account Lookup"
  description: "Retrieves customer account from Salesforce including contact details and policy count."
  tags:
    - insurance
    - salesforce
    - crm
capability:
  exposes:
    - type: mcp
      namespace: account-ops
      port: 8080
      tools:
        - name: get-account
          description: "Look up Salesforce account."
          inputParameters:
            - name: account_id
              in: body
              type: string
              description: "Account ID."
          call: "salesforce.get-account"
          with:
            account_id: "{{account_id}}"
          outputParameters:
            - name: name
              type: string
              mapping: "$.Name"
            - name: policies
              type: integer
              mapping: "$.Policy_Count__c"
            - name: tier
              type: string
              mapping: "$.Account_Tier__c"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://axa.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: accounts
          path: "/sobjects/Account/{{account_id}}"
          inputParameters:
            - name: account_id
              in: path
          operations:
            - name: get-account
              method: GET

When a qualified insurance lead is flagged in Salesforce, enriches the contact record, converts it to an opportunity, and assigns the account manager via HubSpot.

naftiko: "0.5"
info:
  label: "Salesforce Lead to Opportunity Conversion"
  description: "When a qualified insurance lead is flagged in Salesforce, enriches the contact record, converts it to an opportunity, and assigns the account manager via HubSpot."
  tags:
    - sales
    - crm
    - salesforce
    - hubspot
    - lead-management
    - insurance
capability:
  exposes:
    - type: mcp
      namespace: sales-crm
      port: 8080
      tools:
        - name: convert-lead-to-opportunity
          description: "Given a Salesforce lead ID and qualifying score, enrich the lead record, convert it to an opportunity, and create a corresponding HubSpot deal."
          inputParameters:
            - name: lead_id
              in: body
              type: string
              description: "The Salesforce lead ID to convert."
            - name: lead_score
              in: body
              type: integer
              description: "Lead qualification score (0-100). Must be above 70 to convert."
            - name: product_interest
              in: body
              type: string
              description: "The AXA product the lead is interested in, e.g. 'Life Insurance', 'Health'."
          steps:
            - name: get-lead
              type: call
              call: "salesforce-lookup.get-lead"
              with:
                lead_id: "{{lead_id}}"
            - name: convert-lead
              type: call
              call: "salesforce-update.convert-lead"
              with:
                lead_id: "{{lead_id}}"
                opportunity_name: "{{get-lead.company}} — {{product_interest}}"
            - name: create-hubspot-deal
              type: call
              call: "hubspot.create-deal"
              with:
                dealname: "{{get-lead.company}} — {{product_interest}}"
                email: "{{get-lead.email}}"
                dealstage: "qualified"
                amount: "{{get-lead.estimated_premium}}"
  consumes:
    - type: http
      namespace: salesforce-lookup
      baseUri: "https://axa.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: leads
          path: "/sobjects/Lead/{{lead_id}}"
          inputParameters:
            - name: lead_id
              in: path
          operations:
            - name: get-lead
              method: GET
    - type: http
      namespace: salesforce-update
      baseUri: "https://axa.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: lead-convert
          path: "/sobjects/Lead/{{lead_id}}/convert"
          inputParameters:
            - name: lead_id
              in: path
          operations:
            - name: convert-lead
              method: POST
    - type: http
      namespace: hubspot
      baseUri: "https://api.hubapi.com/crm/v3"
      authentication:
        type: bearer
        token: "$secrets.hubspot_token"
      resources:
        - name: deals
          path: "/objects/deals"
          operations:
            - name: create-deal
              method: POST

Queries Salesforce for open opportunities closing in the current quarter, aggregates forecast by product line, and posts a pipeline digest to the Sales Leadership Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Salesforce Opportunity Forecast Digest"
  description: "Queries Salesforce for open opportunities closing in the current quarter, aggregates forecast by product line, and posts a pipeline digest to the Sales Leadership Microsoft Teams channel."
  tags:
    - sales
    - salesforce
    - forecasting
    - microsoft-teams
    - reporting
    - finance
capability:
  exposes:
    - type: mcp
      namespace: sales-forecasting
      port: 8080
      tools:
        - name: digest-quarterly-forecast
          description: "Query Salesforce for open opportunities closing this quarter, grouped by product line, and post a pipeline forecast digest to the Sales Leadership Teams channel."
          inputParameters:
            - name: fiscal_quarter
              in: body
              type: string
              description: "The fiscal quarter to forecast, e.g. '2026-Q1'."
            - name: product_line
              in: body
              type: string
              description: "Insurance product line to filter by, e.g. 'Commercial P&C'. Leave blank for all."
          steps:
            - name: query-opportunities
              type: call
              call: "salesforce.query-opportunities"
              with:
                quarter: "{{fiscal_quarter}}"
                product_line: "{{product_line}}"
            - name: post-forecast-digest
              type: call
              call: "msteams.post-channel-message"
              with:
                channel: "sales-leadership"
                message: "Q{{fiscal_quarter}} Forecast ({{product_line}}): {{query-opportunities.count}} open opps | Pipeline value: €{{query-opportunities.total_value}} | Weighted: €{{query-opportunities.weighted_value}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://axa.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opportunity-query
          path: "/query"
          inputParameters:
            - name: q
              in: query
          operations:
            - name: query-opportunities
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Reconciles invoices against POs in SAP and creates ServiceNow tickets.

naftiko: "0.5"
info:
  label: "SAP Invoice Reconciliation Workflow"
  description: "Reconciles invoices against POs in SAP and creates ServiceNow tickets."
  tags:
    - finance
    - sap
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: invoice-ops
      port: 8080
      tools:
        - name: reconcile
          description: "Reconcile invoices."
          inputParameters:
            - name: vendor
              in: body
              type: string
              description: "Vendor."
            - name: period
              in: body
              type: string
              description: "YYYY-MM."
          steps:
            - name: invoices
              type: call
              call: "sap.get-invoices"
              with:
                vendor: "{{vendor}}"
                period: "{{period}}"
            - name: pos
              type: call
              call: "sap.get-pos"
              with:
                vendor: "{{vendor}}"
                period: "{{period}}"
            - name: ticket
              type: call
              call: "servicenow.create-case"
              with:
                short_description: "Recon: {{vendor}} - {{period}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://axa-sap.s4hana.cloud.sap/api/v1"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: invoices
          path: "/invoices"
          operations:
            - name: get-invoices
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://axa.snowflakecomputing.com/api/v2"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: cases
          path: "/table/sn_customerservice_case"
          operations:
            - name: create-case
              method: POST

Looks up purchase order in SAP returning status, supplier, and value.

naftiko: "0.5"
info:
  label: "SAP Purchase Order Lookup"
  description: "Looks up purchase order in SAP returning status, supplier, and value."
  tags:
    - procurement
    - finance
    - sap
capability:
  exposes:
    - type: mcp
      namespace: po-ops
      port: 8080
      tools:
        - name: get-po
          description: "Look up PO. Returns status, supplier, value."
          inputParameters:
            - name: po_number
              in: body
              type: string
              description: "SAP PO number."
          call: "sap.get-po"
          with:
            po_number: "{{po_number}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.status"
            - name: supplier
              type: string
              mapping: "$.supplier.name"
            - name: value
              type: number
              mapping: "$.totalCost.amount"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://axa-sap.s4hana.cloud.sap/api/v1"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: purchase-orders
          path: "/purchase-orders/{{po_number}}"
          inputParameters:
            - name: po_number
              in: path
          operations:
            - name: get-po
              method: GET

Creates a ServiceNow change request for infrastructure changes, routes it through the CAB approval chain, and notifies stakeholders via Microsoft Teams at each stage.

naftiko: "0.5"
info:
  label: "ServiceNow Change Request Approval Workflow"
  description: "Creates a ServiceNow change request for infrastructure changes, routes it through the CAB approval chain, and notifies stakeholders via Microsoft Teams at each stage."
  tags:
    - itsm
    - change-management
    - servicenow
    - microsoft-teams
    - approval
    - operations
capability:
  exposes:
    - type: mcp
      namespace: change-management
      port: 8080
      tools:
        - name: submit-change-request
          description: "Given change details, create a ServiceNow change request, assign it to the CAB, and notify the Change Management Teams channel with a link for approval."
          inputParameters:
            - name: change_title
              in: body
              type: string
              description: "Short description of the proposed change."
            - name: change_description
              in: body
              type: string
              description: "Detailed description of what is changing, why, and the rollback plan."
            - name: risk_level
              in: body
              type: string
              description: "Risk level: 'low', 'medium', or 'high'."
            - name: planned_date
              in: body
              type: string
              description: "Planned implementation date in YYYY-MM-DD format."
          steps:
            - name: create-change
              type: call
              call: "servicenow.create-change"
              with:
                short_description: "{{change_title}}"
                description: "{{change_description}}"
                risk: "{{risk_level}}"
                planned_start_date: "{{planned_date}}"
            - name: notify-cab
              type: call
              call: "msteams.post-channel-message"
              with:
                channel: "change-advisory-board"
                message: "New change request submitted: {{change_title}} | Risk: {{risk_level}} | Planned: {{planned_date}} | SNOW: {{create-change.number}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://axa.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: changes
          path: "/table/change_request"
          operations:
            - name: create-change
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Searches ServiceNow knowledge base for articles matching a query.

naftiko: "0.5"
info:
  label: "ServiceNow Knowledge Article Search"
  description: "Searches ServiceNow knowledge base for articles matching a query."
  tags:
    - insurance
    - servicenow
    - knowledge-management
capability:
  exposes:
    - type: mcp
      namespace: kb-ops
      port: 8080
      tools:
        - name: search-kb
          description: "Search knowledge base. Returns articles."
          inputParameters:
            - name: query
              in: body
              type: string
              description: "Search query."
            - name: category
              in: body
              type: string
              description: "Category."
          call: "servicenow.search"
          with:
            query: "{{query}}"
            category: "{{category}}"
          outputParameters:
            - name: articles
              type: array
              mapping: "$.result"
            - name: total
              type: integer
              mapping: "$.totalResults"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://axa.snowflakecomputing.com/api/v2"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: knowledge
          path: "/table/kb_knowledge"
          operations:
            - name: search
              method: GET

Runs data quality validation queries on AXA's Snowflake actuarial data warehouse to detect nulls, outliers, and schema drift, and posts results to the Actuarial Data Teams channel.

naftiko: "0.5"
info:
  label: "Snowflake Actuarial Data Quality Check"
  description: "Runs data quality validation queries on AXA's Snowflake actuarial data warehouse to detect nulls, outliers, and schema drift, and posts results to the Actuarial Data Teams channel."
  tags:
    - data
    - analytics
    - snowflake
    - data-quality
    - actuarial
    - insurance
capability:
  exposes:
    - type: mcp
      namespace: actuarial-data
      port: 8080
      tools:
        - name: run-actuarial-data-quality-check
          description: "Given a Snowflake table name and validation rules, execute data quality checks and post a pass/fail report to the Actuarial Data Teams channel."
          inputParameters:
            - name: table_name
              in: body
              type: string
              description: "The fully qualified Snowflake table name, e.g. 'AXA_DW_PROD.ACTUARIAL.LOSS_TRIANGLES'."
            - name: check_date
              in: body
              type: string
              description: "The date to run data quality checks against in YYYY-MM-DD format."
          steps:
            - name: run-dq-query
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT COUNT(*) as total, COUNT_IF(claim_amount IS NULL) as null_count FROM {{table_name}} WHERE report_date = '{{check_date}}'"
            - name: post-dq-results
              type: call
              call: "msteams.post-channel-message"
              with:
                channel: "actuarial-data"
                message: "DQ check on {{table_name}} for {{check_date}}: Total rows {{run-dq-query.total}}, Null claim amounts: {{run-dq-query.null_count}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://axa.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Runs data quality checks in Snowflake and creates Jira tickets for breached thresholds.

naftiko: "0.5"
info:
  label: "Snowflake Claims Data Quality Check"
  description: "Runs data quality checks in Snowflake and creates Jira tickets for breached thresholds."
  tags:
    - insurance
    - claims
    - data
    - snowflake
    - jira
capability:
  exposes:
    - type: mcp
      namespace: dq-ops
      port: 8080
      tools:
        - name: check-quality
          description: "Check data quality."
          inputParameters:
            - name: date
              in: body
              type: string
              description: "Check date."
          steps:
            - name: check
              type: call
              call: "snowflake.query"
              with:
                query: "CALL RUN_DQ_CHECKS('{{date}}')"
            - name: ticket
              type: call
              call: "jira.create-issue"
              with:
                project_key: "DATA"
                issuetype: "Bug"
                summary: "DQ issues {{date}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://axa.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: query
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://axa.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Retrieves CLV score from Snowflake including retention probability and revenue projection.

naftiko: "0.5"
info:
  label: "Snowflake Customer Lifetime Value Lookup"
  description: "Retrieves CLV score from Snowflake including retention probability and revenue projection."
  tags:
    - insurance
    - analytics
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: clv-ops
      port: 8080
      tools:
        - name: get-clv
          description: "Look up CLV. Returns score, retention, revenue."
          inputParameters:
            - name: customer_id
              in: body
              type: string
              description: "AXA customer ID."
          call: "snowflake.query-clv"
          with:
            customer_id: "{{customer_id}}"
          outputParameters:
            - name: ltv
              type: number
              mapping: "$.ltvScore"
            - name: retention
              type: number
              mapping: "$.retentionProbability"
            - name: revenue
              type: number
              mapping: "$.projectedAnnualRevenue"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://axa.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: queries
          path: "/statements"
          operations:
            - name: query-clv
              method: POST

Queries Snowflake for failed or delayed data pipeline tasks in the insurance data warehouse, posts a health report to the Data Engineering Teams channel, and creates ServiceNow tickets for failures.

naftiko: "0.5"
info:
  label: "Snowflake Data Pipeline Health Check"
  description: "Queries Snowflake for failed or delayed data pipeline tasks in the insurance data warehouse, posts a health report to the Data Engineering Teams channel, and creates ServiceNow tickets for failures."
  tags:
    - data
    - analytics
    - snowflake
    - servicenow
    - microsoft-teams
    - data-quality
capability:
  exposes:
    - type: mcp
      namespace: data-ops
      port: 8080
      tools:
        - name: check-pipeline-health
          description: "Query Snowflake for failed task runs in the last N hours, open ServiceNow incidents for failures, and post a health summary to the Data Engineering Teams channel."
          inputParameters:
            - name: look_back_hours
              in: body
              type: integer
              description: "Hours to look back for failed pipeline tasks, typically 24."
            - name: database_name
              in: body
              type: string
              description: "The Snowflake database to check, e.g. 'AXA_DW_PROD'."
          steps:
            - name: get-failed-tasks
              type: call
              call: "snowflake.query-task-history"
              with:
                database: "{{database_name}}"
                hours: "{{look_back_hours}}"
                state: "FAILED"
            - name: create-snow-incident
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Snowflake pipeline failures in {{database_name}}: {{get-failed-tasks.count}} tasks failed"
                category: "data_engineering"
                urgency: "2"
            - name: post-health-report
              type: call
              call: "msteams.post-channel-message"
              with:
                channel: "data-engineering"
                message: "Pipeline health (last {{look_back_hours}}h): {{get-failed-tasks.count}} failed tasks in {{database_name}}. SNOW: {{create-snow-incident.number}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://axa.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: task-history
          path: "/databases/{{database}}/schemas/information_schema/task_history"
          inputParameters:
            - name: database
              in: path
          operations:
            - name: query-task-history
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://axa.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Triggers a Terraform Cloud workspace run to provision or update AXA cloud infrastructure, monitors run status, and alerts the Platform Engineering team via Microsoft Teams on completion.

naftiko: "0.5"
info:
  label: "Terraform Cloud Infrastructure Provisioning"
  description: "Triggers a Terraform Cloud workspace run to provision or update AXA cloud infrastructure, monitors run status, and alerts the Platform Engineering team via Microsoft Teams on completion."
  tags:
    - cloud
    - infrastructure
    - terraform
    - microsoft-teams
    - devops
    - provisioning
capability:
  exposes:
    - type: mcp
      namespace: infra-provisioning
      port: 8080
      tools:
        - name: trigger-terraform-run
          description: "Given a Terraform Cloud workspace ID and message, trigger a new plan-and-apply run, then notify the Platform Engineering Teams channel with the run URL and status."
          inputParameters:
            - name: workspace_id
              in: body
              type: string
              description: "The Terraform Cloud workspace ID to trigger the run against."
            - name: run_message
              in: body
              type: string
              description: "Description message for this Terraform run, e.g. 'Provision AKS cluster for claims service'."
          steps:
            - name: trigger-run
              type: call
              call: "terraform.create-run"
              with:
                workspace_id: "{{workspace_id}}"
                message: "{{run_message}}"
            - name: notify-platform
              type: call
              call: "msteams.post-channel-message"
              with:
                channel: "platform-engineering"
                message: "Terraform run triggered on {{workspace_id}}: {{run_message}} | Run ID: {{trigger-run.id}} | URL: {{trigger-run.url}}"
  consumes:
    - type: http
      namespace: terraform
      baseUri: "https://app.terraform.io/api/v2"
      authentication:
        type: bearer
        token: "$secrets.terraform_token"
      resources:
        - name: runs
          path: "/runs"
          operations:
            - name: create-run
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Provisions infrastructure via Terraform Cloud and notifies platform team.

naftiko: "0.5"
info:
  label: "Terraform Infrastructure Provisioning Workflow"
  description: "Provisions infrastructure via Terraform Cloud and notifies platform team."
  tags:
    - engineering
    - terraform
    - microsoft-azure
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: infra-ops
      port: 8080
      tools:
        - name: provision
          description: "Provision infrastructure."
          inputParameters:
            - name: workspace
              in: body
              type: string
              description: "Workspace."
            - name: env
              in: body
              type: string
              description: "Environment."
          steps:
            - name: run
              type: call
              call: "terraform.create-run"
              with:
                workspace: "{{workspace}}"
                message: "Provisioning {{env}}"
            - name: notify
              type: call
              call: "msteams.post"
              with:
                channel_id: "$secrets.platform_channel"
                text: "Terraform: {{workspace}} ({{env}})"
  consumes:
    - type: http
      namespace: terraform
      baseUri: "https://app.terraform.io/api/v2"
      authentication:
        type: bearer
        token: "$secrets.terraform_token"
      resources:
        - name: runs
          path: "/runs"
          operations:
            - name: create-run
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post
              method: POST

Checks current underwriting appetite for product, state, and risk class.

naftiko: "0.5"
info:
  label: "Underwriting Appetite Check"
  description: "Checks current underwriting appetite for product, state, and risk class."
  tags:
    - insurance
    - underwriting
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: appetite-ops
      port: 8080
      tools:
        - name: check-appetite
          description: "Check appetite. Returns status and restrictions."
          inputParameters:
            - name: product
              in: body
              type: string
              description: "Product type."
            - name: state
              in: body
              type: string
              description: "State code."
            - name: risk_class
              in: body
              type: string
              description: "Risk class."
          call: "uw-api.check"
          with:
            product: "{{product}}"
            state: "{{state}}"
            risk_class: "{{risk_class}}"
          outputParameters:
            - name: accepting
              type: boolean
              mapping: "$.isAccepting"
            - name: restrictions
              type: array
              mapping: "$.restrictions"
  consumes:
    - type: http
      namespace: uw-api
      baseUri: "https://api.axa.com/underwriting/v2"
      authentication:
        type: bearer
        token: "$secrets.underwriting_api_token"
      resources:
        - name: appetite
          path: "/appetite"
          operations:
            - name: check
              method: GET

Generates profitability report from Snowflake and publishes to Power BI.

naftiko: "0.5"
info:
  label: "Underwriting Profitability Report"
  description: "Generates profitability report from Snowflake and publishes to Power BI."
  tags:
    - insurance
    - underwriting
    - actuarial
    - snowflake
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: uw-profit
      port: 8080
      tools:
        - name: gen-profitability
          description: "Generate UW profitability."
          inputParameters:
            - name: product
              in: body
              type: string
              description: "Product."
            - name: period
              in: body
              type: string
              description: "YYYY-Q."
          steps:
            - name: query
              type: call
              call: "snowflake.query"
              with:
                query: "SELECT state,combined_ratio FROM PROFITABILITY WHERE product='{{product}}'"
            - name: refresh
              type: call
              call: "powerbi.refresh"
              with:
                group_id: "$secrets.pbi_uw"
                dataset_id: "$secrets.pbi_profit"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://axa.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: query
              method: POST
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/groups/{{group_id}}/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: group_id
              in: path
            - name: dataset_id
              in: path
          operations:
            - name: refresh
              method: POST

Retrieves underwriting risk score for a policy application returning grade, score, and action.

naftiko: "0.5"
info:
  label: "Underwriting Risk Score Lookup"
  description: "Retrieves underwriting risk score for a policy application returning grade, score, and action."
  tags:
    - insurance
    - underwriting
    - risk
capability:
  exposes:
    - type: mcp
      namespace: uw-ops
      port: 8080
      tools:
        - name: get-risk-score
          description: "Look up risk score for application. Returns grade and action."
          inputParameters:
            - name: application_id
              in: body
              type: string
              description: "Application ID."
          call: "risk-engine.get-score"
          with:
            application_id: "{{application_id}}"
          outputParameters:
            - name: risk_grade
              type: string
              mapping: "$.riskGrade"
            - name: score
              type: number
              mapping: "$.overallScore"
            - name: action
              type: string
              mapping: "$.recommendedAction"
  consumes:
    - type: http
      namespace: risk-engine
      baseUri: "https://api.axa.com/underwriting/v2"
      authentication:
        type: bearer
        token: "$secrets.underwriting_api_token"
      resources:
        - name: scores
          path: "/applications/{{application_id}}/risk-score"
          inputParameters:
            - name: application_id
              in: path
          operations:
            - name: get-score
              method: GET

Reconciles vendor payments against authorizations and flags discrepancies.

naftiko: "0.5"
info:
  label: "Vendor Payment Reconciliation Workflow"
  description: "Reconciles vendor payments against authorizations and flags discrepancies."
  tags:
    - insurance
    - claims
    - finance
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: vendor-recon
      port: 8080
      tools:
        - name: reconcile-vendor
          description: "Reconcile vendor payments."
          inputParameters:
            - name: vendor
              in: body
              type: string
              description: "Vendor."
            - name: period
              in: body
              type: string
              description: "YYYY-MM."
          steps:
            - name: invoices
              type: call
              call: "claims-api.get-invoices"
              with:
                vendor: "{{vendor}}"
                period: "{{period}}"
            - name: auths
              type: call
              call: "claims-api.get-auths"
              with:
                vendor: "{{vendor}}"
                period: "{{period}}"
            - name: flag
              type: call
              call: "servicenow.create-case"
              with:
                short_description: "Vendor recon: {{vendor}} - {{period}}"
  consumes:
    - type: http
      namespace: claims-api
      baseUri: "https://api.axa.com/claims/v2"
      authentication:
        type: bearer
        token: "$secrets.claims_api_token"
      resources:
        - name: vendor-data
          path: "/vendors/{{vendor}}/invoices"
          inputParameters:
            - name: vendor
              in: path
          operations:
            - name: get-invoices
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://axa.snowflakecomputing.com/api/v2"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: cases
          path: "/table/sn_customerservice_case"
          operations:
            - name: create-case
              method: POST

Pulls vendor data from SAP, scores risk, and creates assessment in ServiceNow.

naftiko: "0.5"
info:
  label: "Vendor Risk Assessment Workflow"
  description: "Pulls vendor data from SAP, scores risk, and creates assessment in ServiceNow."
  tags:
    - insurance
    - compliance
    - sap
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: vendor-risk
      port: 8080
      tools:
        - name: assess-vendor
          description: "Assess vendor risk."
          inputParameters:
            - name: vendor_id
              in: body
              type: string
              description: "Vendor ID."
            - name: type
              in: body
              type: string
              description: "Assessment type."
          steps:
            - name: get
              type: call
              call: "sap.get-vendor"
              with:
                vendor_id: "{{vendor_id}}"
            - name: score
              type: call
              call: "risk-api.score"
              with:
                name: "{{get.name}}"
                type: "{{type}}"
            - name: log
              type: call
              call: "servicenow.create-record"
              with:
                table: "u_vendor_risk"
                vendor: "{{vendor_id}}"
                level: "{{score.level}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://axa-sap.s4hana.cloud.sap/api/v1"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: vendors
          path: "/suppliers/{{vendor_id}}"
          inputParameters:
            - name: vendor_id
              in: path
          operations:
            - name: get-vendor
              method: GET
    - type: http
      namespace: risk-api
      baseUri: "https://api.axa.com/risk/v1"
      authentication:
        type: bearer
        token: "$secrets.risk_token"
      resources:
        - name: scoring
          path: "/vendors/score"
          operations:
            - name: score
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://axa.snowflakecomputing.com/api/v2"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: records
          path: "/table/u_vendor_risk"
          operations:
            - name: create-record
              method: POST

Queries Snowflake for policy exposure in severe weather regions and refreshes Power BI.

naftiko: "0.5"
info:
  label: "Weather Exposure Analysis Workflow"
  description: "Queries Snowflake for policy exposure in severe weather regions and refreshes Power BI."
  tags:
    - insurance
    - actuarial
    - catastrophe
    - snowflake
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: exposure-ops
      port: 8080
      tools:
        - name: analyze-exposure
          description: "Analyze weather exposure."
          inputParameters:
            - name: type
              in: body
              type: string
              description: "Weather type."
            - name: zips
              in: body
              type: string
              description: "Affected ZIPs."
          steps:
            - name: query
              type: call
              call: "snowflake.query"
              with:
                query: "SELECT lob,COUNT(*),SUM(tiv) FROM POLICIES WHERE zip IN ('{{zips}}') GROUP BY lob"
            - name: refresh
              type: call
              call: "powerbi.refresh"
              with:
                group_id: "$secrets.pbi_cat"
                dataset_id: "$secrets.pbi_exposure"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://axa.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: query
              method: POST
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/groups/{{group_id}}/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: group_id
              in: path
            - name: dataset_id
              in: path
          operations:
            - name: refresh
              method: POST

Looks up the current status of an employee absence request in Workday by request ID, returning approval status, dates, and approver information.

naftiko: "0.5"
info:
  label: "Workday Absence Request Status Lookup"
  description: "Looks up the current status of an employee absence request in Workday by request ID, returning approval status, dates, and approver information."
  tags:
    - hr
    - workday
    - absence-management
    - lookup
capability:
  exposes:
    - type: mcp
      namespace: hr-absence
      port: 8080
      tools:
        - name: get-absence-request-status
          description: "Given a Workday absence request ID, return the current approval status, leave dates, leave type, and approver name. Use for employee self-service or manager review."
          inputParameters:
            - name: absence_request_id
              in: body
              type: string
              description: "The Workday absence request ID to look up."
          call: "workday.get-absence-request"
          with:
            request_id: "{{absence_request_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.data.approvalStatus"
            - name: start_date
              type: string
              mapping: "$.data.startDate"
            - name: end_date
              type: string
              mapping: "$.data.endDate"
            - name: leave_type
              type: string
              mapping: "$.data.leaveType"
            - name: approver_name
              type: string
              mapping: "$.data.approver.name"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: absence-requests
          path: "/axa/absenceRequests/{{request_id}}"
          inputParameters:
            - name: request_id
              in: path
          operations:
            - name: get-absence-request
              method: GET

Retrieves employee benefits eligibility from Workday including enrolled and eligible plans.

naftiko: "0.5"
info:
  label: "Workday Benefits Eligibility Lookup"
  description: "Retrieves employee benefits eligibility from Workday including enrolled and eligible plans."
  tags:
    - hr
    - workday
    - benefits
capability:
  exposes:
    - type: mcp
      namespace: benefits-ops
      port: 8080
      tools:
        - name: get-benefits
          description: "Look up benefits eligibility."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "Workday employee ID."
          call: "workday.get-benefits"
          with:
            employee_id: "{{employee_id}}"
          outputParameters:
            - name: enrolled
              type: array
              mapping: "$.enrolledPlans"
            - name: eligible
              type: array
              mapping: "$.eligiblePlans"
            - name: status
              type: string
              mapping: "$.enrollmentStatus"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd5-impl-services1.workday.com/ccx/api/v1/axa"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: benefits
          path: "/benefits/eligibility/{{employee_id}}"
          inputParameters:
            - name: employee_id
              in: path
          operations:
            - name: get-benefits
              method: GET

When an employee role change is processed in Workday, updates their Okta group membership to match the new role's access profile and notifies IT via ServiceNow.

naftiko: "0.5"
info:
  label: "Workday Role Change Access Provisioning"
  description: "When an employee role change is processed in Workday, updates their Okta group membership to match the new role's access profile and notifies IT via ServiceNow."
  tags:
    - hr
    - identity
    - workday
    - okta
    - servicenow
    - role-change
    - access-management
capability:
  exposes:
    - type: mcp
      namespace: hr-access
      port: 8080
      tools:
        - name: sync-role-change-access
          description: "Given a Workday worker ID and new role, update Okta group memberships to match the new access profile and create a ServiceNow task to confirm provisioning."
          inputParameters:
            - name: workday_employee_id
              in: body
              type: string
              description: "The Workday worker ID for the employee whose role changed."
            - name: new_role
              in: body
              type: string
              description: "The new job role name as defined in the AXA role catalogue."
            - name: old_role
              in: body
              type: string
              description: "The previous job role name for de-provisioning reference."
          steps:
            - name: get-worker
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{workday_employee_id}}"
            - name: update-okta-groups
              type: call
              call: "okta.update-user-groups"
              with:
                user_login: "{{get-worker.work_email}}"
                add_group: "{{new_role}}"
                remove_group: "{{old_role}}"
            - name: create-provisioning-task
              type: call
              call: "servicenow.create-task"
              with:
                short_description: "Role change access update: {{get-worker.full_name}} from {{old_role}} to {{new_role}}"
                assignment_group: "IT_Access_Management"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/axa/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: okta
      baseUri: "https://axa.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_api_token"
        placement: header
      resources:
        - name: user-groups
          path: "/users/{{user_login}}/groups"
          inputParameters:
            - name: user_login
              in: path
          operations:
            - name: update-user-groups
              method: PUT
    - type: http
      namespace: servicenow
      baseUri: "https://axa.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: create-task
              method: POST

Retrieves employee time off balances from Workday including vacation, sick, and personal hours.

naftiko: "0.5"
info:
  label: "Workday Time Off Balance Lookup"
  description: "Retrieves employee time off balances from Workday including vacation, sick, and personal hours."
  tags:
    - hr
    - workday
capability:
  exposes:
    - type: mcp
      namespace: timeoff-ops
      port: 8080
      tools:
        - name: get-balance
          description: "Look up time off balances."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "Workday employee ID."
          call: "workday.get-balance"
          with:
            employee_id: "{{employee_id}}"
          outputParameters:
            - name: vacation
              type: number
              mapping: "$.vacationBalance"
            - name: sick
              type: number
              mapping: "$.sickBalance"
            - name: personal
              type: number
              mapping: "$.personalBalance"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd5-impl-services1.workday.com/ccx/api/v1/axa"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: time-off
          path: "/timeOff/balances/{{employee_id}}"
          inputParameters:
            - name: employee_id
              in: path
          operations:
            - name: get-balance
              method: GET