Metlife Capabilities

Naftiko 0.5 capability definitions for Metlife - 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://metlife.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://metlife.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.metlife.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://metlife.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.metlife.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://metlife.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.metlife.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.metlife.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

Retrieves a complex insurance claim record from Salesforce and uses OpenAI to generate a structured adjudication summary for the claims examiner.

naftiko: "0.5"
info:
  label: "AI-Assisted Insurance Claims Summary"
  description: "Retrieves a complex insurance claim record from Salesforce and uses OpenAI to generate a structured adjudication summary for the claims examiner."
  tags:
    - ai
    - automation
    - openai
    - salesforce
    - claims
    - insurance
capability:
  exposes:
    - type: mcp
      namespace: ai-claims
      port: 8080
      tools:
        - name: summarize-claim-for-adjudication
          description: "Given a Salesforce claims case ID, retrieve the full claim record including notes, policy details, and medical documentation references, then use OpenAI to generate a structured adjudication summary for the claims examiner."
          inputParameters:
            - name: case_id
              in: body
              type: string
              description: "The Salesforce case ID for the insurance claim to summarize."
          steps:
            - name: get-claim
              type: call
              call: "salesforce.get-full-claim-case"
              with:
                case_id: "{{case_id}}"
            - name: generate-summary
              type: call
              call: "openai.create-completion"
              with:
                model: "gpt-4o"
                prompt: "You are a MetLife claims adjudication specialist. Analyze this insurance claim and provide a structured summary covering: Claim Overview, Policy Coverage Analysis, Key Documentation, Risk Assessment, and Recommended Action. Claim data: {{get-claim.case_details}}"
            - name: update-case-notes
              type: call
              call: "salesforce.add-case-note"
              with:
                case_id: "{{case_id}}"
                note: "AI Adjudication Summary:\n{{generate-summary.choices[0].message.content}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://metlife.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: claim-cases
          path: "/sobjects/Case/{{case_id}}"
          inputParameters:
            - name: case_id
              in: path
          operations:
            - name: get-full-claim-case
              method: GET
        - name: case-notes
          path: "/sobjects/CaseComment"
          operations:
            - name: add-case-note
              method: POST
    - type: http
      namespace: openai
      baseUri: "https://api.openai.com/v1"
      authentication:
        type: bearer
        token: "$secrets.openai_api_key"
      resources:
        - name: completions
          path: "/chat/completions"
          operations:
            - name: create-completion
              method: POST

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

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

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.metlife.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://metlife.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://metlife.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://metlife.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: pages
          path: "/content"
          operations:
            - name: create-page
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post
              method: POST

Queries Azure costs and publishes allocation to Confluence.

naftiko: "0.5"
info:
  label: "Azure Cost Allocation Report Workflow"
  description: "Queries Azure costs and publishes allocation to Confluence."
  tags:
    - cloud
    - finance
    - microsoft-azure
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: cost-ops
      port: 8080
      tools:
        - name: gen-report
          description: "Generate cost report."
          inputParameters:
            - name: period
              in: body
              type: string
              description: "YYYY-MM."
          steps:
            - name: costs
              type: call
              call: "azure-cost.get-usage"
              with:
                period: "{{period}}"
            - name: publish
              type: call
              call: "confluence.create-page"
              with:
                space_key: "FINOPS"
                title: "Azure Costs {{period}}"
  consumes:
    - type: http
      namespace: azure-cost
      baseUri: "https://management.azure.com"
      authentication:
        type: bearer
        token: "$secrets.azure_token"
      resources:
        - name: usage
          path: "/subscriptions/$secrets.azure_sub/providers/Microsoft.CostManagement/query"
          operations:
            - name: get-usage
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://metlife.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.metlife.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://metlife.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://metlife.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://metlife.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://metlife.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/metlife"
      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://metlife.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.metlife.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://metlife.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.metlife.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://metlife.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://metlife.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.metlife.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.metlife.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://metlife.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.metlife.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://metlife.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: "MetLife 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://metlife.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

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

When a Datadog APM alert fires for a critical insurance processing application, creates a ServiceNow incident and pages the on-call engineer via PagerDuty.

naftiko: "0.5"
info:
  label: "Datadog Application Performance Alert"
  description: "When a Datadog APM alert fires for a critical insurance processing application, creates a ServiceNow incident and pages the on-call engineer via PagerDuty."
  tags:
    - observability
    - apm
    - datadog
    - servicenow
    - pagerduty
    - monitoring
capability:
  exposes:
    - type: mcp
      namespace: apm-monitoring
      port: 8080
      tools:
        - name: handle-apm-alert
          description: "Given a Datadog APM alert with service name, error rate, and latency metrics, open a high-priority ServiceNow incident and trigger PagerDuty for the on-call engineer."
          inputParameters:
            - name: service_name
              in: body
              type: string
              description: "The application or microservice that triggered the APM alert."
            - name: error_rate
              in: body
              type: number
              description: "The current error rate percentage exceeding the threshold."
            - name: p99_latency_ms
              in: body
              type: number
              description: "The P99 request latency in milliseconds."
            - name: alert_url
              in: body
              type: string
              description: "URL to the Datadog APM alert dashboard."
          steps:
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "APM Alert: {{service_name}} error rate {{error_rate}}%"
                urgency: "1"
                category: "application_performance"
            - name: page-oncall
              type: call
              call: "pagerduty.create-incident"
              with:
                title: "APM Alert: {{service_name}} - {{error_rate}}% error rate"
                severity: "critical"
                body: "P99 latency: {{p99_latency_ms}}ms. Dashboard: {{alert_url}}. SNOW: {{create-incident.number}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://metlife.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incident
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.pagerduty_token"
        placement: header
      resources:
        - name: incidents
          path: "/incidents"
          operations:
            - name: create-incident
              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

Retrieves Datadog SLO compliance metrics for critical insurance processing services and posts a weekly reliability report to the engineering leadership Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Datadog SLO Compliance Report"
  description: "Retrieves Datadog SLO compliance metrics for critical insurance processing services and posts a weekly reliability report to the engineering leadership Microsoft Teams channel."
  tags:
    - observability
    - slo
    - datadog
    - microsoft-teams
    - reporting
    - reliability
capability:
  exposes:
    - type: mcp
      namespace: slo-reporting
      port: 8080
      tools:
        - name: publish-slo-report
          description: "Retrieve SLO compliance data from Datadog for all services tagged as critical insurance systems and post a weekly formatted report to the engineering leadership Microsoft Teams channel."
          inputParameters:
            - name: report_period_days
              in: body
              type: integer
              description: "Number of days to include in the SLO compliance report (e.g., 7 for weekly)."
          steps:
            - name: get-slo-status
              type: call
              call: "datadog.list-slos"
              with:
                tags: "team:insurance-critical"
            - name: post-report
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "engineering-leadership"
                message: "Weekly SLO Report ({{report_period_days}} days): {{get-slo-status.compliant_count}} compliant, {{get-slo-status.breached_count}} in breach out of {{get-slo-status.total_count}} total SLOs monitored."
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: slos
          path: "/slo"
          operations:
            - name: list-slos
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

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://metlife.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://metlife.snowflakecomputing.com/api/v2"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: records
          path: "/table/u_fraud_alert"
          operations:
            - name: create-record
              method: POST

When an employee departure is confirmed in Workday, deactivates Okta access, disables the Microsoft 365 account, and creates a ServiceNow offboarding compliance checklist.

naftiko: "0.5"
info:
  label: "Employee Offboarding and Access Revocation"
  description: "When an employee departure is confirmed in Workday, deactivates Okta access, disables the Microsoft 365 account, and creates a ServiceNow offboarding compliance checklist."
  tags:
    - hr
    - offboarding
    - workday
    - okta
    - microsoft-365
    - servicenow
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: hr-offboarding
      port: 8080
      tools:
        - name: trigger-offboarding
          description: "Given a Workday employee ID and termination date, deactivate the Okta user, disable their Microsoft 365 account, and create a ServiceNow SOX compliance offboarding checklist."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "The Workday employee ID of the departing employee."
            - name: termination_date
              in: body
              type: string
              description: "The employee's last working day in ISO 8601 format (YYYY-MM-DD)."
          steps:
            - name: get-employee
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{employee_id}}"
            - name: deactivate-okta
              type: call
              call: "okta.deactivate-user"
              with:
                user_email: "{{get-employee.work_email}}"
            - name: disable-m365
              type: call
              call: "msgraph.disable-user"
              with:
                user_id: "{{get-employee.work_email}}"
            - name: create-sox-checklist
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "SOX offboarding: {{get-employee.displayName}} - {{termination_date}}"
                category: "hr_offboarding"
                description: "Okta deactivated | M365 disabled | Requires IT asset return and access revocation audit"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: basic
        username: "$secrets.workday_user"
        password: "$secrets.workday_password"
      resources:
        - name: workers
          path: "/metlife/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: okta
      baseUri: "https://metlife.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_api_token"
        placement: header
      resources:
        - name: user-lifecycle
          path: "/users/{{user_id}}/lifecycle/deactivate"
          inputParameters:
            - name: user_id
              in: path
          operations:
            - name: deactivate-user
              method: POST
    - type: http
      namespace: msgraph
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: users
          path: "/users/{{user_id}}"
          inputParameters:
            - name: user_id
              in: path
          operations:
            - name: disable-user
              method: PATCH
    - type: http
      namespace: servicenow
      baseUri: "https://metlife.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incident
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST

When a new hire is created in Workday, provisions a Microsoft 365 account, opens a ServiceNow onboarding ticket, and sends a Microsoft Teams welcome message.

naftiko: "0.5"
info:
  label: "Employee Onboarding Orchestrator"
  description: "When a new hire is created in Workday, provisions a Microsoft 365 account, opens a ServiceNow onboarding ticket, and sends a Microsoft Teams welcome message."
  tags:
    - hr
    - onboarding
    - workday
    - microsoft-365
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-onboarding
      port: 8080
      tools:
        - name: trigger-onboarding
          description: "Given a Workday employee ID and start date, orchestrate the full MetLife onboarding sequence: provision Microsoft 365, open a ServiceNow ticket, and send a Teams welcome message."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "The Workday employee ID for the new hire."
            - name: start_date
              in: body
              type: string
              description: "The new hire's start date in ISO 8601 format (YYYY-MM-DD)."
            - name: business_unit
              in: body
              type: string
              description: "The MetLife business unit the hire is joining (e.g., Group Benefits, Retirement Income)."
          steps:
            - name: get-employee
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{employee_id}}"
            - name: provision-m365
              type: call
              call: "msgraph.create-user"
              with:
                displayName: "{{get-employee.displayName}}"
                mailNickname: "{{get-employee.userId}}"
                department: "{{business_unit}}"
            - name: open-ticket
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "New hire onboarding: {{get-employee.displayName}}"
                category: "hr_onboarding"
            - name: send-welcome
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{provision-m365.userPrincipalName}}"
                message: "Welcome to MetLife, {{get-employee.firstName}}! Your IT onboarding ticket is {{open-ticket.number}}. Start date: {{start_date}}."
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: basic
        username: "$secrets.workday_user"
        password: "$secrets.workday_password"
      resources:
        - name: workers
          path: "/metlife/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: msgraph
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: users
          path: "/users"
          operations:
            - name: create-user
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://metlife.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incident
          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: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              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://metlife.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://metlife.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://metlife.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://metlife.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

On a GitHub Actions pipeline failure on a protected branch, creates a Jira bug, logs a Datadog event, and alerts the engineering team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "GitHub CI/CD Pipeline Failure Response"
  description: "On a GitHub Actions pipeline failure on a protected branch, creates a Jira bug, logs a Datadog event, and alerts the engineering team via Microsoft Teams."
  tags:
    - devops
    - cicd
    - github
    - jira
    - datadog
    - microsoft-teams
    - incident-response
capability:
  exposes:
    - type: mcp
      namespace: devops-ops
      port: 8080
      tools:
        - name: handle-pipeline-failure
          description: "Given a GitHub Actions pipeline failure with repository, branch, commit SHA, and run URL, create a Jira bug, log a Datadog deployment event, and alert the engineering Microsoft Teams channel."
          inputParameters:
            - name: repository
              in: body
              type: string
              description: "The GitHub repository where the failure occurred (e.g., metlife/policy-api)."
            - name: workflow_name
              in: body
              type: string
              description: "The GitHub Actions workflow name that failed."
            - name: branch
              in: body
              type: string
              description: "The branch on which the failure occurred."
            - name: run_url
              in: body
              type: string
              description: "URL to the failed GitHub Actions run."
            - name: commit_sha
              in: body
              type: string
              description: "The commit SHA for the failed run."
          steps:
            - name: create-bug
              type: call
              call: "jira.create-issue"
              with:
                project_key: "ENG"
                issuetype: "Bug"
                summary: "[CI Failure] {{repository}} / {{branch}} - {{workflow_name}}"
                description: "Workflow: {{workflow_name}}\nBranch: {{branch}}\nCommit: {{commit_sha}}\nRun: {{run_url}}"
            - name: log-event
              type: call
              call: "datadog.create-event"
              with:
                title: "CI Failure: {{repository}}/{{branch}}"
                text: "Workflow {{workflow_name}} failed at commit {{commit_sha}}"
                alert_type: "error"
            - name: notify-team
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "engineering-alerts"
                message: "Pipeline Failure: {{repository}} | {{branch}} | {{workflow_name}} | Jira: {{create-bug.key}} | Run: {{run_url}}"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://metlife.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: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: events
          path: "/events"
          operations:
            - name: create-event
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

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://metlife.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.metlife.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.metlife.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.metlife.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.metlife.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.metlife.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://metlife.snowflakecomputing.com/api/v2"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: records
          path: "/table/u_ime"
          operations:
            - name: create-record
              method: POST

When a new insurance claim is submitted, creates a Salesforce case, opens a ServiceNow workflow ticket, and notifies the claims adjuster team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Insurance Claims Intake Orchestrator"
  description: "When a new insurance claim is submitted, creates a Salesforce case, opens a ServiceNow workflow ticket, and notifies the claims adjuster team via Microsoft Teams."
  tags:
    - insurance
    - claims
    - salesforce
    - servicenow
    - microsoft-teams
    - intake
capability:
  exposes:
    - type: mcp
      namespace: claims-intake
      port: 8080
      tools:
        - name: intake-insurance-claim
          description: "Given a policy number, claim type, and incident description, create a Salesforce claims case, open a ServiceNow workflow task for the claims team, and notify the appropriate adjuster team via Microsoft Teams."
          inputParameters:
            - name: policy_number
              in: body
              type: string
              description: "The MetLife policy number under which the claim is being filed."
            - name: claim_type
              in: body
              type: string
              description: "Type of claim: life, disability, dental, vision, or group_benefits."
            - name: incident_description
              in: body
              type: string
              description: "Brief description of the claim incident."
            - name: claimant_name
              in: body
              type: string
              description: "Full name of the claimant filing the claim."
          steps:
            - name: create-case
              type: call
              call: "salesforce.create-case"
              with:
                subject: "{{claim_type}} claim for policy {{policy_number}}"
                description: "{{incident_description}}"
                origin: "Claims Intake"
                type: "{{claim_type}}"
            - name: open-workflow
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Claims workflow: {{claim_type}} - Policy {{policy_number}}"
                category: "insurance_claims"
            - name: notify-adjuster
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "claims-adjusters"
                message: "New Claim: {{claim_type}} for policy {{policy_number}} - {{claimant_name}}. Case: {{create-case.id}} | SNOW: {{open-workflow.number}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://metlife.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: servicenow
      baseUri: "https://metlife.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incident
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Retrieves an insurance policy record from the core policy system via Salesforce, returning policy status, coverage details, and premium information.

naftiko: "0.5"
info:
  label: "Insurance Policy Lookup"
  description: "Retrieves an insurance policy record from the core policy system via Salesforce, returning policy status, coverage details, and premium information."
  tags:
    - insurance
    - policy
    - salesforce
    - crm
capability:
  exposes:
    - type: mcp
      namespace: policy-ops
      port: 8080
      tools:
        - name: get-policy-details
          description: "Look up an insurance policy by policy number in Salesforce. Returns policy status, product type, coverage amount, premium, and policyholder name. Use when agents need to retrieve policy details for servicing."
          inputParameters:
            - name: policy_number
              in: body
              type: string
              description: "The MetLife insurance policy number to look up (e.g., MET-2026-123456)."
          call: "salesforce.get-policy"
          with:
            policy_number: "{{policy_number}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.Status__c"
            - name: product_type
              type: string
              mapping: "$.Product_Type__c"
            - name: coverage_amount
              type: string
              mapping: "$.Coverage_Amount__c"
            - name: premium
              type: string
              mapping: "$.Annual_Premium__c"
            - name: policyholder_name
              type: string
              mapping: "$.PolicyHolder__r.Name"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://metlife.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

Generates a sprint retrospective report from Jira for an IT delivery team and posts the digest to the team's Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Jira IT Sprint Retrospective Digest"
  description: "Generates a sprint retrospective report from Jira for an IT delivery team and posts the digest to the team's Microsoft Teams channel."
  tags:
    - devops
    - agile
    - jira
    - microsoft-teams
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: it-agile-reporting
      port: 8080
      tools:
        - name: digest-sprint-retrospective
          description: "Given a Jira board ID and sprint ID, fetch completed and incomplete issues, summarize sprint velocity, and post a formatted retrospective digest to the team's Microsoft Teams channel."
          inputParameters:
            - name: board_id
              in: body
              type: string
              description: "The Jira board ID for the IT delivery team sprint."
            - name: sprint_id
              in: body
              type: string
              description: "The Jira sprint ID to summarize."
            - name: teams_channel_id
              in: body
              type: string
              description: "The Microsoft Teams channel ID to post the digest to."
          steps:
            - name: get-issues
              type: call
              call: "jira.list-sprint-issues"
              with:
                board_id: "{{board_id}}"
                sprint_id: "{{sprint_id}}"
            - name: post-digest
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "{{teams_channel_id}}"
                message: "Sprint {{sprint_id}} Retro: {{get-issues.done_count}} completed, {{get-issues.todo_count}} carried over. Velocity: {{get-issues.story_points_completed}} story points."
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://metlife.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: sprint-issues
          path: "/board/{{board_id}}/sprint/{{sprint_id}}/issue"
          inputParameters:
            - name: board_id
              in: path
            - name: sprint_id
              in: path
          operations:
            - name: list-sprint-issues
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Retrieves Jira issue status including assignee and priority.

naftiko: "0.5"
info:
  label: "Jira Ticket Status Lookup"
  description: "Retrieves Jira issue status including assignee and priority."
  tags:
    - engineering
    - jira
capability:
  exposes:
    - type: mcp
      namespace: jira-ops
      port: 8080
      tools:
        - name: get-ticket
          description: "Look up Jira ticket."
          inputParameters:
            - name: key
              in: body
              type: string
              description: "Issue key."
          call: "jira.get-issue"
          with:
            key: "{{key}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.fields.status.name"
            - name: assignee
              type: string
              mapping: "$.fields.assignee.displayName"
            - name: priority
              type: string
              mapping: "$.fields.priority.name"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://metlife.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 LinkedIn Campaign Manager performance data for MetLife employer brand campaigns and posts a weekly summary to the talent acquisition Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "LinkedIn Employer Brand Campaign Report"
  description: "Retrieves LinkedIn Campaign Manager performance data for MetLife employer brand campaigns and posts a weekly summary to the talent acquisition Microsoft Teams channel."
  tags:
    - marketing
    - linkedin
    - employer-brand
    - microsoft-teams
    - reporting
    - recruiting
capability:
  exposes:
    - type: mcp
      namespace: employer-brand
      port: 8080
      tools:
        - name: digest-employer-brand-performance
          description: "Given a LinkedIn Campaign Manager account ID and date range, retrieve impressions, clicks, applications, and cost-per-application for employer brand campaigns and post a digest to the talent acquisition Microsoft Teams channel."
          inputParameters:
            - name: account_id
              in: body
              type: string
              description: "The LinkedIn Campaign Manager account ID for employer brand campaigns."
            - name: date_start
              in: body
              type: string
              description: "Start date for the performance period (YYYY-MM-DD)."
            - name: date_end
              in: body
              type: string
              description: "End date for the performance period (YYYY-MM-DD)."
          steps:
            - name: get-analytics
              type: call
              call: "linkedin.get-campaign-analytics"
              with:
                account_id: "{{account_id}}"
                start_date: "{{date_start}}"
                end_date: "{{date_end}}"
            - name: post-digest
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "talent-acquisition"
                message: "Employer Brand Campaign ({{date_start}} to {{date_end}}): Impressions: {{get-analytics.impressions}} | Clicks: {{get-analytics.clicks}} | Applications: {{get-analytics.conversions}} | Cost/App: ${{get-analytics.costPerConversion}}"
  consumes:
    - type: http
      namespace: linkedin
      baseUri: "https://api.linkedin.com/v2"
      authentication:
        type: bearer
        token: "$secrets.linkedin_token"
      resources:
        - name: campaign-analytics
          path: "/adAnalyticsV2"
          operations:
            - name: get-campaign-analytics
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

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

Provisions Okta access for new employees based on business unit role, and logs the provisioning event in ServiceNow for SOX compliance audit trail.

naftiko: "0.5"
info:
  label: "Okta Identity Provisioning and Compliance Logging"
  description: "Provisions Okta access for new employees based on business unit role, and logs the provisioning event in ServiceNow for SOX compliance audit trail."
  tags:
    - identity
    - security
    - okta
    - servicenow
    - access-management
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: identity-compliance
      port: 8080
      tools:
        - name: provision-compliant-access
          description: "Given an employee email, business unit, and application list, provision Okta group membership for insurance system access and log the event in ServiceNow for SOX compliance audit trail."
          inputParameters:
            - name: user_email
              in: body
              type: string
              description: "The employee work email address."
            - name: business_unit
              in: body
              type: string
              description: "The MetLife business unit (e.g., Group Benefits, Retirement Income, International)."
            - name: application_ids
              in: body
              type: string
              description: "Comma-separated list of application IDs to provision access for."
          steps:
            - name: get-user
              type: call
              call: "okta.get-user"
              with:
                email: "{{user_email}}"
            - name: assign-groups
              type: call
              call: "okta.assign-group"
              with:
                user_id: "{{get-user.id}}"
                business_unit: "{{business_unit}}"
            - name: log-compliance
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "SOX access provisioning: {{user_email}} - {{business_unit}}"
                category: "access_management"
                description: "Applications: {{application_ids}} | Business Unit: {{business_unit}} | Approved via Workday"
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://metlife.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_api_token"
        placement: header
      resources:
        - name: users
          path: "/users"
          operations:
            - name: get-user
              method: GET
        - name: group-memberships
          path: "/groups/{{group_id}}/users/{{user_id}}"
          inputParameters:
            - name: group_id
              in: path
            - name: user_id
              in: path
          operations:
            - name: assign-group
              method: PUT
    - type: http
      namespace: servicenow
      baseUri: "https://metlife.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incident
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST

When Okta detects a suspicious login event for a MetLife employee, suspends the user account, creates a high-priority ServiceNow security incident, and notifies the security operations team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Okta Suspicious Login Security Incident"
  description: "When Okta detects a suspicious login event for a MetLife employee, suspends the user account, creates a high-priority ServiceNow security incident, and notifies the security operations team via Microsoft Teams."
  tags:
    - security
    - identity
    - okta
    - servicenow
    - microsoft-teams
    - siem
capability:
  exposes:
    - type: mcp
      namespace: security-ops
      port: 8080
      tools:
        - name: handle-suspicious-login
          description: "Given an Okta suspicious login event with user email and source IP address, suspend the user account, create a high-priority ServiceNow security incident, and alert the security operations Microsoft Teams channel."
          inputParameters:
            - name: user_email
              in: body
              type: string
              description: "The email of the employee whose login was flagged as suspicious."
            - name: ip_address
              in: body
              type: string
              description: "The IP address from which the suspicious login originated."
            - name: event_id
              in: body
              type: string
              description: "The Okta system log event ID for the suspicious login."
          steps:
            - name: get-user
              type: call
              call: "okta.get-user"
              with:
                email: "{{user_email}}"
            - name: suspend-account
              type: call
              call: "okta.suspend-user"
              with:
                user_id: "{{get-user.id}}"
            - name: create-security-incident
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Suspicious login: {{user_email}} from {{ip_address}}"
                urgency: "1"
                category: "security_incident"
            - name: alert-soc
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "security-operations"
                message: "SECURITY: Account suspended for {{user_email}} after suspicious login from {{ip_address}}. SNOW: {{create-security-incident.number}}"
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://metlife.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_api_token"
        placement: header
      resources:
        - name: users
          path: "/users"
          operations:
            - name: get-user
              method: GET
        - name: user-lifecycle-suspend
          path: "/users/{{user_id}}/lifecycle/suspend"
          inputParameters:
            - name: user_id
              in: path
          operations:
            - name: suspend-user
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://metlife.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incident
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

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://metlife.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.metlife.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.metlife.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: "MetLife 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.metlife.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.metlife.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://metlife.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://metlife.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: "MetLife 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://metlife.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: "MetLife 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.metlife.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.metlife.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://metlife.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.metlife.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://metlife.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://metlife.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://metlife.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: "MetLife 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.metlife.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.metlife.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://metlife.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.metlife.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.metlife.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://metlife.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: policies
          path: "/sobjects/Policy__c"
          operations:
            - name: reinstate
              method: PATCH

Queries Salesforce for policies expiring within 60 days, creates outreach tasks for agents, and posts a renewal pipeline summary to the sales Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Policy Renewal Reminder Campaign"
  description: "Queries Salesforce for policies expiring within 60 days, creates outreach tasks for agents, and posts a renewal pipeline summary to the sales Microsoft Teams channel."
  tags:
    - sales
    - insurance
    - salesforce
    - microsoft-teams
    - renewal
    - pipeline
capability:
  exposes:
    - type: mcp
      namespace: policy-renewal
      port: 8080
      tools:
        - name: run-renewal-reminder-campaign
          description: "Query Salesforce for insurance policies expiring within a specified number of days, create follow-up tasks for the responsible agents, and post a renewal pipeline summary to the sales Microsoft Teams channel."
          inputParameters:
            - name: days_until_expiry
              in: body
              type: integer
              description: "Number of days ahead to scan for expiring policies (e.g., 60)."
            - name: product_type
              in: body
              type: string
              description: "Insurance product type to filter by (e.g., life, group_benefits, or all)."
          steps:
            - name: get-expiring-policies
              type: call
              call: "salesforce.query-expiring-policies"
              with:
                days_until_expiry: "{{days_until_expiry}}"
                product_type: "{{product_type}}"
            - name: create-outreach-tasks
              type: call
              call: "salesforce.create-task-batch"
              with:
                policy_ids: "{{get-expiring-policies.policy_ids}}"
                subject: "Policy renewal outreach - {{product_type}}"
                due_date: "+7d"
            - name: post-pipeline-summary
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "sales-pipeline"
                message: "Renewal Campaign: {{get-expiring-policies.policy_count}} {{product_type}} policies expiring within {{days_until_expiry}} days. Outreach tasks created for all agents."
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://metlife.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: policy-queries
          path: "/query"
          operations:
            - name: query-expiring-policies
              method: GET
        - name: tasks
          path: "/sobjects/Task"
          operations:
            - name: create-task-batch
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

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

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

Triggers a Power BI dataset refresh for the actuarial risk and reserve dashboard and notifies the actuarial team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Power BI Actuarial Dashboard Refresh"
  description: "Triggers a Power BI dataset refresh for the actuarial risk and reserve dashboard and notifies the actuarial team via Microsoft Teams."
  tags:
    - analytics
    - reporting
    - power-bi
    - actuarial
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: actuarial-analytics
      port: 8080
      tools:
        - name: refresh-actuarial-dashboard
          description: "Given a Power BI workspace and dataset ID, trigger a dataset refresh for the actuarial risk and reserve dashboard and notify the actuarial team via Microsoft Teams."
          inputParameters:
            - name: workspace_id
              in: body
              type: string
              description: "The Power BI workspace ID containing the actuarial dashboard."
            - name: dataset_id
              in: body
              type: string
              description: "The Power BI dataset ID for the actuarial dashboard."
          steps:
            - name: trigger-refresh
              type: call
              call: "powerbi.refresh-dataset"
              with:
                workspace_id: "{{workspace_id}}"
                dataset_id: "{{dataset_id}}"
            - name: notify-actuarial
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "actuarial-team"
                message: "Actuarial dashboard refresh initiated for dataset {{dataset_id}}. Data will be current within 20 minutes."
  consumes:
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: dataset-refreshes
          path: "/groups/{{workspace_id}}/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: workspace_id
              in: path
            - name: dataset_id
              in: path
          operations:
            - name: refresh-dataset
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Detects Confluence updates and broadcasts to staff via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Procedure Update Notifier Workflow"
  description: "Detects Confluence updates and broadcasts to staff via Microsoft Teams."
  tags:
    - insurance
    - confluence
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: proc-notify
      port: 8080
      tools:
        - name: notify-update
          description: "Notify procedure updates."
          inputParameters:
            - name: page_id
              in: body
              type: string
              description: "Page ID."
          steps:
            - name: history
              type: call
              call: "confluence.get-history"
              with:
                page_id: "{{page_id}}"
            - name: notify
              type: call
              call: "msteams.post"
              with:
                channel_id: "$secrets.all_staff"
                text: "Updated: {{history.title}}"
  consumes:
    - type: http
      namespace: confluence
      baseUri: "https://metlife.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.metlife.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.metlife.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://metlife.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://metlife.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.metlife.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.metlife.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://metlife.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.metlife.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://metlife.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.metlife.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.metlife.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://metlife.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://metlife.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://metlife.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://metlife.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

Escalates a high-priority Salesforce customer service case to the senior resolution team, pages the on-call manager via PagerDuty, and notifies the customer success Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Salesforce Customer Service Case Escalation"
  description: "Escalates a high-priority Salesforce customer service case to the senior resolution team, pages the on-call manager via PagerDuty, and notifies the customer success Microsoft Teams channel."
  tags:
    - customer-service
    - salesforce
    - pagerduty
    - microsoft-teams
    - escalation
capability:
  exposes:
    - type: mcp
      namespace: customer-service-ops
      port: 8080
      tools:
        - name: escalate-customer-case
          description: "Given a Salesforce case ID that requires escalation, retrieve case details, trigger a PagerDuty alert to the on-call customer service manager, and post context to the customer success Microsoft Teams channel."
          inputParameters:
            - name: case_id
              in: body
              type: string
              description: "The Salesforce case ID to escalate."
            - name: escalation_reason
              in: body
              type: string
              description: "Reason for escalation (e.g., regulatory complaint, high-value customer, SLA breach)."
          steps:
            - name: get-case
              type: call
              call: "salesforce.get-case"
              with:
                case_id: "{{case_id}}"
            - name: page-manager
              type: call
              call: "pagerduty.create-incident"
              with:
                title: "Customer Case Escalated: {{case_id}} - {{get-case.subject}}"
                severity: "high"
                body: "{{escalation_reason}} | Policy: {{get-case.policy_number}} | Customer: {{get-case.contact_name}}"
            - name: notify-team
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "customer-success"
                message: "Case Escalated: {{case_id}} | {{get-case.contact_name}} | Reason: {{escalation_reason}} | PagerDuty incident created."
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://metlife.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: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.pagerduty_token"
        placement: header
      resources:
        - name: incidents
          path: "/incidents"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

When a Salesforce insurance opportunity is marked Closed Won, creates a corresponding SAP S/4HANA revenue entry and notifies the sales operations team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Salesforce New Business Opportunity Sync to SAP"
  description: "When a Salesforce insurance opportunity is marked Closed Won, creates a corresponding SAP S/4HANA revenue entry and notifies the sales operations team via Microsoft Teams."
  tags:
    - sales
    - crm
    - salesforce
    - sap-s4hana
    - microsoft-teams
    - revenue
capability:
  exposes:
    - type: mcp
      namespace: new-business-ops
      port: 8080
      tools:
        - name: sync-won-opportunity-to-sap
          description: "Given a Salesforce opportunity ID marked Closed Won for a new insurance policy, retrieve deal details, post a SAP S/4HANA revenue entry, and notify the sales ops Microsoft Teams channel."
          inputParameters:
            - name: opportunity_id
              in: body
              type: string
              description: "The Salesforce Opportunity ID that has been marked Closed Won."
          steps:
            - name: get-opportunity
              type: call
              call: "salesforce.get-opportunity"
              with:
                opportunity_id: "{{opportunity_id}}"
            - name: post-revenue
              type: call
              call: "sap-s4.post-revenue"
              with:
                customer: "{{get-opportunity.account_name}}"
                amount: "{{get-opportunity.amount}}"
                product_line: "{{get-opportunity.product_type}}"
            - name: notify-sales-ops
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "sales-operations"
                message: "New Business Won: {{get-opportunity.account_name}} - ${{get-opportunity.amount}} {{get-opportunity.product_type}}. SAP revenue posted."
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://metlife.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opportunity
          path: "/sobjects/Opportunity/{{opportunity_id}}"
          inputParameters:
            - name: opportunity_id
              in: path
          operations:
            - name: get-opportunity
              method: GET
    - type: http
      namespace: sap-s4
      baseUri: "https://metlife-s4.sap.com/sap/opu/odata/sap/FI_REVENUE_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: revenue-entries
          path: "/A_RevenueEntry"
          operations:
            - name: post-revenue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Queries SAP Ariba for insurance vendor contracts expiring within 90 days, creates Jira procurement renewal tasks, and notifies the vendor management team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "SAP Ariba Contract Expiry Alert"
  description: "Queries SAP Ariba for insurance vendor contracts expiring within 90 days, creates Jira procurement renewal tasks, and notifies the vendor management team via Microsoft Teams."
  tags:
    - procurement
    - sap-ariba
    - jira
    - microsoft-teams
    - contract-management
capability:
  exposes:
    - type: mcp
      namespace: contract-management
      port: 8080
      tools:
        - name: alert-expiring-vendor-contracts
          description: "Query SAP Ariba for vendor contracts expiring within a specified number of days, create Jira renewal tasks for each contract, and notify the vendor management Microsoft Teams channel."
          inputParameters:
            - name: days_ahead
              in: body
              type: integer
              description: "Number of days ahead to check for expiring contracts (e.g., 90)."
          steps:
            - name: get-expiring
              type: call
              call: "sap-ariba.list-expiring-contracts"
              with:
                expiry_within_days: "{{days_ahead}}"
            - name: create-renewal-task
              type: call
              call: "jira.create-issue"
              with:
                project_key: "PROC"
                issuetype: "Task"
                summary: "Vendor contract renewals due in {{days_ahead}} days: {{get-expiring.contract_count}}"
                description: "{{get-expiring.contract_list}}"
            - name: notify-vendor-mgmt
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "vendor-management"
                message: "Contract Alert: {{get-expiring.contract_count}} vendor contracts expiring within {{days_ahead}} days. Jira: {{create-renewal-task.key}}"
  consumes:
    - type: http
      namespace: sap-ariba
      baseUri: "https://openapi.ariba.com/api/contract/v1"
      authentication:
        type: apikey
        key: "apiKey"
        value: "$secrets.ariba_api_key"
        placement: header
      resources:
        - name: contracts
          path: "/contracts"
          operations:
            - name: list-expiring-contracts
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://metlife.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Creates and routes a purchase requisition in SAP Ariba for corporate procurement and logs it against the appropriate cost center in SAP S/4HANA.

naftiko: "0.5"
info:
  label: "SAP Ariba Procurement Request"
  description: "Creates and routes a purchase requisition in SAP Ariba for corporate procurement and logs it against the appropriate cost center in SAP S/4HANA."
  tags:
    - procurement
    - sap-ariba
    - sap-s4hana
    - finance
    - approval
capability:
  exposes:
    - type: mcp
      namespace: procurement-ops
      port: 8080
      tools:
        - name: create-procurement-request
          description: "Given a supplier, item description, quantity, unit price, and cost center, create a purchase requisition in SAP Ariba and post the cost center entry to SAP S/4HANA."
          inputParameters:
            - name: supplier_id
              in: body
              type: string
              description: "The SAP Ariba supplier ID."
            - name: item_description
              in: body
              type: string
              description: "Description of the item or service being procured."
            - name: quantity
              in: body
              type: integer
              description: "Quantity requested."
            - name: unit_price
              in: body
              type: number
              description: "Unit price in USD."
            - name: cost_center
              in: body
              type: string
              description: "The cost center code to charge."
          steps:
            - name: create-requisition
              type: call
              call: "sap-ariba.create-requisition"
              with:
                supplier_id: "{{supplier_id}}"
                description: "{{item_description}}"
                quantity: "{{quantity}}"
                unit_price: "{{unit_price}}"
                cost_center: "{{cost_center}}"
            - name: post-cost-entry
              type: call
              call: "sap-s4.create-cost-entry"
              with:
                cost_center: "{{cost_center}}"
                amount: "{{unit_price}}"
                document_reference: "{{create-requisition.requisition_id}}"
  consumes:
    - type: http
      namespace: sap-ariba
      baseUri: "https://openapi.ariba.com/api/purchase-req/v1"
      authentication:
        type: apikey
        key: "apiKey"
        value: "$secrets.ariba_api_key"
        placement: header
      resources:
        - name: requisitions
          path: "/requisitions"
          operations:
            - name: create-requisition
              method: POST
    - type: http
      namespace: sap-s4
      baseUri: "https://metlife-s4.sap.com/sap/opu/odata/sap/CO_COST_CENTER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: cost-entries
          path: "/A_CostEntry"
          operations:
            - name: create-cost-entry
              method: POST

Audits SAP Concur expense reports for MetLife travel policy compliance, flags policy violations, and routes non-compliant reports for manager review.

naftiko: "0.5"
info:
  label: "SAP Concur Employee Expense Audit"
  description: "Audits SAP Concur expense reports for MetLife travel policy compliance, flags policy violations, and routes non-compliant reports for manager review."
  tags:
    - finance
    - expense-management
    - sap-concur
    - compliance
    - audit
capability:
  exposes:
    - type: mcp
      namespace: expense-compliance
      port: 8080
      tools:
        - name: audit-expense-report
          description: "Given a SAP Concur expense report ID, retrieve report line items, validate each against MetLife travel and expense policy, and flag non-compliant items for manager review."
          inputParameters:
            - name: report_id
              in: body
              type: string
              description: "The SAP Concur expense report ID to audit."
            - name: per_diem_limit
              in: body
              type: number
              description: "Maximum allowed per diem amount in USD for this trip destination."
          steps:
            - name: get-report
              type: call
              call: "concur.get-report"
              with:
                report_id: "{{report_id}}"
            - name: flag-for-review
              type: call
              call: "concur.update-report-status"
              with:
                report_id: "{{report_id}}"
                status: "Pending_Manager_Review"
                comment: "Policy audit: items exceed per diem limit of ${{per_diem_limit}}"
  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-report
              method: GET
            - name: update-report-status
              method: PATCH

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://metlife-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://metlife.snowflakecomputing.com/api/v2"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: cases
          path: "/table/sn_customerservice_case"
          operations:
            - name: create-case
              method: POST

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

naftiko: "0.5"
info:
  label: "SAP Purchase Order Lookup"
  description: "Looks up purchase order in SAP returning status, supplier, and value."
  tags:
    - procurement
    - finance
    - sap
capability:
  exposes:
    - type: mcp
      namespace: po-ops
      port: 8080
      tools:
        - name: get-po
          description: "Look up PO. Returns status, supplier, value."
          inputParameters:
            - name: po_number
              in: body
              type: string
              description: "SAP PO number."
          call: "sap.get-po"
          with:
            po_number: "{{po_number}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.status"
            - name: supplier
              type: string
              mapping: "$.supplier.name"
            - name: value
              type: number
              mapping: "$.totalCost.amount"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://metlife-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

Initiates the monthly financial period close in SAP S/4HANA, creates a Jira checklist for the finance team, and notifies the controller via Microsoft Teams.

naftiko: "0.5"
info:
  label: "SAP S/4HANA Finance Period Close"
  description: "Initiates the monthly financial period close in SAP S/4HANA, creates a Jira checklist for the finance team, and notifies the controller via Microsoft Teams."
  tags:
    - finance
    - period-close
    - sap-s4hana
    - jira
    - microsoft-teams
    - erp
capability:
  exposes:
    - type: mcp
      namespace: finance-close
      port: 8080
      tools:
        - name: initiate-period-close
          description: "Given a fiscal period and year, retrieve SAP S/4HANA period close status, create a Jira epic with close checklist tasks for the MetLife finance team, and notify the controller via Microsoft Teams."
          inputParameters:
            - name: fiscal_period
              in: body
              type: string
              description: "The fiscal period number to close (01-12)."
            - name: fiscal_year
              in: body
              type: string
              description: "The fiscal year to close (e.g., 2026)."
          steps:
            - name: get-close-status
              type: call
              call: "sap-s4.get-period-close-status"
              with:
                fiscal_period: "{{fiscal_period}}"
                fiscal_year: "{{fiscal_year}}"
            - name: create-epic
              type: call
              call: "jira.create-issue"
              with:
                project_key: "FIN"
                issuetype: "Epic"
                summary: "Period Close {{fiscal_period}}/{{fiscal_year}}"
                description: "SAP status: {{get-close-status.status}} | Company code: {{get-close-status.company_code}}"
            - name: notify-controller
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "global-finance"
                message: "Period close initiated: FY{{fiscal_year}} Period {{fiscal_period}}. Jira: {{create-epic.key}}"
  consumes:
    - type: http
      namespace: sap-s4
      baseUri: "https://metlife-s4.sap.com/sap/opu/odata/sap/FI_PERIOD_CLOSE_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: period-close-status
          path: "/PeriodCloseStatusSet"
          operations:
            - name: get-period-close-status
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://metlife.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Retrieves a ServiceNow change request for IT infrastructure, notifies the Change Advisory Board via Microsoft Teams, and updates the approval status.

naftiko: "0.5"
info:
  label: "ServiceNow IT Incident Change Advisory Board"
  description: "Retrieves a ServiceNow change request for IT infrastructure, notifies the Change Advisory Board via Microsoft Teams, and updates the approval status."
  tags:
    - itsm
    - change-management
    - servicenow
    - microsoft-teams
    - approval
capability:
  exposes:
    - type: mcp
      namespace: cab-process
      port: 8080
      tools:
        - name: process-cab-approval
          description: "Given a ServiceNow change request number and approval decision, retrieve the change details, update the record with the approval decision, and notify the IT Change Advisory Board via Microsoft Teams."
          inputParameters:
            - name: change_number
              in: body
              type: string
              description: "The ServiceNow change request number (e.g., CHG0012345)."
            - name: approval_decision
              in: body
              type: string
              description: "The approval decision: approved or rejected."
            - name: approver_comments
              in: body
              type: string
              description: "Comments from the approver."
          steps:
            - name: get-change
              type: call
              call: "servicenow-lookup.get-change-request"
              with:
                number: "{{change_number}}"
            - name: update-change
              type: call
              call: "servicenow-update.update-change"
              with:
                sys_id: "{{get-change.sys_id}}"
                state: "{{approval_decision}}"
                comments: "{{approver_comments}}"
            - name: notify-cab
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "change-advisory-board"
                message: "Change {{change_number}} - {{get-change.short_description}}: {{approval_decision}}. Approver notes: {{approver_comments}}"
  consumes:
    - type: http
      namespace: servicenow-lookup
      baseUri: "https://metlife.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: change-request
          path: "/table/change_request"
          operations:
            - name: get-change-request
              method: GET
    - type: http
      namespace: servicenow-update
      baseUri: "https://metlife.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: change-record
          path: "/table/change_request/{{sys_id}}"
          inputParameters:
            - name: sys_id
              in: path
          operations:
            - name: update-change
              method: PATCH
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Searches ServiceNow knowledge base for articles matching a query.

naftiko: "0.5"
info:
  label: "ServiceNow Knowledge Article Search"
  description: "Searches ServiceNow knowledge base for articles matching a query."
  tags:
    - insurance
    - servicenow
    - knowledge-management
capability:
  exposes:
    - type: mcp
      namespace: kb-ops
      port: 8080
      tools:
        - name: search-kb
          description: "Search knowledge base. Returns articles."
          inputParameters:
            - name: query
              in: body
              type: string
              description: "Search query."
            - name: category
              in: body
              type: string
              description: "Category."
          call: "servicenow.search"
          with:
            query: "{{query}}"
            category: "{{category}}"
          outputParameters:
            - name: articles
              type: array
              mapping: "$.result"
            - name: total
              type: integer
              mapping: "$.totalResults"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://metlife.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

Monitors Snowflake for failed claims analytics pipeline tasks, creates Jira issues for each failure, and alerts the data engineering team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Snowflake Claims Analytics Pipeline Monitor"
  description: "Monitors Snowflake for failed claims analytics pipeline tasks, creates Jira issues for each failure, and alerts the data engineering team via Microsoft Teams."
  tags:
    - data
    - analytics
    - snowflake
    - jira
    - microsoft-teams
    - monitoring
    - claims
capability:
  exposes:
    - type: mcp
      namespace: claims-data-ops
      port: 8080
      tools:
        - name: monitor-claims-pipelines
          description: "Query Snowflake for failed claims analytics pipeline tasks in the last 24 hours, create Jira issues for critical failures, and post a summary alert to the data engineering Microsoft Teams channel."
          inputParameters:
            - name: warehouse
              in: body
              type: string
              description: "The Snowflake warehouse running claims data pipelines."
            - name: lookback_hours
              in: body
              type: integer
              description: "Number of hours to look back for failures (default 24)."
          steps:
            - name: get-failures
              type: call
              call: "snowflake.query-task-failures"
              with:
                warehouse: "{{warehouse}}"
                lookback_hours: "{{lookback_hours}}"
            - name: create-issue
              type: call
              call: "jira.create-issue"
              with:
                project_key: "DATA"
                issuetype: "Bug"
                summary: "Claims pipeline failures in {{warehouse}}: {{get-failures.failure_count}}"
                description: "{{get-failures.failure_summary}}"
            - name: notify-data-team
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "data-engineering"
                message: "Claims Pipeline Alert: {{get-failures.failure_count}} failures in {{warehouse}}. Jira: {{create-issue.key}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://metlife.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: query-task-failures
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://metlife.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

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://metlife.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://metlife.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: "MetLife 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://metlife.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: queries
          path: "/statements"
          operations:
            - name: query-clv
              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.metlife.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://metlife.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://metlife.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

Creates a new Terraform Cloud workspace for an insurance application team, links it to GitHub, and notifies the platform engineering team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Terraform Cloud Cloud Workspace Provisioning"
  description: "Creates a new Terraform Cloud workspace for an insurance application team, links it to GitHub, and notifies the platform engineering team via Microsoft Teams."
  tags:
    - cloud
    - infrastructure
    - terraform
    - github
    - microsoft-teams
    - provisioning
capability:
  exposes:
    - type: mcp
      namespace: cloud-provisioning
      port: 8080
      tools:
        - name: provision-application-workspace
          description: "Given an application team name, GitHub repository, and target environment, create a Terraform Cloud workspace for the insurance application, link it to the repository, and notify the platform engineering Microsoft Teams channel."
          inputParameters:
            - name: team_name
              in: body
              type: string
              description: "The application team name for workspace naming."
            - name: repository
              in: body
              type: string
              description: "The GitHub repository to link to the workspace."
            - name: environment
              in: body
              type: string
              description: "Target environment: dev, staging, or production."
          steps:
            - name: create-workspace
              type: call
              call: "terraform.create-workspace"
              with:
                name: "{{team_name}}-{{environment}}"
                vcs_repo: "{{repository}}"
            - name: notify-platform
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "platform-engineering"
                message: "Workspace created: {{team_name}}-{{environment}} linked to {{repository}}. Workspace ID: {{create-workspace.workspace_id}}"
  consumes:
    - type: http
      namespace: terraform
      baseUri: "https://app.terraform.io/api/v2"
      authentication:
        type: bearer
        token: "$secrets.terraform_token"
      resources:
        - name: workspaces
          path: "/organizations/metlife/workspaces"
          operations:
            - name: create-workspace
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Provisions infrastructure via Terraform Cloud and notifies platform team.

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

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

naftiko: "0.5"
info:
  label: "Underwriting Appetite Check"
  description: "Checks current underwriting appetite for product, state, and risk class."
  tags:
    - insurance
    - underwriting
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: appetite-ops
      port: 8080
      tools:
        - name: check-appetite
          description: "Check appetite. Returns status and restrictions."
          inputParameters:
            - name: product
              in: body
              type: string
              description: "Product type."
            - name: state
              in: body
              type: string
              description: "State code."
            - name: risk_class
              in: body
              type: string
              description: "Risk class."
          call: "uw-api.check"
          with:
            product: "{{product}}"
            state: "{{state}}"
            risk_class: "{{risk_class}}"
          outputParameters:
            - name: accepting
              type: boolean
              mapping: "$.isAccepting"
            - name: restrictions
              type: array
              mapping: "$.restrictions"
  consumes:
    - type: http
      namespace: uw-api
      baseUri: "https://api.metlife.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://metlife.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.metlife.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.metlife.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://metlife.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://metlife-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.metlife.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://metlife.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://metlife.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

Launches the annual performance review cycle in Workday for a business unit, creates HR coordination Jira tasks, and notifies all employees via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Workday Annual Performance Review Launch"
  description: "Launches the annual performance review cycle in Workday for a business unit, creates HR coordination Jira tasks, and notifies all employees via Microsoft Teams."
  tags:
    - hr
    - performance-management
    - workday
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: performance-review
      port: 8080
      tools:
        - name: launch-annual-review
          description: "Given a Workday business unit ID and review cycle parameters, retrieve employee roster, create HR coordination tasks in Jira, and broadcast the review launch to the business unit Microsoft Teams channel."
          inputParameters:
            - name: business_unit_id
              in: body
              type: string
              description: "The Workday business unit ID for which to launch the annual review."
            - name: cycle_name
              in: body
              type: string
              description: "Name of the annual review cycle (e.g., 2026 Annual Performance Review)."
            - name: due_date
              in: body
              type: string
              description: "The self-assessment due date in ISO 8601 format (YYYY-MM-DD)."
          steps:
            - name: get-business-unit
              type: call
              call: "workday.get-org-unit"
              with:
                unit_id: "{{business_unit_id}}"
            - name: create-hr-tasks
              type: call
              call: "jira.create-issue"
              with:
                project_key: "HR"
                issuetype: "Task"
                summary: "Annual review coordination: {{cycle_name}} - {{get-business-unit.name}}"
                description: "Business unit: {{get-business-unit.name}} | Headcount: {{get-business-unit.headcount}} | Due: {{due_date}}"
            - name: notify-unit
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "{{get-business-unit.teams_channel_id}}"
                message: "Annual Performance Review Launched: {{cycle_name}} is now open. Please complete your self-assessment by {{due_date}}."
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: basic
        username: "$secrets.workday_user"
        password: "$secrets.workday_password"
      resources:
        - name: org-units
          path: "/metlife/organizations/{{unit_id}}"
          inputParameters:
            - name: unit_id
              in: path
          operations:
            - name: get-org-unit
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://metlife.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

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/metlife"
      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

At the start of benefits open enrollment, retrieves eligible employees from Workday and sends personalized enrollment reminder messages via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Workday Benefits Open Enrollment Notification"
  description: "At the start of benefits open enrollment, retrieves eligible employees from Workday and sends personalized enrollment reminder messages via Microsoft Teams."
  tags:
    - hr
    - benefits
    - workday
    - microsoft-teams
    - enrollment
capability:
  exposes:
    - type: mcp
      namespace: benefits-enrollment
      port: 8080
      tools:
        - name: launch-open-enrollment
          description: "Given a Workday benefits plan year and enrollment deadline, retrieve all eligible employees, and send a personalized enrollment reminder via Microsoft Teams to each employee who has not yet enrolled."
          inputParameters:
            - name: plan_year
              in: body
              type: string
              description: "The benefits plan year for open enrollment (e.g., 2027)."
            - name: enrollment_deadline
              in: body
              type: string
              description: "The open enrollment deadline date in ISO 8601 format (YYYY-MM-DD)."
          steps:
            - name: get-eligible-employees
              type: call
              call: "workday.list-benefits-eligible-workers"
              with:
                plan_year: "{{plan_year}}"
            - name: notify-employees
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "all-employees"
                message: "Benefits Open Enrollment is now open for {{plan_year}}! Please complete your selections by {{enrollment_deadline}}. Eligible employees: {{get-eligible-employees.count}}."
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: basic
        username: "$secrets.workday_user"
        password: "$secrets.workday_password"
      resources:
        - name: benefits-eligible
          path: "/metlife/workers"
          operations:
            - name: list-benefits-eligible-workers
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Retrieves current headcount by department and benefits enrollment status from Workday for actuarial planning and benefits reporting.

naftiko: "0.5"
info:
  label: "Workday Headcount and Benefits Snapshot"
  description: "Retrieves current headcount by department and benefits enrollment status from Workday for actuarial planning and benefits reporting."
  tags:
    - hr
    - finance
    - workday
    - headcount
    - benefits
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: hr-benefits-reporting
      port: 8080
      tools:
        - name: get-headcount-benefits-snapshot
          description: "Returns current headcount grouped by department with benefits enrollment counts from Workday. Use for actuarial planning, benefits cost analysis, and regulatory reporting."
          call: "workday.list-workers-with-benefits"
          outputParameters:
            - name: workers
              type: array
              mapping: "$.Report_Entry"
              items:
                - name: employee_id
                  type: string
                  mapping: "$.Employee_ID"
                - name: full_name
                  type: string
                  mapping: "$.Employee_Name"
                - name: department
                  type: string
                  mapping: "$.Department"
                - name: benefits_plan
                  type: string
                  mapping: "$.Benefits_Plan"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: basic
        username: "$secrets.workday_user"
        password: "$secrets.workday_password"
      resources:
        - name: workers-benefits
          path: "/metlife/workers"
          operations:
            - name: list-workers-with-benefits
              method: GET

When an employee job change is processed in Workday, updates their Okta group memberships for the new role and notifies the employee and manager via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Workday Role Change and Access Update"
  description: "When an employee job change is processed in Workday, updates their Okta group memberships for the new role and notifies the employee and manager via Microsoft Teams."
  tags:
    - hr
    - role-change
    - workday
    - okta
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-role-change
      port: 8080
      tools:
        - name: process-role-change
          description: "Given a Workday job change event ID, retrieve the employee's new role and department, update Okta access groups, and notify the employee and new manager via Microsoft Teams."
          inputParameters:
            - name: event_id
              in: body
              type: string
              description: "The Workday job change business process event ID."
          steps:
            - name: get-job-change
              type: call
              call: "workday.get-job-change-event"
              with:
                event_id: "{{event_id}}"
            - name: update-okta
              type: call
              call: "okta.update-user-groups"
              with:
                user_email: "{{get-job-change.employee_email}}"
                new_department: "{{get-job-change.new_department}}"
            - name: notify-employee
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{get-job-change.employee_email}}"
                message: "Congratulations! Your role change to {{get-job-change.new_job_title}} in {{get-job-change.new_department}} is effective {{get-job-change.effective_date}}."
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: basic
        username: "$secrets.workday_user"
        password: "$secrets.workday_password"
      resources:
        - name: job-change-events
          path: "/metlife/jobChangeEvents/{{event_id}}"
          inputParameters:
            - name: event_id
              in: path
          operations:
            - name: get-job-change-event
              method: GET
    - type: http
      namespace: okta
      baseUri: "https://metlife.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_api_token"
        placement: header
      resources:
        - name: user-groups
          path: "/users/{{user_id}}/groups"
          inputParameters:
            - name: user_id
              in: path
          operations:
            - name: update-user-groups
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_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/metlife"
      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