AIG Capabilities

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

Sort
Expand

Triggers a reserve calculation by pulling loss triangles from Snowflake, posting to SAP GL, and notifying the chief actuary via Teams.

naftiko: "0.5"
info:
  label: "Actuarial Reserve Calculation Workflow"
  description: "Triggers a reserve calculation by pulling loss triangles from Snowflake, posting to SAP GL, and notifying the chief actuary via Teams."
  tags:
    - insurance
    - actuarial
    - finance
    - snowflake
    - sap
capability:
  exposes:
    - type: mcp
      namespace: reserve-ops
      port: 8080
      tools:
        - name: trigger-reserve-calc
          description: "Given a valuation date and LOB, extract loss data from Snowflake, post the reserve entry to SAP, and notify the actuary."
          inputParameters:
            - name: valuation_date
              in: body
              type: string
              description: "Valuation date."
            - name: line_of_business
              in: body
              type: string
              description: "LOB."
            - name: actuary_upn
              in: body
              type: string
              description: "Chief actuary UPN."
          steps:
            - name: get-data
              type: call
              call: snowflake.run-query
              with:
                query: "SELECT * FROM reserve_triangles WHERE lob='{{line_of_business}}'"
            - name: post-gl
              type: call
              call: sap-fi.post-journal
              with:
                PostingDate: "{{valuation_date}}"
                Description: "Reserve: {{line_of_business}}"
            - name: notify-actuary
              type: call
              call: msteams.send-message
              with:
                recipient_upn: "{{actuary_upn}}"
                text: "Reserve calc: {{line_of_business}} as of {{valuation_date}}. GL: {{post-gl.document_number}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://aig.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: sap
      baseUri: "https://aig-s4.sap.com/sap/opu/odata/sap/API_JOURNAL_ENTRY_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: journal-entries
          path: "/A_JournalEntry"
          operations:
            - name: post-journal
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves a complex claims document from ServiceNow, sends it to Anthropic Claude for intelligent summarization, and posts the AI summary to the claims adjuster in Teams.

naftiko: "0.5"
info:
  label: "AI-Assisted Claims Document Summarization"
  description: "Retrieves a complex claims document from ServiceNow, sends it to Anthropic Claude for intelligent summarization, and posts the AI summary to the claims adjuster in Teams."
  tags:
    - ai
    - claims
    - servicenow
    - anthropic
    - insurance
capability:
  exposes:
    - type: mcp
      namespace: ai-claims
      port: 8080
      tools:
        - name: summarize-claims-document
          description: "Given a ServiceNow claim record ID, retrieve the claim description and attached documents, send to Anthropic Claude for an intelligent claim summary including coverage assessment and recommended next steps. Post the summary to the adjuster in Teams. Use when adjusters need rapid comprehension of complex or lengthy claims."
          inputParameters:
            - name: claim_record_id
              in: body
              type: string
              description: "ServiceNow claim record sys_id."
            - name: adjuster_upn
              in: body
              type: string
              description: "Claims adjuster Teams UPN."
          steps:
            - name: get-claim
              type: call
              call: servicenow-ai.get-record
              with:
                sys_id: "{{claim_record_id}}"
            - name: generate-summary
              type: call
              call: anthropic.create-message
              with:
                model: "claude-opus-4-5"
                prompt: "Summarize this insurance claim for an AIG claims adjuster. Include: 1) key facts of the loss, 2) likely coverage implications, 3) recommended immediate next steps. Claim: {{get-claim.description}}"
            - name: notify-adjuster
              type: call
              call: msteams-adj.send-message
              with:
                recipient_upn: "{{adjuster_upn}}"
                text: "AI Claim Summary for {{claim_record_id}}: {{generate-summary.content[0].text}}"
  consumes:
    - type: http
      namespace: servicenow-ai
      baseUri: "https://aig.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: claim-records
          path: "/table/u_claims_investigation/{{sys_id}}"
          inputParameters:
            - name: sys_id
              in: path
          operations:
            - name: get-record
              method: GET
    - type: http
      namespace: anthropic
      baseUri: "https://api.anthropic.com/v1"
      authentication:
        type: apikey
        key: "x-api-key"
        value: "$secrets.anthropic_api_key"
        placement: header
      resources:
        - name: messages
          path: "/messages"
          operations:
            - name: create-message
              method: POST
    - type: http
      namespace: msteams-adj
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves the latest build run for an Azure DevOps pipeline, returning status and result.

naftiko: "0.5"
info:
  label: "Azure DevOps Build Status Lookup"
  description: "Retrieves the latest build run for an Azure DevOps pipeline, returning status and result."
  tags:
    - insurance
    - devops
    - azure-devops
    - cicd
    - lookup
capability:
  exposes:
    - type: mcp
      namespace: cicd-ops
      port: 8080
      tools:
        - name: get-build-status
          description: "Given an Azure DevOps project and pipeline ID, return the latest build status and result."
          inputParameters:
            - name: project
              in: body
              type: string
              description: "Azure DevOps project name."
            - name: pipeline_id
              in: body
              type: string
              description: "Pipeline ID."
          call: azdo.get-run
          with:
            project: "{{project}}"
            pipelineId: "{{pipeline_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.value[0].state"
            - name: result
              type: string
              mapping: "$.value[0].result"
  consumes:
    - namespace: azdo
      type: http
      baseUri: "https://dev.azure.com/aig"
      authentication:
        type: bearer
        token: "$secrets.azdo_token"
      resources:
        - name: cicd-ops
          path: "/{{id}}"
          operations:
            - name: get-run
              method: GET

Responds to AKS scaling alerts by checking Datadog metrics, triggering node pool scaling via Azure, and notifying the platform team in Teams.

naftiko: "0.5"
info:
  label: "Azure Kubernetes Cluster Scaling Handler"
  description: "Responds to AKS scaling alerts by checking Datadog metrics, triggering node pool scaling via Azure, and notifying the platform team in Teams."
  tags:
    - insurance
    - devops
    - kubernetes
    - azure
    - datadog
capability:
  exposes:
    - type: mcp
      namespace: platform-ops
      port: 8080
      tools:
        - name: handle-aks-scaling
          description: "Given an AKS cluster name and CPU utilization, check Datadog metrics, scale Azure node pool, and notify platform team in Teams."
          inputParameters:
            - name: cluster_name
              in: body
              type: string
              description: "AKS cluster name."
            - name: cpu_utilization
              in: body
              type: number
              description: "CPU utilization percentage."
            - name: platform_channel_id
              in: body
              type: string
              description: "Teams channel ID."
          steps:
            - name: check-metrics
              type: call
              call: datadog.get-cluster-metrics
              with:
                cluster: "{{cluster_name}}"
            - name: scale-nodes
              type: call
              call: azure.scale-nodepool
              with:
                cluster: "{{cluster_name}}"
            - name: notify-team
              type: call
              call: msteams.post-channel
              with:
                channel_id: "{{platform_channel_id}}"
                text: "AKS scaling: {{cluster_name}} — CPU: {{cpu_utilization}}%. Trend: {{check-metrics.trend}}"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.datadog_api_key"
      resources:
        - name: metrics
          path: "/query?query=kubernetes.cpu.usage{{cluster}}"
          inputParameters:
            - name: cluster
              in: query
          operations:
            - name: get-cluster-metrics
              method: GET
    - type: http
      namespace: azure
      baseUri: "https://management.azure.com"
      authentication:
        type: bearer
        token: "$secrets.azure_mgmt_token"
      resources:
        - name: nodepools
          path: "/subscriptions/{{subId}}/resourceGroups/aks-rg/providers/Microsoft.ContainerService/managedClusters/{{cluster}}/agentPools/default"
          inputParameters:
            - name: cluster
              in: path
          operations:
            - name: scale-nodepool
              method: PUT
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: channels
          path: "/teams/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel
              method: POST

Queries Azure Cost Management for the current month spend of a specified resource group.

naftiko: "0.5"
info:
  label: "Azure Resource Group Cost Check"
  description: "Queries Azure Cost Management for the current month spend of a specified resource group."
  tags:
    - insurance
    - cloud
    - azure
    - finops
    - lookup
capability:
  exposes:
    - type: mcp
      namespace: cloud-finops
      port: 8080
      tools:
        - name: get-rg-cost
          description: "Given an Azure resource group name, return the current month total cost and forecast."
          inputParameters:
            - name: resource_group
              in: body
              type: string
              description: "Azure resource group name."
          call: azure-cost.get-cost
          with:
            resourceGroup: "{{resource_group}}"
          outputParameters:
            - name: total_cost
              type: number
              mapping: "$.properties.rows[0][0]"
            - name: forecast
              type: number
              mapping: "$.properties.rows[0][1]"
  consumes:
    - namespace: azure-cost
      type: http
      baseUri: "https://management.azure.com"
      authentication:
        type: bearer
        token: "$secrets.azure_mgmt_token"
      resources:
        - name: cloud-finops
          path: "/{{id}}"
          operations:
            - name: get-cost
              method: GET

Reconciles broker commissions by pulling payment data from SAP, comparing against Salesforce policy data, and emailing discrepancy reports.

naftiko: "0.5"
info:
  label: "Broker Commission Reconciliation Workflow"
  description: "Reconciles broker commissions by pulling payment data from SAP, comparing against Salesforce policy data, and emailing discrepancy reports."
  tags:
    - insurance
    - finance
    - commissions
    - sap
    - salesforce
capability:
  exposes:
    - type: mcp
      namespace: commission-ops
      port: 8080
      tools:
        - name: reconcile-commissions
          description: "Given a broker ID and period, pull SAP commission payments, compare with Salesforce, and send a reconciliation report."
          inputParameters:
            - name: broker_id
              in: body
              type: string
              description: "Broker ID."
            - name: period
              in: body
              type: string
              description: "Commission period."
            - name: finance_email
              in: body
              type: string
              description: "Finance contact email."
          steps:
            - name: get-payments
              type: call
              call: sap-fi.get-commissions
              with:
                broker_id: "{{broker_id}}"
                period: "{{period}}"
            - name: get-earned
              type: call
              call: sf.get-earned
              with:
                broker_id: "{{broker_id}}"
                period: "{{period}}"
            - name: send-report
              type: call
              call: msgraph.send-mail
              with:
                to: "{{finance_email}}"
                subject: "Commission Reconciliation: {{broker_id}} — {{period}}"
                body: "Paid: {{get-payments.total}} | Earned: {{get-earned.total}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://aig-s4.sap.com/sap/opu/odata/sap/API_JOURNAL_ENTRY_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: commissions
          path: "/A_JournalEntry?$filter=BrokerID eq '{{broker_id}}'"
          inputParameters:
            - name: broker_id
              in: query
          operations:
            - name: get-commissions
              method: GET
    - type: http
      namespace: sf
      baseUri: "https://aig.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: policies
          path: "/query/?q=SELECT+SUM(Commission__c)+FROM+Policy__c+WHERE+Broker_ID__c='{{broker_id}}'"
          inputParameters:
            - name: broker_id
              in: query
          operations:
            - name: get-earned
              method: GET
    - type: http
      namespace: msgraph
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/users/noreply@aig.com/sendMail"
          operations:
            - name: send-mail
              method: POST

Coordinates BC drills by pulling participant lists from Workday, creating tasks in ServiceNow, and distributing instructions via Teams.

naftiko: "0.5"
info:
  label: "Business Continuity Drill Coordinator"
  description: "Coordinates BC drills by pulling participant lists from Workday, creating tasks in ServiceNow, and distributing instructions via Teams."
  tags:
    - insurance
    - operations
    - business-continuity
    - workday
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: bcp-ops
      port: 8080
      tools:
        - name: coordinate-bc-drill
          description: "Given a drill scenario and date, pull department staff from Workday, create drill tasks in ServiceNow, and post instructions to Teams."
          inputParameters:
            - name: drill_scenario
              in: body
              type: string
              description: "Drill scenario."
            - name: drill_date
              in: body
              type: string
              description: "Drill date."
            - name: bcp_channel_id
              in: body
              type: string
              description: "Teams channel ID."
          steps:
            - name: get-participants
              type: call
              call: workday.get-staff
              with:
                scenario: "{{drill_scenario}}"
            - name: create-task
              type: call
              call: snow.create-task
              with:
                short_description: "BC Drill: {{drill_scenario}} — {{drill_date}}"
                description: "Participants: {{get-participants.count}}"
            - name: notify-channel
              type: call
              call: msteams.post-channel
              with:
                channel_id: "{{bcp_channel_id}}"
                text: "BC Drill: {{drill_scenario}} on {{drill_date}}. Participants: {{get-participants.count}}. Task: {{create-task.number}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd5-impl-services1.workday.com/ccx/service/aig/Human_Resources/v40.1"
      authentication:
        type: basic
        username: "$secrets.workday_user"
        password: "$secrets.workday_password"
      resources:
        - name: staff
          path: "/workers"
          operations:
            - name: get-staff
              method: GET
    - type: http
      namespace: snow
      baseUri: "https://aig.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/u_bc_drill"
          operations:
            - name: create-task
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: channels
          path: "/teams/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel
              method: POST

When a CAT event is declared, queries Salesforce for impacted policies, provisions ServiceNow claim queues, and notifies the CAT response team via Teams.

naftiko: "0.5"
info:
  label: "Catastrophe Event Claims Surge Coordinator"
  description: "When a CAT event is declared, queries Salesforce for impacted policies, provisions ServiceNow claim queues, and notifies the CAT response team via Teams."
  tags:
    - insurance
    - catastrophe
    - claims
    - salesforce
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: cat-ops
      port: 8080
      tools:
        - name: handle-cat-event
          description: "Given a CAT event code and affected ZIP codes, query Salesforce for impacted policies, create a surge queue in ServiceNow, and broadcast to the CAT team."
          inputParameters:
            - name: cat_event_code
              in: body
              type: string
              description: "CAT event code."
            - name: affected_zips
              in: body
              type: string
              description: "Affected ZIP codes."
            - name: cat_channel_id
              in: body
              type: string
              description: "Teams channel ID."
          steps:
            - name: query-policies
              type: call
              call: sf.query-by-geo
              with:
                zip_codes: "{{affected_zips}}"
            - name: create-queue
              type: call
              call: snow.create-queue
              with:
                short_description: "CAT surge: {{cat_event_code}}"
                description: "Policies: {{query-policies.totalSize}} | ZIPs: {{affected_zips}}"
            - name: notify-team
              type: call
              call: msteams.post-channel
              with:
                channel_id: "{{cat_channel_id}}"
                text: "CAT {{cat_event_code}}: {{query-policies.totalSize}} policies. Queue: {{create-queue.number}}"
  consumes:
    - type: http
      namespace: sf
      baseUri: "https://aig.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: policies
          path: "/query/?q=SELECT+Id+FROM+InsurancePolicy__c+WHERE+Zip__c+IN+({{zip_codes}})"
          inputParameters:
            - name: zip_codes
              in: query
          operations:
            - name: query-by-geo
              method: GET
    - type: http
      namespace: snow
      baseUri: "https://aig.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: queues
          path: "/table/u_claims_queue"
          operations:
            - name: create-queue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: channels
          path: "/teams/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel
              method: POST

Balances adjuster workloads by querying Salesforce for open claims, checking capacity in Snowflake, and notifying the claims manager in Teams.

naftiko: "0.5"
info:
  label: "Claims Adjuster Workload Balancing"
  description: "Balances adjuster workloads by querying Salesforce for open claims, checking capacity in Snowflake, and notifying the claims manager in Teams."
  tags:
    - insurance
    - claims
    - workforce-management
    - salesforce
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: workload-ops
      port: 8080
      tools:
        - name: balance-workload
          description: "Given a claims region, query Salesforce for open claims per adjuster, check capacity thresholds in Snowflake, and notify the manager."
          inputParameters:
            - name: region
              in: body
              type: string
              description: "Claims region."
            - name: manager_upn
              in: body
              type: string
              description: "Claims manager UPN."
          steps:
            - name: get-workload
              type: call
              call: sf.query-workload
              with:
                region: "{{region}}"
            - name: check-capacity
              type: call
              call: snowflake.check-thresholds
              with:
                region: "{{region}}"
            - name: notify-manager
              type: call
              call: msteams.send-message
              with:
                recipient_upn: "{{manager_upn}}"
                text: "Workload: {{region}} — {{get-workload.total_open}} open claims, {{get-workload.adjuster_count}} adjusters. Status: {{check-capacity.status}}"
  consumes:
    - type: http
      namespace: sf
      baseUri: "https://aig.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: workload
          path: "/query/?q=SELECT+COUNT(Id),OwnerId+FROM+Case+WHERE+Region__c='{{region}}'"
          operations:
            - name: query-workload
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://aig.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: check-thresholds
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          operations:
            - name: send-message
              method: POST

When a fraud indicator is detected, enriches the claim from Salesforce, flags in ServiceNow, and alerts the SIU team via Teams.

naftiko: "0.5"
info:
  label: "Claims Fraud Detection Alert Workflow"
  description: "When a fraud indicator is detected, enriches the claim from Salesforce, flags in ServiceNow, and alerts the SIU team via Teams."
  tags:
    - insurance
    - claims
    - fraud-detection
    - salesforce
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: fraud-ops
      port: 8080
      tools:
        - name: handle-fraud-indicator
          description: "Given a claim number and fraud indicator, look up in Salesforce, create a fraud investigation in ServiceNow, and notify SIU in Teams."
          inputParameters:
            - name: claim_number
              in: body
              type: string
              description: "Claim number."
            - name: fraud_indicator
              in: body
              type: string
              description: "Fraud indicator type."
            - name: siu_upn
              in: body
              type: string
              description: "UPN of SIU lead."
          steps:
            - name: get-claim
              type: call
              call: sf.get-claim
              with:
                claim_number: "{{claim_number}}"
            - name: create-investigation
              type: call
              call: snow.create-record
              with:
                short_description: "Fraud: {{claim_number}} — {{fraud_indicator}}"
                category: "fraud_investigation"
            - name: notify-siu
              type: call
              call: msteams.send-message
              with:
                recipient_upn: "{{siu_upn}}"
                text: "Fraud alert: Claim {{claim_number}} — {{fraud_indicator}}. SNOW: {{create-investigation.number}}"
  consumes:
    - type: http
      namespace: sf
      baseUri: "https://aig.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: claims
          path: "/sobjects/Case/CaseNumber/{{claim_number}}"
          inputParameters:
            - name: claim_number
              in: path
          operations:
            - name: get-claim
              method: GET
    - type: http
      namespace: snow
      baseUri: "https://aig.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: fraud
          path: "/table/u_fraud_investigation"
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Processes a claims payment by validating the claim in Salesforce, creating a payment in SAP, and notifying the adjuster via Teams.

naftiko: "0.5"
info:
  label: "Claims Payment Processing Workflow"
  description: "Processes a claims payment by validating the claim in Salesforce, creating a payment in SAP, and notifying the adjuster via Teams."
  tags:
    - insurance
    - claims
    - finance
    - salesforce
    - sap
capability:
  exposes:
    - type: mcp
      namespace: payment-ops
      port: 8080
      tools:
        - name: process-claims-payment
          description: "Given a claim number and payment amount, validate in Salesforce, create an SAP payment, and notify the adjuster."
          inputParameters:
            - name: claim_number
              in: body
              type: string
              description: "Claim number."
            - name: payment_amount
              in: body
              type: number
              description: "Payment amount."
            - name: adjuster_upn
              in: body
              type: string
              description: "Adjuster UPN."
          steps:
            - name: validate
              type: call
              call: sf.get-claim-status
              with:
                claim_number: "{{claim_number}}"
            - name: create-payment
              type: call
              call: sap-fi.post-payment
              with:
                claim_number: "{{claim_number}}"
                amount: "{{payment_amount}}"
            - name: notify-adjuster
              type: call
              call: msteams.send-message
              with:
                recipient_upn: "{{adjuster_upn}}"
                text: "Payment: Claim {{claim_number}} — ${{payment_amount}}. SAP: {{create-payment.document_number}}"
  consumes:
    - type: http
      namespace: sf
      baseUri: "https://aig.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: claims
          path: "/sobjects/Case/CaseNumber/{{claim_number}}"
          inputParameters:
            - name: claim_number
              in: path
          operations:
            - name: get-claim-status
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://aig-s4.sap.com/sap/opu/odata/sap/API_JOURNAL_ENTRY_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: payments
          path: "/A_JournalEntry"
          operations:
            - name: post-payment
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Reviews reserve adequacy by pulling reserves from SAP, comparing development in Snowflake, and alerting actuaries in Teams.

naftiko: "0.5"
info:
  label: "Claims Reserve Adequacy Review Workflow"
  description: "Reviews reserve adequacy by pulling reserves from SAP, comparing development in Snowflake, and alerting actuaries in Teams."
  tags:
    - insurance
    - actuarial
    - claims
    - sap
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: reserve-review
      port: 8080
      tools:
        - name: review-reserve-adequacy
          description: "Given an LOB and date, pull booked reserves from SAP, compare with Snowflake factors, and alert the actuarial team."
          inputParameters:
            - name: line_of_business
              in: body
              type: string
              description: "LOB."
            - name: valuation_date
              in: body
              type: string
              description: "Valuation date."
            - name: actuary_channel_id
              in: body
              type: string
              description: "Actuarial Teams channel."
          steps:
            - name: get-reserves
              type: call
              call: sap-fi.get-reserves
              with:
                lob: "{{line_of_business}}"
                date: "{{valuation_date}}"
            - name: get-development
              type: call
              call: snowflake.query-development
              with:
                lob: "{{line_of_business}}"
            - name: alert-team
              type: call
              call: msteams.post-channel
              with:
                channel_id: "{{actuary_channel_id}}"
                text: "Reserve review: {{line_of_business}} — Booked: ${{get-reserves.total}} | Indicated: ${{get-development.indicated}}"
  consumes:
    - type: http
      namespace: sap-fi
      baseUri: "https://aig-s4.sap.com/sap/opu/odata/sap/API_JOURNAL_ENTRY_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: reserves
          path: "/A_JournalEntry?$filter=LOB eq '{{lob}}'"
          operations:
            - name: get-reserves
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://aig.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: query-development
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: channels
          path: "/teams/channels/{{channel_id}}/messages"
          operations:
            - name: post-channel
              method: POST

When AWS Cost Anomaly Detection raises an alert, creates a Datadog event, opens a Jira FinOps ticket, and posts to the cloud-finops Teams channel.

naftiko: "0.5"
info:
  label: "Cloud Cost Anomaly Response"
  description: "When AWS Cost Anomaly Detection raises an alert, creates a Datadog event, opens a Jira FinOps ticket, and posts to the cloud-finops Teams channel."
  tags:
    - finops
    - cloud
    - aws
    - datadog
    - jira
capability:
  exposes:
    - type: mcp
      namespace: cloud-finops
      port: 8080
      tools:
        - name: handle-cost-anomaly
          description: "Given an AWS cost anomaly ID, service name, and estimated overage, create a Datadog warning event, open a Jira cloud FinOps task, and post to the finops Teams channel. Use when AWS Cost Anomaly Detection triggers above threshold."
          inputParameters:
            - name: anomaly_id
              in: body
              type: string
              description: "AWS Cost Anomaly Detection anomaly ID."
            - name: service_name
              in: body
              type: string
              description: "AWS service generating the anomaly."
            - name: estimated_overage_usd
              in: body
              type: number
              description: "Estimated cost overage in USD."
            - name: finops_channel_id
              in: body
              type: string
              description: "FinOps Teams channel ID."
          steps:
            - name: create-dd-event
              type: call
              call: datadog.create-event
              with:
                title: "AWS Cost Anomaly: {{service_name}}"
                text: "Anomaly {{anomaly_id}} — overage ${{estimated_overage_usd}}"
                alert_type: "warning"
            - name: open-jira
              type: call
              call: jira-finops.create-issue
              with:
                project_key: "FINOPS"
                issuetype: "Task"
                summary: "Cost anomaly: {{service_name}} +${{estimated_overage_usd}}"
                description: "Anomaly {{anomaly_id}}. Datadog: {{create-dd-event.id}}"
            - name: alert-finops
              type: call
              call: msteams-finops.post-channel-message
              with:
                channel_id: "{{finops_channel_id}}"
                text: "AWS Cost Anomaly on {{service_name}}: +${{estimated_overage_usd}} | Jira: {{open-jira.key}} | Datadog: {{create-dd-event.url}}"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: events
          path: "/events"
          operations:
            - name: create-event
              method: POST
    - type: http
      namespace: jira-finops
      baseUri: "https://aig.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams-finops
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Schedules property inspections by pulling policy details from Salesforce, creating a task in ServiceNow, and notifying the inspector via Teams.

naftiko: "0.5"
info:
  label: "Commercial Property Inspection Scheduler"
  description: "Schedules property inspections by pulling policy details from Salesforce, creating a task in ServiceNow, and notifying the inspector via Teams."
  tags:
    - insurance
    - property
    - underwriting
    - salesforce
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: inspection-ops
      port: 8080
      tools:
        - name: schedule-inspection
          description: "Given a policy number and inspection type, retrieve property details, create a ServiceNow inspection task, and notify the inspector."
          inputParameters:
            - name: policy_number
              in: body
              type: string
              description: "Policy number."
            - name: inspection_type
              in: body
              type: string
              description: "Inspection type."
            - name: inspector_upn
              in: body
              type: string
              description: "Inspector UPN."
          steps:
            - name: get-property
              type: call
              call: sf.get-property
              with:
                policy_number: "{{policy_number}}"
            - name: create-task
              type: call
              call: snow.create-task
              with:
                short_description: "Inspection: {{policy_number}} — {{inspection_type}}"
                description: "Address: {{get-property.address}}"
            - name: notify-inspector
              type: call
              call: msteams.send-message
              with:
                recipient_upn: "{{inspector_upn}}"
                text: "Inspection: {{inspection_type}} at {{get-property.address}} — Policy {{policy_number}}. SNOW: {{create-task.number}}"
  consumes:
    - type: http
      namespace: sf
      baseUri: "https://aig.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: properties
          path: "/sobjects/Property_Risk__c/PolicyNumber__c/{{policy_number}}"
          operations:
            - name: get-property
              method: GET
    - type: http
      namespace: snow
      baseUri: "https://aig.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/u_inspection_task"
          operations:
            - name: create-task
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          operations:
            - name: send-message
              method: POST

Tracks compliance training by pulling enrollment data from Workday Learning, checking ServiceNow escalation thresholds, and notifying managers via Teams.

naftiko: "0.5"
info:
  label: "Compliance Training Completion Tracker"
  description: "Tracks compliance training by pulling enrollment data from Workday Learning, checking ServiceNow escalation thresholds, and notifying managers via Teams."
  tags:
    - insurance
    - compliance
    - training
    - workday
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: compliance-training
      port: 8080
      tools:
        - name: track-training-completion
          description: "Given a program ID and deadline, query Workday for incomplete enrollments, check escalation status in ServiceNow, and notify managers in Teams."
          inputParameters:
            - name: program_id
              in: body
              type: string
              description: "Training program ID."
            - name: deadline
              in: body
              type: string
              description: "Deadline date."
          steps:
            - name: get-enrollments
              type: call
              call: workday.get-training-status
              with:
                program_id: "{{program_id}}"
            - name: check-escalation
              type: call
              call: snow.check-escalation
              with:
                program_id: "{{program_id}}"
                deadline: "{{deadline}}"
            - name: notify-managers
              type: call
              call: msteams.send-notification
              with:
                subject: "Training overdue: {{program_id}}"
                body: "Deadline: {{deadline}}. Incomplete: {{get-enrollments.incomplete_count}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd5-impl-services1.workday.com/ccx/service/aig/Learning/v40.1"
      authentication:
        type: basic
        username: "$secrets.workday_user"
        password: "$secrets.workday_password"
      resources:
        - name: training
          path: "/learning-enrollments?program={{program_id}}"
          inputParameters:
            - name: program_id
              in: query
          operations:
            - name: get-training-status
              method: GET
    - type: http
      namespace: snow
      baseUri: "https://aig.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: escalation
          path: "/table/u_training_compliance"
          operations:
            - name: check-escalation
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Books a conference room via Microsoft Graph, creates the calendar event, and notifies attendees in Teams.

naftiko: "0.5"
info:
  label: "Conference Room Booking Notification"
  description: "Books a conference room via Microsoft Graph, creates the calendar event, and notifies attendees in Teams."
  tags:
    - insurance
    - facilities
    - microsoft-graph
    - microsoft-teams
    - scheduling
capability:
  exposes:
    - type: mcp
      namespace: facilities-ops
      port: 8080
      tools:
        - name: book-conference-room
          description: "Given a room email, start/end times, and organizer, check availability, create the booking, and notify in Teams."
          inputParameters:
            - name: room_email
              in: body
              type: string
              description: "Room resource email."
            - name: start_time
              in: body
              type: string
              description: "Start time (ISO 8601)."
            - name: end_time
              in: body
              type: string
              description: "End time (ISO 8601)."
            - name: organizer_upn
              in: body
              type: string
              description: "Organizer UPN."
          steps:
            - name: check-availability
              type: call
              call: msgraph.get-schedule
              with:
                room: "{{room_email}}"
                start: "{{start_time}}"
            - name: create-booking
              type: call
              call: msgraph.create-event
              with:
                room: "{{room_email}}"
                start: "{{start_time}}"
                end: "{{end_time}}"
            - name: notify-organizer
              type: call
              call: msteams.send-message
              with:
                recipient_upn: "{{organizer_upn}}"
                text: "Room booked: {{room_email}} from {{start_time}} to {{end_time}}."
  consumes:
    - type: http
      namespace: msgraph
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: schedules
          path: "/users/{{room}}/calendar/getSchedule"
          inputParameters:
            - name: room
              in: path
          operations:
            - name: get-schedule
              method: POST
        - name: events
          path: "/users/{{organizer_upn}}/events"
          operations:
            - name: create-event
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Searches Confluence for a knowledge article by keyword and returns the page title, space, and URL.

naftiko: "0.5"
info:
  label: "Confluence Knowledge Article Search"
  description: "Searches Confluence for a knowledge article by keyword and returns the page title, space, and URL."
  tags:
    - insurance
    - knowledge-management
    - confluence
    - documentation
    - lookup
capability:
  exposes:
    - type: mcp
      namespace: km-ops
      port: 8080
      tools:
        - name: search-article
          description: "Given a keyword, search Confluence for matching articles and return the top result title, space, and URL."
          inputParameters:
            - name: keyword
              in: body
              type: string
              description: "Search keyword."
          call: confluence.search-content
          with:
            cql: "type=page AND title~{{keyword}}"
          outputParameters:
            - name: title
              type: string
              mapping: "$.results[0].title"
            - name: space
              type: string
              mapping: "$.results[0].space.name"
  consumes:
    - namespace: confluence
      type: http
      baseUri: "https://aig.atlassian.net/wiki/rest/api"
      authentication:
        type: bearer
        token: "$secrets.confluence_api_token"
      resources:
        - name: km-ops
          path: "/{{id}}"
          operations:
            - name: search-content
              method: GET

When a complaint is received, creates a Salesforce case, opens a ServiceNow investigation task, and notifies the compliance officer via Teams.

naftiko: "0.5"
info:
  label: "Customer Complaint Escalation Handler"
  description: "When a complaint is received, creates a Salesforce case, opens a ServiceNow investigation task, and notifies the compliance officer via Teams."
  tags:
    - insurance
    - customer-service
    - salesforce
    - servicenow
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: complaints-ops
      port: 8080
      tools:
        - name: escalate-complaint
          description: "Given complaint details, create a Salesforce case, open a ServiceNow task, and alert compliance via Teams."
          inputParameters:
            - name: customer_name
              in: body
              type: string
              description: "Complainant name."
            - name: account_number
              in: body
              type: string
              description: "Account or policy number."
            - name: complaint_category
              in: body
              type: string
              description: "Complaint category."
            - name: compliance_upn
              in: body
              type: string
              description: "UPN of compliance officer."
          steps:
            - name: create-case
              type: call
              call: sf.create-case
              with:
                Subject: "Complaint — {{account_number}} — {{complaint_category}}"
                Description: "Customer: {{customer_name}} | Category: {{complaint_category}}"
            - name: create-task
              type: call
              call: snow.create-task
              with:
                short_description: "Complaint: {{account_number}}"
                description: "SF Case: {{create-case.case_number}} | {{complaint_category}}"
            - name: notify-compliance
              type: call
              call: msteams.send-message
              with:
                recipient_upn: "{{compliance_upn}}"
                text: "Complaint escalation: {{customer_name}} — {{complaint_category}}. SF: {{create-case.case_number}} | SNOW: {{create-task.number}}"
  consumes:
    - type: http
      namespace: sf
      baseUri: "https://aig.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: snow
      baseUri: "https://aig.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sn_si_task"
          operations:
            - name: create-task
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Scores cyber risk by checking security posture, pulling claims history from Snowflake, and updating Salesforce with the score.

naftiko: "0.5"
info:
  label: "Cyber Insurance Risk Scoring Workflow"
  description: "Scores cyber risk by checking security posture, pulling claims history from Snowflake, and updating Salesforce with the score."
  tags:
    - insurance
    - cyber
    - underwriting
    - snowflake
    - salesforce
capability:
  exposes:
    - type: mcp
      namespace: cyber-uw
      port: 8080
      tools:
        - name: score-cyber-risk
          description: "Given an applicant domain, run a security posture check, pull cyber claims data from Snowflake, and update Salesforce."
          inputParameters:
            - name: applicant_domain
              in: body
              type: string
              description: "Applicant domain."
            - name: policy_number
              in: body
              type: string
              description: "Policy number."
            - name: underwriter_upn
              in: body
              type: string
              description: "Underwriter UPN."
          steps:
            - name: scan-posture
              type: call
              call: security-scan.check-domain
              with:
                domain: "{{applicant_domain}}"
            - name: get-history
              type: call
              call: snowflake.query-cyber-claims
              with:
                domain: "{{applicant_domain}}"
            - name: update-record
              type: call
              call: sf.update-risk-score
              with:
                policy_number: "{{policy_number}}"
                score: "{{scan-posture.score}}"
            - name: notify-uw
              type: call
              call: msteams.send-message
              with:
                recipient_upn: "{{underwriter_upn}}"
                text: "Cyber risk: {{applicant_domain}} — Score: {{scan-posture.score}}/100 | Losses: {{get-history.loss_count}}"
  consumes:
    - type: http
      namespace: security-scan
      baseUri: "https://api.securityscorecard.io"
      authentication:
        type: bearer
        token: "$secrets.securityscorecard_token"
      resources:
        - name: domains
          path: "/companies/{{domain}}/score"
          operations:
            - name: check-domain
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://aig.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: query-cyber-claims
              method: POST
    - type: http
      namespace: sf
      baseUri: "https://aig.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: policies
          path: "/sobjects/InsurancePolicy__c/PolicyNumber__c/{{policy_number}}"
          operations:
            - name: update-risk-score
              method: PATCH
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          operations:
            - name: send-message
              method: POST

Processes a data subject access request by searching Salesforce and Snowflake for personal data, compiling results, and logging in ServiceNow.

naftiko: "0.5"
info:
  label: "Data Privacy Subject Access Request Handler"
  description: "Processes a data subject access request by searching Salesforce and Snowflake for personal data, compiling results, and logging in ServiceNow."
  tags:
    - insurance
    - compliance
    - data-privacy
    - salesforce
    - snowflake
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: privacy-ops
      port: 8080
      tools:
        - name: process-dsar
          description: "Given a data subject email, search for personal data across Salesforce and Snowflake, log the DSAR in ServiceNow, and notify the privacy officer via Teams."
          inputParameters:
            - name: subject_email
              in: body
              type: string
              description: "Data subject email."
            - name: request_type
              in: body
              type: string
              description: "DSAR type: access, deletion."
            - name: privacy_officer_upn
              in: body
              type: string
              description: "UPN of privacy officer."
          steps:
            - name: search-sf
              type: call
              call: sf.search-person
              with:
                email: "{{subject_email}}"
            - name: search-snowflake
              type: call
              call: snowflake.search-pii
              with:
                email: "{{subject_email}}"
            - name: log-dsar
              type: call
              call: snow.create-dsar
              with:
                short_description: "DSAR: {{request_type}} — {{subject_email}}"
                description: "SF: {{search-sf.record_count}} | Snowflake: {{search-snowflake.record_count}}"
            - name: notify-officer
              type: call
              call: msteams.send-message
              with:
                recipient_upn: "{{privacy_officer_upn}}"
                text: "DSAR: {{request_type}} for {{subject_email}}. SF: {{search-sf.record_count}}, SF: {{search-snowflake.record_count}}. SNOW: {{log-dsar.number}}"
  consumes:
    - type: http
      namespace: sf
      baseUri: "https://aig.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: search
          path: "/parameterizedSearch/?q={{email}}"
          inputParameters:
            - name: email
              in: query
          operations:
            - name: search-person
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://aig.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: search-pii
              method: POST
    - type: http
      namespace: snow
      baseUri: "https://aig.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: dsar
          path: "/table/u_dsar_request"
          operations:
            - name: create-dsar
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Queries Datadog for the current health status of a specified service, returning uptime percentage and error rate.

naftiko: "0.5"
info:
  label: "Datadog Service Health Check"
  description: "Queries Datadog for the current health status of a specified service, returning uptime percentage and error rate."
  tags:
    - insurance
    - it-operations
    - datadog
    - monitoring
    - lookup
capability:
  exposes:
    - type: mcp
      namespace: observability
      port: 8080
      tools:
        - name: get-service-health
          description: "Given a Datadog service name, return the current uptime percentage, error rate, and active monitor count."
          inputParameters:
            - name: service_name
              in: body
              type: string
              description: "Datadog service name."
          call: datadog.get-slo
          with:
            service: "{{service_name}}"
          outputParameters:
            - name: uptime_pct
              type: number
              mapping: "$.data[0].overall.sli_value"
            - name: error_rate
              type: number
              mapping: "$.data[0].overall.error_budget_remaining"
  consumes:
    - namespace: datadog
      type: http
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.datadog_api_key"
      resources:
        - name: observability
          path: "/{{id}}"
          operations:
            - name: get-slo
              method: GET

When a Datadog SLO breach is detected, creates a ServiceNow incident, pages on-call via PagerDuty, and posts to the reliability channel.

naftiko: "0.5"
info:
  label: "Datadog SLO Breach Incident Handler"
  description: "When a Datadog SLO breach is detected, creates a ServiceNow incident, pages on-call via PagerDuty, and posts to the reliability channel."
  tags:
    - insurance
    - sre
    - datadog
    - servicenow
    - pagerduty
capability:
  exposes:
    - type: mcp
      namespace: sre-ops
      port: 8080
      tools:
        - name: handle-slo-breach
          description: "Given an SLO name and current SLI value, create a ServiceNow incident, trigger a PagerDuty alert, and notify the SRE channel in Teams."
          inputParameters:
            - name: slo_name
              in: body
              type: string
              description: "SLO name."
            - name: sli_value
              in: body
              type: number
              description: "Current SLI value."
            - name: service_name
              in: body
              type: string
              description: "Affected service."
            - name: sre_channel_id
              in: body
              type: string
              description: "SRE Teams channel."
          steps:
            - name: create-incident
              type: call
              call: snow.create-incident
              with:
                short_description: "SLO breach: {{slo_name}} — {{service_name}}"
                description: "SLI: {{sli_value}}%"
                priority: "2"
            - name: page-oncall
              type: call
              call: pagerduty.create-incident
              with:
                service_id: "sre-team"
                title: "SLO breach: {{slo_name}} ({{sli_value}}%)"
            - name: notify-channel
              type: call
              call: msteams.post-channel
              with:
                channel_id: "{{sre_channel_id}}"
                text: "SLO Breach: {{slo_name}} — {{service_name}} at {{sli_value}}%. SNOW: {{create-incident.number}}"
  consumes:
    - type: http
      namespace: snow
      baseUri: "https://aig.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: 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.msteams_token"
      resources:
        - name: channels
          path: "/teams/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel
              method: POST

Retrieves the status of a DocuSign envelope by ID, returning signing status and sent date.

naftiko: "0.5"
info:
  label: "DocuSign Envelope Tracking Lookup"
  description: "Retrieves the status of a DocuSign envelope by ID, returning signing status and sent date."
  tags:
    - insurance
    - legal
    - docusign
    - document-management
    - lookup
capability:
  exposes:
    - type: mcp
      namespace: doc-ops
      port: 8080
      tools:
        - name: get-envelope-status
          description: "Given a DocuSign envelope ID, return the status, sent date, and recipient count."
          inputParameters:
            - name: envelope_id
              in: body
              type: string
              description: "DocuSign envelope ID."
          call: docusign.get-envelope
          with:
            envelopeId: "{{envelope_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.status"
            - name: sent_date
              type: string
              mapping: "$.sentDateTime"
  consumes:
    - namespace: docusign
      type: http
      baseUri: "https://na4.docusign.net/restapi/v2.1"
      authentication:
        type: bearer
        token: "$secrets.docusign_token"
      resources:
        - name: doc-ops
          path: "/{{id}}"
          operations:
            - name: get-envelope
              method: GET

Queries Dynatrace for the response time and failure rate of a specified application.

naftiko: "0.5"
info:
  label: "Dynatrace Application Metrics Lookup"
  description: "Queries Dynatrace for the response time and failure rate of a specified application."
  tags:
    - insurance
    - it-operations
    - dynatrace
    - monitoring
    - lookup
capability:
  exposes:
    - type: mcp
      namespace: apm-ops
      port: 8080
      tools:
        - name: get-app-metrics
          description: "Given a Dynatrace entity ID, return the median response time and failure rate."
          inputParameters:
            - name: entity_id
              in: body
              type: string
              description: "Dynatrace application entity ID."
          call: dynatrace.get-metrics
          with:
            entityId: "{{entity_id}}"
          outputParameters:
            - name: response_time_ms
              type: number
              mapping: "$.result[0].data[0].values.median"
            - name: failure_rate
              type: number
              mapping: "$.result[1].data[0].values.avg"
  consumes:
    - namespace: dynatrace
      type: http
      baseUri: "https://aig.live.dynatrace.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.dynatrace_token"
      resources:
        - name: apm-ops
          path: "/{{id}}"
          operations:
            - name: get-metrics
              method: GET

When a Workday role change is approved, updates Okta group memberships, adjusts the Salesforce user profile, and creates an IT ServiceNow follow-up task.

naftiko: "0.5"
info:
  label: "Employee Role Change Access Provisioning"
  description: "When a Workday role change is approved, updates Okta group memberships, adjusts the Salesforce user profile, and creates an IT ServiceNow follow-up task."
  tags:
    - hr
    - identity
    - workday
    - okta
    - provisioning
capability:
  exposes:
    - type: mcp
      namespace: role-provisioning
      port: 8080
      tools:
        - name: process-role-change
          description: "Given a Workday employee ID, new role, and Okta group changes, update Okta group membership, update the Salesforce user profile with the new title, and create a ServiceNow task for IT access follow-up. Use when an AIG employee's role or department changes."
          inputParameters:
            - name: workday_employee_id
              in: body
              type: string
              description: "Workday worker ID of the employee."
            - name: new_role
              in: body
              type: string
              description: "New job title or role."
            - name: okta_add_group_id
              in: body
              type: string
              description: "Okta group ID to add the employee to for the new role."
            - name: salesforce_user_id
              in: body
              type: string
              description: "Salesforce user ID to update."
          steps:
            - name: get-worker
              type: call
              call: workday-rc.get-worker
              with:
                worker_id: "{{workday_employee_id}}"
            - name: add-to-group
              type: call
              call: okta-rc.add-user-to-group
              with:
                group_id: "{{okta_add_group_id}}"
            - name: update-sf-user
              type: call
              call: salesforce-rc.update-user
              with:
                user_id: "{{salesforce_user_id}}"
                title: "{{new_role}}"
            - name: create-it-task
              type: call
              call: servicenow-rc.create-task
              with:
                short_description: "Role change: {{get-worker.full_name}} → {{new_role}}"
                category: "access_management"
                assigned_group: "IT_Access"
  consumes:
    - type: http
      namespace: workday-rc
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: okta-rc
      baseUri: "https://aig.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_token"
        placement: header
      resources:
        - name: group-users
          path: "/groups/{{group_id}}/users"
          inputParameters:
            - name: group_id
              in: path
          operations:
            - name: add-user-to-group
              method: PUT
    - type: http
      namespace: salesforce-rc
      baseUri: "https://aig.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: users
          path: "/sobjects/User/{{user_id}}"
          inputParameters:
            - name: user_id
              in: path
          operations:
            - name: update-user
              method: PATCH
    - type: http
      namespace: servicenow-rc
      baseUri: "https://aig.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: create-task
              method: POST

When an employee termination is processed in Workday, disables their Okta account, revokes ServiceNow access, and notifies the HR business partner via Teams.

naftiko: "0.5"
info:
  label: "Employee Termination Access Revocation"
  description: "When an employee termination is processed in Workday, disables their Okta account, revokes ServiceNow access, and notifies the HR business partner via Teams."
  tags:
    - insurance
    - hr
    - security
    - workday
    - okta
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: hr-security
      port: 8080
      tools:
        - name: revoke-terminated-access
          description: "Given a Workday employee ID and termination date, disable the Okta account, close open ServiceNow tickets, and notify the HRBP via Teams."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "Workday employee ID."
            - name: termination_date
              in: body
              type: string
              description: "Termination date."
            - name: hrbp_upn
              in: body
              type: string
              description: "UPN of the HRBP."
          steps:
            - name: get-employee
              type: call
              call: workday.get-worker
              with:
                employee_id: "{{employee_id}}"
            - name: disable-okta
              type: call
              call: okta.deactivate-user
              with:
                login: "{{get-employee.email}}"
            - name: notify-hrbp
              type: call
              call: msteams.send-message
              with:
                recipient_upn: "{{hrbp_upn}}"
                text: "Access revoked for {{get-employee.full_name}} ({{employee_id}}) effective {{termination_date}}."
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd5-impl-services1.workday.com/ccx/service/aig/Human_Resources/v40.1"
      authentication:
        type: basic
        username: "$secrets.workday_user"
        password: "$secrets.workday_password"
      resources:
        - name: workers
          path: "/workers/{{employee_id}}"
          inputParameters:
            - name: employee_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: okta
      baseUri: "https://aig.okta.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.okta_api_token"
      resources:
        - name: users
          path: "/users/{{login}}/lifecycle/deactivate"
          inputParameters:
            - name: login
              in: path
          operations:
            - name: deactivate-user
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Compiles an executive KPI digest by pulling metrics from Snowflake, refreshing Power BI, and emailing the C-suite.

naftiko: "0.5"
info:
  label: "Executive KPI Dashboard Digest"
  description: "Compiles an executive KPI digest by pulling metrics from Snowflake, refreshing Power BI, and emailing the C-suite."
  tags:
    - insurance
    - reporting
    - analytics
    - snowflake
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: exec-reporting
      port: 8080
      tools:
        - name: generate-kpi-digest
          description: "Given a reporting period, pull KPIs from Snowflake, refresh the Power BI executive dashboard, and email the digest."
          inputParameters:
            - name: period
              in: body
              type: string
              description: "Reporting period."
            - name: exec_dl
              in: body
              type: string
              description: "Executive DL email."
          steps:
            - name: get-kpis
              type: call
              call: snowflake.query-kpis
              with:
                period: "{{period}}"
            - name: refresh-pbi
              type: call
              call: powerbi.trigger-refresh
              with:
                datasetId: "executive-dashboard"
            - name: send-digest
              type: call
              call: msgraph.send-mail
              with:
                to: "{{exec_dl}}"
                subject: "Executive KPI Digest — {{period}}"
                body: "Key metrics refreshed. Dashboard updated."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://aig.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: query-kpis
              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: "/datasets/{{datasetId}}/refreshes"
          inputParameters:
            - name: datasetId
              in: path
          operations:
            - name: trigger-refresh
              method: POST
    - type: http
      namespace: msgraph
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/users/noreply@aig.com/sendMail"
          operations:
            - name: send-mail
              method: POST

When a GitHub Actions workflow fails on a protected branch, creates a Jira bug, logs a Datadog deployment marker, and alerts the engineering Teams channel.

naftiko: "0.5"
info:
  label: "GitHub CI/CD Pipeline Failure Handler"
  description: "When a GitHub Actions workflow fails on a protected branch, creates a Jira bug, logs a Datadog deployment marker, and alerts the engineering Teams channel."
  tags:
    - devops
    - cicd
    - github
    - jira
    - datadog
capability:
  exposes:
    - type: mcp
      namespace: devops-ci
      port: 8080
      tools:
        - name: handle-pipeline-failure
          description: "Given a GitHub Actions failure event with repo, branch, commit, and workflow details, open a Jira bug, create a Datadog error event, and alert the engineering Teams channel. Use when a protected-branch CI pipeline fails on an AIG platform repo."
          inputParameters:
            - name: repo
              in: body
              type: string
              description: "GitHub repository full name."
            - name: branch
              in: body
              type: string
              description: "Branch where the failure occurred."
            - name: commit_sha
              in: body
              type: string
              description: "Failing commit SHA."
            - name: workflow_name
              in: body
              type: string
              description: "Name of the failed workflow."
            - name: run_url
              in: body
              type: string
              description: "URL to the failed run."
            - name: eng_channel_id
              in: body
              type: string
              description: "Engineering Teams channel ID."
          steps:
            - name: create-bug
              type: call
              call: jira-eng.create-issue
              with:
                project_key: "ENG"
                issuetype: "Bug"
                summary: "[CI Failure] {{repo}} / {{branch}} — {{workflow_name}}"
                description: "Commit: {{commit_sha}}\nRun: {{run_url}}"
            - name: log-dd-event
              type: call
              call: datadog-ci.create-event
              with:
                title: "CI Failure: {{repo}} — {{branch}}"
                text: "Commit {{commit_sha}} | Workflow {{workflow_name}}"
                alert_type: "error"
            - name: alert-eng
              type: call
              call: msteams-eng.post-channel-message
              with:
                channel_id: "{{eng_channel_id}}"
                text: "CI Failure: {{repo}} | Branch: {{branch}} | Jira: {{create-bug.key}} | Run: {{run_url}}"
  consumes:
    - type: http
      namespace: jira-eng
      baseUri: "https://aig.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: datadog-ci
      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-eng
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

When Dependabot alerts are raised, creates Jira tickets for remediation, logs in Snowflake, and alerts the AppSec team via Teams.

naftiko: "0.5"
info:
  label: "GitHub Dependabot Alert Handler"
  description: "When Dependabot alerts are raised, creates Jira tickets for remediation, logs in Snowflake, and alerts the AppSec team via Teams."
  tags:
    - insurance
    - security
    - github
    - jira
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: appsec-ops
      port: 8080
      tools:
        - name: handle-dependabot-alert
          description: "Given a repo and alert severity, create a Jira ticket, log the vulnerability in Snowflake, and notify AppSec in Teams."
          inputParameters:
            - name: repo_name
              in: body
              type: string
              description: "GitHub repository."
            - name: cve_id
              in: body
              type: string
              description: "CVE identifier."
            - name: severity
              in: body
              type: string
              description: "Alert severity."
            - name: appsec_upn
              in: body
              type: string
              description: "UPN of AppSec lead."
          steps:
            - name: create-jira
              type: call
              call: jira.create-issue
              with:
                project: "APPSEC"
                summary: "Dependabot: {{cve_id}} in {{repo_name}}"
                description: "Severity: {{severity}} | Repo: {{repo_name}}"
            - name: log-vuln
              type: call
              call: snowflake.insert-vuln
              with:
                repo: "{{repo_name}}"
                cve: "{{cve_id}}"
                severity: "{{severity}}"
            - name: notify-appsec
              type: call
              call: msteams.send-message
              with:
                recipient_upn: "{{appsec_upn}}"
                text: "Dependabot: {{cve_id}} ({{severity}}) in {{repo_name}}. Jira: {{create-jira.key}}"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://aig.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://aig.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: insert-vuln
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Fetches a GitHub repository by name and returns the default branch, open issue count, and last push timestamp.

naftiko: "0.5"
info:
  label: "GitHub Repository Status Check"
  description: "Fetches a GitHub repository by name and returns the default branch, open issue count, and last push timestamp."
  tags:
    - insurance
    - engineering
    - github
    - devops
    - lookup
capability:
  exposes:
    - type: mcp
      namespace: dev-ops
      port: 8080
      tools:
        - name: get-repo-status
          description: "Given a GitHub repository full name, return the default branch and last push timestamp."
          inputParameters:
            - name: repo_name
              in: body
              type: string
              description: "GitHub repository full name."
          call: github.get-repo
          with:
            repo: "{{repo_name}}"
          outputParameters:
            - name: default_branch
              type: string
              mapping: "$.default_branch"
            - name: last_push
              type: string
              mapping: "$.pushed_at"
  consumes:
    - namespace: github
      type: http
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: dev-ops
          path: "/{{id}}"
          operations:
            - name: get-repo
              method: GET

When GitHub Advanced Security detects a critical CVE in an AIG platform repo, creates a Jira security ticket, logs a Datadog event, and alerts the cybersecurity team in Teams.

naftiko: "0.5"
info:
  label: "GitHub Security Vulnerability Triage"
  description: "When GitHub Advanced Security detects a critical CVE in an AIG platform repo, creates a Jira security ticket, logs a Datadog event, and alerts the cybersecurity team in Teams."
  tags:
    - security
    - github
    - devops
    - jira
    - vulnerability
capability:
  exposes:
    - type: mcp
      namespace: sec-triage
      port: 8080
      tools:
        - name: triage-security-alert
          description: "Given a GitHub security alert with CVE, severity, and affected package, create a Jira security ticket, log a Datadog error event, and alert the cybersecurity Teams channel. Use when GitHub Advanced Security finds a critical CVE in an AIG insurance platform repo."
          inputParameters:
            - name: repo
              in: body
              type: string
              description: "GitHub repository full name."
            - name: cve_id
              in: body
              type: string
              description: "CVE identifier."
            - name: severity
              in: body
              type: string
              description: "Severity: critical, high, medium, or low."
            - name: package_name
              in: body
              type: string
              description: "Affected package name."
            - name: sec_channel_id
              in: body
              type: string
              description: "Cybersecurity Teams channel ID."
          steps:
            - name: create-sec-ticket
              type: call
              call: jira-sec.create-issue
              with:
                project_key: "SEC"
                issuetype: "Bug"
                summary: "[{{severity}}] {{cve_id}} in {{repo}} — {{package_name}}"
                description: "CVE: {{cve_id}} | Package: {{package_name}} | Severity: {{severity}}"
                priority: "Highest"
            - name: log-event
              type: call
              call: datadog-sec.create-event
              with:
                title: "Security: {{cve_id}} in {{repo}}"
                text: "Package {{package_name}} | Severity: {{severity}} | Jira: {{create-sec-ticket.key}}"
                alert_type: "error"
            - name: alert-sec-team
              type: call
              call: msteams-sec.post-channel-message
              with:
                channel_id: "{{sec_channel_id}}"
                text: "SECURITY: {{severity}} CVE {{cve_id}} in {{repo}} / {{package_name}} | Jira: {{create-sec-ticket.key}} | Datadog: {{log-event.url}}"
  consumes:
    - type: http
      namespace: jira-sec
      baseUri: "https://aig.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: datadog-sec
      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-sec
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Processes bordereaux by loading data into Snowflake, reconciling against Salesforce, and sending variance reports.

naftiko: "0.5"
info:
  label: "Insurance Bordereaux Processing Workflow"
  description: "Processes bordereaux by loading data into Snowflake, reconciling against Salesforce, and sending variance reports."
  tags:
    - insurance
    - delegated-authority
    - snowflake
    - salesforce
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: da-ops
      port: 8080
      tools:
        - name: process-bordereaux
          description: "Given a bordereaux file reference and period, load into Snowflake, reconcile with Salesforce, and send a report."
          inputParameters:
            - name: file_reference
              in: body
              type: string
              description: "File reference ID."
            - name: period
              in: body
              type: string
              description: "Reporting period."
            - name: da_manager_email
              in: body
              type: string
              description: "DA manager email."
          steps:
            - name: load-data
              type: call
              call: snowflake.load-bordereaux
              with:
                file_ref: "{{file_reference}}"
                period: "{{period}}"
            - name: reconcile
              type: call
              call: sf.query-policies
              with:
                period: "{{period}}"
            - name: send-report
              type: call
              call: msgraph.send-mail
              with:
                to: "{{da_manager_email}}"
                subject: "Bordereaux: {{period}} — {{file_reference}}"
                body: "Loaded: {{load-data.row_count}} | Matches: {{reconcile.match_count}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://aig.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: load-bordereaux
              method: POST
    - type: http
      namespace: sf
      baseUri: "https://aig.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: policies
          path: "/query/?q=SELECT+Id+FROM+InsurancePolicy__c+WHERE+Period__c='{{period}}'"
          operations:
            - name: query-policies
              method: GET
    - type: http
      namespace: msgraph
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/users/noreply@aig.com/sendMail"
          operations:
            - name: send-mail
              method: POST

When a new insurance claim is submitted, creates a Salesforce case, opens a ServiceNow claim investigation record, and notifies the assigned adjuster in Teams.

naftiko: "0.5"
info:
  label: "Insurance Claim Intake and Triage"
  description: "When a new insurance claim is submitted, creates a Salesforce case, opens a ServiceNow claim investigation record, and notifies the assigned adjuster in Teams."
  tags:
    - insurance
    - claims
    - salesforce
    - servicenow
    - customer-service
capability:
  exposes:
    - type: mcp
      namespace: claims-ops
      port: 8080
      tools:
        - name: intake-insurance-claim
          description: "Given claim details including policy number, claimant name, loss type, and loss date, create a Salesforce case for customer tracking, open a ServiceNow claim investigation record, and notify the assigned adjuster in Teams. Use when a new claim is received."
          inputParameters:
            - name: policy_number
              in: body
              type: string
              description: "AIG policy number for the claim."
            - name: claimant_name
              in: body
              type: string
              description: "Full name of the claimant."
            - name: loss_type
              in: body
              type: string
              description: "Type of loss, e.g. 'property-damage', 'liability', 'auto'."
            - name: loss_date
              in: body
              type: string
              description: "Date of loss in YYYY-MM-DD format."
            - name: adjuster_upn
              in: body
              type: string
              description: "UPN of the assigned claims adjuster."
          steps:
            - name: create-sf-case
              type: call
              call: salesforce-claims.create-case
              with:
                subject: "Claim — Policy {{policy_number}} — {{loss_type}}"
                description: "Claimant: {{claimant_name}} | Loss date: {{loss_date}}"
                origin: "Phone"
            - name: create-snow-record
              type: call
              call: servicenow-claims.create-record
              with:
                short_description: "Claim investigation: {{policy_number}} — {{loss_type}}"
                description: "Claimant: {{claimant_name}} | Loss date: {{loss_date}} | Salesforce case: {{create-sf-case.case_number}}"
                category: "claims_investigation"
            - name: notify-adjuster
              type: call
              call: msteams-claims.send-message
              with:
                recipient_upn: "{{adjuster_upn}}"
                text: "New claim assigned: Policy {{policy_number}} — {{loss_type}} on {{loss_date}}. Claimant: {{claimant_name}}. Salesforce: {{create-sf-case.case_number}} | ServiceNow: {{create-snow-record.number}}"
  consumes:
    - type: http
      namespace: salesforce-claims
      baseUri: "https://aig.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-claims
      baseUri: "https://aig.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: claim-records
          path: "/table/u_claims_investigation"
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: msteams-claims
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Manages IT asset retirement by updating the ServiceNow CMDB, revoking Okta access, and logging disposal in SAP fixed assets.

naftiko: "0.5"
info:
  label: "IT Asset Lifecycle Retirement Workflow"
  description: "Manages IT asset retirement by updating the ServiceNow CMDB, revoking Okta access, and logging disposal in SAP fixed assets."
  tags:
    - insurance
    - it-operations
    - asset-management
    - servicenow
    - okta
    - sap
capability:
  exposes:
    - type: mcp
      namespace: asset-ops
      port: 8080
      tools:
        - name: retire-it-asset
          description: "Given a CI name and asset tag, mark as retired in ServiceNow CMDB, revoke Okta access, create SAP disposal entry, and notify IT manager in Teams."
          inputParameters:
            - name: ci_name
              in: body
              type: string
              description: "ServiceNow CI name."
            - name: asset_tag
              in: body
              type: string
              description: "Asset tag number."
            - name: it_manager_upn
              in: body
              type: string
              description: "UPN of IT asset manager."
          steps:
            - name: retire-cmdb
              type: call
              call: snow.update-ci-status
              with:
                ci_name: "{{ci_name}}"
                status: "Retired"
            - name: revoke-access
              type: call
              call: okta.remove-app-assignment
              with:
                app_label: "{{ci_name}}"
            - name: log-disposal
              type: call
              call: sap.create-disposal
              with:
                asset_number: "{{asset_tag}}"
            - name: notify-manager
              type: call
              call: msteams.send-message
              with:
                recipient_upn: "{{it_manager_upn}}"
                text: "Asset retired: {{ci_name}} ({{asset_tag}}). CMDB updated, access revoked."
  consumes:
    - type: http
      namespace: snow
      baseUri: "https://aig.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: cmdb
          path: "/table/cmdb_ci?sysparm_query=name={{ci_name}}"
          inputParameters:
            - name: ci_name
              in: query
          operations:
            - name: update-ci-status
              method: PATCH
    - type: http
      namespace: okta
      baseUri: "https://aig.okta.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.okta_api_token"
      resources:
        - name: apps
          path: "/apps?q={{app_label}}"
          inputParameters:
            - name: app_label
              in: query
          operations:
            - name: remove-app-assignment
              method: DELETE
    - type: http
      namespace: sap
      baseUri: "https://aig-s4.sap.com/sap/opu/odata/sap/API_FIXEDASSET_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: disposals
          path: "/A_FixedAsset"
          operations:
            - name: create-disposal
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Creates a ServiceNow change request for planned maintenance on insurance platform systems and notifies the CAB Teams channel for approval.

naftiko: "0.5"
info:
  label: "IT Change Management Request"
  description: "Creates a ServiceNow change request for planned maintenance on insurance platform systems and notifies the CAB Teams channel for approval."
  tags:
    - itsm
    - change-management
    - servicenow
    - approval
capability:
  exposes:
    - type: mcp
      namespace: change-mgmt
      port: 8080
      tools:
        - name: submit-change-request
          description: "Given maintenance details and a planned window, create a ServiceNow change request and notify the CAB Teams channel. Use when scheduling planned maintenance that affects AIG insurance or corporate systems."
          inputParameters:
            - name: short_description
              in: body
              type: string
              description: "Brief description of the planned change."
            - name: description
              in: body
              type: string
              description: "Full change details including systems affected and rollback plan."
            - name: planned_start
              in: body
              type: string
              description: "Planned start time in ISO 8601 format."
            - name: planned_end
              in: body
              type: string
              description: "Planned end time in ISO 8601 format."
            - name: cab_channel_id
              in: body
              type: string
              description: "CAB Teams channel ID."
          steps:
            - name: create-change
              type: call
              call: servicenow-change.create-change-request
              with:
                short_description: "{{short_description}}"
                description: "{{description}}"
                start_date: "{{planned_start}}"
                end_date: "{{planned_end}}"
            - name: notify-cab
              type: call
              call: msteams-cab.post-channel-message
              with:
                channel_id: "{{cab_channel_id}}"
                text: "Change Request {{create-change.number}}: {{short_description}} | Window: {{planned_start}} to {{planned_end}} | Awaiting CAB approval"
  consumes:
    - type: http
      namespace: servicenow-change
      baseUri: "https://aig.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: change-requests
          path: "/table/change_request"
          operations:
            - name: create-change-request
              method: POST
    - type: http
      namespace: msteams-cab
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

When Datadog fires a critical alert on an insurance platform system, opens a P1 ServiceNow incident, pages the on-call engineer via PagerDuty, and posts to the IT war-room Teams channel.

naftiko: "0.5"
info:
  label: "IT P1 Incident Triage and Escalation"
  description: "When Datadog fires a critical alert on an insurance platform system, opens a P1 ServiceNow incident, pages the on-call engineer via PagerDuty, and posts to the IT war-room Teams channel."
  tags:
    - itsm
    - incident-response
    - datadog
    - pagerduty
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: it-p1-ops
      port: 8080
      tools:
        - name: handle-critical-alert
          description: "Given a Datadog critical alert for an AIG insurance platform system, create a P1 ServiceNow incident, trigger PagerDuty to page the on-call engineer, and post to the IT war-room Teams channel. Use when monitoring detects a critical system failure."
          inputParameters:
            - name: alert_id
              in: body
              type: string
              description: "Datadog monitor alert ID."
            - name: system_name
              in: body
              type: string
              description: "Affected system name."
            - name: alert_message
              in: body
              type: string
              description: "Human-readable alert description."
            - name: warroom_channel_id
              in: body
              type: string
              description: "IT war-room Teams channel ID."
          steps:
            - name: create-incident
              type: call
              call: servicenow-p1.create-incident
              with:
                short_description: "P1: {{system_name}} — {{alert_message}}"
                priority: "1"
                category: "critical_system"
            - name: page-oncall
              type: call
              call: pagerduty.trigger-incident
              with:
                title: "P1 — {{system_name}}"
                severity: "critical"
                details: "INC: {{create-incident.number}} | Alert: {{alert_id}}"
            - name: post-warroom
              type: call
              call: msteams-p1.post-channel-message
              with:
                channel_id: "{{warroom_channel_id}}"
                text: "P1 INCIDENT: {{system_name}} | INC: {{create-incident.number}} | PagerDuty: {{page-oncall.incident_key}} | {{alert_message}}"
  consumes:
    - type: http
      namespace: servicenow-p1
      baseUri: "https://aig.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: pagerduty
      baseUri: "https://events.pagerduty.com/v2"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.pagerduty_token"
        placement: header
      resources:
        - name: enqueue
          path: "/enqueue"
          operations:
            - name: trigger-incident
              method: POST
    - type: http
      namespace: msteams-p1
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

When a critical vulnerability is discovered, creates a Jira remediation ticket, updates the CMDB in ServiceNow, and alerts the security team via Teams.

naftiko: "0.5"
info:
  label: "IT Security Vulnerability Remediation Workflow"
  description: "When a critical vulnerability is discovered, creates a Jira remediation ticket, updates the CMDB in ServiceNow, and alerts the security team via Teams."
  tags:
    - insurance
    - security
    - vulnerability-management
    - jira
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: secops
      port: 8080
      tools:
        - name: remediate-vulnerability
          description: "Given a CVE ID, severity, and affected system, create a Jira ticket, update the ServiceNow CMDB, and notify SecOps in Teams."
          inputParameters:
            - name: cve_id
              in: body
              type: string
              description: "CVE identifier."
            - name: severity
              in: body
              type: string
              description: "Severity level."
            - name: affected_system
              in: body
              type: string
              description: "Affected system name."
            - name: secops_upn
              in: body
              type: string
              description: "UPN of SecOps lead."
          steps:
            - name: create-ticket
              type: call
              call: jira.create-issue
              with:
                project: "SECOPS"
                summary: "Remediate {{cve_id}} — {{affected_system}}"
                description: "Severity: {{severity}} | System: {{affected_system}}"
            - name: update-cmdb
              type: call
              call: snow.update-ci
              with:
                ci_name: "{{affected_system}}"
                vulnerability: "{{cve_id}} — {{severity}}"
            - name: notify-secops
              type: call
              call: msteams.send-message
              with:
                recipient_upn: "{{secops_upn}}"
                text: "Vulnerability: {{cve_id}} ({{severity}}) on {{affected_system}}. Jira: {{create-ticket.key}}"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://aig.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: snow
      baseUri: "https://aig.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: cmdb
          path: "/table/cmdb_ci?sysparm_query=name={{ci_name}}"
          inputParameters:
            - name: ci_name
              in: query
          operations:
            - name: update-ci
              method: PATCH
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Fetches a Jira issue by key and returns the summary, status, assignee, and priority.

naftiko: "0.5"
info:
  label: "Jira Issue Detail Lookup"
  description: "Fetches a Jira issue by key and returns the summary, status, assignee, and priority."
  tags:
    - insurance
    - engineering
    - jira
    - project-management
    - lookup
capability:
  exposes:
    - type: mcp
      namespace: eng-ops
      port: 8080
      tools:
        - name: get-jira-issue
          description: "Given a Jira issue key, return the issue summary, status, assignee, and priority."
          inputParameters:
            - name: issue_key
              in: body
              type: string
              description: "Jira issue key."
          call: jira.get-issue
          with:
            issueKey: "{{issue_key}}"
          outputParameters:
            - name: summary
              type: string
              mapping: "$.fields.summary"
            - name: status
              type: string
              mapping: "$.fields.status.name"
            - name: assignee
              type: string
              mapping: "$.fields.assignee.displayName"
  consumes:
    - namespace: jira
      type: http
      baseUri: "https://aig.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_api_token"
      resources:
        - name: eng-ops
          path: "/{{id}}"
          operations:
            - name: get-issue
              method: GET

At sprint close, retrieves Jira velocity metrics, refreshes the Power BI agile dashboard, and posts a sprint summary to the engineering Teams channel.

naftiko: "0.5"
info:
  label: "Jira Sprint Velocity Digest"
  description: "At sprint close, retrieves Jira velocity metrics, refreshes the Power BI agile dashboard, and posts a sprint summary to the engineering Teams channel."
  tags:
    - devops
    - jira
    - agile
    - reporting
    - engineering
capability:
  exposes:
    - type: mcp
      namespace: sprint-reporting
      port: 8080
      tools:
        - name: publish-sprint-velocity
          description: "Given a Jira board and sprint ID, retrieve completed story points, refresh the Power BI agile dashboard, and post the sprint summary to the engineering Teams channel. Use at each sprint close to communicate velocity."
          inputParameters:
            - name: board_id
              in: body
              type: string
              description: "Jira software board ID."
            - name: sprint_id
              in: body
              type: string
              description: "Completed sprint ID."
            - name: pbi_dataset_id
              in: body
              type: string
              description: "Power BI dataset ID for the agile dashboard."
            - name: eng_channel_id
              in: body
              type: string
              description: "Engineering Teams channel ID."
          steps:
            - name: get-sprint-report
              type: call
              call: jira-agile.get-sprint-report
              with:
                board_id: "{{board_id}}"
                sprint_id: "{{sprint_id}}"
            - name: refresh-pbi-sprint
              type: call
              call: powerbi-sprint.trigger-refresh
              with:
                dataset_id: "{{pbi_dataset_id}}"
            - name: post-sprint-summary
              type: call
              call: msteams-sprint.post-channel-message
              with:
                channel_id: "{{eng_channel_id}}"
                text: "Sprint {{sprint_id}} closed. Velocity: {{get-sprint-report.completed_points}} pts | Completion: {{get-sprint-report.completion_rate}}% | Dashboard refreshed."
  consumes:
    - type: http
      namespace: jira-agile
      baseUri: "https://aig.atlassian.net/rest/agile/1.0"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_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: get-sprint-report
              method: GET
    - type: http
      namespace: powerbi-sprint
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: dataset-refreshes
          path: "/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: trigger-refresh
              method: POST
    - type: http
      namespace: msteams-sprint
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Generates a talent brand performance report by pulling LinkedIn analytics, comparing with Workday hiring data, and posting to Teams.

naftiko: "0.5"
info:
  label: "LinkedIn Talent Brand Performance Report"
  description: "Generates a talent brand performance report by pulling LinkedIn analytics, comparing with Workday hiring data, and posting to Teams."
  tags:
    - insurance
    - hr
    - talent-acquisition
    - linkedin
    - workday
capability:
  exposes:
    - type: mcp
      namespace: ta-ops
      port: 8080
      tools:
        - name: generate-talent-report
          description: "Given a reporting week, pull LinkedIn employer brand metrics, compare against Workday requisitions, and post a digest to Teams."
          inputParameters:
            - name: week
              in: body
              type: string
              description: "Reporting week."
            - name: region
              in: body
              type: string
              description: "Region."
            - name: ta_channel_id
              in: body
              type: string
              description: "Teams channel ID."
          steps:
            - name: get-metrics
              type: call
              call: linkedin.get-brand-metrics
              with:
                week: "{{week}}"
                region: "{{region}}"
            - name: get-reqs
              type: call
              call: workday.get-open-reqs
              with:
                region: "{{region}}"
            - name: post-digest
              type: call
              call: msteams.post-channel
              with:
                channel_id: "{{ta_channel_id}}"
                text: "Talent Brand: {{week}} ({{region}}). Impressions: {{get-metrics.impressions}} | Open reqs: {{get-reqs.count}}"
  consumes:
    - type: http
      namespace: linkedin
      baseUri: "https://api.linkedin.com/v2"
      authentication:
        type: bearer
        token: "$secrets.linkedin_token"
      resources:
        - name: analytics
          path: "/organizationalEntityShareStatistics"
          operations:
            - name: get-brand-metrics
              method: GET
    - type: http
      namespace: workday
      baseUri: "https://wd5-impl-services1.workday.com/ccx/service/aig/Recruiting/v40.1"
      authentication:
        type: basic
        username: "$secrets.workday_user"
        password: "$secrets.workday_password"
      resources:
        - name: requisitions
          path: "/job-requisitions"
          operations:
            - name: get-open-reqs
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: channels
          path: "/teams/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel
              method: POST

Checks Microsoft 365 license utilization for the organization, returning assigned and consumed license counts.

naftiko: "0.5"
info:
  label: "Microsoft 365 License Utilization Check"
  description: "Checks Microsoft 365 license utilization for the organization, returning assigned and consumed license counts."
  tags:
    - it-operations
    - microsoft-365
    - license-management
    - lookup
capability:
  exposes:
    - type: mcp
      namespace: license-ops
      port: 8080
      tools:
        - name: get-license-usage
          description: "Return the total assigned and consumed Microsoft 365 license counts for the organization."
          inputParameters:
            - name: sku_part_number
              in: body
              type: string
              description: "Microsoft 365 SKU part number."
          call: msgraph.get-subscribed-skus
          with:
            sku: "{{sku_part_number}}"
          outputParameters:
            - name: assigned
              type: integer
              mapping: "$.consumedUnits"
            - name: total
              type: integer
              mapping: "$.prepaidUnits.enabled"
  consumes:
    - namespace: msgraph
      type: http
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: subscribed-skus
          path: "/subscribedSkus"
          operations:
            - name: get-subscribed-skus
              method: GET

Triggers SAP S/4HANA period close for the fiscal month, validates journal postings, and notifies the finance team in Teams.

naftiko: "0.5"
info:
  label: "Monthly Financial Period Close"
  description: "Triggers SAP S/4HANA period close for the fiscal month, validates journal postings, and notifies the finance team in Teams."
  tags:
    - finance
    - erp
    - period-close
    - sap
    - accounting
capability:
  exposes:
    - type: mcp
      namespace: finance-close
      port: 8080
      tools:
        - name: trigger-period-close
          description: "Given a fiscal period and company code, initiate the SAP period close sequence, validate journal completeness, and post completion status to the finance Teams channel. Use at month end to automate AIG's financial close workflow."
          inputParameters:
            - name: fiscal_period
              in: body
              type: string
              description: "Fiscal period in YYYYPP format, e.g. '202603'."
            - name: company_code
              in: body
              type: string
              description: "SAP company code, e.g. 'AIGI'."
            - name: finance_channel_id
              in: body
              type: string
              description: "Finance Teams channel ID."
          steps:
            - name: close-period
              type: call
              call: sap-fi.close-period
              with:
                fiscal_period: "{{fiscal_period}}"
                company_code: "{{company_code}}"
            - name: validate-journals
              type: call
              call: sap-journals.check-completeness
              with:
                fiscal_period: "{{fiscal_period}}"
                company_code: "{{company_code}}"
            - name: notify-finance
              type: call
              call: msteams-finance.post-channel-message
              with:
                channel_id: "{{finance_channel_id}}"
                text: "Period {{fiscal_period}} closed for {{company_code}}. Journal status: {{validate-journals.status}} | Open items: {{validate-journals.open_count}}"
  consumes:
    - type: http
      namespace: sap-fi
      baseUri: "https://aig-s4.sap.com/sap/opu/odata/sap/FAR_PERIOD_CLOSE_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: period-close
          path: "/PeriodClose"
          operations:
            - name: close-period
              method: POST
    - type: http
      namespace: sap-journals
      baseUri: "https://aig-s4.sap.com/sap/opu/odata/sap/FAR_JOURNAL_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: journal-validation
          path: "/JournalEntryCompleteness"
          inputParameters:
            - name: fiscal_period
              in: query
            - name: company_code
              in: query
          operations:
            - name: check-completeness
              method: GET
    - type: http
      namespace: msteams-finance
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Processes a new business submission by creating a Salesforce opportunity, generating an underwriting task in ServiceNow, and notifying the underwriter via Teams.

naftiko: "0.5"
info:
  label: "New Business Submission Processing"
  description: "Processes a new business submission by creating a Salesforce opportunity, generating an underwriting task in ServiceNow, and notifying the underwriter via Teams."
  tags:
    - insurance
    - underwriting
    - salesforce
    - servicenow
    - new-business
capability:
  exposes:
    - type: mcp
      namespace: submission-ops
      port: 8080
      tools:
        - name: process-submission
          description: "Given submission details, create a Salesforce opportunity, open an underwriting task in ServiceNow, and notify the underwriter."
          inputParameters:
            - name: broker_name
              in: body
              type: string
              description: "Broker name."
            - name: coverage_type
              in: body
              type: string
              description: "Coverage type."
            - name: estimated_premium
              in: body
              type: number
              description: "Estimated premium."
            - name: underwriter_upn
              in: body
              type: string
              description: "UPN of underwriter."
          steps:
            - name: create-opp
              type: call
              call: sf.create-opportunity
              with:
                Name: "New — {{broker_name}} — {{coverage_type}}"
                Amount: "{{estimated_premium}}"
            - name: create-task
              type: call
              call: snow.create-task
              with:
                short_description: "UW Review: {{broker_name}} — {{coverage_type}}"
                description: "Premium: {{estimated_premium}} | SF: {{create-opp.id}}"
            - name: notify-uw
              type: call
              call: msteams.send-message
              with:
                recipient_upn: "{{underwriter_upn}}"
                text: "New submission: {{broker_name}} — {{coverage_type}}. SF: {{create-opp.id}} | SNOW: {{create-task.number}}"
  consumes:
    - type: http
      namespace: sf
      baseUri: "https://aig.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opportunities
          path: "/sobjects/Opportunity"
          operations:
            - name: create-opportunity
              method: POST
    - type: http
      namespace: snow
      baseUri: "https://aig.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/u_underwriting_task"
          operations:
            - name: create-task
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

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

naftiko: "0.5"
info:
  label: "New Hire Onboarding Orchestration"
  description: "When a new employee is created in Workday, opens a ServiceNow onboarding ticket, provisions their Okta account, and sends a Microsoft Teams welcome message."
  tags:
    - hr
    - onboarding
    - workday
    - servicenow
    - okta
capability:
  exposes:
    - type: mcp
      namespace: hr-onboarding
      port: 8080
      tools:
        - name: trigger-employee-onboarding
          description: "Given a Workday employee ID and start date, create a ServiceNow onboarding task, provision Okta access, and send a Teams welcome message. Use when HR confirms a new hire in Workday."
          inputParameters:
            - name: workday_employee_id
              in: body
              type: string
              description: "Workday worker ID for the new hire."
            - name: start_date
              in: body
              type: string
              description: "Employee start date in YYYY-MM-DD format."
          steps:
            - name: get-employee
              type: call
              call: workday.get-worker
              with:
                worker_id: "{{workday_employee_id}}"
            - name: create-onboarding-ticket
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Onboarding: {{get-employee.first_name}} {{get-employee.last_name}}"
                category: "hr_onboarding"
                assigned_group: "IT_Onboarding"
            - name: provision-okta
              type: call
              call: okta.create-user
              with:
                firstName: "{{get-employee.first_name}}"
                lastName: "{{get-employee.last_name}}"
                email: "{{get-employee.work_email}}"
                login: "{{get-employee.work_email}}"
            - name: send-welcome
              type: call
              call: msteams.send-message
              with:
                recipient_upn: "{{get-employee.work_email}}"
                text: "Welcome to AIG, {{get-employee.first_name}}! Your onboarding ticket is {{create-onboarding-ticket.number}}. Start date: {{start_date}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://aig.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: okta
      baseUri: "https://aig.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_token"
        placement: header
      resources:
        - name: users
          path: "/users"
          operations:
            - name: create-user
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

When an employee termination is processed in Workday, deactivates their Okta account, closes open ServiceNow access requests, and deactivates their Salesforce user.

naftiko: "0.5"
info:
  label: "Okta Employee Access Deprovisioning"
  description: "When an employee termination is processed in Workday, deactivates their Okta account, closes open ServiceNow access requests, and deactivates their Salesforce user."
  tags:
    - hr
    - offboarding
    - okta
    - workday
    - identity
capability:
  exposes:
    - type: mcp
      namespace: hr-offboarding
      port: 8080
      tools:
        - name: deprovision-terminated-employee
          description: "Given a terminated employee's Workday ID, Okta user ID, and Salesforce user ID, deactivate Okta, close open ServiceNow requests, and deactivate Salesforce. Use immediately upon processing a termination to prevent unauthorized access to AIG systems."
          inputParameters:
            - name: workday_employee_id
              in: body
              type: string
              description: "Workday worker ID of the terminated employee."
            - name: okta_user_id
              in: body
              type: string
              description: "Okta user ID to deactivate."
            - name: salesforce_user_id
              in: body
              type: string
              description: "Salesforce user ID to deactivate."
          steps:
            - name: deactivate-okta
              type: call
              call: okta-offboard.deactivate-user
              with:
                user_id: "{{okta_user_id}}"
            - name: close-snow-requests
              type: call
              call: servicenow-offboard.close-requests
              with:
                employee_id: "{{workday_employee_id}}"
            - name: deactivate-sf-user
              type: call
              call: salesforce-offboard.update-user
              with:
                user_id: "{{salesforce_user_id}}"
                is_active: "false"
  consumes:
    - type: http
      namespace: okta-offboard
      baseUri: "https://aig.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_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: servicenow-offboard
      baseUri: "https://aig.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: requests
          path: "/table/sc_request"
          operations:
            - name: close-requests
              method: PATCH
    - type: http
      namespace: salesforce-offboard
      baseUri: "https://aig.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: users
          path: "/sobjects/User/{{user_id}}"
          inputParameters:
            - name: user_id
              in: path
          operations:
            - name: update-user
              method: PATCH

Audits MFA enrollment by querying Okta for unenrolled users, creating compliance tasks in ServiceNow, and notifying IT security via Teams.

naftiko: "0.5"
info:
  label: "Okta MFA Enrollment Compliance Audit"
  description: "Audits MFA enrollment by querying Okta for unenrolled users, creating compliance tasks in ServiceNow, and notifying IT security via Teams."
  tags:
    - insurance
    - security
    - okta
    - mfa
    - servicenow
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: mfa-ops
      port: 8080
      tools:
        - name: audit-mfa-compliance
          description: "Query Okta for users without MFA, create a compliance task in ServiceNow, and notify IT security in Teams."
          inputParameters:
            - name: department
              in: body
              type: string
              description: "Department to audit."
            - name: security_lead_upn
              in: body
              type: string
              description: "UPN of security lead."
          steps:
            - name: get-unenrolled
              type: call
              call: okta.list-unenrolled
              with:
                department: "{{department}}"
            - name: create-task
              type: call
              call: snow.create-task
              with:
                short_description: "MFA non-compliance: {{department}}"
                description: "Unenrolled: {{get-unenrolled.count}}"
            - name: notify-lead
              type: call
              call: msteams.send-message
              with:
                recipient_upn: "{{security_lead_upn}}"
                text: "MFA audit: {{department}} — {{get-unenrolled.count}} unenrolled. Task: {{create-task.number}}"
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://aig.okta.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.okta_api_token"
      resources:
        - name: users
          path: '/users?filter=profile.department eq "{{department}}"'
          inputParameters:
            - name: department
              in: query
          operations:
            - name: list-unenrolled
              method: GET
    - type: http
      namespace: snow
      baseUri: "https://aig.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/u_compliance_task"
          operations:
            - name: create-task
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves Okta privileged group membership, refreshes a Power BI certification report, and emails the security team for access review.

naftiko: "0.5"
info:
  label: "Okta Privileged Access Quarterly Certification"
  description: "Retrieves Okta privileged group membership, refreshes a Power BI certification report, and emails the security team for access review."
  tags:
    - identity
    - security
    - okta
    - compliance
    - access-review
capability:
  exposes:
    - type: mcp
      namespace: access-cert
      port: 8080
      tools:
        - name: run-privileged-access-certification
          description: "Given an Okta privileged group ID, retrieve current membership, trigger a Power BI report refresh, and email the security team the certification report for review. Use quarterly for regulatory compliance access reviews."
          inputParameters:
            - name: okta_group_id
              in: body
              type: string
              description: "Okta privileged group ID to certify."
            - name: pbi_dataset_id
              in: body
              type: string
              description: "Power BI dataset ID for access certification reports."
            - name: security_team_email
              in: body
              type: string
              description: "Security team email for the certification."
          steps:
            - name: get-group-users
              type: call
              call: okta-cert.get-group-members
              with:
                group_id: "{{okta_group_id}}"
            - name: refresh-pbi-cert
              type: call
              call: powerbi-cert.trigger-refresh
              with:
                dataset_id: "{{pbi_dataset_id}}"
            - name: send-cert-report
              type: call
              call: msgraph-cert.send-email
              with:
                to: "{{security_team_email}}"
                subject: "Quarterly Access Certification — Okta Group {{okta_group_id}}"
                body: "Group {{okta_group_id}} has {{get-group-users.total_count}} members. Review in Power BI and certify or revoke access."
  consumes:
    - type: http
      namespace: okta-cert
      baseUri: "https://aig.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_token"
        placement: header
      resources:
        - name: group-members
          path: "/groups/{{group_id}}/users"
          inputParameters:
            - name: group_id
              in: path
          operations:
            - name: get-group-members
              method: GET
    - type: http
      namespace: powerbi-cert
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: dataset-refreshes
          path: "/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: trigger-refresh
              method: POST
    - type: http
      namespace: msgraph-cert
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: send-mail
          path: "/users/{{sender}}/sendMail"
          operations:
            - name: send-email
              method: POST

Looks up an Okta user by email and returns the account status, last login timestamp, and MFA enrollment state.

naftiko: "0.5"
info:
  label: "Okta User Account Status Lookup"
  description: "Looks up an Okta user by email and returns the account status, last login timestamp, and MFA enrollment state."
  tags:
    - insurance
    - security
    - okta
    - identity
    - lookup
capability:
  exposes:
    - type: mcp
      namespace: identity-ops
      port: 8080
      tools:
        - name: get-user-status
          description: "Given a user email, return the Okta account status, last login, and MFA enrollment status."
          inputParameters:
            - name: user_email
              in: body
              type: string
              description: "User email address."
          call: okta.get-user
          with:
            login: "{{user_email}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.status"
            - name: last_login
              type: string
              mapping: "$.lastLogin"
  consumes:
    - namespace: okta
      type: http
      baseUri: "https://aig.okta.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.okta_api_token"
      resources:
        - name: identity-ops
          path: "/{{id}}"
          operations:
            - name: get-user
              method: GET

Retrieves the current on-call engineer for a PagerDuty schedule.

naftiko: "0.5"
info:
  label: "PagerDuty On-Call Schedule Lookup"
  description: "Retrieves the current on-call engineer for a PagerDuty schedule."
  tags:
    - insurance
    - it-operations
    - pagerduty
    - incident-management
    - lookup
capability:
  exposes:
    - type: mcp
      namespace: incident-ops
      port: 8080
      tools:
        - name: get-on-call
          description: "Given a PagerDuty schedule ID, return the currently on-call user name and email."
          inputParameters:
            - name: schedule_id
              in: body
              type: string
              description: "PagerDuty schedule ID."
          call: pagerduty.get-oncall
          with:
            schedule_id: "{{schedule_id}}"
          outputParameters:
            - name: user_name
              type: string
              mapping: "$.oncalls[0].user.name"
            - name: user_email
              type: string
              mapping: "$.oncalls[0].user.email"
  consumes:
    - namespace: pagerduty
      type: http
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: bearer
        token: "$secrets.pagerduty_token"
      resources:
        - name: incident-ops
          path: "/{{id}}"
          operations:
            - name: get-oncall
              method: GET

Processes a policy endorsement by updating Salesforce, adjusting premium in SAP, and emailing confirmation to the broker.

naftiko: "0.5"
info:
  label: "Policy Endorsement Processing Workflow"
  description: "Processes a policy endorsement by updating Salesforce, adjusting premium in SAP, and emailing confirmation to the broker."
  tags:
    - insurance
    - policy-management
    - salesforce
    - sap
    - customer-service
capability:
  exposes:
    - type: mcp
      namespace: endorsement-ops
      port: 8080
      tools:
        - name: process-endorsement
          description: "Given a policy number and endorsement type, update Salesforce, post SAP premium adjustment, and send confirmation."
          inputParameters:
            - name: policy_number
              in: body
              type: string
              description: "Policy number."
            - name: endorsement_type
              in: body
              type: string
              description: "Endorsement type."
            - name: effective_date
              in: body
              type: string
              description: "Effective date."
            - name: broker_email
              in: body
              type: string
              description: "Broker email."
          steps:
            - name: update-policy
              type: call
              call: sf.update-policy
              with:
                policy_number: "{{policy_number}}"
                endorsement_type: "{{endorsement_type}}"
            - name: adjust-premium
              type: call
              call: sap-fi.post-adjustment
              with:
                policy_number: "{{policy_number}}"
                effective_date: "{{effective_date}}"
            - name: send-confirmation
              type: call
              call: msgraph.send-mail
              with:
                to: "{{broker_email}}"
                subject: "Endorsement: {{policy_number}} — {{endorsement_type}}"
                body: "Effective {{effective_date}}. Adjustment: {{adjust-premium.amount}}"
  consumes:
    - type: http
      namespace: sf
      baseUri: "https://aig.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: policies
          path: "/sobjects/InsurancePolicy__c/PolicyNumber__c/{{policy_number}}"
          inputParameters:
            - name: policy_number
              in: path
          operations:
            - name: update-policy
              method: PATCH
    - type: http
      namespace: sap
      baseUri: "https://aig-s4.sap.com/sap/opu/odata/sap/API_JOURNAL_ENTRY_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: adjustments
          path: "/A_JournalEntry"
          operations:
            - name: post-adjustment
              method: POST
    - type: http
      namespace: msgraph
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/users/noreply@aig.com/sendMail"
          operations:
            - name: send-mail
              method: POST

When a policy payment is overdue, retrieves policyholder details from Salesforce, sends a retention email, and logs the outreach in ServiceNow.

naftiko: "0.5"
info:
  label: "Policy Lapse Prevention Outreach Workflow"
  description: "When a policy payment is overdue, retrieves policyholder details from Salesforce, sends a retention email, and logs the outreach in ServiceNow."
  tags:
    - insurance
    - retention
    - salesforce
    - servicenow
    - customer-service
capability:
  exposes:
    - type: mcp
      namespace: retention-ops
      port: 8080
      tools:
        - name: prevent-policy-lapse
          description: "Given a policy number and days overdue, look up the policyholder, send a retention email, and log the outreach."
          inputParameters:
            - name: policy_number
              in: body
              type: string
              description: "Policy number."
            - name: days_overdue
              in: body
              type: integer
              description: "Days overdue."
          steps:
            - name: get-policyholder
              type: call
              call: sf.get-account
              with:
                policy_number: "{{policy_number}}"
            - name: send-email
              type: call
              call: msgraph.send-mail
              with:
                to: "{{get-policyholder.PersonEmail}}"
                subject: "Your policy {{policy_number}} — Action Needed"
                body: "Payment is {{days_overdue}} days overdue."
            - name: log-outreach
              type: call
              call: snow.create-activity
              with:
                short_description: "Lapse prevention: {{policy_number}}"
                description: "Days overdue: {{days_overdue}}"
  consumes:
    - type: http
      namespace: sf
      baseUri: "https://aig.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: accounts
          path: "/sobjects/Account/PolicyNumber__c/{{policy_number}}"
          inputParameters:
            - name: policy_number
              in: path
          operations:
            - name: get-account
              method: GET
    - type: http
      namespace: msgraph
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/users/noreply@aig.com/sendMail"
          operations:
            - name: send-mail
              method: POST
    - type: http
      namespace: snow
      baseUri: "https://aig.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: activities
          path: "/table/u_retention_activity"
          operations:
            - name: create-activity
              method: POST

When a policy is within 60 days of expiration, enriches the Salesforce account with ZoomInfo data, creates a renewal opportunity, and alerts the account manager in Teams.

naftiko: "0.5"
info:
  label: "Policy Renewal Outreach Workflow"
  description: "When a policy is within 60 days of expiration, enriches the Salesforce account with ZoomInfo data, creates a renewal opportunity, and alerts the account manager in Teams."
  tags:
    - sales
    - crm
    - salesforce
    - insurance
    - renewal
capability:
  exposes:
    - type: mcp
      namespace: policy-renewal
      port: 8080
      tools:
        - name: trigger-renewal-outreach
          description: "Given a Salesforce account ID and policy expiration date, enrich the account from ZoomInfo, create a renewal opportunity in Salesforce, and notify the account manager in Teams. Use when policy records show expiration within 60 days."
          inputParameters:
            - name: salesforce_account_id
              in: body
              type: string
              description: "Salesforce account ID for the policyholder."
            - name: policy_expiry_date
              in: body
              type: string
              description: "Policy expiration date in YYYY-MM-DD format."
            - name: account_manager_upn
              in: body
              type: string
              description: "Account manager Teams UPN."
            - name: zoominfo_company_id
              in: body
              type: string
              description: "ZoomInfo company ID for enrichment."
          steps:
            - name: enrich-account
              type: call
              call: zoominfo.get-company
              with:
                company_id: "{{zoominfo_company_id}}"
            - name: update-sf-account
              type: call
              call: salesforce-acct.update-account
              with:
                account_id: "{{salesforce_account_id}}"
                employees: "{{enrich-account.employee_count}}"
                annual_revenue: "{{enrich-account.revenue}}"
            - name: create-renewal-opp
              type: call
              call: salesforce-opps.create-opportunity
              with:
                account_id: "{{salesforce_account_id}}"
                name: "Policy Renewal — {{enrich-account.company_name}} — {{policy_expiry_date}}"
                stage_name: "Renewal Outreach"
                close_date: "{{policy_expiry_date}}"
            - name: alert-account-manager
              type: call
              call: msteams-renewal.send-message
              with:
                recipient_upn: "{{account_manager_upn}}"
                text: "Policy renewal due {{policy_expiry_date}} for {{enrich-account.company_name}}. Opportunity created: {{create-renewal-opp.id}}. Employees: {{enrich-account.employee_count}}"
  consumes:
    - type: http
      namespace: zoominfo
      baseUri: "https://api.zoominfo.com/search"
      authentication:
        type: bearer
        token: "$secrets.zoominfo_token"
      resources:
        - name: companies
          path: "/company/{{company_id}}"
          inputParameters:
            - name: company_id
              in: path
          operations:
            - name: get-company
              method: GET
    - type: http
      namespace: salesforce-acct
      baseUri: "https://aig.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: update-account
              method: PATCH
    - type: http
      namespace: salesforce-opps
      baseUri: "https://aig.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opportunities
          path: "/sobjects/Opportunity"
          operations:
            - name: create-opportunity
              method: POST
    - type: http
      namespace: msteams-renewal
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Generates policyholder documents by pulling policy data from Salesforce, creating a DocuSign envelope, and logging in ServiceNow.

naftiko: "0.5"
info:
  label: "Policyholder Document Generation Workflow"
  description: "Generates policyholder documents by pulling policy data from Salesforce, creating a DocuSign envelope, and logging in ServiceNow."
  tags:
    - insurance
    - document-management
    - salesforce
    - docusign
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: doc-gen
      port: 8080
      tools:
        - name: generate-policy-documents
          description: "Given a policy number and document type, retrieve policy details, create a DocuSign envelope, and log in ServiceNow."
          inputParameters:
            - name: policy_number
              in: body
              type: string
              description: "Policy number."
            - name: document_type
              in: body
              type: string
              description: "Document type."
            - name: recipient_email
              in: body
              type: string
              description: "Recipient email."
          steps:
            - name: get-policy
              type: call
              call: sf.get-policy-details
              with:
                policy_number: "{{policy_number}}"
            - name: create-envelope
              type: call
              call: docusign.create-envelope
              with:
                recipient_email: "{{recipient_email}}"
                subject: "{{document_type}} — {{policy_number}}"
            - name: log-task
              type: call
              call: snow.create-task
              with:
                short_description: "Doc: {{document_type}} — {{policy_number}}"
                description: "DocuSign: {{create-envelope.envelopeId}}"
  consumes:
    - type: http
      namespace: sf
      baseUri: "https://aig.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: policies
          path: "/sobjects/InsurancePolicy__c/PolicyNumber__c/{{policy_number}}"
          operations:
            - name: get-policy-details
              method: GET
    - type: http
      namespace: docusign
      baseUri: "https://na4.docusign.net/restapi/v2.1"
      authentication:
        type: bearer
        token: "$secrets.docusign_token"
      resources:
        - name: envelopes
          path: "/accounts/{{accountId}}/envelopes"
          operations:
            - name: create-envelope
              method: POST
    - type: http
      namespace: snow
      baseUri: "https://aig.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/u_document_task"
          operations:
            - name: create-task
              method: POST

Triggers a Power BI dataset refresh for the claims performance dashboard and notifies the claims leadership team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Power BI Claims Dashboard Refresh"
  description: "Triggers a Power BI dataset refresh for the claims performance dashboard and notifies the claims leadership team in Microsoft Teams."
  tags:
    - analytics
    - power-bi
    - claims
    - reporting
    - insurance
capability:
  exposes:
    - type: mcp
      namespace: claims-reporting
      port: 8080
      tools:
        - name: refresh-claims-dashboard
          description: "Given a Power BI dataset ID and claims leadership Teams channel, trigger a dataset refresh and post a notification when complete. Use each morning before claims leadership review meetings."
          inputParameters:
            - name: dataset_id
              in: body
              type: string
              description: "Power BI dataset ID for the claims dashboard."
            - name: claims_channel_id
              in: body
              type: string
              description: "Claims leadership Teams channel ID."
          steps:
            - name: trigger-refresh
              type: call
              call: powerbi.trigger-refresh
              with:
                dataset_id: "{{dataset_id}}"
            - name: notify-claims-team
              type: call
              call: msteams-claims-rpt.post-channel-message
              with:
                channel_id: "{{claims_channel_id}}"
                text: "Claims dashboard refresh triggered (dataset {{dataset_id}}). Refresh ID: {{trigger-refresh.refreshId}}"
  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: "/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: trigger-refresh
              method: POST
    - type: http
      namespace: msteams-claims-rpt
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Checks the refresh status of a Power BI dataset and returns the last refresh time and status.

naftiko: "0.5"
info:
  label: "Power BI Dataset Refresh Status Check"
  description: "Checks the refresh status of a Power BI dataset and returns the last refresh time and status."
  tags:
    - insurance
    - analytics
    - power-bi
    - reporting
    - lookup
capability:
  exposes:
    - type: mcp
      namespace: bi-ops
      port: 8080
      tools:
        - name: get-dataset-refresh
          description: "Given a Power BI dataset ID, return the last refresh timestamp and status."
          inputParameters:
            - name: dataset_id
              in: body
              type: string
              description: "Power BI dataset GUID."
          call: pbi.get-refresh
          with:
            datasetId: "{{dataset_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.value[0].status"
            - name: end_time
              type: string
              mapping: "$.value[0].endTime"
  consumes:
    - namespace: pbi
      type: http
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: bi-ops
          path: "/{{id}}"
          operations:
            - name: get-refresh
              method: GET

Collects premium audit data by pulling policy details from Salesforce, payroll data from Workday, and creating an audit task in ServiceNow.

naftiko: "0.5"
info:
  label: "Premium Audit Data Collection Workflow"
  description: "Collects premium audit data by pulling policy details from Salesforce, payroll data from Workday, and creating an audit task in ServiceNow."
  tags:
    - insurance
    - audit
    - salesforce
    - workday
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: audit-ops
      port: 8080
      tools:
        - name: collect-audit-data
          description: "Given a policy number and audit period, retrieve details from Salesforce, pull payroll from Workday, and create an audit task."
          inputParameters:
            - name: policy_number
              in: body
              type: string
              description: "Policy number."
            - name: audit_period
              in: body
              type: string
              description: "Audit period."
          steps:
            - name: get-policy
              type: call
              call: sf.get-policy
              with:
                policy_number: "{{policy_number}}"
            - name: get-payroll
              type: call
              call: workday.get-payroll
              with:
                company: "{{get-policy.CompanyName}}"
                period: "{{audit_period}}"
            - name: create-task
              type: call
              call: snow.create-task
              with:
                short_description: "Audit: {{policy_number}} — {{audit_period}}"
                description: "Company: {{get-policy.CompanyName}} | Payroll: {{get-payroll.total}}"
  consumes:
    - type: http
      namespace: sf
      baseUri: "https://aig.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: policies
          path: "/sobjects/InsurancePolicy__c/PolicyNumber__c/{{policy_number}}"
          inputParameters:
            - name: policy_number
              in: path
          operations:
            - name: get-policy
              method: GET
    - type: http
      namespace: workday
      baseUri: "https://wd5-impl-services1.workday.com/ccx/service/aig/Payroll/v40.1"
      authentication:
        type: basic
        username: "$secrets.workday_user"
        password: "$secrets.workday_password"
      resources:
        - name: payroll
          path: "/payroll-summaries"
          operations:
            - name: get-payroll
              method: POST
    - type: http
      namespace: snow
      baseUri: "https://aig.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/u_premium_audit"
          operations:
            - name: create-task
              method: POST

Generates a quarterly financial report by querying Snowflake for KPIs, refreshing Power BI dashboards, and distributing via email to the executive team.

naftiko: "0.5"
info:
  label: "Quarterly Financial Report Generator"
  description: "Generates a quarterly financial report by querying Snowflake for KPIs, refreshing Power BI dashboards, and distributing via email to the executive team."
  tags:
    - insurance
    - finance
    - analytics
    - snowflake
    - power-bi
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: finance-reporting
      port: 8080
      tools:
        - name: generate-financial-report
          description: "Given a reporting quarter, query Snowflake for financial KPIs, trigger a Power BI refresh, and email the report link to executives."
          inputParameters:
            - name: quarter
              in: body
              type: string
              description: "Reporting quarter."
            - name: exec_dl
              in: body
              type: string
              description: "Executive distribution list email."
          steps:
            - name: query-kpis
              type: call
              call: snowflake.run-query
              with:
                query: "SELECT * FROM financial_kpis WHERE quarter='{{quarter}}'"
            - name: refresh-pbi
              type: call
              call: powerbi.trigger-refresh
              with:
                datasetId: "financial-dashboard"
            - name: send-report
              type: call
              call: msgraph.send-mail
              with:
                to: "{{exec_dl}}"
                subject: "Financial Report — {{quarter}}"
                body: "Revenue: {{query-kpis.revenue}} | Expenses: {{query-kpis.expenses}}. Dashboard refreshed."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://aig.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: run-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: "/datasets/{{datasetId}}/refreshes"
          inputParameters:
            - name: datasetId
              in: path
          operations:
            - name: trigger-refresh
              method: POST
    - type: http
      namespace: msgraph
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/users/noreply@aig.com/sendMail"
          operations:
            - name: send-mail
              method: POST

Generates a quarterly loss ratio report by querying Snowflake, refreshing Power BI, and distributing via Teams.

naftiko: "0.5"
info:
  label: "Quarterly Loss Ratio Report Workflow"
  description: "Generates a quarterly loss ratio report by querying Snowflake, refreshing Power BI, and distributing via Teams."
  tags:
    - insurance
    - actuarial
    - analytics
    - snowflake
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: actuarial-ops
      port: 8080
      tools:
        - name: generate-loss-ratio
          description: "Given a quarter and LOB, query Snowflake, trigger Power BI refresh, and send to actuarial channel."
          inputParameters:
            - name: quarter
              in: body
              type: string
              description: "Quarter."
            - name: lob
              in: body
              type: string
              description: "Line of business."
            - name: channel_id
              in: body
              type: string
              description: "Teams channel."
          steps:
            - name: query-data
              type: call
              call: snowflake.run-query
              with:
                query: "SELECT SUM(claim_amount) as losses FROM claims_fact WHERE quarter='{{quarter}}' AND lob='{{lob}}'"
            - name: refresh-pbi
              type: call
              call: powerbi.trigger-refresh
              with:
                datasetId: "loss-ratio-{{lob}}"
            - name: notify-team
              type: call
              call: msteams.post-channel
              with:
                channel_id: "{{channel_id}}"
                text: "{{quarter}} Loss Ratio for {{lob}} ready. Losses: {{query-data.losses}}. Dashboard refreshed."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://aig.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: run-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: "/datasets/{{datasetId}}/refreshes"
          operations:
            - name: trigger-refresh
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: channels
          path: "/teams/channels/{{channel_id}}/messages"
          operations:
            - name: post-channel
              method: POST

When a regulatory breach or compliance incident is identified, creates a ServiceNow compliance incident, opens a Jira investigation task, and notifies the Chief Compliance Officer in Teams.

naftiko: "0.5"
info:
  label: "Regulatory Compliance Incident Reporting"
  description: "When a regulatory breach or compliance incident is identified, creates a ServiceNow compliance incident, opens a Jira investigation task, and notifies the Chief Compliance Officer in Teams."
  tags:
    - compliance
    - regulatory
    - servicenow
    - jira
    - insurance
capability:
  exposes:
    - type: mcp
      namespace: compliance-ops
      port: 8080
      tools:
        - name: report-compliance-incident
          description: "Given a compliance incident type, jurisdiction, and description, create a ServiceNow compliance record, open a Jira investigation task, and alert the compliance officer in Teams. Use when a regulatory breach or potential violation is identified."
          inputParameters:
            - name: incident_type
              in: body
              type: string
              description: "Type of compliance incident, e.g. 'data-breach', 'regulatory-violation', 'sanctions-breach'."
            - name: jurisdiction
              in: body
              type: string
              description: "Regulatory jurisdiction, e.g. 'US-NY', 'EU-GDPR', 'UK-FCA'."
            - name: description
              in: body
              type: string
              description: "Full description of the compliance incident."
            - name: cco_upn
              in: body
              type: string
              description: "Chief Compliance Officer Teams UPN."
          steps:
            - name: create-compliance-record
              type: call
              call: servicenow-compliance.create-incident
              with:
                short_description: "Compliance incident: {{incident_type}} — {{jurisdiction}}"
                description: "{{description}}"
                category: "compliance_breach"
                priority: "1"
            - name: open-investigation
              type: call
              call: jira-compliance.create-issue
              with:
                project_key: "COMP"
                issuetype: "Task"
                summary: "Compliance investigation: {{incident_type}} — {{jurisdiction}}"
                description: "{{description}} | ServiceNow: {{create-compliance-record.number}}"
                priority: "Highest"
            - name: alert-cco
              type: call
              call: msteams-compliance.send-message
              with:
                recipient_upn: "{{cco_upn}}"
                text: "COMPLIANCE ALERT: {{incident_type}} in {{jurisdiction}} | INC: {{create-compliance-record.number}} | Jira: {{open-investigation.key}} | {{description}}"
  consumes:
    - type: http
      namespace: servicenow-compliance
      baseUri: "https://aig.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: jira-compliance
      baseUri: "https://aig.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams-compliance
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Monitors regulatory filing deadlines by querying Snowflake, checking preparation status in ServiceNow, and alerting the compliance team in Teams.

naftiko: "0.5"
info:
  label: "Regulatory Filing Deadline Monitor"
  description: "Monitors regulatory filing deadlines by querying Snowflake, checking preparation status in ServiceNow, and alerting the compliance team in Teams."
  tags:
    - insurance
    - compliance
    - regulatory
    - snowflake
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: regulatory-ops
      port: 8080
      tools:
        - name: track-filing-deadlines
          description: "Given a jurisdiction and filing type, check the filing calendar in Snowflake, verify status in ServiceNow, and alert the compliance channel in Teams."
          inputParameters:
            - name: jurisdiction
              in: body
              type: string
              description: "Jurisdiction."
            - name: filing_type
              in: body
              type: string
              description: "Filing type."
            - name: compliance_channel_id
              in: body
              type: string
              description: "Teams channel ID."
          steps:
            - name: get-deadlines
              type: call
              call: snowflake.query-filings
              with:
                jurisdiction: "{{jurisdiction}}"
            - name: check-status
              type: call
              call: snow.get-filing-status
              with:
                jurisdiction: "{{jurisdiction}}"
            - name: alert-team
              type: call
              call: msteams.post-channel
              with:
                channel_id: "{{compliance_channel_id}}"
                text: "Filing deadline: {{filing_type}} for {{jurisdiction}} — Due: {{get-deadlines.next_deadline}} | Status: {{check-status.status}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://aig.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: query-filings
              method: POST
    - type: http
      namespace: snow
      baseUri: "https://aig.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: filings
          path: "/table/u_regulatory_filing?sysparm_query=jurisdiction={{jurisdiction}}"
          inputParameters:
            - name: jurisdiction
              in: query
          operations:
            - name: get-filing-status
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: channels
          path: "/teams/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel
              method: POST

Validates that a large claim falls within reinsurance treaty limits by checking Snowflake for terms, SAP for exposure, and logging in ServiceNow.

naftiko: "0.5"
info:
  label: "Reinsurance Treaty Compliance Validator"
  description: "Validates that a large claim falls within reinsurance treaty limits by checking Snowflake for terms, SAP for exposure, and logging in ServiceNow."
  tags:
    - insurance
    - reinsurance
    - compliance
    - snowflake
    - sap
capability:
  exposes:
    - type: mcp
      namespace: reinsurance-ops
      port: 8080
      tools:
        - name: check-treaty-compliance
          description: "Given a claim number and amount, look up treaty terms in Snowflake, validate exposure in SAP, and log the compliance check."
          inputParameters:
            - name: claim_number
              in: body
              type: string
              description: "Claim number."
            - name: claim_amount
              in: body
              type: number
              description: "Claim amount."
            - name: treaty_id
              in: body
              type: string
              description: "Treaty ID."
          steps:
            - name: get-treaty
              type: call
              call: snowflake.query-treaty
              with:
                treaty_id: "{{treaty_id}}"
            - name: check-exposure
              type: call
              call: sap-fi.get-exposure
              with:
                treaty_id: "{{treaty_id}}"
            - name: log-check
              type: call
              call: snow.create-record
              with:
                short_description: "Treaty compliance: {{claim_number}}"
                description: "Amount: {{claim_amount}} | Treaty: {{treaty_id}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://aig.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: query-treaty
              method: POST
    - type: http
      namespace: sap
      baseUri: "https://aig-s4.sap.com/sap/opu/odata/sap/API_JOURNAL_ENTRY_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: exposure
          path: "/A_JournalEntry?$filter=TreatyID eq '{{treaty_id}}'"
          inputParameters:
            - name: treaty_id
              in: query
          operations:
            - name: get-exposure
              method: GET
    - type: http
      namespace: snow
      baseUri: "https://aig.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: compliance
          path: "/table/u_reinsurance_compliance"
          operations:
            - name: create-record
              method: POST

Looks up a user identity in SailPoint and returns current entitlements and certification status.

naftiko: "0.5"
info:
  label: "SailPoint Identity Governance Lookup"
  description: "Looks up a user identity in SailPoint and returns current entitlements and certification status."
  tags:
    - insurance
    - security
    - sailpoint
    - identity-governance
    - lookup
capability:
  exposes:
    - type: mcp
      namespace: iam-ops
      port: 8080
      tools:
        - name: get-identity-access
          description: "Given a SailPoint identity alias, return the display name, entitlement count, and last certification date."
          inputParameters:
            - name: identity_alias
              in: body
              type: string
              description: "SailPoint identity alias or email."
          call: sailpoint.get-identity
          with:
            alias: "{{identity_alias}}"
          outputParameters:
            - name: display_name
              type: string
              mapping: "$.displayName"
            - name: entitlement_count
              type: integer
              mapping: "$.entitlementCount"
  consumes:
    - namespace: sailpoint
      type: http
      baseUri: "https://aig.api.identitynow.com/v3"
      authentication:
        type: bearer
        token: "$secrets.sailpoint_token"
      resources:
        - name: iam-ops
          path: "/{{id}}"
          operations:
            - name: get-identity
              method: GET

Pulls the insurance sales pipeline from Salesforce, refreshes the Power BI executive pipeline dashboard, and emails a weekly summary to sales leadership.

naftiko: "0.5"
info:
  label: "Sales Pipeline Executive Digest"
  description: "Pulls the insurance sales pipeline from Salesforce, refreshes the Power BI executive pipeline dashboard, and emails a weekly summary to sales leadership."
  tags:
    - sales
    - crm
    - salesforce
    - power-bi
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: sales-exec-reporting
      port: 8080
      tools:
        - name: publish-pipeline-digest
          description: "Given a Salesforce opportunity filter and Power BI dataset ID, query open insurance opportunities, trigger a Power BI refresh, and email the pipeline digest to sales leadership. Use weekly for sales forecast reviews."
          inputParameters:
            - name: product_line
              in: body
              type: string
              description: "Insurance product line filter, e.g. 'Property Casualty' or 'Life'."
            - name: pbi_dataset_id
              in: body
              type: string
              description: "Power BI dataset ID for the pipeline dashboard."
            - name: leadership_email
              in: body
              type: string
              description: "Sales leadership email distribution list."
          steps:
            - name: get-pipeline
              type: call
              call: salesforce-pipeline.query-opportunities
              with:
                product_line: "{{product_line}}"
            - name: refresh-pbi
              type: call
              call: powerbi-pipeline.trigger-refresh
              with:
                dataset_id: "{{pbi_dataset_id}}"
            - name: send-digest
              type: call
              call: msgraph-sales.send-email
              with:
                to: "{{leadership_email}}"
                subject: "{{product_line}} Pipeline Digest — {{get-pipeline.record_count}} opportunities | ${{get-pipeline.total_premium}}"
                body: "Open pipeline for {{product_line}}: {{get-pipeline.record_count}} opportunities totaling ${{get-pipeline.total_premium}} gross written premium. Power BI refreshed."
  consumes:
    - type: http
      namespace: salesforce-pipeline
      baseUri: "https://aig.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opportunities
          path: "/query"
          inputParameters:
            - name: product_line
              in: query
          operations:
            - name: query-opportunities
              method: GET
    - type: http
      namespace: powerbi-pipeline
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: dataset-refreshes
          path: "/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: trigger-refresh
              method: POST
    - type: http
      namespace: msgraph-sales
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: send-mail
          path: "/users/{{sender}}/sendMail"
          operations:
            - name: send-email
              method: POST

Enriches Salesforce account health scores by pulling data from Snowflake, checking billing in SAP, and updating the Salesforce record.

naftiko: "0.5"
info:
  label: "Salesforce Account Health Enrichment"
  description: "Enriches Salesforce account health scores by pulling data from Snowflake, checking billing in SAP, and updating the Salesforce record."
  tags:
    - insurance
    - crm
    - salesforce
    - snowflake
    - sap
capability:
  exposes:
    - type: mcp
      namespace: account-ops
      port: 8080
      tools:
        - name: enrich-account-health
          description: "Given a Salesforce account ID, pull performance data from Snowflake, check billing in SAP, and update the health score in Salesforce."
          inputParameters:
            - name: account_id
              in: body
              type: string
              description: "Salesforce account ID."
            - name: account_manager_upn
              in: body
              type: string
              description: "UPN of account manager."
          steps:
            - name: get-data
              type: call
              call: snowflake.query-account-data
              with:
                account_id: "{{account_id}}"
            - name: get-billing
              type: call
              call: sap-fi.get-ar-aging
              with:
                account_id: "{{account_id}}"
            - name: update-sf
              type: call
              call: sf.update-health-score
              with:
                account_id: "{{account_id}}"
                score: "{{get-data.health_score}}"
            - name: notify-manager
              type: call
              call: msteams.send-message
              with:
                recipient_upn: "{{account_manager_upn}}"
                text: "Account health updated: {{account_id}}. Score: {{get-data.health_score}} | AR: {{get-billing.days_outstanding}} days"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://aig.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: query-account-data
              method: POST
    - type: http
      namespace: sap
      baseUri: "https://aig-s4.sap.com/sap/opu/odata/sap/API_JOURNAL_ENTRY_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: ar
          path: "/A_JournalEntry?$filter=AccountID eq '{{account_id}}'"
          inputParameters:
            - name: account_id
              in: query
          operations:
            - name: get-ar-aging
              method: GET
    - type: http
      namespace: sf
      baseUri: "https://aig.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: update-health-score
              method: PATCH
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves a summary of open claims from Salesforce by line of business, returning total count and average age.

naftiko: "0.5"
info:
  label: "Salesforce Claims Pipeline Summary"
  description: "Retrieves a summary of open claims from Salesforce by line of business, returning total count and average age."
  tags:
    - insurance
    - claims
    - salesforce
    - analytics
    - lookup
capability:
  exposes:
    - type: mcp
      namespace: claims-analytics
      port: 8080
      tools:
        - name: get-claims-summary
          description: "Given a line of business, return the total open claim count and average claim age in days."
          inputParameters:
            - name: line_of_business
              in: body
              type: string
              description: "Insurance line of business."
          call: sf.query-claims-summary
          with:
            lob: "{{line_of_business}}"
          outputParameters:
            - name: total_open
              type: integer
              mapping: "$.totalSize"
            - name: avg_age_days
              type: number
              mapping: "$.records[0].Avg_Age__c"
  consumes:
    - namespace: sf
      type: http
      baseUri: "https://aig.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: claims
          path: "/query/?q=SELECT+COUNT(Id)+FROM+Case+WHERE+LOB__c='{{lob}}'"
          operations:
            - name: query-claims-summary
              method: GET

Converts a Salesforce lead to a quote by enriching the lead, creating a quote request in ServiceNow, and notifying the producer via Teams.

naftiko: "0.5"
info:
  label: "Salesforce Lead-to-Quote Conversion"
  description: "Converts a Salesforce lead to a quote by enriching the lead, creating a quote request in ServiceNow, and notifying the producer via Teams."
  tags:
    - insurance
    - sales
    - salesforce
    - servicenow
    - crm
capability:
  exposes:
    - type: mcp
      namespace: sales-ops
      port: 8080
      tools:
        - name: convert-lead-to-quote
          description: "Given a Salesforce lead ID, enrich the lead, create a ServiceNow quote request, and notify the producer."
          inputParameters:
            - name: lead_id
              in: body
              type: string
              description: "Salesforce lead ID."
            - name: producer_upn
              in: body
              type: string
              description: "Producer UPN."
          steps:
            - name: get-lead
              type: call
              call: sf.get-lead
              with:
                lead_id: "{{lead_id}}"
            - name: create-quote
              type: call
              call: snow.create-quote
              with:
                short_description: "Quote: {{get-lead.Company}}"
                description: "Industry: {{get-lead.Industry}} | Revenue: {{get-lead.AnnualRevenue}}"
            - name: notify-producer
              type: call
              call: msteams.send-message
              with:
                recipient_upn: "{{producer_upn}}"
                text: "Lead converted: {{get-lead.Company}}. Quote: {{create-quote.number}}"
  consumes:
    - type: http
      namespace: sf
      baseUri: "https://aig.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: leads
          path: "/sobjects/Lead/{{lead_id}}"
          operations:
            - name: get-lead
              method: GET
    - type: http
      namespace: snow
      baseUri: "https://aig.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: quotes
          path: "/table/u_quote_request"
          operations:
            - name: create-quote
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          operations:
            - name: send-message
              method: POST

Retrieves a policyholder record from Salesforce by policy number, returning contact details, coverage tier, and account status.

naftiko: "0.5"
info:
  label: "Salesforce Policy Holder Lookup"
  description: "Retrieves a policyholder record from Salesforce by policy number, returning contact details, coverage tier, and account status."
  tags:
    - insurance
    - insurance
    - salesforce
    - customer-service
    - lookup
capability:
  exposes:
    - type: mcp
      namespace: policy-ops
      port: 8080
      tools:
        - name: get-policyholder
          description: "Given a policy number, return the policyholder contact name, email, phone, coverage tier, and account status from Salesforce."
          inputParameters:
            - name: policy_number
              in: body
              type: string
              description: "Policy number."
          call: sf.get-account
          with:
            PolicyNumber__c: "{{policy_number}}"
          outputParameters:
            - name: contact_name
              type: string
              mapping: "$.Name"
            - name: email
              type: string
              mapping: "$.PersonEmail"
            - name: status
              type: string
              mapping: "$.Status__c"
  consumes:
    - namespace: sf
      type: http
      baseUri: "https://aig.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: policy-ops
          path: "/{{id}}"
          operations:
            - name: get-account
              method: GET

Validates incoming SAP Ariba invoices against open purchase orders and routes discrepancies to the accounts payable team for resolution.

naftiko: "0.5"
info:
  label: "SAP Ariba Invoice Validation"
  description: "Validates incoming SAP Ariba invoices against open purchase orders and routes discrepancies to the accounts payable team for resolution."
  tags:
    - finance
    - procurement
    - sap-ariba
    - accounts-payable
capability:
  exposes:
    - type: mcp
      namespace: ap-validation
      port: 8080
      tools:
        - name: validate-supplier-invoice
          description: "Given an SAP Ariba invoice ID and corresponding PO number, fetch both records, compare totals for three-way match, and create a ServiceNow task if a discrepancy is found. Use for incoming supplier invoice processing."
          inputParameters:
            - name: invoice_id
              in: body
              type: string
              description: "SAP Ariba invoice ID."
            - name: po_number
              in: body
              type: string
              description: "SAP purchase order number for three-way match."
          steps:
            - name: get-invoice
              type: call
              call: ariba.get-invoice
              with:
                invoice_id: "{{invoice_id}}"
            - name: get-po
              type: call
              call: sap-po.get-purchase-order
              with:
                po_number: "{{po_number}}"
            - name: create-approval-task
              type: call
              call: servicenow-ap.create-task
              with:
                short_description: "Invoice match review: {{invoice_id}} vs PO {{po_number}}"
                description: "Invoice: ${{get-invoice.total_amount}} | PO: ${{get-po.total_amount}} | Vendor: {{get-invoice.vendor_name}}"
                assigned_group: "AP_Finance"
  consumes:
    - type: http
      namespace: ariba
      baseUri: "https://openapi.ariba.com/api/invoice/v1"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: invoices
          path: "/invoices/{{invoice_id}}"
          inputParameters:
            - name: invoice_id
              in: path
          operations:
            - name: get-invoice
              method: GET
    - type: http
      namespace: sap-po
      baseUri: "https://aig-s4.sap.com/sap/opu/odata/sap/MM_PUR_PO_MAINT_V2_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: purchase-orders
          path: "/A_PurchaseOrder('{{po_number}}')"
          inputParameters:
            - name: po_number
              in: path
          operations:
            - name: get-purchase-order
              method: GET
    - type: http
      namespace: servicenow-ap
      baseUri: "https://aig.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: create-task
              method: POST

Coordinates RFP responses by pulling requirements from Ariba, gathering costs from SAP, and distributing tasks via ServiceNow and Teams.

naftiko: "0.5"
info:
  label: "SAP Ariba RFP Response Coordinator"
  description: "Coordinates RFP responses by pulling requirements from Ariba, gathering costs from SAP, and distributing tasks via ServiceNow and Teams."
  tags:
    - procurement
    - sap-ariba
    - sap
    - servicenow
    - collaboration
capability:
  exposes:
    - type: mcp
      namespace: rfp-ops
      port: 8080
      tools:
        - name: coordinate-rfp
          description: "Given an Ariba RFP event ID, pull requirements, get SAP costs, create a ServiceNow task, and notify procurement."
          inputParameters:
            - name: rfp_event_id
              in: body
              type: string
              description: "Ariba event ID."
            - name: deadline
              in: body
              type: string
              description: "Response deadline."
            - name: procurement_channel_id
              in: body
              type: string
              description: "Teams channel."
          steps:
            - name: get-rfp
              type: call
              call: ariba.get-event
              with:
                event_id: "{{rfp_event_id}}"
            - name: get-costs
              type: call
              call: sap.get-cost-estimate
              with:
                category: "{{get-rfp.category}}"
            - name: create-task
              type: call
              call: snow.create-task
              with:
                short_description: "RFP: {{rfp_event_id}} — Due {{deadline}}"
                description: "Category: {{get-rfp.category}}"
            - name: notify-team
              type: call
              call: msteams.post-channel
              with:
                channel_id: "{{procurement_channel_id}}"
                text: "RFP: {{rfp_event_id}} — {{get-rfp.category}}. Deadline: {{deadline}}. Task: {{create-task.number}}"
  consumes:
    - type: http
      namespace: ariba
      baseUri: "https://openapi.ariba.com/api/sourcing/v1"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: events
          path: "/events/{{event_id}}"
          operations:
            - name: get-event
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://aig-s4.sap.com/sap/opu/odata/sap/API_PRODUCT_COST_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: costs
          path: "/A_ProductCostEstimate"
          operations:
            - name: get-cost-estimate
              method: GET
    - type: http
      namespace: snow
      baseUri: "https://aig.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/u_rfp_task"
          operations:
            - name: create-task
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: channels
          path: "/teams/channels/{{channel_id}}/messages"
          operations:
            - name: post-channel
              method: POST

Retrieves the current status of an SAP Ariba sourcing event, returning phase, participant count, and close date.

naftiko: "0.5"
info:
  label: "SAP Ariba Sourcing Event Status"
  description: "Retrieves the current status of an SAP Ariba sourcing event, returning phase, participant count, and close date."
  tags:
    - procurement
    - sap-ariba
    - sourcing
    - lookup
capability:
  exposes:
    - type: mcp
      namespace: sourcing-ops
      port: 8080
      tools:
        - name: get-sourcing-status
          description: "Given an Ariba sourcing event ID, return the event phase, participant count, and scheduled close date."
          inputParameters:
            - name: event_id
              in: body
              type: string
              description: "SAP Ariba sourcing event ID."
          call: ariba.get-event
          with:
            eventId: "{{event_id}}"
          outputParameters:
            - name: phase
              type: string
              mapping: "$.Phase"
            - name: participants
              type: integer
              mapping: "$.ParticipantCount"
            - name: close_date
              type: string
              mapping: "$.CloseDate"
  consumes:
    - namespace: ariba
      type: http
      baseUri: "https://openapi.ariba.com/api/sourcing/v1"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: events
          path: "/events/{{eventId}}"
          operations:
            - name: get-event
              method: GET

Scans SAP Ariba for supplier contracts expiring within 90 days, creates Jira procurement tasks, and emails contract owners.

naftiko: "0.5"
info:
  label: "SAP Ariba Supplier Contract Renewal Alerts"
  description: "Scans SAP Ariba for supplier contracts expiring within 90 days, creates Jira procurement tasks, and emails contract owners."
  tags:
    - procurement
    - contract-management
    - sap-ariba
    - jira
capability:
  exposes:
    - type: mcp
      namespace: contract-renewal
      port: 8080
      tools:
        - name: alert-expiring-contracts
          description: "Given a look-ahead window, fetch supplier contracts expiring from SAP Ariba and create a Jira renewal task for each. Use monthly to proactively manage AIG's vendor and reinsurer contract renewals."
          inputParameters:
            - name: days_ahead
              in: body
              type: integer
              description: "Number of days ahead to scan for expiring contracts."
            - name: jira_project_key
              in: body
              type: string
              description: "Jira project key for procurement renewal tasks."
          steps:
            - name: get-expiring
              type: call
              call: ariba-renewal.get-expiring-contracts
              with:
                days_ahead: "{{days_ahead}}"
            - name: create-renewal-task
              type: call
              call: jira-contracts.create-issue
              with:
                project_key: "{{jira_project_key}}"
                issuetype: "Task"
                summary: "Supplier contract renewals due within {{days_ahead}} days"
                description: "Expiring contracts: {{get-expiring.contract_ids}}"
  consumes:
    - type: http
      namespace: ariba-renewal
      baseUri: "https://openapi.ariba.com/api/contract/v1"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: contracts
          path: "/contracts"
          inputParameters:
            - name: days_ahead
              in: query
          operations:
            - name: get-expiring-contracts
              method: GET
    - type: http
      namespace: jira-contracts
      baseUri: "https://aig.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Retrieves an SAP Concur expense report by ID, returning the total amount, approval status, and owner.

naftiko: "0.5"
info:
  label: "SAP Concur Expense Report Status Lookup"
  description: "Retrieves an SAP Concur expense report by ID, returning the total amount, approval status, and owner."
  tags:
    - insurance
    - finance
    - sap-concur
    - expense-management
    - lookup
capability:
  exposes:
    - type: mcp
      namespace: expense-ops
      port: 8080
      tools:
        - name: get-expense-report
          description: "Given a Concur report ID, return the total, currency, approval status, and submitter name."
          inputParameters:
            - name: report_id
              in: body
              type: string
              description: "SAP Concur expense report ID."
          call: concur.get-report
          with:
            reportId: "{{report_id}}"
          outputParameters:
            - name: total
              type: number
              mapping: "$.Total"
            - name: status
              type: string
              mapping: "$.ApprovalStatusName"
            - name: owner
              type: string
              mapping: "$.OwnerName"
  consumes:
    - namespace: concur
      type: http
      baseUri: "https://api.aig.com/v1"
      authentication:
        type: bearer
        token: "$secrets.api_token"
      resources:
        - name: expense-ops
          path: "/{{id}}"
          operations:
            - name: get-report
              method: GET

Retrieves the current balance for a specified SAP general ledger account and company code.

naftiko: "0.5"
info:
  label: "SAP General Ledger Balance Check"
  description: "Retrieves the current balance for a specified SAP general ledger account and company code."
  tags:
    - insurance
    - finance
    - sap
    - accounting
    - lookup
capability:
  exposes:
    - type: mcp
      namespace: gl-ops
      port: 8080
      tools:
        - name: get-gl-balance
          description: "Given an SAP company code and GL account, return the current balance and currency."
          inputParameters:
            - name: company_code
              in: body
              type: string
              description: "SAP company code."
            - name: gl_account
              in: body
              type: string
              description: "GL account number."
          call: sap-fi.get-balance
          with:
            CompanyCode: "{{company_code}}"
            GLAccount: "{{gl_account}}"
          outputParameters:
            - name: balance
              type: number
              mapping: "$.d.EndingBalanceAmtInCoCodeCrcy"
            - name: currency
              type: string
              mapping: "$.d.CompanyCodeCurrency"
  consumes:
    - namespace: sap-fi
      type: http
      baseUri: "https://aig-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: gl-ops
          path: "/{{id}}"
          operations:
            - name: get-balance
              method: GET

Performs a three-way match on a vendor invoice by verifying the PO in SAP, confirming goods receipt, and routing for approval with Teams notification.

naftiko: "0.5"
info:
  label: "SAP Invoice Three-Way Match Workflow"
  description: "Performs a three-way match on a vendor invoice by verifying the PO in SAP, confirming goods receipt, and routing for approval with Teams notification."
  tags:
    - insurance
    - finance
    - accounts-payable
    - sap
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: ap-ops
      port: 8080
      tools:
        - name: three-way-match
          description: "Given an invoice and PO number, verify the PO in SAP, confirm goods receipt, create an approval in ServiceNow, and notify AP via Teams."
          inputParameters:
            - name: invoice_number
              in: body
              type: string
              description: "Vendor invoice number."
            - name: po_number
              in: body
              type: string
              description: "SAP purchase order number."
            - name: ap_manager_upn
              in: body
              type: string
              description: "UPN of AP manager."
          steps:
            - name: verify-po
              type: call
              call: sap.get-po
              with:
                po_number: "{{po_number}}"
            - name: check-gr
              type: call
              call: sap.get-goods-receipt
              with:
                po_number: "{{po_number}}"
            - name: create-approval
              type: call
              call: snow.create-approval
              with:
                short_description: "Invoice approval: {{invoice_number}} — PO {{po_number}}"
                description: "PO Amount: {{verify-po.total_amount}} | GR: {{check-gr.status}}"
            - name: notify-ap
              type: call
              call: msteams.send-message
              with:
                recipient_upn: "{{ap_manager_upn}}"
                text: "Three-way match: Invoice {{invoice_number}} — PO {{po_number}}. GR: {{check-gr.status}}. Approval: {{create-approval.number}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://aig-s4.sap.com/sap/opu/odata/sap/MM_PUR_PO_MAINT_V2_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: purchase-orders
          path: "/A_PurchaseOrder('{{po_number}}')"
          inputParameters:
            - name: po_number
              in: path
          operations:
            - name: get-po
              method: GET
        - name: goods-receipts
          path: "/A_PurchaseOrder('{{po_number}}')/to_GoodsReceipt"
          inputParameters:
            - name: po_number
              in: path
          operations:
            - name: get-goods-receipt
              method: GET
    - type: http
      namespace: snow
      baseUri: "https://aig.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: approvals
          path: "/table/sysapproval_approver"
          operations:
            - name: create-approval
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Validates period-end journal entries by pulling entries from SAP, cross-checking balances in Snowflake, and notifying the controller via Teams.

naftiko: "0.5"
info:
  label: "SAP Period-End Journal Entry Validation"
  description: "Validates period-end journal entries by pulling entries from SAP, cross-checking balances in Snowflake, and notifying the controller via Teams."
  tags:
    - insurance
    - finance
    - accounting
    - sap
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: gl-ops
      port: 8080
      tools:
        - name: validate-journal-entries
          description: "Given a company code and posting period, retrieve journal entries from SAP, validate against Snowflake, and notify the controller of discrepancies."
          inputParameters:
            - name: company_code
              in: body
              type: string
              description: "SAP company code."
            - name: posting_period
              in: body
              type: string
              description: "Posting period."
            - name: controller_upn
              in: body
              type: string
              description: "UPN of controller."
          steps:
            - name: get-entries
              type: call
              call: sap-fi.get-journal-entries
              with:
                company_code: "{{company_code}}"
                period: "{{posting_period}}"
            - name: validate-balances
              type: call
              call: snowflake.check-recon
              with:
                company_code: "{{company_code}}"
                period: "{{posting_period}}"
            - name: notify-controller
              type: call
              call: msteams.send-message
              with:
                recipient_upn: "{{controller_upn}}"
                text: "Period-end validation: {{company_code}} — {{posting_period}}. Entries: {{get-entries.count}} | Status: {{validate-balances.status}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://aig-s4.sap.com/sap/opu/odata/sap/API_JOURNAL_ENTRY_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: entries
          path: "/A_JournalEntry?$filter=CompanyCode eq '{{company_code}}'"
          inputParameters:
            - name: company_code
              in: query
          operations:
            - name: get-journal-entries
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://aig.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: check-recon
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Looks up an SAP S/4HANA purchase order by number and returns header status, vendor, and total value for the finance or procurement team.

naftiko: "0.5"
info:
  label: "SAP Purchase Order Status Lookup"
  description: "Looks up an SAP S/4HANA purchase order by number and returns header status, vendor, and total value for the finance or procurement team."
  tags:
    - finance
    - procurement
    - erp
    - sap
capability:
  exposes:
    - type: mcp
      namespace: erp-finance
      port: 8080
      tools:
        - name: get-purchase-order
          description: "Given a SAP purchase order number, return the PO status, vendor name, total amount, and currency. Use when procurement or AP teams need to verify PO status before approving a vendor invoice."
          inputParameters:
            - name: po_number
              in: body
              type: string
              description: "SAP purchase order number, e.g. '4500012345'."
          call: sap-erp.get-po
          with:
            po_number: "{{po_number}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.d.OverallStatus"
            - name: vendor
              type: string
              mapping: "$.d.Supplier.CompanyName"
            - name: total_amount
              type: string
              mapping: "$.d.TotalAmount"
            - name: currency
              type: string
              mapping: "$.d.TransactionCurrency"
  consumes:
    - type: http
      namespace: sap-erp
      baseUri: "https://aig-s4.sap.com/sap/opu/odata/sap/MM_PUR_PO_MAINT_V2_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: purchase-orders
          path: "/A_PurchaseOrder('{{po_number}}')"
          inputParameters:
            - name: po_number
              in: path
          operations:
            - name: get-po
              method: GET

Retrieves vendor master data from SAP by vendor number, returning company name, payment terms, and tax ID.

naftiko: "0.5"
info:
  label: "SAP Vendor Master Data Lookup"
  description: "Retrieves vendor master data from SAP by vendor number, returning company name, payment terms, and tax ID."
  tags:
    - insurance
    - finance
    - sap
    - procurement
    - lookup
capability:
  exposes:
    - type: mcp
      namespace: vendor-ops
      port: 8080
      tools:
        - name: get-vendor
          description: "Given an SAP vendor number, return the vendor name, payment terms, and tax ID."
          inputParameters:
            - name: vendor_number
              in: body
              type: string
              description: "SAP vendor account number."
          call: sap.get-vendor
          with:
            Supplier: "{{vendor_number}}"
          outputParameters:
            - name: vendor_name
              type: string
              mapping: "$.d.SupplierName"
            - name: payment_terms
              type: string
              mapping: "$.d.PaymentTerms"
  consumes:
    - namespace: sap
      type: http
      baseUri: "https://aig-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: vendor-ops
          path: "/{{id}}"
          operations:
            - name: get-vendor
              method: GET

Verifies that a change request falls within the approved window by checking ServiceNow, validating service health in Datadog, and notifying the CAB via Teams.

naftiko: "0.5"
info:
  label: "ServiceNow Change Window Compliance Validator"
  description: "Verifies that a change request falls within the approved window by checking ServiceNow, validating service health in Datadog, and notifying the CAB via Teams."
  tags:
    - insurance
    - it-operations
    - change-management
    - servicenow
    - datadog
capability:
  exposes:
    - type: mcp
      namespace: change-ops
      port: 8080
      tools:
        - name: check-change-compliance
          description: "Given a change request number and proposed date, verify window compliance in ServiceNow, check Datadog service health, and notify the CAB in Teams."
          inputParameters:
            - name: change_number
              in: body
              type: string
              description: "Change request number."
            - name: proposed_date
              in: body
              type: string
              description: "Proposed date."
            - name: cab_channel_id
              in: body
              type: string
              description: "Teams channel ID for CAB."
          steps:
            - name: check-window
              type: call
              call: snow.get-change-window
              with:
                change_number: "{{change_number}}"
            - name: check-health
              type: call
              call: datadog.get-status
              with:
                date: "{{proposed_date}}"
            - name: notify-cab
              type: call
              call: msteams.post-channel
              with:
                channel_id: "{{cab_channel_id}}"
                text: "Change compliance: {{change_number}} for {{proposed_date}}. Window: {{check-window.status}} | Health: {{check-health.overall}}"
  consumes:
    - type: http
      namespace: snow
      baseUri: "https://aig.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: changes
          path: "/table/change_request?sysparm_query=number={{change_number}}"
          inputParameters:
            - name: change_number
              in: query
          operations:
            - name: get-change-window
              method: GET
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.datadog_api_key"
      resources:
        - name: monitors
          path: "/monitor/groups"
          operations:
            - name: get-status
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: channels
          path: "/teams/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel
              method: POST

Looks up a claim investigation record in ServiceNow by claim number and returns status, assigned adjuster, and priority.

naftiko: "0.5"
info:
  label: "ServiceNow Claim Record Lookup"
  description: "Looks up a claim investigation record in ServiceNow by claim number and returns status, assigned adjuster, and priority."
  tags:
    - insurance
    - insurance
    - claims
    - servicenow
    - lookup
capability:
  exposes:
    - type: mcp
      namespace: claims-ops
      port: 8080
      tools:
        - name: get-claim-record
          description: "Given a claim number, return the ServiceNow investigation record status, assigned adjuster, and priority level."
          inputParameters:
            - name: claim_number
              in: body
              type: string
              description: "Insurance claim number."
          call: snow.get-claim
          with:
            number: "{{claim_number}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.result.state"
            - name: adjuster
              type: string
              mapping: "$.result.assigned_to.display_value"
            - name: priority
              type: string
              mapping: "$.result.priority"
  consumes:
    - namespace: snow
      type: http
      baseUri: "https://aig.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: claims-ops
          path: "/{{id}}"
          operations:
            - name: get-claim
              method: GET

Looks up a ServiceNow incident by number and returns current state, priority, and assigned group.

naftiko: "0.5"
info:
  label: "ServiceNow Incident Status Check"
  description: "Looks up a ServiceNow incident by number and returns current state, priority, and assigned group."
  tags:
    - insurance
    - it-operations
    - servicenow
    - incident-management
    - lookup
capability:
  exposes:
    - type: mcp
      namespace: it-ops
      port: 8080
      tools:
        - name: get-incident-status
          description: "Given a ServiceNow incident number, return the state, priority, and assignment group."
          inputParameters:
            - name: incident_number
              in: body
              type: string
              description: "ServiceNow incident number."
          call: snow.get-incident
          with:
            number: "{{incident_number}}"
          outputParameters:
            - name: state
              type: string
              mapping: "$.result.state"
            - name: priority
              type: string
              mapping: "$.result.priority"
            - name: assigned_to
              type: string
              mapping: "$.result.assignment_group.display_value"
  consumes:
    - namespace: snow
      type: http
      baseUri: "https://aig.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: it-ops
          path: "/{{id}}"
          operations:
            - name: get-incident
              method: GET

Monitors Snowflake data pipeline tasks for the claims analytics warehouse, logs failures to Datadog, and creates Jira tickets for the data engineering team.

naftiko: "0.5"
info:
  label: "Snowflake Claims Analytics Pipeline Monitoring"
  description: "Monitors Snowflake data pipeline tasks for the claims analytics warehouse, logs failures to Datadog, and creates Jira tickets for the data engineering team."
  tags:
    - data
    - snowflake
    - datadog
    - analytics
    - claims
capability:
  exposes:
    - type: mcp
      namespace: claims-analytics-ops
      port: 8080
      tools:
        - name: check-claims-pipeline-health
          description: "Query Snowflake task history for pipeline failures in the claims analytics database, log failures to Datadog, and open Jira tickets for data engineering. Use daily to ensure the claims and actuarial data pipelines are running correctly."
          inputParameters:
            - name: lookback_hours
              in: body
              type: integer
              description: "Hours of pipeline history to scan."
            - name: jira_project_key
              in: body
              type: string
              description: "Jira project key for data engineering tickets."
          steps:
            - name: get-failed-tasks
              type: call
              call: snowflake.get-task-failures
              with:
                lookback_hours: "{{lookback_hours}}"
            - name: log-to-datadog
              type: call
              call: datadog-dw.create-event
              with:
                title: "Snowflake claims pipeline failures"
                text: "Failed tasks: {{get-failed-tasks.task_names}}"
                alert_type: "error"
            - name: create-jira
              type: call
              call: jira-data.create-issue
              with:
                project_key: "{{jira_project_key}}"
                issuetype: "Bug"
                summary: "Claims pipeline failures — {{get-failed-tasks.task_count}} tasks"
                description: "Tasks: {{get-failed-tasks.task_names}} | Datadog: {{log-to-datadog.url}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://aig.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: task-history
          path: "/databases/CLAIMS_ANALYTICS/schemas/PUBLIC/tasks/history"
          inputParameters:
            - name: lookback_hours
              in: query
          operations:
            - name: get-task-failures
              method: GET
    - type: http
      namespace: datadog-dw
      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: jira-data
      baseUri: "https://aig.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

When a Snowflake pipeline fails, creates a Jira incident, pages the on-call engineer via PagerDuty, and notifies the pipeline owner in Teams.

naftiko: "0.5"
info:
  label: "Snowflake Data Pipeline Failure Response"
  description: "When a Snowflake pipeline fails, creates a Jira incident, pages the on-call engineer via PagerDuty, and notifies the pipeline owner in Teams."
  tags:
    - insurance
    - data-engineering
    - snowflake
    - jira
    - pagerduty
capability:
  exposes:
    - type: mcp
      namespace: data-reliability
      port: 8080
      tools:
        - name: handle-pipeline-failure
          description: "Given a Snowflake task name and error, create a Jira incident, trigger a PagerDuty alert, and notify the owner in Teams."
          inputParameters:
            - name: task_name
              in: body
              type: string
              description: "Snowflake task name."
            - name: error_message
              in: body
              type: string
              description: "Error message."
            - name: pipeline_owner
              in: body
              type: string
              description: "Pipeline owner email."
          steps:
            - name: create-incident
              type: call
              call: jira.create-issue
              with:
                project: "DATA"
                summary: "Pipeline failure: {{task_name}}"
                description: "Error: {{error_message}}"
            - name: page-oncall
              type: call
              call: pagerduty.create-incident
              with:
                service_id: "data-engineering"
                title: "Pipeline failure: {{task_name}}"
            - name: notify-owner
              type: call
              call: msteams.send-message
              with:
                recipient_upn: "{{pipeline_owner}}"
                text: "Pipeline failure: {{task_name}}. Jira: {{create-incident.key}}"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://aig.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              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
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Queries Snowflake account query history for a specified warehouse, returning recent query count and average execution time.

naftiko: "0.5"
info:
  label: "Snowflake Query History Check"
  description: "Queries Snowflake account query history for a specified warehouse, returning recent query count and average execution time."
  tags:
    - data-engineering
    - snowflake
    - performance
    - lookup
capability:
  exposes:
    - type: mcp
      namespace: data-perf
      port: 8080
      tools:
        - name: get-query-history
          description: "Given a Snowflake warehouse name, return the recent query count and average execution time in seconds."
          inputParameters:
            - name: warehouse_name
              in: body
              type: string
              description: "Snowflake warehouse name."
          call: snowflake.query-history
          with:
            warehouse: "{{warehouse_name}}"
          outputParameters:
            - name: query_count
              type: integer
              mapping: "$.data[0].QUERY_COUNT"
            - name: avg_exec_time
              type: number
              mapping: "$.data[0].AVG_EXEC_TIME"
  consumes:
    - namespace: snowflake
      type: http
      baseUri: "https://aig.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: query-history
              method: POST

Queries Snowflake to return the row count and last update timestamp for a specified data table.

naftiko: "0.5"
info:
  label: "Snowflake Table Row Count Check"
  description: "Queries Snowflake to return the row count and last update timestamp for a specified data table."
  tags:
    - insurance
    - data-engineering
    - snowflake
    - analytics
    - lookup
capability:
  exposes:
    - type: mcp
      namespace: data-ops
      port: 8080
      tools:
        - name: get-table-stats
          description: "Given a Snowflake table name, return the row count and last DML timestamp."
          inputParameters:
            - name: table_name
              in: body
              type: string
              description: "Fully qualified Snowflake table name."
          call: snowflake.query-stats
          with:
            table: "{{table_name}}"
          outputParameters:
            - name: row_count
              type: integer
              mapping: "$.data[0].ROW_COUNT"
            - name: last_altered
              type: string
              mapping: "$.data[0].LAST_ALTERED"
  consumes:
    - namespace: snowflake
      type: http
      baseUri: "https://aig.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: data-ops
          path: "/{{id}}"
          operations:
            - name: query-stats
              method: GET

Runs a Splunk search for security events matching a query and returns the result count.

naftiko: "0.5"
info:
  label: "Splunk Security Event Query"
  description: "Runs a Splunk search for security events matching a query and returns the result count."
  tags:
    - insurance
    - security
    - splunk
    - siem
    - lookup
capability:
  exposes:
    - type: mcp
      namespace: security-ops
      port: 8080
      tools:
        - name: search-security-events
          description: "Given a Splunk search query, execute the search and return the result count and top events."
          inputParameters:
            - name: search_query
              in: body
              type: string
              description: "Splunk search query string."
          call: splunk.run-search
          with:
            search: "{{search_query}}"
          outputParameters:
            - name: result_count
              type: integer
              mapping: "$.resultCount"
  consumes:
    - namespace: splunk
      type: http
      baseUri: "https://aig-splunk.splunkcloud.com:8089/services"
      authentication:
        type: bearer
        token: "$secrets.splunk_token"
      resources:
        - name: security-ops
          path: "/{{id}}"
          operations:
            - name: run-search
              method: GET

Tracks subrogation recovery by pulling data from Salesforce, updating SAP subledger, and notifying the recovery lead via Teams.

naftiko: "0.5"
info:
  label: "Subrogation Recovery Tracking Workflow"
  description: "Tracks subrogation recovery by pulling data from Salesforce, updating SAP subledger, and notifying the recovery lead via Teams."
  tags:
    - insurance
    - subrogation
    - finance
    - salesforce
    - sap
capability:
  exposes:
    - type: mcp
      namespace: subrogation-ops
      port: 8080
      tools:
        - name: track-subrogation
          description: "Given a claim number, pull recovery status from Salesforce, update SAP, and notify the lead."
          inputParameters:
            - name: claim_number
              in: body
              type: string
              description: "Claim number."
            - name: recovery_lead_upn
              in: body
              type: string
              description: "Recovery lead UPN."
          steps:
            - name: get-recovery
              type: call
              call: sf.get-subrogation
              with:
                claim_number: "{{claim_number}}"
            - name: update-ledger
              type: call
              call: sap-fi.post-recovery
              with:
                claim_number: "{{claim_number}}"
                amount: "{{get-recovery.recovered_amount}}"
            - name: notify-lead
              type: call
              call: msteams.send-message
              with:
                recipient_upn: "{{recovery_lead_upn}}"
                text: "Subrogation: {{claim_number}} — Recovered: ${{get-recovery.recovered_amount}}. SAP: {{update-ledger.document_number}}"
  consumes:
    - type: http
      namespace: sf
      baseUri: "https://aig.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: subrogation
          path: "/sobjects/Subrogation__c/ClaimNumber__c/{{claim_number}}"
          operations:
            - name: get-subrogation
              method: GET
    - type: http
      namespace: sap-fi
      baseUri: "https://aig-s4.sap.com/sap/opu/odata/sap/API_JOURNAL_ENTRY_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: recoveries
          path: "/A_JournalEntry"
          operations:
            - name: post-recovery
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          operations:
            - name: send-message
              method: POST

Triggers a Terraform Cloud workspace run to provision new insurance platform infrastructure and notifies the DevOps team in Teams.

naftiko: "0.5"
info:
  label: "Terraform Cloud Insurance Platform Provisioning"
  description: "Triggers a Terraform Cloud workspace run to provision new insurance platform infrastructure and notifies the DevOps team in Teams."
  tags:
    - devops
    - terraform
    - cloud
    - infrastructure
    - insurance
capability:
  exposes:
    - type: mcp
      namespace: infra-ops
      port: 8080
      tools:
        - name: provision-platform-environment
          description: "Given a Terraform Cloud workspace ID and environment label, trigger a plan-and-apply run to provision insurance platform infrastructure. Notify the DevOps Teams channel with run status. Use when standing up new environments for insurance system development or testing."
          inputParameters:
            - name: workspace_id
              in: body
              type: string
              description: "Terraform Cloud workspace ID."
            - name: environment_label
              in: body
              type: string
              description: "Human-readable label, e.g. 'claims-api-staging'."
            - name: devops_channel_id
              in: body
              type: string
              description: "DevOps Teams channel ID."
          steps:
            - name: trigger-run
              type: call
              call: terraform.create-run
              with:
                workspace_id: "{{workspace_id}}"
                message: "Provisioning {{environment_label}}"
                auto_apply: "true"
            - name: notify-devops
              type: call
              call: msteams-devops.post-channel-message
              with:
                channel_id: "{{devops_channel_id}}"
                text: "Terraform run triggered for {{environment_label}} (workspace {{workspace_id}}). Run ID: {{trigger-run.data.id}}"
  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-devops
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Detects Terraform state drift, creates a Jira remediation ticket, and alerts the platform team in Teams.

naftiko: "0.5"
info:
  label: "Terraform Drift Detection and Remediation"
  description: "Detects Terraform state drift, creates a Jira remediation ticket, and alerts the platform team in Teams."
  tags:
    - insurance
    - devops
    - terraform
    - jira
    - infrastructure
capability:
  exposes:
    - type: mcp
      namespace: platform-drift
      port: 8080
      tools:
        - name: handle-terraform-drift
          description: "Given a Terraform workspace, check for drift, create a Jira ticket if detected, and notify platform engineering in Teams."
          inputParameters:
            - name: workspace_name
              in: body
              type: string
              description: "Terraform workspace name."
            - name: platform_channel_id
              in: body
              type: string
              description: "Teams channel ID."
          steps:
            - name: check-drift
              type: call
              call: tfc.run-plan
              with:
                workspace: "{{workspace_name}}"
            - name: create-ticket
              type: call
              call: jira.create-issue
              with:
                project: "PLATFORM"
                summary: "Drift detected: {{workspace_name}}"
                description: "Changes: {{check-drift.resource_changes}}"
            - name: notify-team
              type: call
              call: msteams.post-channel
              with:
                channel_id: "{{platform_channel_id}}"
                text: "Terraform drift: {{workspace_name}} — {{check-drift.resource_changes}} changes. Jira: {{create-ticket.key}}"
  consumes:
    - type: http
      namespace: tfc
      baseUri: "https://app.terraform.io/api/v2"
      authentication:
        type: bearer
        token: "$secrets.terraform_token"
      resources:
        - name: runs
          path: "/workspaces/{{workspace}}/runs"
          inputParameters:
            - name: workspace
              in: path
          operations:
            - name: run-plan
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://aig.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$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.msteams_token"
      resources:
        - name: channels
          path: "/teams/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel
              method: POST

Retrieves the current state of a Terraform Cloud workspace, returning last run status and resource count.

naftiko: "0.5"
info:
  label: "Terraform Workspace State Check"
  description: "Retrieves the current state of a Terraform Cloud workspace, returning last run status and resource count."
  tags:
    - insurance
    - devops
    - terraform
    - infrastructure
    - lookup
capability:
  exposes:
    - type: mcp
      namespace: infra-ops
      port: 8080
      tools:
        - name: get-workspace-state
          description: "Given a Terraform Cloud workspace name, return the last run status and managed resource count."
          inputParameters:
            - name: workspace_name
              in: body
              type: string
              description: "Terraform Cloud workspace name."
          call: tfc.get-workspace
          with:
            workspace: "{{workspace_name}}"
          outputParameters:
            - name: last_run_status
              type: string
              mapping: "$.data.attributes.latest-run.status"
            - name: resource_count
              type: integer
              mapping: "$.data.attributes.resource-count"
  consumes:
    - namespace: tfc
      type: http
      baseUri: "https://app.terraform.io/api/v2"
      authentication:
        type: bearer
        token: "$secrets.terraform_token"
      resources:
        - name: infra-ops
          path: "/{{id}}"
          operations:
            - name: get-workspace
              method: GET

Performs a vendor risk assessment by pulling vendor details from SAP Ariba, checking compliance in ServiceNow GRC, and notifying procurement via Teams.

naftiko: "0.5"
info:
  label: "Third-Party Vendor Risk Assessment Workflow"
  description: "Performs a vendor risk assessment by pulling vendor details from SAP Ariba, checking compliance in ServiceNow GRC, and notifying procurement via Teams."
  tags:
    - insurance
    - procurement
    - risk-management
    - sap-ariba
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: vendor-risk
      port: 8080
      tools:
        - name: assess-vendor-risk
          description: "Given a vendor ID, retrieve the vendor profile from SAP Ariba, check GRC compliance in ServiceNow, and send the risk summary to procurement in Teams."
          inputParameters:
            - name: vendor_id
              in: body
              type: string
              description: "SAP Ariba supplier ID."
            - name: procurement_lead_upn
              in: body
              type: string
              description: "UPN of procurement lead."
          steps:
            - name: get-vendor
              type: call
              call: ariba.get-supplier
              with:
                vendorId: "{{vendor_id}}"
            - name: check-grc
              type: call
              call: snow.get-compliance
              with:
                vendor_name: "{{get-vendor.SupplierName}}"
            - name: notify-lead
              type: call
              call: msteams.send-message
              with:
                recipient_upn: "{{procurement_lead_upn}}"
                text: "Vendor Risk: {{get-vendor.SupplierName}} — GRC: {{check-grc.compliance_status}} | Score: {{check-grc.risk_score}}"
  consumes:
    - type: http
      namespace: ariba
      baseUri: "https://openapi.ariba.com/api/supplier-management/v1"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: suppliers
          path: "/suppliers/{{vendorId}}"
          inputParameters:
            - name: vendorId
              in: path
          operations:
            - name: get-supplier
              method: GET
    - type: http
      namespace: snow
      baseUri: "https://aig.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: grc
          path: "/table/sn_grc_profile?sysparm_query=name={{vendor_name}}"
          inputParameters:
            - name: vendor_name
              in: query
          operations:
            - name: get-compliance
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Auto-adjudicates travel claims by verifying coverage in Salesforce, processing payment in SAP, and updating the claim status.

naftiko: "0.5"
info:
  label: "Travel Insurance Auto-Adjudication Workflow"
  description: "Auto-adjudicates travel claims by verifying coverage in Salesforce, processing payment in SAP, and updating the claim status."
  tags:
    - insurance
    - claims
    - travel
    - salesforce
    - sap
capability:
  exposes:
    - type: mcp
      namespace: travel-claims
      port: 8080
      tools:
        - name: auto-adjudicate-travel
          description: "Given a travel claim number, type, and amount, verify coverage, process payment, and update status."
          inputParameters:
            - name: claim_number
              in: body
              type: string
              description: "Claim number."
            - name: claim_type
              in: body
              type: string
              description: "Claim type."
            - name: claim_amount
              in: body
              type: number
              description: "Claim amount."
          steps:
            - name: verify-coverage
              type: call
              call: sf.get-travel-policy
              with:
                claim_number: "{{claim_number}}"
            - name: process-payment
              type: call
              call: sap-fi.post-payment
              with:
                claim_number: "{{claim_number}}"
                amount: "{{claim_amount}}"
            - name: update-case
              type: call
              call: sf.update-claim
              with:
                claim_number: "{{claim_number}}"
                status: "Paid"
                payment_ref: "{{process-payment.document_number}}"
  consumes:
    - type: http
      namespace: sf
      baseUri: "https://aig.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: travel-claims
          path: "/sobjects/Travel_Claim__c/ClaimNumber__c/{{claim_number}}"
          operations:
            - name: get-travel-policy
              method: GET
    - type: http
      namespace: sap-fi
      baseUri: "https://aig-s4.sap.com/sap/opu/odata/sap/API_JOURNAL_ENTRY_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: payments
          path: "/A_JournalEntry"
          operations:
            - name: post-payment
              method: POST

Routes underwriting referrals by checking authority limits in Snowflake, creating a referral task in ServiceNow, and notifying the authorized underwriter via Teams.

naftiko: "0.5"
info:
  label: "Underwriting Referral Routing Workflow"
  description: "Routes underwriting referrals by checking authority limits in Snowflake, creating a referral task in ServiceNow, and notifying the authorized underwriter via Teams."
  tags:
    - insurance
    - underwriting
    - snowflake
    - servicenow
    - workflow
capability:
  exposes:
    - type: mcp
      namespace: uw-ops
      port: 8080
      tools:
        - name: route-uw-referral
          description: "Given a submission ID and coverage amount, check authority limits in Snowflake, create a ServiceNow referral, and notify the underwriter in Teams."
          inputParameters:
            - name: submission_id
              in: body
              type: string
              description: "Submission ID."
            - name: coverage_amount
              in: body
              type: number
              description: "Coverage amount."
            - name: line_of_business
              in: body
              type: string
              description: "LOB."
          steps:
            - name: check-authority
              type: call
              call: snowflake.query-authority
              with:
                lob: "{{line_of_business}}"
                amount: "{{coverage_amount}}"
            - name: create-referral
              type: call
              call: snow.create-referral
              with:
                short_description: "UW Referral: {{submission_id}} — ${{coverage_amount}}"
                description: "LOB: {{line_of_business}}"
            - name: notify-uw
              type: call
              call: msteams.send-message
              with:
                recipient_upn: "{{check-authority.authorized_upn}}"
                text: "UW Referral: {{submission_id}} — ${{coverage_amount}} ({{line_of_business}}). SNOW: {{create-referral.number}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://aig.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: query-authority
              method: POST
    - type: http
      namespace: snow
      baseUri: "https://aig.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: referrals
          path: "/table/u_uw_referral"
          operations:
            - name: create-referral
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Enriches an underwriting prospect account in Salesforce with ZoomInfo firmographic and risk-signal data before the underwriting team conducts a policy review.

naftiko: "0.5"
info:
  label: "Underwriting Risk Data Enrichment"
  description: "Enriches an underwriting prospect account in Salesforce with ZoomInfo firmographic and risk-signal data before the underwriting team conducts a policy review."
  tags:
    - underwriting
    - crm
    - salesforce
    - data-enrichment
    - insurance
capability:
  exposes:
    - type: mcp
      namespace: underwriting-ops
      port: 8080
      tools:
        - name: enrich-underwriting-prospect
          description: "Given a Salesforce account ID and ZoomInfo company ID, fetch current firmographic data including employee count, revenue, and industry, then update the Salesforce account record. Use before underwriting team conducts policy risk review."
          inputParameters:
            - name: salesforce_account_id
              in: body
              type: string
              description: "Salesforce account ID for the underwriting prospect."
            - name: zoominfo_company_id
              in: body
              type: string
              description: "ZoomInfo company ID for firmographic lookup."
            - name: underwriter_upn
              in: body
              type: string
              description: "Underwriter Teams UPN for enrichment notification."
          steps:
            - name: get-firmographics
              type: call
              call: zoominfo-uw.get-company
              with:
                company_id: "{{zoominfo_company_id}}"
            - name: update-sf-account
              type: call
              call: salesforce-uw.update-account
              with:
                account_id: "{{salesforce_account_id}}"
                employees: "{{get-firmographics.employee_count}}"
                annual_revenue: "{{get-firmographics.revenue}}"
                industry: "{{get-firmographics.industry}}"
                sic_code: "{{get-firmographics.sic_code}}"
            - name: notify-underwriter
              type: call
              call: msteams-uw.send-message
              with:
                recipient_upn: "{{underwriter_upn}}"
                text: "Account enriched: {{get-firmographics.company_name}} | Employees: {{get-firmographics.employee_count}} | Revenue: ${{get-firmographics.revenue}} | Industry: {{get-firmographics.industry}}"
  consumes:
    - type: http
      namespace: zoominfo-uw
      baseUri: "https://api.zoominfo.com/search"
      authentication:
        type: bearer
        token: "$secrets.zoominfo_token"
      resources:
        - name: companies
          path: "/company/{{company_id}}"
          inputParameters:
            - name: company_id
              in: path
          operations:
            - name: get-company
              method: GET
    - type: http
      namespace: salesforce-uw
      baseUri: "https://aig.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: update-account
              method: PATCH
    - type: http
      namespace: msteams-uw
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Sends benefits open enrollment reminders by querying Workday for incomplete enrollments, sending emails via Microsoft Graph, and logging in ServiceNow.

naftiko: "0.5"
info:
  label: "Workday Benefits Enrollment Reminder Workflow"
  description: "Sends benefits open enrollment reminders by querying Workday for incomplete enrollments, sending emails via Microsoft Graph, and logging in ServiceNow."
  tags:
    - insurance
    - hr
    - benefits
    - workday
    - microsoft-graph
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: benefits-ops
      port: 8080
      tools:
        - name: send-enrollment-reminders
          description: "Given an enrollment period and deadline, query Workday for incomplete enrollments, send reminder emails, and log the outreach in ServiceNow."
          inputParameters:
            - name: enrollment_period
              in: body
              type: string
              description: "Enrollment period."
            - name: deadline_date
              in: body
              type: string
              description: "Deadline in YYYY-MM-DD."
          steps:
            - name: get-incomplete
              type: call
              call: workday.get-incomplete-enrollment
              with:
                period: "{{enrollment_period}}"
            - name: send-reminders
              type: call
              call: msgraph.send-bulk-mail
              with:
                subject: "Benefits Enrollment Deadline {{deadline_date}}"
                body: "Please complete enrollment by {{deadline_date}}."
            - name: log-outreach
              type: call
              call: snow.create-task
              with:
                short_description: "Benefits reminders: {{enrollment_period}}"
                description: "Incomplete: {{get-incomplete.count}} | Deadline: {{deadline_date}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd5-impl-services1.workday.com/ccx/service/aig/Benefits/v40.1"
      authentication:
        type: basic
        username: "$secrets.workday_user"
        password: "$secrets.workday_password"
      resources:
        - name: enrollment
          path: "/benefit-elections?status=incomplete"
          operations:
            - name: get-incomplete-enrollment
              method: GET
    - type: http
      namespace: msgraph
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/users/benefits@aig.com/sendMail"
          operations:
            - name: send-bulk-mail
              method: POST
    - type: http
      namespace: snow
      baseUri: "https://aig.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/u_benefits_task"
          operations:
            - name: create-task
              method: POST

Retrieves compensation band details from Workday for a specified job profile, returning min, mid, and max salary.

naftiko: "0.5"
info:
  label: "Workday Compensation Band Lookup"
  description: "Retrieves compensation band details from Workday for a specified job profile, returning min, mid, and max salary."
  tags:
    - hr
    - workday
    - compensation
    - lookup
capability:
  exposes:
    - type: mcp
      namespace: comp-ops
      port: 8080
      tools:
        - name: get-comp-band
          description: "Given a job profile ID, return the salary band minimum, midpoint, and maximum."
          inputParameters:
            - name: job_profile_id
              in: body
              type: string
              description: "Workday job profile ID."
          call: workday.get-comp-band
          with:
            profile: "{{job_profile_id}}"
          outputParameters:
            - name: min_salary
              type: number
              mapping: "$.Compensation_Band.Min"
            - name: mid_salary
              type: number
              mapping: "$.Compensation_Band.Mid"
            - name: max_salary
              type: number
              mapping: "$.Compensation_Band.Max"
  consumes:
    - namespace: workday
      type: http
      baseUri: "https://wd5-impl-services1.workday.com/ccx/service/aig/Compensation/v40.1"
      authentication:
        type: basic
        username: "$secrets.workday_user"
        password: "$secrets.workday_password"
      resources:
        - name: comp-bands
          path: "/compensation-bands/{{profile}}"
          operations:
            - name: get-comp-band
              method: GET

Retrieves an employee profile from Workday by employee ID, returning name, department, title, and manager.

naftiko: "0.5"
info:
  label: "Workday Employee Profile Lookup"
  description: "Retrieves an employee profile from Workday by employee ID, returning name, department, title, and manager."
  tags:
    - insurance
    - hr
    - workday
    - employee-management
    - lookup
capability:
  exposes:
    - type: mcp
      namespace: hr-ops
      port: 8080
      tools:
        - name: get-employee-profile
          description: "Given a Workday employee ID, return the employee full name, department, job title, and manager name."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "Workday employee ID."
          call: workday.get-worker
          with:
            Worker_ID: "{{employee_id}}"
          outputParameters:
            - name: full_name
              type: string
              mapping: "$.Worker.Worker_Data.Personal_Data.Name_Data.Legal_Name"
            - name: department
              type: string
              mapping: "$.Worker.Worker_Data.Organization_Data.Organization_Name"
            - name: title
              type: string
              mapping: "$.Worker.Worker_Data.Job_Data.Position_Data.Business_Title"
  consumes:
    - namespace: workday
      type: http
      baseUri: "https://wd5-impl-services1.workday.com/ccx/service/aig/Human_Resources/v40.1"
      authentication:
        type: basic
        username: "$secrets.workday_user"
        password: "$secrets.workday_password"
      resources:
        - name: hr-ops
          path: "/{{id}}"
          operations:
            - name: get-worker
              method: GET

Retrieves current headcount and payroll cost by department and cost center from Workday for finance and HR reporting.

naftiko: "0.5"
info:
  label: "Workday Headcount and Payroll Snapshot"
  description: "Retrieves current headcount and payroll cost by department and cost center from Workday for finance and HR reporting."
  tags:
    - hr
    - finance
    - payroll
    - workday
    - headcount
capability:
  exposes:
    - type: mcp
      namespace: hr-finance
      port: 8080
      tools:
        - name: get-headcount-snapshot
          description: "Returns headcount and payroll cost data grouped by department and cost center from Workday as of the specified date. Use for monthly finance reviews and workforce planning."
          inputParameters:
            - name: as_of_date
              in: body
              type: string
              description: "Snapshot date in YYYY-MM-DD format."
          call: workday-hcm.get-headcount
          with:
            effective_date: "{{as_of_date}}"
          outputParameters:
            - name: total_headcount
              type: string
              mapping: "$.Report_Entry[0].Total_Headcount"
            - name: total_payroll_cost
              type: string
              mapping: "$.Report_Entry[0].Total_Payroll_Cost"
  consumes:
    - type: http
      namespace: workday-hcm
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: headcount
          path: "/reports/headcount_by_department"
          inputParameters:
            - name: effective_date
              in: query
          operations:
            - name: get-headcount
              method: GET

Queries Workday for open positions by department, returning count and average days open.

naftiko: "0.5"
info:
  label: "Workday Open Position Count Check"
  description: "Queries Workday for open positions by department, returning count and average days open."
  tags:
    - insurance
    - hr
    - workday
    - talent-acquisition
    - lookup
capability:
  exposes:
    - type: mcp
      namespace: ta-ops
      port: 8080
      tools:
        - name: get-open-positions
          description: "Given a department name, return the open position count and average days since posting."
          inputParameters:
            - name: department
              in: body
              type: string
              description: "Department name."
          call: workday.get-requisitions
          with:
            department: "{{department}}"
          outputParameters:
            - name: open_count
              type: integer
              mapping: "$.total"
            - name: avg_days_open
              type: number
              mapping: "$.averageDaysOpen"
  consumes:
    - namespace: workday
      type: http
      baseUri: "https://wd5-impl-services1.workday.com/ccx/service/aig/Human_Resources/v40.1"
      authentication:
        type: basic
        username: "$secrets.workday_user"
        password: "$secrets.workday_password"
      resources:
        - name: ta-ops
          path: "/{{id}}"
          operations:
            - name: get-requisitions
              method: GET

Generates a performance calibration report by pulling ratings from Workday, aggregating in Snowflake, and distributing to HR leadership via Teams.

naftiko: "0.5"
info:
  label: "Workday Performance Calibration Report"
  description: "Generates a performance calibration report by pulling ratings from Workday, aggregating in Snowflake, and distributing to HR leadership via Teams."
  tags:
    - insurance
    - hr
    - performance-management
    - workday
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: perf-ops
      port: 8080
      tools:
        - name: generate-calibration-report
          description: "Given a review cycle and business unit, pull ratings from Workday, aggregate in Snowflake, and post to HR leadership channel."
          inputParameters:
            - name: review_cycle
              in: body
              type: string
              description: "Review cycle ID."
            - name: business_unit
              in: body
              type: string
              description: "Business unit."
            - name: hr_channel_id
              in: body
              type: string
              description: "HR Teams channel ID."
          steps:
            - name: get-ratings
              type: call
              call: workday.get-performance-data
              with:
                cycle: "{{review_cycle}}"
                bu: "{{business_unit}}"
            - name: aggregate
              type: call
              call: snowflake.aggregate-ratings
              with:
                cycle: "{{review_cycle}}"
                bu: "{{business_unit}}"
            - name: post-report
              type: call
              call: msteams.post-channel
              with:
                channel_id: "{{hr_channel_id}}"
                text: "Calibration: {{business_unit}} — {{review_cycle}}. Exceeds: {{aggregate.exceeds_pct}}% | Meets: {{aggregate.meets_pct}}%"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd5-impl-services1.workday.com/ccx/service/aig/Performance_Management/v40.1"
      authentication:
        type: basic
        username: "$secrets.workday_user"
        password: "$secrets.workday_password"
      resources:
        - name: reviews
          path: "/performance-reviews"
          operations:
            - name: get-performance-data
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://aig.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: aggregate-ratings
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: channels
          path: "/teams/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel
              method: POST

Coordinates return-to-work by pulling medical status from Salesforce, updating Workday leave records, and notifying the employer via Teams.

naftiko: "0.5"
info:
  label: "Workers Comp Return-to-Work Workflow"
  description: "Coordinates return-to-work by pulling medical status from Salesforce, updating Workday leave records, and notifying the employer via Teams."
  tags:
    - insurance
    - workers-compensation
    - claims
    - workday
    - salesforce
capability:
  exposes:
    - type: mcp
      namespace: wc-ops
      port: 8080
      tools:
        - name: coordinate-rtw
          description: "Given a WC claim number and employee ID, pull medical clearance from Salesforce, update Workday leave, and notify the employer."
          inputParameters:
            - name: claim_number
              in: body
              type: string
              description: "WC claim number."
            - name: employee_id
              in: body
              type: string
              description: "Employee ID."
            - name: employer_upn
              in: body
              type: string
              description: "Employer HR contact UPN."
          steps:
            - name: get-medical
              type: call
              call: sf.get-claim-medical
              with:
                claim_number: "{{claim_number}}"
            - name: update-leave
              type: call
              call: workday.update-leave
              with:
                employee_id: "{{employee_id}}"
                status: "Return Approved"
            - name: notify-employer
              type: call
              call: msteams.send-message
              with:
                recipient_upn: "{{employer_upn}}"
                text: "RTW approved: Claim {{claim_number}} — Employee {{employee_id}}. Clearance: {{get-medical.clearance_date}}"
  consumes:
    - type: http
      namespace: sf
      baseUri: "https://aig.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: claims
          path: "/sobjects/WC_Claim__c/ClaimNumber__c/{{claim_number}}"
          operations:
            - name: get-claim-medical
              method: GET
    - type: http
      namespace: workday
      baseUri: "https://wd5-impl-services1.workday.com/ccx/service/aig/Absence_Management/v40.1"
      authentication:
        type: basic
        username: "$secrets.workday_user"
        password: "$secrets.workday_password"
      resources:
        - name: leaves
          path: "/leave-of-absence/{{employee_id}}"
          operations:
            - name: update-leave
              method: PATCH
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          operations:
            - name: send-message
              method: POST