Zurich Insurance Capabilities

Naftiko 0.5 capability definitions for Zurich Insurance - 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://zurich.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://zurich.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.zurichinsurance.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://zurich.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

Validates address, updates policy, and recalculates premium.

naftiko: "0.5"
info:
  label: "Address Change Workflow"
  description: "Validates address, updates policy, and recalculates premium."
  tags:
    - insurance
    - policy
    - salesforce
    - underwriting
capability:
  exposes:
    - type: mcp
      namespace: addr-ops
      port: 8080
      tools:
        - name: change-address
          description: "Process address change."
          inputParameters:
            - name: policy
              in: body
              type: string
              description: "Policy."
            - name: address
              in: body
              type: string
              description: "Address."
            - name: zip
              in: body
              type: string
              description: "ZIP."
          steps:
            - name: validate
              type: call
              call: "address-api.validate"
              with:
                address: "{{address}}"
                zip: "{{zip}}"
            - name: update
              type: call
              call: "salesforce.update"
              with:
                policy: "{{policy}}"
                address: "{{validate.standardized}}"
            - name: recalc
              type: call
              call: "rating.recalc"
              with:
                policy: "{{policy}}"
  consumes:
    - type: http
      namespace: address-api
      baseUri: "https://api.zurichinsurance.com/address/v1"
      authentication:
        type: bearer
        token: "$secrets.address_token"
      resources:
        - name: validation
          path: "/validate"
          operations:
            - name: validate
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://zurich.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.zurichinsurance.com/rating/v2"
      authentication:
        type: bearer
        token: "$secrets.rating_token"
      resources:
        - name: recalc
          path: "/recalculate"
          operations:
            - name: recalc
              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.zurichinsurance.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

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

Dispatches appraiser, creates work order, and notifies adjuster.

naftiko: "0.5"
info:
  label: "Appraisal Vendor Dispatch Workflow"
  description: "Dispatches appraiser, creates work order, and notifies adjuster."
  tags:
    - insurance
    - claims
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: appraisal-ops
      port: 8080
      tools:
        - name: dispatch
          description: "Dispatch appraiser."
          inputParameters:
            - name: claim_id
              in: body
              type: string
              description: "Claim."
            - name: address
              in: body
              type: string
              description: "Address."
            - name: loss
              in: body
              type: string
              description: "Loss type."
          steps:
            - name: find
              type: call
              call: "vendor-api.find"
              with:
                location: "{{address}}"
                specialty: "{{loss}}"
            - name: wo
              type: call
              call: "servicenow.create-wo"
              with:
                short_description: "Appraisal: {{claim_id}}"
            - name: notify
              type: call
              call: "msteams.post"
              with:
                channel_id: "$secrets.claims_channel"
                text: "Appraiser: {{claim_id}}"
  consumes:
    - type: http
      namespace: vendor-api
      baseUri: "https://api.zurichinsurance.com/vendors/v1"
      authentication:
        type: bearer
        token: "$secrets.vendor_token"
      resources:
        - name: appraisers
          path: "/appraisers/search"
          operations:
            - name: find
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://zurich.snowflakecomputing.com/api/v2"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: work-orders
          path: "/table/wm_order"
          operations:
            - name: create-wo
              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://zurich.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://zurichinsurance.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

Detects Azure subscription spend anomalies above a daily threshold and notifies the FinOps team via Microsoft Teams with a cost breakdown.

naftiko: "0.5"
info:
  label: "Azure Cloud Cost Anomaly Detection"
  description: "Detects Azure subscription spend anomalies above a daily threshold and notifies the FinOps team via Microsoft Teams with a cost breakdown."
  tags:
    - cloud
    - finops
    - azure
    - microsoft-teams
    - cost-management
capability:
  exposes:
    - type: mcp
      namespace: cloud-finops
      port: 8080
      tools:
        - name: alert-azure-cost-anomaly
          description: "Given an Azure subscription ID and spend threshold, retrieve daily usage cost data and post an anomaly alert to the FinOps Teams channel if the threshold is exceeded. Use for daily cloud spend governance on insurance platform infrastructure."
          inputParameters:
            - name: subscription_id
              in: body
              type: string
              description: "Azure subscription ID to monitor (GUID format)."
            - name: threshold_usd
              in: body
              type: number
              description: "Daily spend threshold in USD above which to alert."
          steps:
            - name: get-usage-cost
              type: call
              call: azure-cost.get-usage-details
              with:
                subscription_id: "{{subscription_id}}"
            - name: post-cost-anomaly-alert
              type: call
              call: msteams-finops.send-message
              with:
                channel_id: "$secrets.teams_finops_channel_id"
                text: "Azure cost anomaly: Subscription {{subscription_id}} daily spend {{get-usage-cost.total_cost}} exceeds threshold ${{threshold_usd}}. Top service: {{get-usage-cost.top_service}}."
  consumes:
    - type: http
      namespace: azure-cost
      baseUri: "https://management.azure.com/subscriptions"
      authentication:
        type: bearer
        token: "$secrets.azure_mgmt_token"
      resources:
        - name: usage-details
          path: "/{{subscription_id}}/providers/Microsoft.Consumption/usageDetails"
          inputParameters:
            - name: subscription_id
              in: path
          operations:
            - name: get-usage-details
              method: GET
    - type: http
      namespace: msteams-finops
      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: send-message
              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://zurichinsurance.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.zurichinsurance.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://zurich.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://zurich.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://zurich.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://zurich.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/zurich"
      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://zurich.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.zurichinsurance.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://zurich.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.zurichinsurance.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://zurich.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://zurichinsurance.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.zurichinsurance.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.zurichinsurance.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://zurich.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.zurichinsurance.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://zurich.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: "Zurich Insurance 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://zurich.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

Retrieves a complex claim document set from SharePoint, sends the content to an AI model for structured triage summarization, and posts the summary to the claims adjuster in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Claims Triage AI Summarization"
  description: "Retrieves a complex claim document set from SharePoint, sends the content to an AI model for structured triage summarization, and posts the summary to the claims adjuster in Microsoft Teams."
  tags:
    - ai
    - claims
    - insurance
    - microsoft-teams
    - triage
capability:
  exposes:
    - type: mcp
      namespace: claims-ai
      port: 8080
      tools:
        - name: summarize-claim-documents
          description: "Given a claim ID and SharePoint document library path, retrieve claim documents, submit them to an AI model for structured triage summarization, and deliver the summary to the adjuster in Microsoft Teams. Use to accelerate complex commercial claims triage."
          inputParameters:
            - name: claim_id
              in: body
              type: string
              description: "Zurich claim ID to triage (e.g. ZIC-2025-00012345)."
            - name: sharepoint_site_id
              in: body
              type: string
              description: "SharePoint site ID where claim documents are stored."
            - name: adjuster_upn
              in: body
              type: string
              description: "Microsoft UPN of the claims adjuster to notify."
          steps:
            - name: get-claim-documents
              type: call
              call: sharepoint.list-documents
              with:
                site_id: "{{sharepoint_site_id}}"
                folder_path: "Claims/{{claim_id}}"
            - name: generate-ai-summary
              type: call
              call: openai.create-chat-completion
              with:
                model: gpt-4o
                messages: "Summarize the following insurance claim documents and provide a structured triage assessment including loss type, estimated severity, and recommended next steps:\n\n{{get-claim-documents.content}}"
            - name: deliver-summary
              type: call
              call: msteams-adjuster.send-message
              with:
                recipient_upn: "{{adjuster_upn}}"
                text: "AI triage summary for claim {{claim_id}}:\n\n{{generate-ai-summary.choices[0].message.content}}"
  consumes:
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: documents
          path: "/sites/{{site_id}}/drive/root:{{folder_path}}:/children"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
          operations:
            - name: list-documents
              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: msteams-adjuster
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: chats
          path: "/users/{{upn}}/chats"
          inputParameters:
            - name: upn
              in: path
          operations:
            - name: send-message
              method: POST

Aggregates commercial lines risk exposure from Snowflake by industry sector and geography, then refreshes the risk management Power BI dashboard for underwriting leadership.

naftiko: "0.5"
info:
  label: "Commercial Lines Risk Aggregation"
  description: "Aggregates commercial lines risk exposure from Snowflake by industry sector and geography, then refreshes the risk management Power BI dashboard for underwriting leadership."
  tags:
    - insurance
    - underwriting
    - actuarial
    - snowflake
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: risk-agg
      port: 8080
      tools:
        - name: aggregate-commercial-risk
          description: "Aggregate commercial lines risk exposure by sector and geography. Refreshes dashboard. Use for quarterly risk reviews."
          inputParameters:
            - name: sector
              in: body
              type: string
              description: "Industry sector: manufacturing, technology, healthcare, financial."
            - name: period
              in: body
              type: string
              description: "Reporting period YYYY-Q."
          steps:
            - name: query-exposure
              type: call
              call: "snowflake.query"
              with:
                query: "SELECT geography, SUM(tiv), COUNT(*) FROM COMMERCIAL_POLICIES WHERE sector='{{sector}}' GROUP BY geography"
            - name: refresh-dashboard
              type: call
              call: "powerbi.refresh"
              with:
                group_id: "$secrets.pbi_risk_group"
                dataset_id: "$secrets.pbi_commercial_risk"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://zurich.snowflakecomputing.com/api/v2"
      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

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.zurichinsurance.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://zurich.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.zurichinsurance.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://zurichinsurance.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

Retrieves Confluence page content by ID returning title, body, and last modified.

naftiko: "0.5"
info:
  label: "Confluence Page Content Lookup"
  description: "Retrieves Confluence page content by ID returning title, body, and last modified."
  tags:
    - knowledge-management
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: content-ops
      port: 8080
      tools:
        - name: get-page
          description: "Look up Confluence page."
          inputParameters:
            - name: page_id
              in: body
              type: string
              description: "Page ID."
          call: "confluence.get-page"
          with:
            page_id: "{{page_id}}"
          outputParameters:
            - name: title
              type: string
              mapping: "$.title"
            - name: body
              type: string
              mapping: "$.body.storage.value"
            - name: modified
              type: string
              mapping: "$.version.when"
  consumes:
    - type: http
      namespace: confluence
      baseUri: "https://zurichinsurance.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: pages
          path: "/content/{{page_id}}"
          inputParameters:
            - name: page_id
              in: path
          operations:
            - name: get-page
              method: GET

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://zurich.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.zurichinsurance.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://zurich.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://zurich.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://zurich.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

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://zurich.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.zurichinsurance.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://zurich.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

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://zurich.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://zurich.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

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://zurichinsurance.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://zurich.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://zurich.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://zurich.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 workflow fails on a protected branch, creates a Jira bug and alerts the platform engineering team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "GitHub CI/CD Pipeline Failure to Jira"
  description: "When a GitHub Actions workflow fails on a protected branch, creates a Jira bug and alerts the platform engineering team via Microsoft Teams."
  tags:
    - devops
    - cicd
    - github
    - jira
    - microsoft-teams
    - incident-response
capability:
  exposes:
    - type: mcp
      namespace: cicd-failure-ops
      port: 8080
      tools:
        - name: handle-pipeline-failure
          description: "Given a failed GitHub Actions run, create a Jira bug and alert the platform engineering Teams channel. Invoke on protected-branch pipeline failures for insurance platform application repositories."
          inputParameters:
            - name: repo
              in: body
              type: string
              description: "GitHub repository in owner/repo format (e.g. zurich-insurance/claims-platform)."
            - name: workflow_run_id
              in: body
              type: string
              description: "GitHub Actions workflow run ID that failed."
            - name: branch
              in: body
              type: string
              description: "Branch name where the failure occurred."
            - name: commit_sha
              in: body
              type: string
              description: "Commit SHA of the failed run."
          steps:
            - name: get-run-details
              type: call
              call: github.get-workflow-run
              with:
                repo: "{{repo}}"
                run_id: "{{workflow_run_id}}"
            - name: create-jira-bug
              type: call
              call: jira.create-issue
              with:
                project_key: PLAT
                issuetype: Bug
                summary: "[CI Failure] {{repo}} / {{branch}} — {{get-run-details.name}}"
                description: "Workflow: {{get-run-details.name}}\nBranch: {{branch}}\nCommit: {{commit_sha}}\nURL: {{get-run-details.html_url}}"
            - name: alert-platform-eng
              type: call
              call: msteams-plat.send-message
              with:
                channel_id: "$secrets.teams_platform_channel_id"
                text: "CI/CD failure: {{repo}} | Branch: {{branch}} | Jira: {{create-jira-bug.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://zurich.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams-plat
      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: send-message
              method: POST

Scans GitHub repositories for open Dependabot alerts, aggregates by severity, and posts a weekly digest to the AppSec Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "GitHub Security Advisory Digest for Insurance Apps"
  description: "Scans GitHub repositories for open Dependabot alerts, aggregates by severity, and posts a weekly digest to the AppSec Microsoft Teams channel."
  tags:
    - devops
    - security
    - github
    - microsoft-teams
    - devsecops
    - appsec
capability:
  exposes:
    - type: mcp
      namespace: appsec-digest
      port: 8080
      tools:
        - name: digest-security-advisories
          description: "Given a GitHub organization and severity filter, retrieve open Dependabot alerts and post a weekly digest to the AppSec Teams channel. Use for weekly security hygiene reviews on insurance platform repositories."
          inputParameters:
            - name: github_org
              in: body
              type: string
              description: "GitHub organization to scan (e.g. zurich-insurance)."
            - name: severity_filter
              in: body
              type: string
              description: "Minimum severity to include: critical, high, medium."
          steps:
            - name: get-alerts
              type: call
              call: github.list-org-alerts
              with:
                org: "{{github_org}}"
                severity: "{{severity_filter}}"
            - name: post-advisory-digest
              type: call
              call: msteams-appsec.send-message
              with:
                channel_id: "$secrets.teams_appsec_channel_id"
                text: "Weekly security advisory digest for {{github_org}}: {{get-alerts.total_count}} open alerts (Critical: {{get-alerts.critical_count}}, High: {{get-alerts.high_count}}). Review in GitHub Security."
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: org-alerts
          path: "/orgs/{{org}}/dependabot/alerts"
          inputParameters:
            - name: org
              in: path
            - name: severity
              in: query
          operations:
            - name: list-org-alerts
              method: GET
    - type: http
      namespace: msteams-appsec
      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: send-message
              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://zurichinsurance.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.zurichinsurance.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.zurichinsurance.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.zurichinsurance.com/notifications/v1"
      authentication:
        type: bearer
        token: "$secrets.notification_token"
      resources:
        - name: notifications
          path: "/send"
          operations:
            - name: send
              method: POST

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.zurichinsurance.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.zurichinsurance.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://zurich.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 property or casualty claim is submitted in Salesforce, creates a linked ServiceNow claims management task and notifies the assigned adjuster via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Insurance Claim Intake and ServiceNow Ticket Creation"
  description: "When a new property or casualty claim is submitted in Salesforce, creates a linked ServiceNow claims management task and notifies the assigned adjuster via Microsoft Teams."
  tags:
    - insurance
    - claims
    - salesforce
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: claims-intake
      port: 8080
      tools:
        - name: create-claim-task
          description: "Given a Salesforce claim case ID and adjuster UPN, retrieve claim details, create a ServiceNow claims task, and notify the adjuster in Microsoft Teams. Invoke when a new P&C claim is submitted and requires assignment."
          inputParameters:
            - name: claim_case_id
              in: body
              type: string
              description: "Salesforce claim case record ID (18-character)."
            - name: adjuster_upn
              in: body
              type: string
              description: "Microsoft UPN of the assigned claims adjuster."
          steps:
            - name: get-claim
              type: call
              call: salesforce.get-case
              with:
                case_id: "{{claim_case_id}}"
            - name: create-servicenow-task
              type: call
              call: servicenow-claims.create-task
              with:
                category: claims_management
                short_description: "New claim: {{get-claim.subject}} — Policy {{get-claim.policy_number}}"
                description: "Claim type: {{get-claim.claim_type}}\nPolicy: {{get-claim.policy_number}}\nClaimant: {{get-claim.contact_name}}\nIncident date: {{get-claim.incident_date}}"
            - name: notify-adjuster
              type: call
              call: msteams-claims.send-message
              with:
                recipient_upn: "{{adjuster_upn}}"
                text: "New claim assigned: {{get-claim.subject}} | Policy: {{get-claim.policy_number}} | Claimant: {{get-claim.contact_name}} | ServiceNow task: {{create-servicenow-task.number}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://zurich.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: servicenow-claims
      baseUri: "https://zurich.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-claims
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: chats
          path: "/users/{{upn}}/chats"
          inputParameters:
            - name: upn
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves completed sprint data from Jira and posts a velocity and delivery summary to the technology leadership Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Jira Sprint Velocity and Delivery Report"
  description: "Retrieves completed sprint data from Jira and posts a velocity and delivery summary to the technology leadership Microsoft Teams channel."
  tags:
    - devops
    - jira
    - microsoft-teams
    - reporting
    - agile
capability:
  exposes:
    - type: mcp
      namespace: agile-delivery
      port: 8080
      tools:
        - name: publish-sprint-delivery-report
          description: "Given a Jira board ID and sprint ID, retrieve completed issues, calculate velocity, and post the delivery report to the technology leadership Teams channel. Use after each sprint close."
          inputParameters:
            - name: board_id
              in: body
              type: string
              description: "Jira board ID (numeric string)."
            - name: sprint_id
              in: body
              type: string
              description: "Jira sprint ID for the completed sprint."
          steps:
            - name: get-sprint-details
              type: call
              call: jira.get-sprint
              with:
                sprint_id: "{{sprint_id}}"
            - name: get-completed-issues
              type: call
              call: jira.search-issues
              with:
                jql: "sprint = {{sprint_id}} AND status = Done"
            - name: post-delivery-report
              type: call
              call: msteams-tech.send-message
              with:
                channel_id: "$secrets.teams_tech_channel_id"
                text: "Sprint {{get-sprint-details.name}} delivery: {{get-completed-issues.total}} issues completed. Goal: {{get-sprint-details.goal}}."
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://zurich.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: sprints
          path: "/sprint/{{sprint_id}}"
          inputParameters:
            - name: sprint_id
              in: path
          operations:
            - name: get-sprint
              method: GET
        - name: issues
          path: "/search"
          inputParameters:
            - name: jql
              in: query
          operations:
            - name: search-issues
              method: GET
    - type: http
      namespace: msteams-tech
      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: send-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://zurichinsurance.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

Retrieves an approved Workday job requisition for an insurance role and publishes it to LinkedIn Jobs for external advertising.

naftiko: "0.5"
info:
  label: "LinkedIn Job Requisition Publishing"
  description: "Retrieves an approved Workday job requisition for an insurance role and publishes it to LinkedIn Jobs for external advertising."
  tags:
    - hr
    - recruiting
    - workday
    - linkedin
capability:
  exposes:
    - type: mcp
      namespace: talent-acquisition
      port: 8080
      tools:
        - name: post-job-to-linkedin
          description: "Given a Workday job requisition ID, retrieve job details and publish the opening to LinkedIn Jobs. Use when an approved requisition for an underwriter, actuary, claims, or operations role is ready to advertise."
          inputParameters:
            - name: requisition_id
              in: body
              type: string
              description: "Workday job requisition ID (e.g. JR-00011234)."
            - name: linkedin_organization_id
              in: body
              type: string
              description: "LinkedIn organization ID for the Zurich Insurance company page."
          steps:
            - name: get-requisition
              type: call
              call: workday.get-job-requisition
              with:
                requisition_id: "{{requisition_id}}"
            - name: create-job-posting
              type: call
              call: linkedin.create-job-posting
              with:
                organization_id: "{{linkedin_organization_id}}"
                title: "{{get-requisition.job_title}}"
                description: "{{get-requisition.job_description}}"
                location: "{{get-requisition.location}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: job-requisitions
          path: "/zurich/jobRequisitions/{{requisition_id}}"
          inputParameters:
            - name: requisition_id
              in: path
          operations:
            - name: get-job-requisition
              method: GET
    - type: http
      namespace: linkedin
      baseUri: "https://api.linkedin.com/v2"
      authentication:
        type: bearer
        token: "$secrets.linkedin_token"
      resources:
        - name: job-postings
          path: "/jobPostings"
          operations:
            - name: create-job-posting
              method: POST

When a new employee is created in Workday, opens a ServiceNow onboarding ticket, provisions Microsoft 365 access, and sends a Microsoft Teams welcome message with first-day instructions.

naftiko: "0.5"
info:
  label: "New Employee Onboarding Orchestrator"
  description: "When a new employee is created in Workday, opens a ServiceNow onboarding ticket, provisions Microsoft 365 access, and sends a Microsoft Teams welcome message with first-day instructions."
  tags:
    - hr
    - onboarding
    - workday
    - servicenow
    - 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 across ServiceNow and Microsoft Teams. Invoke when a new underwriter, claims adjuster, actuary, or operations employee begins at Zurich Insurance."
          inputParameters:
            - name: workday_employee_id
              in: body
              type: string
              description: "Workday worker ID for the new employee."
            - name: start_date
              in: body
              type: string
              description: "Employment start date in ISO 8601 format (YYYY-MM-DD)."
            - name: business_unit
              in: body
              type: string
              description: "Zurich business unit (e.g. Property Casualty, Life, Commercial Insurance)."
          steps:
            - name: get-worker
              type: call
              call: workday.get-worker
              with:
                worker_id: "{{workday_employee_id}}"
            - name: open-onboarding-ticket
              type: call
              call: servicenow.create-incident
              with:
                category: hr_onboarding
                short_description: "New employee onboarding: {{get-worker.full_name}} — {{business_unit}}"
                assigned_group: IT_Onboarding
            - name: send-welcome
              type: call
              call: msteams.send-message
              with:
                recipient_upn: "{{get-worker.work_email}}"
                text: "Welcome to Zurich Insurance, {{get-worker.first_name}}! Your onboarding ticket is {{open-onboarding-ticket.number}}. Your start date is {{start_date}}."
  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: "/zurich/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://zurich.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/{{upn}}/chats"
          inputParameters:
            - name: 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://zurich.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.zurichinsurance.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.zurichinsurance.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://zurichinsurance.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/zurich"
      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://zurichinsurance.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 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://zurichinsurance.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

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.zurichinsurance.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.zurichinsurance.com/notifications/v1"
      authentication:
        type: bearer
        token: "$secrets.notification_token"
      resources:
        - name: notifications
          path: "/send"
          operations:
            - name: send
              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: "Zurich Insurance 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.zurichinsurance.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.zurichinsurance.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://zurich.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://zurich.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: "Zurich Insurance 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://zurich.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: "Zurich Insurance 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.zurichinsurance.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.zurichinsurance.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://zurich.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.zurichinsurance.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://zurich.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://zurichinsurance.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://zurichinsurance.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: "Zurich Insurance 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.zurichinsurance.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.zurichinsurance.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://zurich.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.zurichinsurance.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.zurichinsurance.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://zurich.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

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://zurich.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://zurich.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: "Zurich Insurance 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://zurich.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 actuarial reserve dashboards after Snowflake data loads and notifies the actuarial team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Power BI Actuarial Reserve Dashboard Refresh"
  description: "Triggers a Power BI dataset refresh for actuarial reserve dashboards after Snowflake data loads and notifies the actuarial team via Microsoft Teams."
  tags:
    - data
    - analytics
    - power-bi
    - microsoft-teams
    - actuarial
capability:
  exposes:
    - type: mcp
      namespace: actuarial-reporting
      port: 8080
      tools:
        - name: refresh-actuarial-dashboard
          description: "Given a Power BI workspace ID and dataset ID, trigger a refresh of the actuarial reserve dashboard and notify the actuarial team in Microsoft Teams. Use after nightly Snowflake reserve calculations complete."
          inputParameters:
            - name: workspace_id
              in: body
              type: string
              description: "Power BI workspace (group) ID containing the actuarial dataset."
            - name: dataset_id
              in: body
              type: string
              description: "Power BI dataset ID for the actuarial reserve dashboard."
            - name: dashboard_name
              in: body
              type: string
              description: "Human-readable name of the actuarial dashboard (e.g. Loss Reserve Monitor)."
          steps:
            - name: trigger-refresh
              type: call
              call: powerbi.trigger-dataset-refresh
              with:
                group_id: "{{workspace_id}}"
                dataset_id: "{{dataset_id}}"
            - name: notify-actuarial
              type: call
              call: msteams-actuarial.send-message
              with:
                channel_id: "$secrets.teams_actuarial_channel_id"
                text: "Actuarial dashboard refresh triggered: {{dashboard_name}} (dataset {{dataset_id}}). 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/{{group_id}}/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: group_id
              in: path
            - name: dataset_id
              in: path
          operations:
            - name: trigger-dataset-refresh
              method: POST
    - type: http
      namespace: msteams-actuarial
      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: send-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://zurichinsurance.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

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.zurichinsurance.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.zurichinsurance.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://zurich.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

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://zurich.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.zurichinsurance.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.zurichinsurance.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://zurich.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.zurichinsurance.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://zurichinsurance.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.zurichinsurance.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.zurichinsurance.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://zurich.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://zurichinsurance.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://zurich.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://zurich.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 Salesforce claims case is escalated to critical priority, creates a ServiceNow P1 incident, notifies the claims manager via Microsoft Teams, and logs the escalation in Snowflake.

naftiko: "0.5"
info:
  label: "Salesforce Claims Case Escalation"
  description: "When a Salesforce claims case is escalated to critical priority, creates a ServiceNow P1 incident, notifies the claims manager via Microsoft Teams, and logs the escalation in Snowflake."
  tags:
    - claims
    - insurance
    - salesforce
    - servicenow
    - microsoft-teams
    - snowflake
    - escalation
capability:
  exposes:
    - type: mcp
      namespace: claims-escalation
      port: 8080
      tools:
        - name: escalate-claims-case
          description: "Given a Salesforce claims case ID, retrieve case details, create a ServiceNow P1 incident, notify the claims manager in Microsoft Teams, and log the escalation to Snowflake. Invoke when a claims case is marked critical priority."
          inputParameters:
            - name: case_id
              in: body
              type: string
              description: "Salesforce claims case ID (18-character)."
            - name: manager_upn
              in: body
              type: string
              description: "Microsoft UPN of the claims manager to notify."
          steps:
            - name: get-case
              type: call
              call: salesforce-esc.get-case
              with:
                case_id: "{{case_id}}"
            - name: create-p1-incident
              type: call
              call: servicenow-esc.create-incident
              with:
                category: claims_management
                impact: 1
                urgency: 1
                short_description: "Critical claim escalation: {{get-case.subject}}"
                description: "Salesforce case {{case_id}}: {{get-case.description}}\nPolicy: {{get-case.policy_number}}\nClaimant: {{get-case.contact_name}}"
            - name: notify-manager
              type: call
              call: msteams-esc.send-message
              with:
                recipient_upn: "{{manager_upn}}"
                text: "Critical claim escalated: {{get-case.subject}} | Policy: {{get-case.policy_number}} | Claimant: {{get-case.contact_name}} | ServiceNow: {{create-p1-incident.number}}"
  consumes:
    - type: http
      namespace: salesforce-esc
      baseUri: "https://zurich.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: servicenow-esc
      baseUri: "https://zurich.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-esc
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: chats
          path: "/users/{{upn}}/chats"
          inputParameters:
            - name: upn
              in: path
          operations:
            - name: send-message
              method: POST

When a Salesforce NPS survey response is marked as a detractor, creates a recovery case and notifies the account manager via Microsoft Teams with recovery instructions.

naftiko: "0.5"
info:
  label: "Salesforce Customer NPS Detractor Recovery"
  description: "When a Salesforce NPS survey response is marked as a detractor, creates a recovery case and notifies the account manager via Microsoft Teams with recovery instructions."
  tags:
    - customer-experience
    - salesforce
    - microsoft-teams
    - nps
    - insurance
capability:
  exposes:
    - type: mcp
      namespace: nps-recovery
      port: 8080
      tools:
        - name: handle-nps-detractor
          description: "Given a Salesforce survey response ID and NPS score, retrieve the policyholder account details, create a recovery case, and notify the account manager in Microsoft Teams. Invoke when an NPS score of 0-6 is submitted by a policyholder."
          inputParameters:
            - name: survey_response_id
              in: body
              type: string
              description: "Salesforce survey response record ID."
            - name: nps_score
              in: body
              type: integer
              description: "NPS score submitted (0-10)."
          steps:
            - name: get-survey-response
              type: call
              call: salesforce-nps.get-survey-response
              with:
                response_id: "{{survey_response_id}}"
            - name: create-recovery-case
              type: call
              call: salesforce-recovery.create-case
              with:
                account_id: "{{get-survey-response.account_id}}"
                subject: "NPS Detractor Recovery: {{get-survey-response.account_name}} — score {{nps_score}}"
                type: NPS_Recovery
            - name: notify-account-manager
              type: call
              call: msteams-am.send-message
              with:
                recipient_upn: "{{get-survey-response.account_manager_upn}}"
                text: "NPS detractor alert: {{get-survey-response.account_name}} scored {{nps_score}}. Recovery case: {{create-recovery-case.case_number}}. Please contact within 24 hours."
  consumes:
    - type: http
      namespace: salesforce-nps
      baseUri: "https://zurich.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: survey-responses
          path: "/sobjects/SurveyQuestionResponse/{{response_id}}"
          inputParameters:
            - name: response_id
              in: path
          operations:
            - name: get-survey-response
              method: GET
    - type: http
      namespace: salesforce-recovery
      baseUri: "https://zurich.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: msteams-am
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: chats
          path: "/users/{{upn}}/chats"
          inputParameters:
            - name: upn
              in: path
          operations:
            - name: send-message
              method: POST

Converts a qualified Salesforce insurance quote into an opportunity, notifies the assigned underwriter via Microsoft Teams, and logs the conversion in Snowflake for pipeline tracking.

naftiko: "0.5"
info:
  label: "Salesforce Policy Quote to Opportunity Conversion"
  description: "Converts a qualified Salesforce insurance quote into an opportunity, notifies the assigned underwriter via Microsoft Teams, and logs the conversion in Snowflake for pipeline tracking."
  tags:
    - sales
    - insurance
    - salesforce
    - snowflake
    - microsoft-teams
    - underwriting
capability:
  exposes:
    - type: mcp
      namespace: quote-to-opportunity
      port: 8080
      tools:
        - name: convert-quote-to-opportunity
          description: "Given a Salesforce quote ID and underwriter UPN, retrieve quote details, create a linked opportunity, notify the underwriter in Microsoft Teams, and log the conversion to Snowflake. Invoke when a commercial insurance quote is approved and ready for underwriting."
          inputParameters:
            - name: quote_id
              in: body
              type: string
              description: "Salesforce quote record ID (18-character)."
            - name: underwriter_upn
              in: body
              type: string
              description: "Microsoft UPN of the assigned underwriter."
          steps:
            - name: get-quote
              type: call
              call: salesforce-quote.get-quote
              with:
                quote_id: "{{quote_id}}"
            - name: create-opportunity
              type: call
              call: salesforce-opp.create-opportunity
              with:
                name: "{{get-quote.account_name}} — {{get-quote.product_line}}"
                account_id: "{{get-quote.account_id}}"
                amount: "{{get-quote.total_premium}}"
                stage: Underwriting
            - name: notify-underwriter
              type: call
              call: msteams-uw-notify.send-message
              with:
                recipient_upn: "{{underwriter_upn}}"
                text: "New opportunity for underwriting: {{get-quote.account_name}} — {{get-quote.product_line}} — Premium {{get-quote.total_premium}}. Salesforce opportunity: {{create-opportunity.id}}."
  consumes:
    - type: http
      namespace: salesforce-quote
      baseUri: "https://zurich.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: quotes
          path: "/sobjects/Quote/{{quote_id}}"
          inputParameters:
            - name: quote_id
              in: path
          operations:
            - name: get-quote
              method: GET
    - type: http
      namespace: salesforce-opp
      baseUri: "https://zurich.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opportunities
          path: "/sobjects/Opportunity"
          operations:
            - name: create-opportunity
              method: POST
    - type: http
      namespace: msteams-uw-notify
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: chats
          path: "/users/{{upn}}/chats"
          inputParameters:
            - name: upn
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves upcoming policy renewals from Salesforce, writes a renewal forecast snapshot to Snowflake, and posts a digest to the underwriting Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Salesforce Policy Renewal Pipeline Digest"
  description: "Retrieves upcoming policy renewals from Salesforce, writes a renewal forecast snapshot to Snowflake, and posts a digest to the underwriting Microsoft Teams channel."
  tags:
    - insurance
    - underwriting
    - salesforce
    - snowflake
    - microsoft-teams
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: underwriting-reporting
      port: 8080
      tools:
        - name: digest-policy-renewals
          description: "Given a renewal window in days, retrieve upcoming policy renewals from Salesforce, persist the forecast to Snowflake, and post a summary to the underwriting Teams channel. Use for weekly renewal pipeline management."
          inputParameters:
            - name: renewal_window_days
              in: body
              type: integer
              description: "Number of days ahead to check for upcoming renewals (e.g. 30)."
            - name: product_line
              in: body
              type: string
              description: "Insurance product line to filter (e.g. Property, Casualty, Liability)."
          steps:
            - name: get-renewals
              type: call
              call: salesforce-renewals.search-renewals
              with:
                renewal_window_days: "{{renewal_window_days}}"
                product_line: "{{product_line}}"
            - name: write-forecast
              type: call
              call: snowflake.insert-row
              with:
                table: "UNDERWRITING.RENEWAL_FORECASTS"
                product_line: "{{product_line}}"
                renewal_count: "{{get-renewals.totalSize}}"
                total_premium: "{{get-renewals.total_premium}}"
            - name: post-digest
              type: call
              call: msteams-uw.send-message
              with:
                channel_id: "$secrets.teams_uw_channel_id"
                text: "Policy renewal digest (next {{renewal_window_days}} days, {{product_line}}): {{get-renewals.totalSize}} renewals, total premium {{get-renewals.total_premium}}."
  consumes:
    - type: http
      namespace: salesforce-renewals
      baseUri: "https://zurich.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: renewals
          path: "/query"
          inputParameters:
            - name: q
              in: query
          operations:
            - name: search-renewals
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://zurich.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: insert-row
              method: POST
    - type: http
      namespace: msteams-uw
      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: send-message
              method: POST

Retrieves a pending SAP Concur expense report and routes an approval notification to the manager via Microsoft Teams with expense details for review.

naftiko: "0.5"
info:
  label: "SAP Concur Expense Report Approval Routing"
  description: "Retrieves a pending SAP Concur expense report and routes an approval notification to the manager via Microsoft Teams with expense details for review."
  tags:
    - finance
    - sap
    - microsoft-teams
    - expense-management
    - approval
capability:
  exposes:
    - type: mcp
      namespace: expense-approval
      port: 8080
      tools:
        - name: route-expense-for-approval
          description: "Given a Concur expense report ID and manager UPN, retrieve expense report details and send an approval card in Microsoft Teams. Use when expense reports enter the pending approval queue."
          inputParameters:
            - name: expense_report_id
              in: body
              type: string
              description: "SAP Concur expense report ID."
            - name: manager_upn
              in: body
              type: string
              description: "Microsoft UPN of the approving manager."
          steps:
            - name: get-expense-report
              type: call
              call: concur.get-expense-report
              with:
                report_id: "{{expense_report_id}}"
            - name: notify-manager
              type: call
              call: msteams-exp.send-message
              with:
                recipient_upn: "{{manager_upn}}"
                text: "Expense report pending approval: {{get-expense-report.name}} submitted by {{get-expense-report.employee_name}}, total {{get-expense-report.total_amount}} {{get-expense-report.currency}}. Review and approve in 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/{{report_id}}"
          inputParameters:
            - name: report_id
              in: path
          operations:
            - name: get-expense-report
              method: GET
    - type: http
      namespace: msteams-exp
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: chats
          path: "/users/{{upn}}/chats"
          inputParameters:
            - name: upn
              in: path
          operations:
            - name: send-message
              method: POST

Queries SAP for open items that would block period close, posts a readiness summary to the finance Microsoft Teams channel, and creates a ServiceNow task for each blocking item.

naftiko: "0.5"
info:
  label: "SAP General Ledger Period Close Readiness"
  description: "Queries SAP for open items that would block period close, posts a readiness summary to the finance Microsoft Teams channel, and creates a ServiceNow task for each blocking item."
  tags:
    - finance
    - sap
    - servicenow
    - microsoft-teams
    - period-close
capability:
  exposes:
    - type: mcp
      namespace: finance-period-close
      port: 8080
      tools:
        - name: check-period-close-readiness
          description: "Given a SAP company code and fiscal period, identify GL open items blocking period close, create ServiceNow tasks for blockers, and post a readiness summary to the finance Teams channel. Use at month-end for group reporting close."
          inputParameters:
            - name: company_code
              in: body
              type: string
              description: "SAP company code (e.g. ZIC1 for Zurich Insurance US)."
            - name: fiscal_period
              in: body
              type: string
              description: "Fiscal period in YYYYMM format (e.g. 202503)."
          steps:
            - name: get-open-items
              type: call
              call: sap.get-gl-open-items
              with:
                company_code: "{{company_code}}"
                fiscal_period: "{{fiscal_period}}"
            - name: create-close-task
              type: call
              call: servicenow-finance.create-task
              with:
                category: finance_period_close
                short_description: "Period close blocker: {{company_code}} — {{fiscal_period}}"
                description: "Open GL items: {{get-open-items.open_count}}, total {{get-open-items.total_amount}} {{get-open-items.currency}}"
            - name: notify-finance
              type: call
              call: msteams-finance.send-message
              with:
                channel_id: "$secrets.teams_finance_channel_id"
                text: "Period close readiness {{company_code}}/{{fiscal_period}}: {{get-open-items.open_count}} blocking items. ServiceNow: {{create-close-task.number}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://zic-s4.sap.com/sap/opu/odata/sap/ZFI_GL_CLOSE_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: gl-open-items
          path: "/GLOpenItemSet"
          inputParameters:
            - name: company_code
              in: query
            - name: fiscal_period
              in: query
          operations:
            - name: get-gl-open-items
              method: GET
    - type: http
      namespace: servicenow-finance
      baseUri: "https://zurich.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-finance
      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: send-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://zurichinsurance-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://zurich.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 a SAP purchase order by PO number and returns header status, supplier name, and total value for procurement and accounts payable review.

naftiko: "0.5"
info:
  label: "SAP Purchase Order Lookup for Procurement"
  description: "Looks up a SAP purchase order by PO number and returns header status, supplier name, and total value for procurement and accounts payable review."
  tags:
    - procurement
    - finance
    - sap
    - purchase-order
capability:
  exposes:
    - type: mcp
      namespace: procurement-ops
      port: 8080
      tools:
        - name: get-purchase-order
          description: "Given a SAP PO number, return header status, supplier details, total value, and currency. Use for procurement tracking and accounts payable reconciliation."
          inputParameters:
            - name: po_number
              in: body
              type: string
              description: "SAP purchase order number (e.g. 4500056789)."
          call: sap-po.get-po
          with:
            po_number: "{{po_number}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.d.OverallStatus"
            - name: supplier
              type: string
              mapping: "$.d.Supplier.CompanyName"
            - name: total_value
              type: string
              mapping: "$.d.TotalAmount"
            - name: currency
              type: string
              mapping: "$.d.TransactionCurrency"
  consumes:
    - type: http
      namespace: sap-po
      baseUri: "https://zic-s4.sap.com/sap/opu/odata/sap/MM_PUR_PO_MAINT_V2_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: purchase-orders
          path: "/A_PurchaseOrder('{{po_number}}')"
          inputParameters:
            - name: po_number
              in: path
          operations:
            - name: get-po
              method: GET

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://zurichinsurance-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

Submits a ServiceNow change request for a planned insurance platform change and notifies the change approver in Microsoft Teams.

naftiko: "0.5"
info:
  label: "ServiceNow Change Request for Insurance Platform Changes"
  description: "Submits a ServiceNow change request for a planned insurance platform change and notifies the change approver in Microsoft Teams."
  tags:
    - itsm
    - servicenow
    - microsoft-teams
    - change-management
    - approval
capability:
  exposes:
    - type: mcp
      namespace: change-request-ops
      port: 8080
      tools:
        - name: submit-platform-change-request
          description: "Given change details and an approver UPN, submit a ServiceNow change request and notify the approver in Microsoft Teams. Use for planned changes to claims, policy, underwriting, or actuarial platforms."
          inputParameters:
            - name: short_description
              in: body
              type: string
              description: "Brief description of the planned change."
            - name: description
              in: body
              type: string
              description: "Detailed change description with impact assessment and rollback plan."
            - name: scheduled_start
              in: body
              type: string
              description: "Scheduled start time in ISO 8601 format."
            - name: approver_upn
              in: body
              type: string
              description: "Microsoft UPN of the change approver."
          steps:
            - name: create-change
              type: call
              call: servicenow-cr.create-change
              with:
                short_description: "{{short_description}}"
                description: "{{description}}"
                start_date: "{{scheduled_start}}"
                type: normal
            - name: notify-approver
              type: call
              call: msteams-cr.send-message
              with:
                recipient_upn: "{{approver_upn}}"
                text: "Change request submitted for your approval: {{short_description}}. Change: {{create-change.number}}. Scheduled: {{scheduled_start}}. Review in ServiceNow."
  consumes:
    - type: http
      namespace: servicenow-cr
      baseUri: "https://zurich.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-cr
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: chats
          path: "/users/{{upn}}/chats"
          inputParameters:
            - name: upn
              in: path
          operations:
            - name: send-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://zurich.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

When a ServiceNow P1 incident is created for a core insurance platform system, creates a linked Jira engineering issue and notifies the on-call team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "ServiceNow P1 Incident to Jira Sync"
  description: "When a ServiceNow P1 incident is created for a core insurance platform system, creates a linked Jira engineering issue and notifies the on-call team via Microsoft Teams."
  tags:
    - itsm
    - servicenow
    - jira
    - microsoft-teams
    - incident-response
capability:
  exposes:
    - type: mcp
      namespace: itsm-bridge
      port: 8080
      tools:
        - name: sync-incident-to-jira
          description: "Given a ServiceNow incident number and priority, create a linked Jira issue and notify the on-call team in Microsoft Teams. Use for P1/P2 incidents affecting core claims, policy, or underwriting systems."
          inputParameters:
            - name: incident_number
              in: body
              type: string
              description: "ServiceNow incident number (e.g. INC0001234)."
            - name: priority
              in: body
              type: string
              description: "Incident priority: P1 or P2."
            - name: affected_system
              in: body
              type: string
              description: "Name of the affected insurance platform or application."
          steps:
            - name: get-incident
              type: call
              call: servicenow.get-incident
              with:
                number: "{{incident_number}}"
            - name: create-jira-issue
              type: call
              call: jira-ops.create-issue
              with:
                project_key: OPS
                issuetype: Incident
                summary: "[{{priority}}] {{get-incident.short_description}}"
                description: "ServiceNow: {{incident_number}}\nSystem: {{affected_system}}\nDetails: {{get-incident.description}}"
            - name: notify-oncall
              type: call
              call: msteams-oncall.send-message
              with:
                channel_id: "$secrets.teams_oncall_channel_id"
                text: "{{priority}} Incident: {{get-incident.short_description}} | System: {{affected_system}} | ServiceNow: {{incident_number}} | Jira: {{create-jira-issue.key}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://zurich.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          inputParameters:
            - name: number
              in: query
          operations:
            - name: get-incident
              method: GET
    - type: http
      namespace: jira-ops
      baseUri: "https://zurich.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams-oncall
      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: send-message
              method: POST

Queries Snowflake for daily claims volume and loss ratio by product line and posts a summary to the claims analytics Microsoft Teams channel for leadership review.

naftiko: "0.5"
info:
  label: "Snowflake Claims Analytics Snapshot"
  description: "Queries Snowflake for daily claims volume and loss ratio by product line and posts a summary to the claims analytics Microsoft Teams channel for leadership review."
  tags:
    - data
    - analytics
    - snowflake
    - microsoft-teams
    - claims
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: claims-analytics
      port: 8080
      tools:
        - name: publish-claims-snapshot
          description: "Given a reporting date and product line, query Snowflake for claims volume, average severity, and loss ratio, and post the snapshot to the claims analytics Teams channel. Use for daily claims management stand-ups."
          inputParameters:
            - name: report_date
              in: body
              type: string
              description: "Claims date to report on in YYYY-MM-DD format."
            - name: product_line
              in: body
              type: string
              description: "Insurance product line (e.g. Property, Casualty, Liability, Life)."
          steps:
            - name: query-claims-data
              type: call
              call: snowflake.execute-statement
              with:
                statement: "SELECT product_line, COUNT(*) as claim_count, AVG(reserve_amount) as avg_severity, SUM(loss_amount)/SUM(earned_premium) as loss_ratio FROM CLAIMS.DAILY_CLAIMS WHERE claim_date = '{{report_date}}' AND product_line = '{{product_line}}' GROUP BY product_line"
            - name: post-claims-snapshot
              type: call
              call: msteams-claims-ops.send-message
              with:
                channel_id: "$secrets.teams_claims_channel_id"
                text: "Claims snapshot for {{product_line}} on {{report_date}}: Count={{query-claims-data.claim_count}}, Avg severity={{query-claims-data.avg_severity}}, Loss ratio={{query-claims-data.loss_ratio}}."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://zurich.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-claims-ops
      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: send-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://zurich.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://zurichinsurance.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: "Zurich Insurance 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://zurich.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: queries
          path: "/statements"
          operations:
            - name: query-clv
              method: POST

Checks Snowflake task history for failed ETL jobs supporting claims, policy, and regulatory data feeds, creates ServiceNow tasks for failures, and notifies the data engineering team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Snowflake ETL Pipeline Health Monitor"
  description: "Checks Snowflake task history for failed ETL jobs supporting claims, policy, and regulatory data feeds, creates ServiceNow tasks for failures, and notifies the data engineering team via Microsoft Teams."
  tags:
    - data
    - snowflake
    - servicenow
    - microsoft-teams
    - monitoring
    - etl
capability:
  exposes:
    - type: mcp
      namespace: etl-health-ops
      port: 8080
      tools:
        - name: monitor-insurance-etl-health
          description: "Given a Snowflake schema and lookback window, check for failed ETL task runs, create ServiceNow tasks for each failure, and post a health summary to the data-engineering Teams channel. Use for daily monitoring of claims, policy, and regulatory data pipelines."
          inputParameters:
            - name: schema_name
              in: body
              type: string
              description: "Snowflake schema to check (e.g. CLAIMS.ETL, POLICY.ETL, REGULATORY.ETL)."
            - name: lookback_hours
              in: body
              type: integer
              description: "Hours of task history to inspect (e.g. 24)."
          steps:
            - name: check-task-failures
              type: call
              call: snowflake-etl.execute-statement
              with:
                statement: "SELECT name, state, error_message FROM TABLE(INFORMATION_SCHEMA.TASK_HISTORY(SCHEDULED_TIME_RANGE_START=>DATEADD('hour', -{{lookback_hours}}, CURRENT_TIMESTAMP()))) WHERE STATE = 'FAILED'"
            - name: create-failure-ticket
              type: call
              call: servicenow-etl.create-task
              with:
                category: data_pipeline
                short_description: "ETL failures: {{schema_name}} — last {{lookback_hours}}h"
                description: "Failed Snowflake tasks in {{schema_name}}: {{check-task-failures.row_count}} failures"
            - name: notify-data-eng
              type: call
              call: msteams-data.send-message
              with:
                channel_id: "$secrets.teams_dataeng_channel_id"
                text: "ETL health check {{schema_name}}: {{check-task-failures.row_count}} failures in last {{lookback_hours}}h. ServiceNow: {{create-failure-ticket.number}}."
  consumes:
    - type: http
      namespace: snowflake-etl
      baseUri: "https://zurich.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: servicenow-etl
      baseUri: "https://zurich.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-data
      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: send-message
              method: POST

Executes Solvency II data quality checks on Snowflake regulatory tables, logs results, and alerts the risk and compliance team via Microsoft Teams if any check fails.

naftiko: "0.5"
info:
  label: "Snowflake Solvency II Data Quality Validation"
  description: "Executes Solvency II data quality checks on Snowflake regulatory tables, logs results, and alerts the risk and compliance team via Microsoft Teams if any check fails."
  tags:
    - compliance
    - regulatory
    - snowflake
    - microsoft-teams
    - solvency-ii
    - data-quality
capability:
  exposes:
    - type: mcp
      namespace: solvency-ii-ops
      port: 8080
      tools:
        - name: validate-solvency-data
          description: "Given a Snowflake Solvency II table and valuation date, run row count and null-check validations, and alert the risk and compliance Teams channel if any check fails. Use before quarterly Solvency II reporting submissions."
          inputParameters:
            - name: solvency_table
              in: body
              type: string
              description: "Snowflake Solvency II data table (e.g. REGULATORY.SCR_CALCULATIONS)."
            - name: valuation_date
              in: body
              type: string
              description: "Solvency II valuation date in YYYY-MM-DD format."
            - name: min_row_count
              in: body
              type: integer
              description: "Minimum expected row count for the valuation date partition."
          steps:
            - name: run-validation
              type: call
              call: snowflake-sii.execute-statement
              with:
                statement: "SELECT COUNT(*) as row_count, SUM(CASE WHEN entity_id IS NULL THEN 1 ELSE 0 END) as null_entities, SUM(CASE WHEN scr_amount IS NULL THEN 1 ELSE 0 END) as null_scr FROM {{solvency_table}} WHERE valuation_date = '{{valuation_date}}'"
            - name: notify-risk-compliance
              type: call
              call: msteams-risk.send-message
              with:
                channel_id: "$secrets.teams_risk_channel_id"
                text: "Solvency II data validation for {{solvency_table}} on {{valuation_date}}: Rows={{run-validation.row_count}} (min {{min_row_count}}), Null entities={{run-validation.null_entities}}, Null SCR={{run-validation.null_scr}}."
  consumes:
    - type: http
      namespace: snowflake-sii
      baseUri: "https://zurich.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-risk
      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: send-message
              method: POST

Queries Snowflake for underwriting profitability metrics by product line and region, and posts a quarterly summary to the underwriting leadership Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Snowflake Underwriting Profitability Report"
  description: "Queries Snowflake for underwriting profitability metrics by product line and region, and posts a quarterly summary to the underwriting leadership Microsoft Teams channel."
  tags:
    - underwriting
    - data
    - snowflake
    - microsoft-teams
    - reporting
    - profitability
capability:
  exposes:
    - type: mcp
      namespace: uw-profitability
      port: 8080
      tools:
        - name: publish-uw-profitability-report
          description: "Given a fiscal quarter and product line, query Snowflake for combined ratio, earned premium, and incurred losses, and post a profitability report to the underwriting leadership Teams channel. Use for quarterly business review preparation."
          inputParameters:
            - name: fiscal_quarter
              in: body
              type: string
              description: "Fiscal quarter in YYYY-QN format (e.g. 2025-Q1)."
            - name: product_line
              in: body
              type: string
              description: "Insurance product line (e.g. Property, Casualty, Specialty, Life)."
          steps:
            - name: query-profitability
              type: call
              call: snowflake-uw.execute-statement
              with:
                statement: "SELECT product_line, SUM(earned_premium) as total_premium, SUM(incurred_losses) as total_losses, (SUM(incurred_losses) + SUM(expenses)) / SUM(earned_premium) as combined_ratio FROM UNDERWRITING.QUARTERLY_RESULTS WHERE fiscal_quarter = '{{fiscal_quarter}}' AND product_line = '{{product_line}}' GROUP BY product_line"
            - name: post-uw-report
              type: call
              call: msteams-uw-lead.send-message
              with:
                channel_id: "$secrets.teams_uw_leadership_channel_id"
                text: "Underwriting profitability {{product_line}} Q{{fiscal_quarter}}: Premium={{query-profitability.total_premium}}, Losses={{query-profitability.total_losses}}, Combined ratio={{query-profitability.combined_ratio}}."
  consumes:
    - type: http
      namespace: snowflake-uw
      baseUri: "https://zurich.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-uw-lead
      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: send-message
              method: POST

Generates Solvency II regulatory reports by querying capital and risk data from Snowflake, validating against thresholds, and publishing to Confluence for board review.

naftiko: "0.5"
info:
  label: "Solvency II Reporting Workflow"
  description: "Generates Solvency II regulatory reports by querying capital and risk data from Snowflake, validating against thresholds, and publishing to Confluence for board review."
  tags:
    - insurance
    - compliance
    - actuarial
    - snowflake
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: solvency-ops
      port: 8080
      tools:
        - name: generate-solvency-report
          description: "Generate Solvency II report. Queries capital data, validates, and publishes. Use for quarterly regulatory reporting."
          inputParameters:
            - name: reporting_period
              in: body
              type: string
              description: "Reporting period in YYYY-Q format."
          steps:
            - name: query-capital
              type: call
              call: "snowflake.query"
              with:
                query: "CALL SOLVENCY_DB.PROCEDURES.GENERATE_SCR_REPORT('{{reporting_period}}')"
            - name: validate
              type: call
              call: "compliance-api.validate-solvency"
              with:
                period: "{{reporting_period}}"
            - name: publish
              type: call
              call: "confluence.create-page"
              with:
                space_key: "REGULATORY"
                title: "Solvency II Report - {{reporting_period}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://zurich.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: query
              method: POST
    - type: http
      namespace: compliance-api
      baseUri: "https://api.zurichinsurance.com/compliance/v1"
      authentication:
        type: bearer
        token: "$secrets.compliance_api_token"
      resources:
        - name: solvency
          path: "/solvency/validate"
          operations:
            - name: validate-solvency
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://zurichinsurance.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

Monitors recovery, updates Snowflake, and generates Confluence reports.

naftiko: "0.5"
info:
  label: "Subrogation Recovery Tracker Workflow"
  description: "Monitors recovery, updates Snowflake, and generates Confluence reports."
  tags:
    - insurance
    - claims
    - subrogation
    - snowflake
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: subro-ops
      port: 8080
      tools:
        - name: track-recovery
          description: "Track subrogation."
          inputParameters:
            - name: start
              in: body
              type: string
              description: "Start."
            - name: end
              in: body
              type: string
              description: "End."
          steps:
            - name: data
              type: call
              call: "claims-api.get-subro"
              with:
                start: "{{start}}"
                end: "{{end}}"
            - name: update
              type: call
              call: "snowflake.query"
              with:
                query: "CALL UPDATE_SUBROGATION('{{start}}','{{end}}')"
            - name: publish
              type: call
              call: "confluence.create-page"
              with:
                space_key: "CLAIMS"
                title: "Subrogation {{start}} to {{end}}"
  consumes:
    - type: http
      namespace: claims-api
      baseUri: "https://api.zurichinsurance.com/claims/v2"
      authentication:
        type: bearer
        token: "$secrets.claims_api_token"
      resources:
        - name: subrogation
          path: "/subrogation/summary"
          operations:
            - name: get-subro
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://zurich.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://zurichinsurance.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

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.zurichinsurance.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://zurich.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.zurichinsurance.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.zurichinsurance.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://zurich.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://zurichinsurance-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.zurichinsurance.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://zurich.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://zurich.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 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/zurich"
      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

Retrieves compensation review proposals from Workday and notifies HR business partners via Microsoft Teams with merit increase summary and approval instructions.

naftiko: "0.5"
info:
  label: "Workday Compensation Review Notification"
  description: "Retrieves compensation review proposals from Workday and notifies HR business partners via Microsoft Teams with merit increase summary and approval instructions."
  tags:
    - hr
    - workday
    - microsoft-teams
    - compensation
    - approval
capability:
  exposes:
    - type: mcp
      namespace: compensation-review
      port: 8080
      tools:
        - name: notify-compensation-review-open
          description: "Given a Workday compensation review cycle ID and period label, retrieve summary data and notify the HRBP team in Microsoft Teams. Use to launch annual merit increase review cycles."
          inputParameters:
            - name: review_cycle_id
              in: body
              type: string
              description: "Workday compensation review cycle ID."
            - name: review_period_label
              in: body
              type: string
              description: "Human-readable review period (e.g. 2025 Annual Merit Review)."
          steps:
            - name: get-review-summary
              type: call
              call: workday-cr.get-comp-review
              with:
                cycle_id: "{{review_cycle_id}}"
            - name: notify-hrbp-team
              type: call
              call: msteams-hrbp.send-message
              with:
                channel_id: "$secrets.teams_hrbp_channel_id"
                text: "Compensation review {{review_period_label}} is now open: {{get-review-summary.total_proposals}} proposals, total increase budget {{get-review-summary.total_amount}}. Complete approvals in Workday by {{get-review-summary.deadline}}."
  consumes:
    - type: http
      namespace: workday-cr
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: comp-reviews
          path: "/zurich/compensationReviewCycles/{{cycle_id}}"
          inputParameters:
            - name: cycle_id
              in: path
          operations:
            - name: get-comp-review
              method: GET
    - type: http
      namespace: msteams-hrbp
      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: send-message
              method: POST

When an employee separation is recorded in Workday, creates a ServiceNow access revocation task and notifies HR Operations via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Workday Employee Offboarding Workflow"
  description: "When an employee separation is recorded in Workday, creates a ServiceNow access revocation task and notifies HR Operations via Microsoft Teams."
  tags:
    - hr
    - offboarding
    - workday
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-offboarding
      port: 8080
      tools:
        - name: trigger-employee-offboarding
          description: "Given a Workday employee ID and separation date, create a ServiceNow access revocation task and notify HR Operations in Microsoft Teams. Invoke on voluntary or involuntary separations at Zurich Insurance."
          inputParameters:
            - name: workday_employee_id
              in: body
              type: string
              description: "Workday worker ID of the departing employee."
            - name: separation_date
              in: body
              type: string
              description: "Last working day in ISO 8601 format (YYYY-MM-DD)."
            - name: separation_reason
              in: body
              type: string
              description: "Reason for separation: voluntary, involuntary, retirement, transfer."
          steps:
            - name: get-worker
              type: call
              call: workday-off.get-worker
              with:
                worker_id: "{{workday_employee_id}}"
            - name: create-offboarding-task
              type: call
              call: servicenow-off.create-task
              with:
                category: hr_offboarding
                short_description: "Offboarding: {{get-worker.full_name}} — effective {{separation_date}}"
                assigned_group: IT_Access_Management
                description: "Employee {{workday_employee_id}} separating on {{separation_date}}. Reason: {{separation_reason}}. Revoke all system access."
            - name: notify-hr-ops
              type: call
              call: msteams-hrops.send-message
              with:
                channel_id: "$secrets.teams_hrops_channel_id"
                text: "Offboarding initiated: {{get-worker.full_name}} ({{workday_employee_id}}). Last day: {{separation_date}}. Reason: {{separation_reason}}. ServiceNow: {{create-offboarding-task.number}}."
  consumes:
    - type: http
      namespace: workday-off
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/zurich/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: servicenow-off
      baseUri: "https://zurich.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-hrops
      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: send-message
              method: POST

Initiates a performance review cycle in Workday for a manager's direct reports and sends each employee a review kickoff notification via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Workday Performance Review Cycle Launch"
  description: "Initiates a performance review cycle in Workday for a manager's direct reports and sends each employee a review kickoff notification via Microsoft Teams."
  tags:
    - hr
    - performance
    - workday
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-performance
      port: 8080
      tools:
        - name: launch-performance-review-cycle
          description: "Given a manager Workday ID and review cycle name, retrieve direct reports and send each a Microsoft Teams notification with performance review instructions and due date. Use to launch annual or mid-year reviews."
          inputParameters:
            - name: manager_workday_id
              in: body
              type: string
              description: "Workday ID of the manager whose team should receive review notifications."
            - name: review_cycle_name
              in: body
              type: string
              description: "Name of the performance review cycle (e.g. 2025 Annual Performance Review)."
            - name: due_date
              in: body
              type: string
              description: "Review submission due date in ISO 8601 format."
          steps:
            - name: get-direct-reports
              type: call
              call: workday-perf.get-direct-reports
              with:
                manager_id: "{{manager_workday_id}}"
            - name: notify-employees
              type: call
              call: msteams-perf.send-message
              with:
                recipient_upn: "{{get-direct-reports.work_email}}"
                text: "Your {{review_cycle_name}} self-assessment is now open. Please complete your review in Workday by {{due_date}}."
  consumes:
    - type: http
      namespace: workday-perf
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: direct-reports
          path: "/zurich/workers/{{manager_id}}/directReports"
          inputParameters:
            - name: manager_id
              in: path
          operations:
            - name: get-direct-reports
              method: GET
    - type: http
      namespace: msteams-perf
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: chats
          path: "/users/{{upn}}/chats"
          inputParameters:
            - name: upn
              in: path
          operations:
            - name: send-message
              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/zurich"
      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