Allianz Capabilities
Naftiko 0.5 capability definitions for Allianz - 100 capabilities showing integration workflows and service orchestrations.
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://allianz.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://allianz-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
Queries Power BI for the latest asset management portfolio KPIs, compiles a performance digest, and posts a summary report to the finance leadership Teams channel on a scheduled basis.
naftiko: "0.5"
info:
label: "Asset Management Portfolio Performance Digest"
description: "Queries Power BI for the latest asset management portfolio KPIs, compiles a performance digest, and posts a summary report to the finance leadership Teams channel on a scheduled basis."
tags:
- finance
- asset-management
- power-bi
- microsoft-teams
- reporting
capability:
exposes:
- type: mcp
namespace: finance-reporting
port: 8080
tools:
- name: digest-portfolio-performance
description: "Fetch the latest portfolio performance dataset from Power BI, format a KPI summary, and post the digest to the finance leadership Teams channel. Invoke on a weekly schedule or on demand before investment committee meetings."
inputParameters:
- name: dataset_id
type: string
description: "The Power BI dataset ID containing portfolio KPI data."
- name: group_id
type: string
description: "The Power BI workspace (group) ID, e.g. the Asset Management workspace."
steps:
- name: get-dataset-rows
type: call
call: "powerbi.execute-query"
with:
group_id: "{{group_id}}"
dataset_id: "{{dataset_id}}"
query: "EVALUATE SUMMARIZECOLUMNS(Portfolio[Fund], 'Metrics'[TotalAUM], 'Metrics'[WeeklyReturn], 'Metrics'[YTDReturn])"
- name: post-digest
type: call
call: "msteams.send-channel-message"
with:
channel_id: "$secrets.finance_leadership_channel_id"
text: "Weekly Portfolio Digest: {{get-dataset-rows.results[0].tables[0].rows.length}} funds reported. Data retrieved from Power BI dataset {{dataset_id}}."
consumes:
- namespace: powerbi
type: http
baseUri: "https://api.powerbi.com/v1.0/myorg"
authentication:
type: bearer
token: "$secrets.powerbi_token"
resources:
- name: datasets-query
path: "/groups/{group_id}/datasets/{dataset_id}/executeQueries"
inputParameters:
- name: group_id
in: path
- name: dataset_id
in: path
operations:
- name: execute-query
method: POST
- namespace: msteams
type: http
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{team_id}/channels/{channel_id}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-channel-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/allianz"
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://allianz-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://allianz.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@allianz.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/allianz/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://allianz.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://allianz.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://allianz.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
When a ServiceNow change request is submitted for production infrastructure, validates the change window, creates a linked Jira ticket for engineering sign-off, and notifies the CAB approvers via Teams.
naftiko: "0.5"
info:
label: "Change Management Approval Workflow"
description: "When a ServiceNow change request is submitted for production infrastructure, validates the change window, creates a linked Jira ticket for engineering sign-off, and notifies the CAB approvers via Teams."
tags:
- itsm
- change-management
- servicenow
- jira
- microsoft-teams
- approval
capability:
exposes:
- type: mcp
namespace: change-management
port: 8080
tools:
- name: submit-change-for-approval
description: "Given a ServiceNow change request number, retrieve the change details, create a linked Jira issue for the engineering team to review, and notify the Change Advisory Board (CAB) channel in Teams with the change summary and scheduled window. Invoke when a normal or emergency change is submitted for CAB review."
inputParameters:
- name: change_number
type: string
description: "The ServiceNow change request number, e.g. CHG0012345."
steps:
- name: get-change
type: call
call: "servicenow.get-change-request"
with:
number: "{{change_number}}"
- name: create-jira-review
type: call
call: "jira.create-issue"
with:
project_key: "OPS"
issuetype: "Change Review"
summary: "CAB Review: {{get-change.short_description}}"
description: "ServiceNow: {{change_number}}\nRisk: {{get-change.risk}}\nImpact: {{get-change.impact}}\nScheduled start: {{get-change.start_date}}\nScheduled end: {{get-change.end_date}}\nImplementation plan: {{get-change.implementation_plan}}"
- name: notify-cab
type: call
call: "msteams.send-channel-message"
with:
channel_id: "$secrets.cab_channel_id"
text: "CAB REVIEW REQUIRED: {{change_number}} | {{get-change.short_description}} | Risk: {{get-change.risk}} | Window: {{get-change.start_date}} → {{get-change.end_date}} | Jira: {{create-jira-review.key}}"
consumes:
- namespace: servicenow
type: http
baseUri: "https://allianz.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_pass"
resources:
- name: change-requests
path: "/table/change_request"
inputParameters:
- name: number
in: query
operations:
- name: get-change-request
method: GET
- namespace: jira
type: http
baseUri: "https://allianz.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
- namespace: msteams
type: http
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{team_id}/channels/{channel_id}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-channel-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://allianz.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://allianz.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://allianz.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://allianz-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
When Datadog detects an AWS cost anomaly, fetches the anomaly details, creates a ServiceNow change request to investigate, and notifies the cloud FinOps team via Teams.
naftiko: "0.5"
info:
label: "Cloud Cost Anomaly Responder"
description: "When Datadog detects an AWS cost anomaly, fetches the anomaly details, creates a ServiceNow change request to investigate, and notifies the cloud FinOps team via Teams."
tags:
- cloud
- finops
- datadog
- servicenow
- microsoft-teams
- aws
- cost-management
capability:
exposes:
- type: mcp
namespace: cloud-ops
port: 8080
tools:
- name: handle-cost-anomaly
description: "Given a Datadog cost anomaly alert ID and the affected AWS account ID, fetch anomaly details, open a ServiceNow change request for FinOps investigation, and notify the cloud cost management channel in Teams. Invoke when a Datadog cost anomaly monitor triggers."
inputParameters:
- name: monitor_id
type: string
description: "The Datadog monitor ID that triggered the cost anomaly alert."
- name: aws_account_id
type: string
description: "The AWS account ID where the anomaly was detected."
- name: estimated_overage_usd
type: number
description: "Estimated cost overage in USD detected by the anomaly alert."
steps:
- name: get-monitor
type: call
call: "datadog.get-monitor"
with:
monitor_id: "{{monitor_id}}"
- name: open-change-request
type: call
call: "servicenow.create-change-request"
with:
short_description: "AWS Cost Anomaly: {{get-monitor.name}} — est. overage ${{estimated_overage_usd}}"
description: "AWS Account: {{aws_account_id}}\nMonitor: {{get-monitor.name}}\nEstimated overage: ${{estimated_overage_usd}}\nQuery: {{get-monitor.query}}"
type: "normal"
category: "Cloud Cost Management"
- name: notify-finops
type: call
call: "msteams.send-channel-message"
with:
channel_id: "$secrets.finops_channel_id"
text: "COST ANOMALY: AWS account {{aws_account_id}} | Monitor: {{get-monitor.name}} | Est. overage: ${{estimated_overage_usd}} | ServiceNow: {{open-change-request.number}}"
consumes:
- namespace: datadog
type: http
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: apikey
key: "DD-API-KEY"
value: "$secrets.datadog_api_key"
placement: header
resources:
- name: monitors
path: "/monitor/{monitor_id}"
inputParameters:
- name: monitor_id
in: path
operations:
- name: get-monitor
method: GET
- namespace: servicenow
type: http
baseUri: "https://allianz.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_pass"
resources:
- name: change-requests
path: "/table/change_request"
operations:
- name: create-change-request
method: POST
- namespace: msteams
type: http
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{team_id}/channels/{channel_id}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-channel-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/allianz/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://allianz.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://allianz.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://allianz.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://allianz.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
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://allianz.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://allianz.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://allianz.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
Fetches the current health status of all monitored Allianz infrastructure hosts from Datadog and returns a structured snapshot for use in status reports or automated runbooks.
naftiko: "0.5"
info:
label: "Datadog Infrastructure Health Dashboard Snapshot"
description: "Fetches the current health status of all monitored Allianz infrastructure hosts from Datadog and returns a structured snapshot for use in status reports or automated runbooks."
tags:
- observability
- datadog
- monitoring
- infrastructure
- reporting
capability:
exposes:
- type: mcp
namespace: infra-monitoring
port: 8080
tools:
- name: get-infra-health-snapshot
description: "Fetch the current status of all monitored hosts from Datadog filtered by environment tag, returning host counts by status (up, down, muted). Use when generating infrastructure health reports or evaluating deployment readiness."
inputParameters:
- name: environment
type: string
description: "The environment tag to filter hosts by, e.g. 'production', 'staging'."
call: "datadog.list-hosts"
with:
filter: "env:{{environment}}"
outputParameters:
- name: total_hosts
type: number
mapping: "$.total_matching"
- name: active_hosts
type: number
mapping: "$.total_active"
consumes:
- namespace: datadog
type: http
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: apikey
key: "DD-API-KEY"
value: "$secrets.datadog_api_key"
placement: header
resources:
- name: hosts
path: "/hosts"
inputParameters:
- name: filter
in: query
operations:
- name: list-hosts
method: GET
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 drops below its error budget threshold, fetches the SLO details, opens a ServiceNow incident, and posts a resolution alert to the relevant Teams engineering channel.
naftiko: "0.5"
info:
label: "Datadog SLO Breach Alert"
description: "When a Datadog SLO drops below its error budget threshold, fetches the SLO details, opens a ServiceNow incident, and posts a resolution alert to the relevant Teams engineering channel."
tags:
- observability
- datadog
- servicenow
- microsoft-teams
- slo
- monitoring
capability:
exposes:
- type: mcp
namespace: observability-ops
port: 8080
tools:
- name: handle-slo-breach
description: "Given a Datadog SLO ID and current error budget remaining, fetch the SLO status, open a ServiceNow incident with full context, and notify the engineering channel in Teams. Invoke when a Datadog monitor triggers an SLO budget burn alert."
inputParameters:
- name: slo_id
type: string
description: "The Datadog SLO ID that breached its error budget threshold."
- name: error_budget_remaining
type: number
description: "Remaining error budget percentage at time of breach, e.g. 2.5."
steps:
- name: get-slo
type: call
call: "datadog.get-slo"
with:
slo_id: "{{slo_id}}"
- name: open-incident
type: call
call: "servicenow.create-incident"
with:
short_description: "SLO Breach: {{get-slo.data.name}}"
urgency: "1"
impact: "1"
description: "SLO: {{get-slo.data.name}}\nID: {{slo_id}}\nError budget remaining: {{error_budget_remaining}}%\nTarget: {{get-slo.data.thresholds[0].target}}%"
- name: alert-team
type: call
call: "msteams.send-channel-message"
with:
channel_id: "$secrets.engineering_channel_id"
text: "SLO BREACH: {{get-slo.data.name}} — {{error_budget_remaining}}% error budget remaining. ServiceNow incident: {{open-incident.number}}"
consumes:
- namespace: datadog
type: http
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: apikey
key: "DD-API-KEY"
value: "$secrets.datadog_api_key"
placement: header
resources:
- name: slos
path: "/slo/{slo_id}"
inputParameters:
- name: slo_id
in: path
operations:
- name: get-slo
method: GET
- namespace: servicenow
type: http
baseUri: "https://allianz.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_pass"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
- namespace: msteams
type: http
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{team_id}/channels/{channel_id}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-channel-message
method: POST
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://allianz.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://allianz.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 an employee separation is recorded in Workday, revokes Microsoft 365 access, closes all open ServiceNow tickets assigned to the employee, and notifies the IT security team via Teams.
naftiko: "0.5"
info:
label: "Employee Offboarding Workflow"
description: "When an employee separation is recorded in Workday, revokes Microsoft 365 access, closes all open ServiceNow tickets assigned to the employee, and notifies the IT security team via Teams."
tags:
- hr
- offboarding
- workday
- servicenow
- microsoft-teams
- identity
capability:
exposes:
- type: mcp
namespace: hr-offboarding
port: 8080
tools:
- name: trigger-offboarding
description: "Given a Workday employee ID and termination date, revoke Microsoft 365 access, close open ServiceNow tickets, and alert the IT security team in Teams. Invoke when an employee separation is confirmed in Workday."
inputParameters:
- name: employee_id
type: string
description: "The Workday worker ID of the departing employee."
- name: termination_date
type: string
description: "Effective termination date in ISO 8601 format (YYYY-MM-DD)."
steps:
- name: get-worker
type: call
call: "workday.get-worker"
with:
worker_id: "{{employee_id}}"
- name: revoke-access
type: call
call: "msgraph.disable-user"
with:
user_id: "{{get-worker.azure_object_id}}"
account_enabled: "false"
- name: close-tickets
type: call
call: "servicenow.close-user-tickets"
with:
caller_id: "{{get-worker.work_email}}"
close_notes: "Auto-closed: employee separation effective {{termination_date}}"
- name: notify-security
type: call
call: "msteams.send-channel-message"
with:
channel_id: "$secrets.security_channel_id"
text: "Offboarding complete for {{get-worker.display_name}} ({{get-worker.work_email}}). M365 access revoked. Open tickets closed. Effective: {{termination_date}}"
consumes:
- namespace: workday
type: http
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
- namespace: msgraph
type: http
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: users
path: "/users/{user_id}"
inputParameters:
- name: user_id
in: path
operations:
- name: disable-user
method: PATCH
- namespace: servicenow
type: http
baseUri: "https://allianz.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_pass"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: close-user-tickets
method: PATCH
- namespace: msteams
type: http
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{team_id}/channels/{channel_id}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-channel-message
method: POST
Queries Workday for the latest employee engagement survey results by business unit, computes satisfaction scores, and posts a pulse digest to the HR leadership Teams channel.
naftiko: "0.5"
info:
label: "Employee Satisfaction Survey Pulse"
description: "Queries Workday for the latest employee engagement survey results by business unit, computes satisfaction scores, and posts a pulse digest to the HR leadership Teams channel."
tags:
- hr
- workday
- microsoft-teams
- employee-engagement
- reporting
capability:
exposes:
- type: mcp
namespace: hr-engagement
port: 8080
tools:
- name: digest-engagement-pulse
description: "Given a Workday survey run ID, fetch engagement survey results segmented by business unit, compute average scores, and post a formatted pulse digest to the HR leadership Teams channel. Invoke after each survey window closes in Workday."
inputParameters:
- name: survey_run_id
type: string
description: "The Workday engagement survey run ID to retrieve results for."
steps:
- name: get-survey-results
type: call
call: "workday.get-survey-results"
with:
surveyRunId: "{{survey_run_id}}"
- name: post-pulse-digest
type: call
call: "msteams.send-channel-message"
with:
channel_id: "$secrets.hr_leadership_channel_id"
text: "Employee Engagement Pulse — Survey Run {{survey_run_id}}: Results retrieved from Workday. {{get-survey-results.totalResponses}} responses collected. Review full breakdown in Workday People Analytics."
consumes:
- namespace: workday
type: http
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: survey-results
path: "/surveyRuns/{surveyRunId}/results"
inputParameters:
- name: surveyRunId
in: path
operations:
- name: get-survey-results
method: GET
- namespace: msteams
type: http
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{team_id}/channels/{channel_id}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-channel-message
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/allianz/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://allianz.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://allianz.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@allianz.com/sendMail"
operations:
- name: send-mail
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://allianz.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://allianz.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
When a GitHub release is published, fetches the merged pull requests since the last release, generates structured release notes using an AI model, and posts them to the engineering Teams channel.
naftiko: "0.5"
info:
label: "GitHub Deployment Release Notes Generator"
description: "When a GitHub release is published, fetches the merged pull requests since the last release, generates structured release notes using an AI model, and posts them to the engineering Teams channel."
tags:
- devops
- github
- ai
- microsoft-teams
- release-management
capability:
exposes:
- type: mcp
namespace: release-ops
port: 8080
tools:
- name: generate-release-notes
description: "Given a GitHub repository, release tag, and prior tag, fetch all merged pull requests between the two tags, generate structured release notes via OpenAI, and post the release notes to the engineering Teams channel. Invoke when a new GitHub release is published."
inputParameters:
- name: repo_owner
type: string
description: "The GitHub organization or owner name, e.g. 'allianz'."
- name: repo_name
type: string
description: "The GitHub repository name."
- name: release_tag
type: string
description: "The new release tag, e.g. 'v2.5.0'."
- name: prior_tag
type: string
description: "The previous release tag to compare against, e.g. 'v2.4.0'."
steps:
- name: get-commits
type: call
call: "github.compare-commits"
with:
owner: "{{repo_owner}}"
repo: "{{repo_name}}"
base: "{{prior_tag}}"
head: "{{release_tag}}"
- name: generate-notes
type: call
call: "openai.create-completion"
with:
model: "gpt-4o"
prompt: "Generate structured release notes for {{repo_name}} {{release_tag}} based on these commits between {{prior_tag}} and {{release_tag}}: {{get-commits.commits}}. Format as: ## What's New, ## Bug Fixes, ## Breaking Changes."
- name: post-release-notes
type: call
call: "msteams.send-channel-message"
with:
channel_id: "$secrets.engineering_channel_id"
text: "Release {{release_tag}} published for {{repo_owner}}/{{repo_name}}:\n{{generate-notes.choices[0].message.content}}"
consumes:
- namespace: github
type: http
baseUri: "https://api.github.com"
authentication:
type: bearer
token: "$secrets.github_token"
resources:
- name: compare
path: "/repos/{owner}/{repo}/compare/{base}...{head}"
inputParameters:
- name: owner
in: path
- name: repo
in: path
- name: base
in: path
- name: head
in: path
operations:
- name: compare-commits
method: GET
- namespace: openai
type: http
baseUri: "https://api.openai.com/v1"
authentication:
type: bearer
token: "$secrets.openai_api_key"
resources:
- name: completions
path: "/chat/completions"
operations:
- name: create-completion
method: POST
- namespace: msteams
type: http
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{team_id}/channels/{channel_id}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-channel-message
method: POST
When a pull request is opened against a protected branch in GitHub, triggers a Datadog static analysis check and blocks merge if critical vulnerabilities are detected, posting findings to the PR and a Teams channel.
naftiko: "0.5"
info:
label: "GitHub Pull Request Security Gate"
description: "When a pull request is opened against a protected branch in GitHub, triggers a Datadog static analysis check and blocks merge if critical vulnerabilities are detected, posting findings to the PR and a Teams channel."
tags:
- devops
- security
- github
- datadog
- microsoft-teams
- code-quality
capability:
exposes:
- type: mcp
namespace: devops-security
port: 8080
tools:
- name: run-pr-security-gate
description: "Given a GitHub repository, PR number, and commit SHA, fetch PR details, query Datadog for static analysis findings on the commit, post a summary comment to the PR, and notify the security channel in Teams if critical issues are found. Invoke on pull_request opened and synchronize events."
inputParameters:
- name: repo_owner
type: string
description: "GitHub organization or owner, e.g. 'allianz'."
- name: repo_name
type: string
description: "GitHub repository name, e.g. 'claims-service'."
- name: pr_number
type: integer
description: "The pull request number."
- name: commit_sha
type: string
description: "The head commit SHA of the pull request."
steps:
- name: get-pr
type: call
call: "github.get-pull-request"
with:
owner: "{{repo_owner}}"
repo: "{{repo_name}}"
pull_number: "{{pr_number}}"
- name: get-findings
type: call
call: "datadog.get-ci-pipeline-events"
with:
filter_query: "ci_level:pipeline @git.commit.sha:{{commit_sha}} @git.repository_url:*{{repo_name}}"
- name: post-pr-comment
type: call
call: "github.create-pr-comment"
with:
owner: "{{repo_owner}}"
repo: "{{repo_name}}"
issue_number: "{{pr_number}}"
body: "Security gate results for {{commit_sha}}: {{get-findings.data.length}} pipeline events found. Branch: {{get-pr.head.ref}}"
consumes:
- namespace: github
type: http
baseUri: "https://api.github.com"
authentication:
type: bearer
token: "$secrets.github_token"
resources:
- name: pull-requests
path: "/repos/{owner}/{repo}/pulls/{pull_number}"
inputParameters:
- name: owner
in: path
- name: repo
in: path
- name: pull_number
in: path
operations:
- name: get-pull-request
method: GET
- name: pr-comments
path: "/repos/{owner}/{repo}/issues/{issue_number}/comments"
inputParameters:
- name: owner
in: path
- name: repo
in: path
- name: issue_number
in: path
operations:
- name: create-pr-comment
method: POST
- namespace: datadog
type: http
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: apikey
key: "DD-API-KEY"
value: "$secrets.datadog_api_key"
placement: header
resources:
- name: ci-pipeline-events
path: "/events"
inputParameters:
- name: filter_query
in: query
operations:
- name: get-ci-pipeline-events
method: GET
Scans all repositories in the Allianz GitHub organization for secret scanning alerts and Dependabot vulnerabilities, then creates Jira tickets for critical findings and posts a summary to the security Teams channel.
naftiko: "0.5"
info:
label: "GitHub Repository Security Audit"
description: "Scans all repositories in the Allianz GitHub organization for secret scanning alerts and Dependabot vulnerabilities, then creates Jira tickets for critical findings and posts a summary to the security Teams channel."
tags:
- devops
- security
- github
- jira
- microsoft-teams
- vulnerability-management
capability:
exposes:
- type: mcp
namespace: security-audit
port: 8080
tools:
- name: audit-repo-security
description: "Given a GitHub organization name and repository name, fetch all open Dependabot critical vulnerability alerts and secret scanning alerts, create a Jira security ticket for each critical finding, and post a consolidated audit summary to the Teams security channel. Invoke weekly or after a new repository is created."
inputParameters:
- name: org
type: string
description: "The GitHub organization name, e.g. 'allianz'."
- name: repo
type: string
description: "The GitHub repository name to audit."
steps:
- name: get-dependabot-alerts
type: call
call: "github.list-dependabot-alerts"
with:
owner: "{{org}}"
repo: "{{repo}}"
severity: "critical"
state: "open"
- name: get-secret-alerts
type: call
call: "github.list-secret-scanning-alerts"
with:
owner: "{{org}}"
repo: "{{repo}}"
state: "open"
- name: create-security-ticket
type: call
call: "jira.create-issue"
with:
project_key: "SEC"
issuetype: "Security Vulnerability"
summary: "Security Audit: {{org}}/{{repo}} — critical findings"
description: "Critical Dependabot alerts: {{get-dependabot-alerts.length}}\nSecret scanning alerts: {{get-secret-alerts.length}}\nRepository: {{org}}/{{repo}}\nReview and remediate all findings immediately."
- name: notify-security-team
type: call
call: "msteams.send-channel-message"
with:
channel_id: "$secrets.security_channel_id"
text: "Security Audit Complete: {{org}}/{{repo}} | Critical vulns: {{get-dependabot-alerts.length}} | Secret alerts: {{get-secret-alerts.length}} | Jira: {{create-security-ticket.key}}"
consumes:
- namespace: github
type: http
baseUri: "https://api.github.com"
authentication:
type: bearer
token: "$secrets.github_token"
resources:
- name: dependabot-alerts
path: "/repos/{owner}/{repo}/dependabot/alerts"
inputParameters:
- name: owner
in: path
- name: repo
in: path
- name: severity
in: query
- name: state
in: query
operations:
- name: list-dependabot-alerts
method: GET
- name: secret-scanning-alerts
path: "/repos/{owner}/{repo}/secret-scanning/alerts"
inputParameters:
- name: owner
in: path
- name: repo
in: path
- name: state
in: query
operations:
- name: list-secret-scanning-alerts
method: GET
- namespace: jira
type: http
baseUri: "https://allianz.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
- namespace: msteams
type: http
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{team_id}/channels/{channel_id}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-channel-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 a new insurance claim is submitted via Salesforce Service Cloud, creates a ServiceNow case, scores it for priority using an AI model, and routes it to the correct claims handler queue.
naftiko: "0.5"
info:
label: "Insurance Claim Intake and Triage"
description: "When a new insurance claim is submitted via Salesforce Service Cloud, creates a ServiceNow case, scores it for priority using an AI model, and routes it to the correct claims handler queue."
tags:
- insurance
- claims
- salesforce
- servicenow
- ai
- triage
capability:
exposes:
- type: mcp
namespace: claims-ops
port: 8080
tools:
- name: handle-claim-intake
description: "Given a Salesforce case ID for a new insurance claim, retrieve claim details, classify priority via OpenAI, create a ServiceNow work order, and route to the correct handler queue. Invoke on new claim submission events."
inputParameters:
- name: salesforce_case_id
type: string
description: "The Salesforce Case ID of the newly submitted insurance claim."
steps:
- name: get-case
type: call
call: "salesforce.get-case"
with:
case_id: "{{salesforce_case_id}}"
- name: classify-priority
type: call
call: "openai.create-completion"
with:
model: "gpt-4o"
prompt: "Classify this insurance claim as LOW, MEDIUM, HIGH, or CRITICAL based on: type={{get-case.type}}, description={{get-case.description}}, amount={{get-case.claim_amount}}. Return only the priority label."
- name: create-work-order
type: call
call: "servicenow.create-work-order"
with:
short_description: "Claim {{salesforce_case_id}}: {{get-case.subject}}"
priority: "{{classify-priority.choices[0].text}}"
assignment_group: "Claims_{{classify-priority.choices[0].text}}"
description: "Salesforce case: {{salesforce_case_id}}\nClaimant: {{get-case.contact_name}}\nAmount: {{get-case.claim_amount}}"
consumes:
- namespace: salesforce
type: http
baseUri: "https://allianz.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: cases
path: "/sobjects/Case/{case_id}"
inputParameters:
- name: case_id
in: path
operations:
- name: get-case
method: GET
- namespace: openai
type: http
baseUri: "https://api.openai.com/v1"
authentication:
type: bearer
token: "$secrets.openai_api_key"
resources:
- name: completions
path: "/chat/completions"
operations:
- name: create-completion
method: POST
- namespace: servicenow
type: http
baseUri: "https://allianz.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_pass"
resources:
- name: work-orders
path: "/table/wm_order"
operations:
- name: create-work-order
method: POST
Given a policy document stored in SharePoint, retrieves the document content, sends it to an AI model for summarization, and returns a structured key-terms summary for agent or advisor use.
naftiko: "0.5"
info:
label: "Insurance Policy Document Summarizer"
description: "Given a policy document stored in SharePoint, retrieves the document content, sends it to an AI model for summarization, and returns a structured key-terms summary for agent or advisor use."
tags:
- insurance
- ai
- sharepoint
- document-management
- summarization
capability:
exposes:
- type: mcp
namespace: policy-intelligence
port: 8080
tools:
- name: summarize-policy-document
description: "Given a SharePoint site ID and document item ID for an insurance policy document, retrieve the file content, send it to the Anthropic API for structured summarization, and return a key-terms summary including coverage limits, exclusions, and renewal date. Use when an advisor or agent needs a quick policy overview."
inputParameters:
- name: site_id
type: string
description: "The SharePoint site ID where the policy document is stored."
- name: item_id
type: string
description: "The SharePoint drive item ID of the policy document."
steps:
- name: get-document
type: call
call: "sharepoint.get-file-content"
with:
site_id: "{{site_id}}"
item_id: "{{item_id}}"
- name: summarize
type: call
call: "anthropic.create-message"
with:
model: "claude-opus-4-5"
max_tokens: 1024
system: "You are an insurance policy analyst. Extract and summarize: coverage limits, exclusions, premium amount, renewal date, and policyholder obligations. Return as structured JSON."
content: "{{get-document.content}}"
consumes:
- namespace: sharepoint
type: http
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: drive-items
path: "/sites/{site_id}/drive/items/{item_id}/content"
inputParameters:
- name: site_id
in: path
- name: item_id
in: path
operations:
- name: get-file-content
method: GET
- namespace: anthropic
type: http
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
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://allianz.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://allianz.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://allianz-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
When a critical ServiceNow incident is raised, creates a Jira ticket for engineering investigation, posts an alert to the Teams ops channel, and tracks the incident in Datadog.
naftiko: "0.5"
info:
label: "IT Incident Response Escalation"
description: "When a critical ServiceNow incident is raised, creates a Jira ticket for engineering investigation, posts an alert to the Teams ops channel, and tracks the incident in Datadog."
tags:
- itsm
- incident-response
- servicenow
- jira
- microsoft-teams
- datadog
capability:
exposes:
- type: mcp
namespace: it-ops
port: 8080
tools:
- name: handle-critical-incident
description: "Given a ServiceNow incident number, retrieve its details, create a linked Jira engineering ticket, post a priority alert to the Teams ops channel, and register a Datadog event for timeline correlation. Invoke for P1 and P2 incidents."
inputParameters:
- name: incident_number
type: string
description: "The ServiceNow incident number, e.g. INC0012345."
steps:
- name: get-incident
type: call
call: "servicenow.get-incident"
with:
number: "{{incident_number}}"
- name: create-jira-ticket
type: call
call: "jira.create-issue"
with:
project_key: "OPS"
issuetype: "Bug"
summary: "[P1] {{get-incident.short_description}}"
description: "ServiceNow: {{incident_number}}\nImpact: {{get-incident.impact}}\nDescription: {{get-incident.description}}"
- name: post-teams-alert
type: call
call: "msteams.send-channel-message"
with:
channel_id: "$secrets.ops_channel_id"
text: "CRITICAL INCIDENT: {{incident_number}} | {{get-incident.short_description}} | Jira: {{create-jira-ticket.key}} | Assigned: {{get-incident.assigned_to}}"
- name: register-datadog-event
type: call
call: "datadog.create-event"
with:
title: "Incident {{incident_number}}: {{get-incident.short_description}}"
text: "ServiceNow P1 incident raised. Jira: {{create-jira-ticket.key}}"
alert_type: "error"
tags: "incident:{{incident_number}},env:production"
consumes:
- namespace: servicenow
type: http
baseUri: "https://allianz.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_pass"
resources:
- name: incidents
path: "/table/incident"
inputParameters:
- name: number
in: query
operations:
- name: get-incident
method: GET
- namespace: jira
type: http
baseUri: "https://allianz.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
- namespace: msteams
type: http
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{team_id}/channels/{channel_id}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-channel-message
method: POST
- namespace: datadog
type: http
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
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://allianz.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://allianz.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
When a Datadog monitor fires for an application error rate spike, automatically creates a Jira bug with full observability context including monitor query, alert value, and affected service tags.
naftiko: "0.5"
info:
label: "Jira Bug Triage from Datadog Alert"
description: "When a Datadog monitor fires for an application error rate spike, automatically creates a Jira bug with full observability context including monitor query, alert value, and affected service tags."
tags:
- devops
- observability
- datadog
- jira
- bug-triage
capability:
exposes:
- type: mcp
namespace: alert-triage
port: 8080
tools:
- name: create-bug-from-alert
description: "Given a Datadog monitor ID and triggered alert value, fetch the monitor definition, create a Jira Bug in the appropriate project with full alert context, and return the Jira issue key. Invoke when Datadog fires a monitor for application error rate or latency SLO violations."
inputParameters:
- name: monitor_id
type: string
description: "The Datadog monitor ID that fired the alert."
- name: alert_value
type: number
description: "The metric value that triggered the alert, e.g. 12.5 for 12.5% error rate."
- name: service_name
type: string
description: "The name of the affected service, e.g. 'claims-api'."
steps:
- name: get-monitor
type: call
call: "datadog.get-monitor"
with:
monitor_id: "{{monitor_id}}"
- name: create-bug
type: call
call: "jira.create-issue"
with:
project_key: "ENG"
issuetype: "Bug"
summary: "[Alert] {{service_name}}: {{get-monitor.name}}"
description: "Monitor: {{get-monitor.name}}\nTriggered value: {{alert_value}}\nMonitor query: {{get-monitor.query}}\nService: {{service_name}}\nDatadog monitor ID: {{monitor_id}}\nThreshold: {{get-monitor.options.thresholds.critical}}"
outputParameters:
- name: jira_key
type: string
consumes:
- namespace: datadog
type: http
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: apikey
key: "DD-API-KEY"
value: "$secrets.datadog_api_key"
placement: header
resources:
- name: monitors
path: "/monitor/{monitor_id}"
inputParameters:
- name: monitor_id
in: path
operations:
- name: get-monitor
method: GET
- namespace: jira
type: http
baseUri: "https://allianz.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
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://allianz.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
Retrieves a Jira issue by its key and returns the summary, status, assignee, priority, and description for use in downstream orchestrations or agent context gathering.
naftiko: "0.5"
info:
label: "Jira Issue Lookup by Key"
description: "Retrieves a Jira issue by its key and returns the summary, status, assignee, priority, and description for use in downstream orchestrations or agent context gathering."
tags:
- devops
- jira
- lookup
- itsm
capability:
exposes:
- type: mcp
namespace: jira-lookup
port: 8080
tools:
- name: get-jira-issue
description: "Given a Jira issue key, fetch the full issue record from Jira including summary, status, assignee, priority, and description. Use when an agent needs issue context before creating a related record or sending a notification."
inputParameters:
- name: issue_key
type: string
description: "The Jira issue key, e.g. 'OPS-1234' or 'SEC-567'."
call: "jira.get-issue"
with:
issueIdOrKey: "{{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"
- name: priority
type: string
mapping: "$.fields.priority.name"
consumes:
- namespace: jira
type: http
baseUri: "https://allianz.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_token"
resources:
- name: issues
path: "/issue/{issueIdOrKey}"
inputParameters:
- name: issueIdOrKey
in: path
operations:
- name: get-issue
method: GET
Fetches completed sprint data from Jira, calculates team velocity metrics, and publishes a sprint summary to the engineering leadership Teams channel.
naftiko: "0.5"
info:
label: "Jira Sprint Velocity Report"
description: "Fetches completed sprint data from Jira, calculates team velocity metrics, and publishes a sprint summary to the engineering leadership Teams channel."
tags:
- devops
- jira
- microsoft-teams
- reporting
- agile
capability:
exposes:
- type: mcp
namespace: devops-reporting
port: 8080
tools:
- name: publish-sprint-velocity
description: "Given a Jira board ID and sprint ID, retrieve the sprint report including completed story points and issue counts, then post a formatted velocity summary to the engineering leadership Teams channel. Invoke at sprint close or on demand."
inputParameters:
- name: board_id
type: integer
description: "The Jira Scrum board ID, e.g. 42."
- name: sprint_id
type: integer
description: "The Jira sprint ID to report on."
steps:
- name: get-sprint
type: call
call: "jira.get-sprint"
with:
sprintId: "{{sprint_id}}"
- name: get-sprint-issues
type: call
call: "jira.get-sprint-issues"
with:
sprintId: "{{sprint_id}}"
jql: "sprint = {{sprint_id}} AND status = Done"
- name: post-report
type: call
call: "msteams.send-channel-message"
with:
channel_id: "$secrets.eng_leadership_channel_id"
text: "Sprint Report: {{get-sprint.name}} | Completed: {{get-sprint-issues.total}} issues | State: {{get-sprint.state}} | Goal: {{get-sprint.goal}}"
consumes:
- namespace: jira
type: http
baseUri: "https://allianz.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_token"
resources:
- name: sprints
path: "/sprint/{sprintId}"
inputParameters:
- name: sprintId
in: path
operations:
- name: get-sprint
method: GET
- name: sprint-issues
path: "/search"
inputParameters:
- name: jql
in: query
operations:
- name: get-sprint-issues
method: GET
- namespace: msteams
type: http
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{team_id}/channels/{channel_id}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-channel-message
method: POST
Fetches the latest LinkedIn Campaign Manager analytics for Allianz's employer brand campaigns and posts a weekly engagement digest to the HR marketing Teams channel.
naftiko: "0.5"
info:
label: "LinkedIn Employer Brand Campaign Digest"
description: "Fetches the latest LinkedIn Campaign Manager analytics for Allianz's employer brand campaigns and posts a weekly engagement digest to the HR marketing Teams channel."
tags:
- marketing
- hr
- linkedin
- microsoft-teams
- reporting
- employer-brand
capability:
exposes:
- type: mcp
namespace: employer-brand
port: 8080
tools:
- name: digest-linkedin-campaigns
description: "Given a LinkedIn ad account ID and date range, fetch campaign performance metrics (impressions, clicks, applications, CTR) for employer brand campaigns and post a formatted digest to the HR marketing Teams channel. Invoke weekly on Monday mornings."
inputParameters:
- name: ad_account_id
type: string
description: "The LinkedIn Campaign Manager ad account URN, e.g. 'urn:li:sponsoredAccount:12345678'."
- name: date_range_start
type: string
description: "Start date for the reporting period in YYYY-MM-DD format."
- name: date_range_end
type: string
description: "End date for the reporting period in YYYY-MM-DD format."
steps:
- name: get-campaign-analytics
type: call
call: "linkedin.get-ad-analytics"
with:
q: "analytics"
pivot: "CAMPAIGN"
dateRange.start.year: "{{date_range_start}}"
dateRange.end.year: "{{date_range_end}}"
accounts: "{{ad_account_id}}"
fields: "impressions,clicks,costInLocalCurrency,externalWebsiteConversions"
- name: post-digest
type: call
call: "msteams.send-channel-message"
with:
channel_id: "$secrets.hr_marketing_channel_id"
text: "LinkedIn Employer Brand Weekly Digest ({{date_range_start}} – {{date_range_end}}): {{get-campaign-analytics.elements.length}} campaigns tracked. See full analytics in Campaign Manager."
consumes:
- namespace: linkedin
type: http
baseUri: "https://api.linkedin.com/v2"
authentication:
type: bearer
token: "$secrets.linkedin_token"
resources:
- name: ad-analytics
path: "/adAnalyticsV2"
inputParameters:
- name: q
in: query
- name: pivot
in: query
- name: accounts
in: query
- name: fields
in: query
operations:
- name: get-ad-analytics
method: GET
- namespace: msteams
type: http
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{team_id}/channels/{channel_id}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-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/allianz/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
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://allianz.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://allianz.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 a Microsoft 365 account, and sends a Teams welcome message.
naftiko: "0.5"
info:
label: "New Hire Onboarding Orchestrator"
description: "When a new employee is created in Workday, opens a ServiceNow onboarding ticket, provisions a Microsoft 365 account, and sends a Teams welcome message."
tags:
- hr
- onboarding
- workday
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: hr-onboarding
port: 8080
tools:
- name: trigger-onboarding
description: "Given a Workday employee ID and start date, orchestrate the full new-hire onboarding sequence across ServiceNow, Microsoft Graph, and Microsoft Teams. Invoke when a new hire record becomes active in Workday."
inputParameters:
- name: employee_id
type: string
description: "The Workday worker ID for the new hire. Format: WD-XXXXXXX."
- name: start_date
type: string
description: "The employee's first day of work in ISO 8601 format (YYYY-MM-DD)."
- name: department
type: string
description: "The department or business unit the new hire is joining, e.g. 'Claims Operations'."
steps:
- name: get-worker
type: call
call: "workday.get-worker"
with:
worker_id: "{{employee_id}}"
- name: create-ticket
type: call
call: "servicenow.create-incident"
with:
category: "hr_onboarding"
short_description: "New hire onboarding: {{get-worker.display_name}}"
assignment_group: "IT_Onboarding"
due_date: "{{start_date}}"
- name: provision-account
type: call
call: "msgraph.create-user"
with:
display_name: "{{get-worker.display_name}}"
mail_nickname: "{{get-worker.user_login}}"
department: "{{department}}"
- name: send-welcome
type: call
call: "msteams.send-message"
with:
recipient_upn: "{{get-worker.work_email}}"
text: "Welcome to Allianz, {{get-worker.first_name}}! Your IT onboarding ticket is {{create-ticket.number}}. Your Microsoft 365 account is ready."
consumes:
- namespace: workday
type: http
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
- namespace: servicenow
type: http
baseUri: "https://allianz.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_pass"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
- namespace: msgraph
type: http
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: users
path: "/users"
operations:
- name: create-user
method: POST
- namespace: msteams
type: http
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: chats
path: "/chats"
operations:
- name: send-message
method: POST
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://allianz.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://allianz.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
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://allianz.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://allianz.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://allianz-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@allianz.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://allianz.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@allianz.com/sendMail"
operations:
- name: send-mail
method: POST
- type: http
namespace: snow
baseUri: "https://allianz.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
Queries Salesforce for insurance policies approaching their renewal date, enriches each with the customer's claims history from ServiceNow, and creates renewal opportunity records back in Salesforce.
naftiko: "0.5"
info:
label: "Policy Renewal Opportunity Sync"
description: "Queries Salesforce for insurance policies approaching their renewal date, enriches each with the customer's claims history from ServiceNow, and creates renewal opportunity records back in Salesforce."
tags:
- insurance
- sales
- crm
- salesforce
- servicenow
- renewal
capability:
exposes:
- type: mcp
namespace: policy-renewals
port: 8080
tools:
- name: sync-renewal-opportunities
description: "Given a renewal look-ahead window in days, query Salesforce for expiring policies, enrich each with the customer's open claim count from ServiceNow, and upsert a renewal Opportunity in Salesforce. Invoke on a daily schedule or on demand."
inputParameters:
- name: days_ahead
type: integer
description: "Number of days ahead to look for expiring policies, e.g. 30 or 60."
steps:
- name: get-expiring-policies
type: call
call: "salesforce-query.run-soql"
with:
query: "SELECT Id, Name, AccountId, ExpirationDate__c FROM InsurancePolicy__c WHERE ExpirationDate__c = NEXT_N_DAYS:{{days_ahead}}"
- name: get-open-claims
type: call
call: "servicenow.list-incidents"
with:
sysparm_query: "state=1^category=insurance_claim"
sysparm_fields: "caller_id,number,priority"
- name: create-opportunities
type: call
call: "salesforce-write.create-opportunity"
with:
name: "Renewal - {{get-expiring-policies.Name}}"
account_id: "{{get-expiring-policies.AccountId}}"
close_date: "{{get-expiring-policies.ExpirationDate__c}}"
stage_name: "Renewal Prospecting"
open_claims: "{{get-open-claims.total_count}}"
consumes:
- namespace: salesforce-query
type: http
baseUri: "https://allianz.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: query
path: "/query"
inputParameters:
- name: query
in: query
operations:
- name: run-soql
method: GET
- namespace: servicenow
type: http
baseUri: "https://allianz.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_pass"
resources:
- name: incidents
path: "/table/incident"
inputParameters:
- name: sysparm_query
in: query
- name: sysparm_fields
in: query
operations:
- name: list-incidents
method: GET
- namespace: salesforce-write
type: http
baseUri: "https://allianz.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
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://allianz.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://allianz.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
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://allianz.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/allianz/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://allianz.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://allianz.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@allianz.com/sendMail"
operations:
- name: send-mail
method: POST
Queries Snowflake for the latest compliance metrics, generates a structured regulatory report using an AI model, and stores the output in SharePoint for the compliance team.
naftiko: "0.5"
info:
label: "Regulatory Compliance Report Generation"
description: "Queries Snowflake for the latest compliance metrics, generates a structured regulatory report using an AI model, and stores the output in SharePoint for the compliance team."
tags:
- compliance
- insurance
- snowflake
- anthropic
- sharepoint
- reporting
capability:
exposes:
- type: mcp
namespace: compliance-reporting
port: 8080
tools:
- name: generate-compliance-report
description: "Given a reporting period and regulatory framework (e.g. Solvency II, IFRS 17), query Snowflake for compliance metrics, generate a narrative report via Anthropic, and upload the report to the SharePoint Compliance library. Invoke monthly before regulatory submission deadlines."
inputParameters:
- name: period
type: string
description: "Reporting period in YYYY-QN format, e.g. 2025-Q4."
- name: framework
type: string
description: "Regulatory framework identifier, e.g. 'Solvency II' or 'IFRS 17'."
steps:
- name: get-metrics
type: call
call: "snowflake.execute-statement"
with:
statement: "SELECT metric_name, metric_value, threshold, status FROM COMPLIANCE.REGULATORY_METRICS WHERE period = '{{period}}' AND framework = '{{framework}}'"
database: "ALLIANZ_DW"
schema: "COMPLIANCE"
- name: generate-report
type: call
call: "anthropic.create-message"
with:
model: "claude-opus-4-5"
max_tokens: 4096
system: "You are a regulatory compliance analyst for a global insurer. Generate a formal compliance report narrative based on the provided metrics data. Structure the report with an executive summary, metric analysis, and remediation recommendations."
content: "Generate a {{framework}} compliance report for period {{period}} based on these metrics: {{get-metrics.results}}"
- name: upload-report
type: call
call: "sharepoint.upload-file"
with:
site_id: "$secrets.compliance_site_id"
folder_path: "Regulatory Reports/{{framework}}/{{period}}"
file_name: "compliance-report-{{period}}.txt"
content: "{{generate-report.content[0].text}}"
consumes:
- namespace: snowflake
type: http
baseUri: "https://allianz.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-statement
method: POST
- namespace: anthropic
type: http
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
- namespace: sharepoint
type: http
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: drive-items
path: "/sites/{site_id}/drive/root:/{folder_path}/{file_name}:/content"
inputParameters:
- name: site_id
in: path
- name: folder_path
in: path
- name: file_name
in: path
operations:
- name: upload-file
method: PUT
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://allianz.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://allianz.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://allianz.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://allianz-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://allianz.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://allianz.api.identitynow.com/v3"
authentication:
type: bearer
token: "$secrets.sailpoint_token"
resources:
- name: iam-ops
path: "/{{id}}"
operations:
- name: get-identity
method: GET
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://allianz.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://allianz-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://allianz.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://allianz.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
Given a Salesforce Account ID, fetches the customer's full profile, open claims from ServiceNow, and active policies, then updates the Salesforce account with a consolidated risk score and notes field.
naftiko: "0.5"
info:
label: "Salesforce Customer 360 Enrichment"
description: "Given a Salesforce Account ID, fetches the customer's full profile, open claims from ServiceNow, and active policies, then updates the Salesforce account with a consolidated risk score and notes field."
tags:
- crm
- sales
- salesforce
- servicenow
- customer-360
- insurance
capability:
exposes:
- type: mcp
namespace: crm-enrichment
port: 8080
tools:
- name: enrich-customer-account
description: "Given a Salesforce Account ID, retrieve the account record, fetch open ServiceNow claims for the customer, and update the Salesforce account with a risk score and claims summary. Use when preparing for customer renewal meetings or account reviews."
inputParameters:
- name: account_id
type: string
description: "The Salesforce Account ID for the customer to enrich."
steps:
- name: get-account
type: call
call: "salesforce-read.get-account"
with:
account_id: "{{account_id}}"
- name: get-claims
type: call
call: "servicenow.list-claims"
with:
sysparm_query: "caller_id.email={{get-account.PersonEmail}}^state!=7"
sysparm_fields: "number,short_description,priority,state"
- name: update-account
type: call
call: "salesforce-write.update-account"
with:
account_id: "{{account_id}}"
open_claims_count: "{{get-claims.total_count}}"
risk_notes: "Open claims: {{get-claims.total_count}} as of last enrichment"
consumes:
- namespace: salesforce-read
type: http
baseUri: "https://allianz.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: accounts
path: "/sobjects/Account/{account_id}"
inputParameters:
- name: account_id
in: path
operations:
- name: get-account
method: GET
- namespace: servicenow
type: http
baseUri: "https://allianz.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_pass"
resources:
- name: incidents
path: "/table/incident"
inputParameters:
- name: sysparm_query
in: query
- name: sysparm_fields
in: query
operations:
- name: list-claims
method: GET
- namespace: salesforce-write
type: http
baseUri: "https://allianz.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
When a Salesforce NPS survey response is submitted with a detractor score, creates a Salesforce task for the account owner to follow up and posts a notification to the customer success Teams channel.
naftiko: "0.5"
info:
label: "Salesforce NPS Survey Follow-Up"
description: "When a Salesforce NPS survey response is submitted with a detractor score, creates a Salesforce task for the account owner to follow up and posts a notification to the customer success Teams channel."
tags:
- crm
- sales
- salesforce
- microsoft-teams
- nps
- customer-success
capability:
exposes:
- type: mcp
namespace: customer-success
port: 8080
tools:
- name: handle-nps-detractor
description: "Given a Salesforce NPS survey response ID and score, retrieve the survey response and account details, create a follow-up task assigned to the account owner, and post a notification to the customer success Teams channel. Invoke when an NPS score below 7 is recorded in Salesforce."
inputParameters:
- name: survey_response_id
type: string
description: "The Salesforce Survey Response record ID."
- name: nps_score
type: integer
description: "The NPS score submitted by the customer (0–6 for detractors)."
steps:
- name: get-response
type: call
call: "salesforce-read.get-survey-response"
with:
record_id: "{{survey_response_id}}"
- name: create-followup-task
type: call
call: "salesforce-write.create-task"
with:
subject: "NPS Detractor Follow-Up: Score {{nps_score}}"
whatId: "{{get-response.AccountId}}"
ownerId: "{{get-response.AccountOwnerId}}"
activity_date: "TODAY+3"
description: "Customer submitted NPS score {{nps_score}}. Feedback: {{get-response.Comments__c}}"
- name: notify-cs-team
type: call
call: "msteams.send-channel-message"
with:
channel_id: "$secrets.customer_success_channel_id"
text: "NPS Detractor Alert: Account {{get-response.AccountName}} scored {{nps_score}}. Follow-up task created for {{get-response.AccountOwnerName}}. Feedback: {{get-response.Comments__c}}"
consumes:
- namespace: salesforce-read
type: http
baseUri: "https://allianz.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: survey-responses
path: "/sobjects/SurveyResponse/{record_id}"
inputParameters:
- name: record_id
in: path
operations:
- name: get-survey-response
method: GET
- namespace: salesforce-write
type: http
baseUri: "https://allianz.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: tasks
path: "/sobjects/Task"
operations:
- name: create-task
method: POST
- namespace: msteams
type: http
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{team_id}/channels/{channel_id}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-channel-message
method: POST
Queries Salesforce for the current quarter's open opportunities by stage and owner, computes a weighted pipeline forecast, and posts the digest to the sales leadership Teams channel.
naftiko: "0.5"
info:
label: "Salesforce Pipeline Forecast Digest"
description: "Queries Salesforce for the current quarter's open opportunities by stage and owner, computes a weighted pipeline forecast, and posts the digest to the sales leadership Teams channel."
tags:
- sales
- crm
- salesforce
- microsoft-teams
- forecasting
- reporting
capability:
exposes:
- type: mcp
namespace: sales-forecasting
port: 8080
tools:
- name: digest-pipeline-forecast
description: "Query Salesforce for all open opportunities closing in the current quarter, compute the weighted forecast by stage probability, and post a pipeline summary to the sales leadership Teams channel. Invoke weekly or before sales review meetings."
inputParameters:
- name: fiscal_quarter
type: string
description: "The fiscal quarter filter for Salesforce SOQL, e.g. 'THIS_QUARTER'."
steps:
- name: get-opportunities
type: call
call: "salesforce.run-soql"
with:
q: "SELECT Name, StageName, Amount, Probability, Owner.Name, CloseDate FROM Opportunity WHERE IsClosed = false AND CloseDate = {{fiscal_quarter}} ORDER BY Amount DESC"
- name: post-forecast
type: call
call: "msteams.send-channel-message"
with:
channel_id: "$secrets.sales_leadership_channel_id"
text: "Pipeline Forecast Digest ({{fiscal_quarter}}): {{get-opportunities.totalSize}} open opportunities. Top opportunities retrieved from Salesforce. Review full forecast in Salesforce Reports."
consumes:
- namespace: salesforce
type: http
baseUri: "https://allianz.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: query
path: "/query"
inputParameters:
- name: q
in: query
operations:
- name: run-soql
method: GET
- namespace: msteams
type: http
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{team_id}/channels/{channel_id}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-channel-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://allianz.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
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
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.allianz.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://allianz-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
When a vendor invoice is received in SAP S/4HANA, validates it against the purchase order, routes it for approval via ServiceNow, and notifies the responsible finance contact via Teams.
naftiko: "0.5"
info:
label: "SAP Invoice Processing and Approval"
description: "When a vendor invoice is received in SAP S/4HANA, validates it against the purchase order, routes it for approval via ServiceNow, and notifies the responsible finance contact via Teams."
tags:
- finance
- erp
- sap
- servicenow
- microsoft-teams
- invoice-processing
capability:
exposes:
- type: mcp
namespace: finance-ops
port: 8080
tools:
- name: process-invoice
description: "Given a SAP invoice document number, fetch invoice and PO details, create a ServiceNow approval task for the finance controller, and notify the approver via Teams. Invoke when a new vendor invoice document is posted in SAP."
inputParameters:
- name: invoice_number
type: string
description: "The SAP FI invoice document number, e.g. 5100012345."
- name: company_code
type: string
description: "The SAP company code, e.g. 1000 for Allianz SE."
steps:
- name: get-invoice
type: call
call: "sap.get-invoice"
with:
InvoiceDocument: "{{invoice_number}}"
CompanyCode: "{{company_code}}"
- name: create-approval-task
type: call
call: "servicenow.create-task"
with:
short_description: "Invoice approval required: {{invoice_number}}"
description: "Vendor: {{get-invoice.SupplierName}}\nAmount: {{get-invoice.InvoiceGrossAmount}} {{get-invoice.DocumentCurrency}}\nPO: {{get-invoice.PurchaseOrder}}"
assignment_group: "Finance_Controllers"
- name: notify-approver
type: call
call: "msteams.send-message"
with:
recipient_upn: "{{get-invoice.AccountingClerk}}@allianz.com"
text: "Invoice {{invoice_number}} from {{get-invoice.SupplierName}} for {{get-invoice.InvoiceGrossAmount}} {{get-invoice.DocumentCurrency}} requires your approval. ServiceNow task: {{create-approval-task.number}}"
consumes:
- namespace: sap
type: http
baseUri: "https://allianz-s4.sap.com/sap/opu/odata/sap/API_SUPPLIER_INVOICE_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_pass"
resources:
- name: invoices
path: "/A_SupplierInvoice(InvoiceDocument='{InvoiceDocument}',FiscalYear='')"
inputParameters:
- name: InvoiceDocument
in: path
- name: CompanyCode
in: query
operations:
- name: get-invoice
method: GET
- namespace: servicenow
type: http
baseUri: "https://allianz.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_pass"
resources:
- name: tasks
path: "/table/task"
operations:
- name: create-task
method: POST
- namespace: msteams
type: http
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: chats
path: "/chats"
operations:
- name: send-message
method: POST
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://allianz-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://allianz.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
At the start of a financial period close, generates a period-end close checklist in ServiceNow, assigns tasks to the finance team via Teams, and monitors SAP for posting period status.
naftiko: "0.5"
info:
label: "SAP Period-End Financial Close Checklist"
description: "At the start of a financial period close, generates a period-end close checklist in ServiceNow, assigns tasks to the finance team via Teams, and monitors SAP for posting period status."
tags:
- finance
- erp
- sap
- servicenow
- microsoft-teams
- period-close
capability:
exposes:
- type: mcp
namespace: finance-close
port: 8080
tools:
- name: trigger-period-close
description: "Given a SAP company code and fiscal period, check the SAP posting period status, generate a ServiceNow close checklist task, and notify the finance controller group in Teams. Invoke at the start of each month-end close cycle."
inputParameters:
- name: company_code
type: string
description: "The SAP company code, e.g. '1000' for Allianz SE."
- name: fiscal_year
type: string
description: "The fiscal year, e.g. '2025'."
- name: fiscal_period
type: string
description: "The fiscal period number, e.g. '12' for December."
steps:
- name: get-posting-period
type: call
call: "sap.get-posting-period"
with:
CompanyCode: "{{company_code}}"
FiscalYear: "{{fiscal_year}}"
FiscalPeriod: "{{fiscal_period}}"
- name: create-checklist
type: call
call: "servicenow.create-task"
with:
short_description: "Period-end close checklist: {{company_code}} FY{{fiscal_year}}-P{{fiscal_period}}"
description: "SAP posting period status: {{get-posting-period.PostingPeriodStatus}}\nCompany code: {{company_code}}\nPeriod: {{fiscal_period}} / {{fiscal_year}}\nClose activities: 1) Reconcile sub-ledgers 2) Post accruals 3) Run foreign currency valuation 4) Execute balance sheet reclassification"
assignment_group: "Finance_Controllers"
- name: notify-finance
type: call
call: "msteams.send-channel-message"
with:
channel_id: "$secrets.finance_channel_id"
text: "Period-end close initiated: {{company_code}} FY{{fiscal_year}}-P{{fiscal_period}} | SAP status: {{get-posting-period.PostingPeriodStatus}} | ServiceNow checklist: {{create-checklist.number}}"
consumes:
- namespace: sap
type: http
baseUri: "https://allianz-s4.sap.com/sap/opu/odata/sap/API_JOURNALENTRYITEMBASIC_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_pass"
resources:
- name: posting-periods
path: "/A_CompanyCode('{CompanyCode}')"
inputParameters:
- name: CompanyCode
in: path
- name: FiscalYear
in: query
- name: FiscalPeriod
in: query
operations:
- name: get-posting-period
method: GET
- namespace: servicenow
type: http
baseUri: "https://allianz.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_pass"
resources:
- name: tasks
path: "/table/task"
operations:
- name: create-task
method: POST
- namespace: msteams
type: http
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{team_id}/channels/{channel_id}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-channel-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://allianz-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://allianz.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
Retrieves a purchase order from SAP S/4HANA by PO number and returns the header details, line items, and current approval status for use in downstream approvals or reporting.
naftiko: "0.5"
info:
label: "SAP Purchase Order Lookup"
description: "Retrieves a purchase order from SAP S/4HANA by PO number and returns the header details, line items, and current approval status for use in downstream approvals or reporting."
tags:
- finance
- erp
- sap
- procurement
- lookup
capability:
exposes:
- type: mcp
namespace: procurement
port: 8080
tools:
- name: get-purchase-order
description: "Given a SAP purchase order number, fetch the PO header and line item details from SAP S/4HANA including supplier, total amount, currency, and approval status. Use when an agent or user needs to review or validate a PO before approval or payment."
inputParameters:
- name: purchase_order
type: string
description: "The SAP purchase order number, e.g. 4500012345."
call: "sap.get-po"
with:
PurchaseOrder: "{{purchase_order}}"
outputParameters:
- name: supplier_name
type: string
mapping: "$.SupplierName"
- name: total_net_amount
type: number
mapping: "$.NetPaymentAmount"
- name: currency
type: string
mapping: "$.DocumentCurrency"
- name: status
type: string
mapping: "$.ProcessingStatus"
consumes:
- namespace: sap
type: http
baseUri: "https://allianz-s4.sap.com/sap/opu/odata/sap/API_PURCHASEORDER_PROCESS_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_pass"
resources:
- name: purchase-orders
path: "/A_PurchaseOrder('{PurchaseOrder}')"
inputParameters:
- name: PurchaseOrder
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://allianz-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
Fetches all unassigned ServiceNow incidents older than a configurable threshold, uses an AI model to suggest priority and assignment group, and updates each incident record with the recommended routing.
naftiko: "0.5"
info:
label: "ServiceNow Backlog Triage and Prioritization"
description: "Fetches all unassigned ServiceNow incidents older than a configurable threshold, uses an AI model to suggest priority and assignment group, and updates each incident record with the recommended routing."
tags:
- itsm
- servicenow
- ai
- triage
- incident-management
capability:
exposes:
- type: mcp
namespace: itsm-triage
port: 8080
tools:
- name: triage-incident-backlog
description: "Given a maximum age in hours, fetch all unassigned open ServiceNow incidents older than that threshold, call the OpenAI API to suggest priority and assignment group based on the incident description, and update each incident with the AI-recommended routing. Invoke daily or when backlog size exceeds SLA limits."
inputParameters:
- name: max_age_hours
type: integer
description: "Maximum age in hours; incidents older than this threshold are included in the triage batch, e.g. 4."
- name: max_batch_size
type: integer
description: "Maximum number of incidents to process in one triage run, e.g. 20."
steps:
- name: get-unassigned-incidents
type: call
call: "servicenow-read.list-incidents"
with:
sysparm_query: "assigned_toISEMPTY^state=1^sys_created_onRELATIVELE@hour@ago@{{max_age_hours}}"
sysparm_limit: "{{max_batch_size}}"
sysparm_fields: "number,short_description,description,category"
- name: suggest-routing
type: call
call: "openai.create-completion"
with:
model: "gpt-4o"
prompt: "For each IT incident below, suggest a priority (1=Critical,2=High,3=Moderate,4=Low) and assignment group from: [Network_Ops, Security_Ops, App_Support, Desktop_Support, Claims_IT, Finance_IT]. Return JSON array with fields: number, priority, assignment_group.\n\nIncidents: {{get-unassigned-incidents.result}}"
- name: update-incidents
type: call
call: "servicenow-write.bulk-update-incidents"
with:
updates: "{{suggest-routing.choices[0].message.content}}"
consumes:
- namespace: servicenow-read
type: http
baseUri: "https://allianz.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_pass"
resources:
- name: incidents
path: "/table/incident"
inputParameters:
- name: sysparm_query
in: query
- name: sysparm_limit
in: query
- name: sysparm_fields
in: query
operations:
- name: list-incidents
method: GET
- namespace: openai
type: http
baseUri: "https://api.openai.com/v1"
authentication:
type: bearer
token: "$secrets.openai_api_key"
resources:
- name: completions
path: "/chat/completions"
operations:
- name: create-completion
method: POST
- namespace: servicenow-write
type: http
baseUri: "https://allianz.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_pass"
resources:
- name: incidents-bulk
path: "/table/incident"
operations:
- name: bulk-update-incidents
method: PATCH
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://allianz.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://allianz.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://allianz.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
Executes a Snowflake stored procedure to refresh the insurance KPI materialized views, then triggers a Power BI dataset refresh so dashboards reflect the latest data.
naftiko: "0.5"
info:
label: "Snowflake BI Refresh and Power BI Dataset Push"
description: "Executes a Snowflake stored procedure to refresh the insurance KPI materialized views, then triggers a Power BI dataset refresh so dashboards reflect the latest data."
tags:
- data
- analytics
- snowflake
- power-bi
- bi-refresh
- insurance
capability:
exposes:
- type: mcp
namespace: bi-ops
port: 8080
tools:
- name: refresh-bi-datasets
description: "Given a Snowflake stored procedure name and a Power BI dataset ID, execute the Snowflake refresh procedure and then trigger a Power BI dataset refresh. Invoke after nightly ETL completion or before scheduled executive report delivery."
inputParameters:
- name: snowflake_procedure
type: string
description: "The fully qualified Snowflake stored procedure to call, e.g. 'REPORTING.REFRESH_INSURANCE_KPIS()'."
- name: powerbi_group_id
type: string
description: "The Power BI workspace (group) ID containing the dataset to refresh."
- name: powerbi_dataset_id
type: string
description: "The Power BI dataset ID to trigger a refresh on."
steps:
- name: run-snowflake-refresh
type: call
call: "snowflake.execute-statement"
with:
statement: "CALL {{snowflake_procedure}}"
database: "ALLIANZ_DW"
schema: "REPORTING"
- name: trigger-powerbi-refresh
type: call
call: "powerbi.trigger-refresh"
with:
group_id: "{{powerbi_group_id}}"
dataset_id: "{{powerbi_dataset_id}}"
consumes:
- namespace: snowflake
type: http
baseUri: "https://allianz.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-statement
method: POST
- namespace: powerbi
type: http
baseUri: "https://api.powerbi.com/v1.0/myorg"
authentication:
type: bearer
token: "$secrets.powerbi_token"
resources:
- name: dataset-refreshes
path: "/groups/{group_id}/datasets/{dataset_id}/refreshes"
inputParameters:
- name: group_id
in: path
- name: dataset_id
in: path
operations:
- name: trigger-refresh
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://allianz.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
Runs data quality validation queries against key insurance data tables in Snowflake and raises a ServiceNow incident when row counts, null rates, or referential integrity checks fall outside acceptable thresholds.
naftiko: "0.5"
info:
label: "Snowflake Data Quality Monitor"
description: "Runs data quality validation queries against key insurance data tables in Snowflake and raises a ServiceNow incident when row counts, null rates, or referential integrity checks fall outside acceptable thresholds."
tags:
- data
- analytics
- snowflake
- servicenow
- data-quality
- monitoring
capability:
exposes:
- type: mcp
namespace: data-quality
port: 8080
tools:
- name: run-data-quality-check
description: "Given a Snowflake table name and schema, execute a suite of data quality validation queries (row count, null rate, referential integrity) and open a ServiceNow incident if any check fails. Invoke on a daily schedule after ETL pipeline completion."
inputParameters:
- name: table_name
type: string
description: "The fully qualified Snowflake table name to validate, e.g. CLAIMS.FACT_CLAIMS."
- name: min_row_count
type: integer
description: "Minimum expected row count; an incident is raised if the actual count falls below this value."
steps:
- name: check-row-count
type: call
call: "snowflake.execute-statement"
with:
statement: "SELECT COUNT(*) AS row_count FROM {{table_name}}"
database: "ALLIANZ_DW"
schema: "PUBLIC"
- name: open-incident
type: call
call: "servicenow.create-incident"
with:
short_description: "Data quality failure: {{table_name}} row count below threshold"
description: "Table: {{table_name}}\nActual row count: {{check-row-count.results[0].data[0]}}\nMinimum expected: {{min_row_count}}\nCheck time: now"
category: "data_engineering"
urgency: "2"
consumes:
- namespace: snowflake
type: http
baseUri: "https://allianz.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-statement
method: POST
- namespace: servicenow
type: http
baseUri: "https://allianz.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_pass"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
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://allianz.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://allianz.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
Queries Snowflake for the latest Solvency Capital Requirement (SCR) and Minimum Capital Requirement (MCR) metrics, compares them against regulatory thresholds, and raises a ServiceNow incident if any ratio falls below the required minimum.
naftiko: "0.5"
info:
label: "Solvency II Capital Adequacy Check"
description: "Queries Snowflake for the latest Solvency Capital Requirement (SCR) and Minimum Capital Requirement (MCR) metrics, compares them against regulatory thresholds, and raises a ServiceNow incident if any ratio falls below the required minimum."
tags:
- compliance
- insurance
- finance
- snowflake
- servicenow
- solvency-ii
- capital-management
capability:
exposes:
- type: mcp
namespace: capital-compliance
port: 8080
tools:
- name: check-capital-adequacy
description: "Given a reporting entity and calculation date, query Snowflake for the current SCR ratio and MCR ratio, compare against Solvency II minimums (SCR >= 100%, MCR >= 100%), and open a ServiceNow P1 incident if either ratio is breached. Invoke daily as part of the capital monitoring schedule."
inputParameters:
- name: entity_code
type: string
description: "The legal entity code for the Allianz entity to check, e.g. 'AZSE' for Allianz SE."
- name: calculation_date
type: string
description: "The date of the capital calculation in ISO 8601 format (YYYY-MM-DD)."
steps:
- name: get-capital-metrics
type: call
call: "snowflake.execute-statement"
with:
statement: "SELECT entity_code, scr_ratio, mcr_ratio, own_funds, scr_value, mcr_value FROM SOLVENCY.CAPITAL_ADEQUACY WHERE entity_code = '{{entity_code}}' AND calculation_date = '{{calculation_date}}'"
database: "ALLIANZ_DW"
schema: "SOLVENCY"
- name: raise-breach-incident
type: call
call: "servicenow.create-incident"
with:
short_description: "Solvency II capital breach: {{entity_code}} SCR/MCR below minimum"
description: "Entity: {{entity_code}}\nCalculation date: {{calculation_date}}\nSCR ratio: {{get-capital-metrics.results[0].data[1]}}\nMCR ratio: {{get-capital-metrics.results[0].data[2]}}\nImmediately escalate to Group CFO and Chief Actuary."
category: "regulatory_capital"
urgency: "1"
impact: "1"
consumes:
- namespace: snowflake
type: http
baseUri: "https://allianz.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-statement
method: POST
- namespace: servicenow
type: http
baseUri: "https://allianz.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_pass"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
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://allianz-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://allianz.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://allianz-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
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://allianz.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://allianz.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
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://allianz.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://allianz.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
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/allianz/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@allianz.com/sendMail"
operations:
- name: send-bulk-mail
method: POST
- type: http
namespace: snow
baseUri: "https://allianz.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/allianz/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/allianz/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
Queries Workday for current active headcount by department and cost center, then pushes the snapshot to a Snowflake table for downstream BI and workforce planning analytics.
naftiko: "0.5"
info:
label: "Workday Headcount Snapshot"
description: "Queries Workday for current active headcount by department and cost center, then pushes the snapshot to a Snowflake table for downstream BI and workforce planning analytics."
tags:
- hr
- analytics
- workday
- snowflake
- reporting
- headcount
capability:
exposes:
- type: mcp
namespace: hr-reporting
port: 8080
tools:
- name: snapshot-headcount
description: "Fetch current active employee headcount segmented by department from Workday, then insert the snapshot record into the Snowflake HR_ANALYTICS.HEADCOUNT_SNAPSHOTS table. Invoke on a daily or weekly schedule for workforce planning."
inputParameters:
- name: as_of_date
type: string
description: "Snapshot date in ISO 8601 format (YYYY-MM-DD). Determines the reference date for the Workday query."
steps:
- name: get-headcount
type: call
call: "workday.get-workers-report"
with:
effectiveDate: "{{as_of_date}}"
status: "Active"
- name: write-snapshot
type: call
call: "snowflake.execute-statement"
with:
statement: "INSERT INTO HR_ANALYTICS.HEADCOUNT_SNAPSHOTS SELECT '{{as_of_date}}' AS snapshot_date, department, COUNT(*) AS headcount FROM STAGING.WORKDAY_WORKERS GROUP BY department"
database: "ALLIANZ_DW"
schema: "HR_ANALYTICS"
consumes:
- namespace: workday
type: http
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: workers-report
path: "/workers"
inputParameters:
- name: effectiveDate
in: query
- name: status
in: query
operations:
- name: get-workers-report
method: GET
- namespace: snowflake
type: http
baseUri: "https://allianz.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-statement
method: POST
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/allianz/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
When a new job requisition is approved in Workday, creates a Jira recruiting ticket, posts the open position to the talent acquisition Teams channel, and updates the requisition with the Jira ticket reference.
naftiko: "0.5"
info:
label: "Workday Open Position Recruiter Assignment"
description: "When a new job requisition is approved in Workday, creates a Jira recruiting ticket, posts the open position to the talent acquisition Teams channel, and updates the requisition with the Jira ticket reference."
tags:
- hr
- recruiting
- workday
- jira
- microsoft-teams
- talent-acquisition
capability:
exposes:
- type: mcp
namespace: recruiting-ops
port: 8080
tools:
- name: assign-recruiter-for-requisition
description: "Given a Workday job requisition ID, fetch the requisition details, create a Jira ticket in the talent acquisition project with job details and hiring manager, and notify the talent acquisition Teams channel. Invoke when a job requisition is approved in Workday."
inputParameters:
- name: requisition_id
type: string
description: "The Workday job requisition ID, e.g. 'JR-00123'."
steps:
- name: get-requisition
type: call
call: "workday.get-job-requisition"
with:
requisitionId: "{{requisition_id}}"
- name: create-recruiting-ticket
type: call
call: "jira.create-issue"
with:
project_key: "TA"
issuetype: "Recruiting Task"
summary: "Open req: {{get-requisition.jobTitle}} — {{get-requisition.department}}"
description: "Requisition ID: {{requisition_id}}\nJob title: {{get-requisition.jobTitle}}\nDepartment: {{get-requisition.department}}\nHiring manager: {{get-requisition.hiringManagerName}}\nLocation: {{get-requisition.location}}\nTarget start date: {{get-requisition.targetStartDate}}"
- name: notify-ta-team
type: call
call: "msteams.send-channel-message"
with:
channel_id: "$secrets.talent_acquisition_channel_id"
text: "New Approved Requisition: {{get-requisition.jobTitle}} | Department: {{get-requisition.department}} | Hiring Manager: {{get-requisition.hiringManagerName}} | Jira: {{create-recruiting-ticket.key}}"
consumes:
- namespace: workday
type: http
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: job-requisitions
path: "/jobRequisitions/{requisitionId}"
inputParameters:
- name: requisitionId
in: path
operations:
- name: get-job-requisition
method: GET
- namespace: jira
type: http
baseUri: "https://allianz.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
- namespace: msteams
type: http
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{team_id}/channels/{channel_id}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-channel-message
method: POST
Compares the current payroll run totals from Workday against the prior period baseline in Snowflake, and raises a ServiceNow incident if any variance exceeds the configured threshold.
naftiko: "0.5"
info:
label: "Workday Payroll Variance Detector"
description: "Compares the current payroll run totals from Workday against the prior period baseline in Snowflake, and raises a ServiceNow incident if any variance exceeds the configured threshold."
tags:
- hr
- finance
- payroll
- workday
- snowflake
- servicenow
- monitoring
capability:
exposes:
- type: mcp
namespace: payroll-ops
port: 8080
tools:
- name: detect-payroll-variance
description: "Given a Workday payroll run ID and variance threshold percentage, fetch the current payroll totals, compare against the prior period stored in Snowflake, and open a ServiceNow incident if variance exceeds the threshold. Invoke after each payroll calculation run completes."
inputParameters:
- name: payroll_run_id
type: string
description: "The Workday payroll run ID to validate."
- name: variance_threshold_pct
type: number
description: "Maximum acceptable variance percentage between current and prior period, e.g. 5.0 for 5%."
steps:
- name: get-payroll-run
type: call
call: "workday.get-payroll-run"
with:
runId: "{{payroll_run_id}}"
- name: get-prior-period
type: call
call: "snowflake.execute-statement"
with:
statement: "SELECT total_gross_pay FROM PAYROLL.RUN_HISTORY ORDER BY run_date DESC LIMIT 1"
database: "ALLIANZ_DW"
schema: "PAYROLL"
- name: open-variance-incident
type: call
call: "servicenow.create-incident"
with:
short_description: "Payroll variance detected: run {{payroll_run_id}}"
description: "Current run gross pay: {{get-payroll-run.totalGrossPay}}\nPrior period: {{get-prior-period.results[0].data[0]}}\nThreshold: {{variance_threshold_pct}}%\nImmediate review required before payroll submission."
category: "payroll"
urgency: "1"
consumes:
- namespace: workday
type: http
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: payroll-runs
path: "/payrollRuns/{runId}"
inputParameters:
- name: runId
in: path
operations:
- name: get-payroll-run
method: GET
- namespace: snowflake
type: http
baseUri: "https://allianz.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-statement
method: POST
- namespace: servicenow
type: http
baseUri: "https://allianz.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_pass"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
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/allianz/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://allianz.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
When an employee's role or department changes in Workday, updates their Microsoft 365 group memberships and raises a ServiceNow task for IT to review any privileged access changes.
naftiko: "0.5"
info:
label: "Workday Role Change Access Provisioning"
description: "When an employee's role or department changes in Workday, updates their Microsoft 365 group memberships and raises a ServiceNow task for IT to review any privileged access changes."
tags:
- hr
- identity
- workday
- microsoft-365
- servicenow
- access-management
capability:
exposes:
- type: mcp
namespace: iam-provisioning
port: 8080
tools:
- name: sync-role-change-access
description: "Given a Workday employee ID, old role, and new role, fetch the employee's Microsoft 365 object ID, update their group memberships to reflect the new role, and create a ServiceNow access review task for IT security. Invoke when a Workday business process for position or department change completes."
inputParameters:
- name: employee_id
type: string
description: "The Workday worker ID of the employee whose role has changed."
- name: old_role
type: string
description: "The employee's previous role or job title, e.g. 'Claims Analyst'."
- name: new_role
type: string
description: "The employee's new role or job title, e.g. 'Senior Claims Manager'."
steps:
- name: get-worker
type: call
call: "workday.get-worker"
with:
worker_id: "{{employee_id}}"
- name: update-group-membership
type: call
call: "msgraph.add-group-member"
with:
group_display_name: "{{new_role}}-Access"
user_id: "{{get-worker.azure_object_id}}"
- name: create-review-task
type: call
call: "servicenow.create-task"
with:
short_description: "Access review: role change for {{get-worker.display_name}}"
description: "Employee: {{get-worker.display_name}}\nPrevious role: {{old_role}}\nNew role: {{new_role}}\nAction taken: M365 group updated to {{new_role}}-Access. Please review and revoke legacy privileged access."
assignment_group: "IT_Security"
consumes:
- namespace: workday
type: http
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
- namespace: msgraph
type: http
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: group-members
path: "/groups/{group_id}/members/$ref"
inputParameters:
- name: group_id
in: path
operations:
- name: add-group-member
method: POST
- namespace: servicenow
type: http
baseUri: "https://allianz.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_pass"
resources:
- name: tasks
path: "/table/task"
operations:
- name: create-task
method: POST