Texaco Capabilities
Naftiko 0.5 capability definitions for Texaco - 100 capabilities showing integration workflows and service orchestrations.
Retrieves members of a specified Azure AD security group, cross-references against active Workday employees, and posts a list of potential stale access accounts to the security Teams channel for review.
naftiko: "0.5"
info:
label: "Azure AD Group Access Review"
description: "Retrieves members of a specified Azure AD security group, cross-references against active Workday employees, and posts a list of potential stale access accounts to the security Teams channel for review."
tags:
- security
- identity
- azure
- workday
- access-management
capability:
exposes:
- type: mcp
namespace: security-access-review
port: 8080
tools:
- name: review-group-access
description: "Given an Azure AD group ID, retrieve all group members and cross-reference against active Workday workers to identify potential stale accounts. Post the review report to the security Teams channel. Use for quarterly access reviews."
inputParameters:
- name: group_id
in: body
type: string
description: "The Azure AD group object ID to review."
steps:
- name: get-group-members
type: call
call: "msgraph-groups.get-members"
with:
group_id: "{{group_id}}"
- name: notify-security
type: call
call: "teams-security.send-message"
with:
channel: "security-access-reviews"
text: "Access Review | Group: {{group_id}} | Members: {{get-group-members.total_count}} | Review completed — check for stale accounts."
consumes:
- type: http
namespace: msgraph-groups
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: group-members
path: "/groups/{{group_id}}/members"
inputParameters:
- name: group_id
in: path
operations:
- name: get-members
method: GET
- type: http
namespace: teams-security
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Identifies unused Microsoft 365 licenses in Azure AD, creates a ServiceNow reclamation task, and notifies the IT asset management team on Teams.
naftiko: "0.5"
info:
label: "Azure AD License Reclamation Workflow"
description: "Identifies unused Microsoft 365 licenses in Azure AD, creates a ServiceNow reclamation task, and notifies the IT asset management team on Teams."
tags:
- it-asset-management
- azure-ad
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: license-mgmt
port: 8080
tools:
- name: reclaim-unused-licenses
description: "Query Azure AD for inactive users with assigned licenses, create a reclamation task, and notify the team."
inputParameters:
- name: days_inactive
in: body
type: string
description: "Number of days of inactivity to flag (e.g., 90)."
steps:
- name: get-inactive-users
type: call
call: "msgraph.get-inactive-users"
with:
days_inactive: "{{days_inactive}}"
- name: create-reclamation-task
type: call
call: "servicenow.create-task"
with:
short_description: "License reclamation: {{get-inactive-users.count}} inactive users ({{days_inactive}}+ days)"
description: "Users inactive for {{days_inactive}}+ days with assigned M365 licenses."
assignment_group: "IT_Asset_Management"
- name: notify-asset-team
type: call
call: "msteams.post-channel-message"
with:
channel_id: "$secrets.teams_it_asset_channel"
text: "License reclamation opportunity: {{get-inactive-users.count}} users inactive {{days_inactive}}+ days | Task: {{create-reclamation-task.number}}"
consumes:
- type: http
namespace: msgraph
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: users
path: "/users?$filter=signInActivity/lastSignInDateTime le {{days_inactive}}"
operations:
- name: get-inactive-users
method: GET
- type: http
namespace: servicenow
baseUri: "https://texaco.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: create-task
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/it-assets/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Fetches Azure Advisor cost optimization recommendations, creates Jira tickets for the cloud team, and posts a weekly summary to the FinOps Teams channel.
naftiko: "0.5"
info:
label: "Azure Cost Optimization Recommendation"
description: "Fetches Azure Advisor cost optimization recommendations, creates Jira tickets for the cloud team, and posts a weekly summary to the FinOps Teams channel."
tags:
- cloud
- finops
- azure
- jira
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: cloud-finops
port: 8080
tools:
- name: process-cost-recommendations
description: "Fetch Azure Advisor cost recommendations, create Jira tickets, and notify the FinOps team."
inputParameters:
- name: subscription_id
in: body
type: string
description: "The Azure subscription ID."
steps:
- name: get-recommendations
type: call
call: "azure.get-advisor-recommendations"
with:
subscription_id: "{{subscription_id}}"
category: "Cost"
- name: create-jira-ticket
type: call
call: "jira.create-issue"
with:
project: "CLOUD"
summary: "Azure cost optimization: {{get-recommendations.count}} recommendations"
description: "Top recommendation: {{get-recommendations.top_recommendation}}. Estimated savings: ${{get-recommendations.estimated_savings}}."
issue_type: "Task"
- name: notify-finops
type: call
call: "msteams.post-channel-message"
with:
channel_id: "$secrets.teams_finops_channel"
text: "Azure Cost Optimization: {{get-recommendations.count}} recommendations | Savings: ${{get-recommendations.estimated_savings}} | Jira: {{create-jira-ticket.key}}"
consumes:
- type: http
namespace: azure
baseUri: "https://management.azure.com"
authentication:
type: bearer
token: "$secrets.azure_mgmt_token"
resources:
- name: advisor
path: "/subscriptions/{{subscription_id}}/providers/Microsoft.Advisor/recommendations?api-version=2022-10-01&$filter=Category eq 'Cost'"
inputParameters:
- name: subscription_id
in: path
operations:
- name: get-advisor-recommendations
method: GET
- type: http
namespace: jira
baseUri: "https://texaco.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/finops/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
When an Azure Databricks job fails, fetches run details, creates a Jira ticket for the data engineering team, and posts the failure context to the data ops Teams channel.
naftiko: "0.5"
info:
label: "Azure Databricks Job Failure Response"
description: "When an Azure Databricks job fails, fetches run details, creates a Jira ticket for the data engineering team, and posts the failure context to the data ops Teams channel."
tags:
- data
- azure-databricks
- jira
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: data-platform
port: 8080
tools:
- name: handle-databricks-failure
description: "Given a Databricks run ID, fetch failure details, create a Jira ticket, and notify data ops."
inputParameters:
- name: run_id
in: body
type: string
description: "The Databricks job run ID."
steps:
- name: get-run-details
type: call
call: "databricks.get-run"
with:
run_id: "{{run_id}}"
- name: create-jira-ticket
type: call
call: "jira.create-issue"
with:
project: "DATA"
summary: "Databricks job failure: {{get-run-details.run_name}}"
description: "Run ID: {{run_id}}. State: {{get-run-details.state}}. Error: {{get-run-details.error_message}}."
issue_type: "Bug"
- name: notify-data-ops
type: call
call: "msteams.post-channel-message"
with:
channel_id: "$secrets.teams_data_ops_channel"
text: "Databricks Failure: {{get-run-details.run_name}} | Run: {{run_id}} | Error: {{get-run-details.error_message}} | Jira: {{create-jira-ticket.key}}"
consumes:
- type: http
namespace: databricks
baseUri: "https://adb-texaco.azuredatabricks.net/api/2.1"
authentication:
type: bearer
token: "$secrets.databricks_token"
resources:
- name: runs
path: "/jobs/runs/get?run_id={{run_id}}"
inputParameters:
- name: run_id
in: query
operations:
- name: get-run
method: GET
- type: http
namespace: jira
baseUri: "https://texaco.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/data-ops/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
When an Azure DevOps build pipeline fails, fetches build details, creates a Jira bug, and notifies the development team on Teams.
naftiko: "0.5"
info:
label: "Azure DevOps Build Failure Notification"
description: "When an Azure DevOps build pipeline fails, fetches build details, creates a Jira bug, and notifies the development team on Teams."
tags:
- devops
- azure-devops
- jira
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: cicd
port: 8080
tools:
- name: handle-build-failure
description: "Given an Azure DevOps build ID that failed, fetch details, create a Jira bug, and notify the dev team."
inputParameters:
- name: project_name
in: body
type: string
description: "The Azure DevOps project name."
- name: build_id
in: body
type: string
description: "The failed build ID."
steps:
- name: get-build
type: call
call: "azdevops.get-build"
with:
project_name: "{{project_name}}"
build_id: "{{build_id}}"
- name: create-bug
type: call
call: "jira.create-issue"
with:
project: "DEV"
summary: "Build failure: {{get-build.definition_name}} #{{build_id}}"
description: "Pipeline: {{get-build.definition_name}}. Reason: {{get-build.result}}. Requested by: {{get-build.requested_by}}."
issue_type: "Bug"
- name: notify-dev-team
type: call
call: "msteams.post-channel-message"
with:
channel_id: "$secrets.teams_dev_channel"
text: "Build Failed: {{get-build.definition_name}} #{{build_id}} | Jira: {{create-bug.key}} | By: {{get-build.requested_by}}"
consumes:
- type: http
namespace: azdevops
baseUri: "https://dev.azure.com/texaco"
authentication:
type: basic
username: ""
password: "$secrets.azdevops_pat"
resources:
- name: builds
path: "/{{project_name}}/_apis/build/builds/{{build_id}}?api-version=7.0"
inputParameters:
- name: project_name
in: path
- name: build_id
in: path
operations:
- name: get-build
method: GET
- type: http
namespace: jira
baseUri: "https://texaco.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/engineering/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Accepts a request to provision a new Azure resource group and virtual network, creates the resources via the Azure Management API, and logs the provisioning event in ServiceNow as a change record.
naftiko: "0.5"
info:
label: "Azure Infrastructure Provisioning Request"
description: "Accepts a request to provision a new Azure resource group and virtual network, creates the resources via the Azure Management API, and logs the provisioning event in ServiceNow as a change record."
tags:
- cloud
- infrastructure
- azure
- servicenow
- provisioning
capability:
exposes:
- type: mcp
namespace: cloud-provisioning
port: 8080
tools:
- name: provision-azure-resource-group
description: "Given subscription ID, resource group name, and Azure region, create the resource group via Azure Management API and log the provisioning as a ServiceNow change record. Use when new project infrastructure is approved and needs to be spun up."
inputParameters:
- name: subscription_id
in: body
type: string
description: "The Azure subscription ID where the resource group will be created."
- name: resource_group_name
in: body
type: string
description: "The name for the new Azure resource group."
- name: location
in: body
type: string
description: "Azure region for the resource group, e.g. eastus, westeurope."
steps:
- name: create-rg
type: call
call: "azure-mgmt.create-resource-group"
with:
subscription_id: "{{subscription_id}}"
resource_group_name: "{{resource_group_name}}"
location: "{{location}}"
- name: log-change
type: call
call: "servicenow-infra.create-change"
with:
short_description: "Azure RG Provisioned: {{resource_group_name}} in {{location}}"
category: "cloud_provisioning"
state: "closed"
consumes:
- type: http
namespace: azure-mgmt
baseUri: "https://management.azure.com"
authentication:
type: bearer
token: "$secrets.azure_mgmt_token"
resources:
- name: resource-groups
path: "/subscriptions/{{subscription_id}}/resourcegroups/{{resource_group_name}}"
inputParameters:
- name: subscription_id
in: path
- name: resource_group_name
in: path
operations:
- name: create-resource-group
method: PUT
- type: http
namespace: servicenow-infra
baseUri: "https://texaco.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: change-requests
path: "/table/change_request"
operations:
- name: create-change
method: POST
Retrieves a secret value from Azure Key Vault by name for secure configuration lookups.
naftiko: "0.5"
info:
label: "Azure Key Vault Secret Retrieval"
description: "Retrieves a secret value from Azure Key Vault by name for secure configuration lookups."
tags:
- security
- azure
- key-vault
capability:
exposes:
- type: mcp
namespace: secrets-mgmt
port: 8080
tools:
- name: get-secret
description: "Retrieve a secret from Azure Key Vault by name. Returns the secret value and version."
inputParameters:
- name: vault_name
in: body
type: string
description: "The Azure Key Vault name."
- name: secret_name
in: body
type: string
description: "The secret name to retrieve."
call: "keyvault.get-secret"
with:
vault_name: "{{vault_name}}"
secret_name: "{{secret_name}}"
outputParameters:
- name: value
type: string
mapping: "$.value"
- name: version
type: string
mapping: "$.id"
consumes:
- type: http
namespace: keyvault
baseUri: "https://{{vault_name}}.vault.azure.net"
authentication:
type: bearer
token: "$secrets.azure_keyvault_token"
resources:
- name: secrets
path: "/secrets/{{secret_name}}?api-version=7.4"
inputParameters:
- name: secret_name
in: path
operations:
- name: get-secret
method: GET
Lists all Azure resource groups in a subscription, returning names, locations, and tags for infrastructure inventory.
naftiko: "0.5"
info:
label: "Azure Resource Group Listing"
description: "Lists all Azure resource groups in a subscription, returning names, locations, and tags for infrastructure inventory."
tags:
- cloud
- azure
- infrastructure
capability:
exposes:
- type: mcp
namespace: cloud-infra
port: 8080
tools:
- name: list-resource-groups
description: "List all Azure resource groups for the Texaco subscription. Returns resource group names, locations, and tag metadata."
inputParameters:
- name: subscription_id
in: body
type: string
description: "The Azure subscription ID."
call: "azure.list-resource-groups"
with:
subscription_id: "{{subscription_id}}"
outputParameters:
- name: resource_groups
type: array
mapping: "$.value[*].name"
consumes:
- type: http
namespace: azure
baseUri: "https://management.azure.com"
authentication:
type: bearer
token: "$secrets.azure_mgmt_token"
resources:
- name: resource-groups
path: "/subscriptions/{{subscription_id}}/resourcegroups?api-version=2021-04-01"
inputParameters:
- name: subscription_id
in: path
operations:
- name: list-resource-groups
method: GET
Processes a VM scaling request by validating cloud budget in SAP, provisioning the Azure resources via ARM, and creating a ServiceNow change record.
naftiko: "0.5"
info:
label: "Azure VM Scaling Request Workflow"
description: "Processes a VM scaling request by validating cloud budget in SAP, provisioning the Azure resources via ARM, and creating a ServiceNow change record."
tags:
- cloud
- infrastructure
- azure
- sap
- servicenow
capability:
exposes:
- type: mcp
namespace: cloud-ops
port: 8080
tools:
- name: process-scaling-request
description: "Given a scaling request with resource group, VM size, and cost center, validate budget, provision the VM, and log the change."
inputParameters:
- name: resource_group
in: body
type: string
description: "The Azure resource group name."
- name: vm_size
in: body
type: string
description: "The target Azure VM size."
- name: cost_center
in: body
type: string
description: "The SAP cost center for budget validation."
steps:
- name: check-budget
type: call
call: "sap.get-budget"
with:
cost_center: "{{cost_center}}"
- name: scale-vm
type: call
call: "azure.update-vm"
with:
resource_group: "{{resource_group}}"
vm_size: "{{vm_size}}"
- name: create-change-record
type: call
call: "servicenow.create-change"
with:
short_description: "Azure VM scaling: {{resource_group}} to {{vm_size}}"
description: "Cost center: {{cost_center}}. Available budget: {{check-budget.remaining_budget}}."
category: "infrastructure"
consumes:
- type: http
namespace: sap
baseUri: "https://texaco-s4.sap.com/sap/opu/odata/sap/API_COSTCENTER_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: budgets
path: "/A_CostCenter('{{cost_center}}')"
inputParameters:
- name: cost_center
in: path
operations:
- name: get-budget
method: GET
- type: http
namespace: azure
baseUri: "https://management.azure.com"
authentication:
type: bearer
token: "$secrets.azure_mgmt_token"
resources:
- name: vms
path: "/subscriptions/$secrets.azure_subscription_id/resourceGroups/{{resource_group}}/providers/Microsoft.Compute/virtualMachines"
inputParameters:
- name: resource_group
in: path
operations:
- name: update-vm
method: PUT
- type: http
namespace: servicenow
baseUri: "https://texaco.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: changes
path: "/table/change_request"
operations:
- name: create-change
method: POST
Queries Azure cost management for spending anomalies over the past 7 days, compares against budget thresholds, and posts a cost alert to the cloud operations Teams channel.
naftiko: "0.5"
info:
label: "Cloud Cost Anomaly Detector"
description: "Queries Azure cost management for spending anomalies over the past 7 days, compares against budget thresholds, and posts a cost alert to the cloud operations Teams channel."
tags:
- cloud
- cost-management
- azure
- microsoft-teams
- monitoring
capability:
exposes:
- type: mcp
namespace: cloud-cost
port: 8080
tools:
- name: detect-cost-anomaly
description: "Query Azure Cost Management for the specified subscription's spend over the past 7 days, identify cost spikes against the monthly budget, and post an alert to the cloud ops Teams channel. Use for proactive cloud spend governance."
inputParameters:
- name: subscription_id
in: body
type: string
description: "The Azure subscription ID to query for cost anomalies."
- name: budget_threshold_usd
in: body
type: number
description: "Monthly budget threshold in USD. Anomalies exceeding 20% of this value will trigger an alert."
steps:
- name: query-costs
type: call
call: "azure-cost.get-usage"
with:
subscription_id: "{{subscription_id}}"
- name: post-alert
type: call
call: "teams-cloud.send-message"
with:
channel: "cloud-ops-alerts"
text: "Cloud Cost Alert | Subscription: {{subscription_id}} | 7-day Spend: {{query-costs.total_cost}} {{query-costs.currency}} | Review recommended."
consumes:
- type: http
namespace: azure-cost
baseUri: "https://management.azure.com"
authentication:
type: bearer
token: "$secrets.azure_mgmt_token"
resources:
- name: usage-details
path: "/subscriptions/{{subscription_id}}/providers/Microsoft.Consumption/usageDetails"
inputParameters:
- name: subscription_id
in: path
operations:
- name: get-usage
method: GET
- type: http
namespace: teams-cloud
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Fetches the content of a Confluence wiki page by page ID for knowledge base lookups and documentation review.
naftiko: "0.5"
info:
label: "Confluence Page Content Retrieval"
description: "Fetches the content of a Confluence wiki page by page ID for knowledge base lookups and documentation review."
tags:
- knowledge-management
- confluence
capability:
exposes:
- type: mcp
namespace: knowledge
port: 8080
tools:
- name: get-confluence-page
description: "Retrieve a Confluence page by ID. Returns the page title, body content, and last-modified date."
inputParameters:
- name: page_id
in: body
type: string
description: "The Confluence page ID."
call: "confluence.get-page"
with:
page_id: "{{page_id}}"
outputParameters:
- name: title
type: string
mapping: "$.title"
- name: body
type: string
mapping: "$.body.storage.value"
- name: last_modified
type: string
mapping: "$.version.when"
consumes:
- type: http
namespace: confluence
baseUri: "https://texaco.atlassian.net/wiki/rest/api"
authentication:
type: basic
username: "$secrets.confluence_user"
password: "$secrets.confluence_api_token"
resources:
- name: pages
path: "/content/{{page_id}}?expand=body.storage,version"
inputParameters:
- name: page_id
in: path
operations:
- name: get-page
method: GET
Monitors crude oil price thresholds from market data, logs the alert in Snowflake, and notifies the trading desk via Teams with position context from SAP.
naftiko: "0.5"
info:
label: "Crude Oil Price Alert to Trading Desk"
description: "Monitors crude oil price thresholds from market data, logs the alert in Snowflake, and notifies the trading desk via Teams with position context from SAP."
tags:
- trading
- commodities
- snowflake
- sap
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: trading-alerts
port: 8080
tools:
- name: alert-price-breach
description: "Given a commodity and price threshold breach, log, get positions, and notify the trading desk."
inputParameters:
- name: commodity
in: body
type: string
description: "The commodity (e.g., WTI, Brent)."
- name: current_price
in: body
type: string
description: "The current market price."
- name: threshold_direction
in: body
type: string
description: "Whether price went above or below threshold."
steps:
- name: log-alert
type: call
call: "snowflake.execute-query"
with:
statement: "INSERT INTO TRADING_DB.PUBLIC.PRICE_ALERTS (commodity, price, direction, alert_time) VALUES ('{{commodity}}', '{{current_price}}', '{{threshold_direction}}', CURRENT_TIMESTAMP())"
- name: get-position
type: call
call: "sap.get-commodity-position"
with:
commodity: "{{commodity}}"
- name: notify-trading
type: call
call: "msteams.post-channel-message"
with:
channel_id: "$secrets.teams_trading_channel"
text: "Price Alert: {{commodity}} {{threshold_direction}} at ${{current_price}} | Current position: {{get-position.net_volume}} bbl | Value: ${{get-position.market_value}}"
consumes:
- type: http
namespace: snowflake
baseUri: "https://texaco.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-query
method: POST
- type: http
namespace: sap
baseUri: "https://texaco-s4.sap.com/sap/opu/odata/sap/API_COMMODITY_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: positions
path: "/A_CommodityPosition"
operations:
- name: get-commodity-position
method: GET
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/trading/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
When a Datadog monitor triggers a critical alert, creates a PagerDuty incident and posts context to the on-call Teams channel.
naftiko: "0.5"
info:
label: "Datadog Alert to PagerDuty Escalation"
description: "When a Datadog monitor triggers a critical alert, creates a PagerDuty incident and posts context to the on-call Teams channel."
tags:
- observability
- incident-response
- datadog
- pagerduty
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: incident-mgmt
port: 8080
tools:
- name: escalate-critical-alert
description: "Given a Datadog monitor ID, create a PagerDuty incident and notify the on-call team on Teams."
inputParameters:
- name: monitor_id
in: body
type: string
description: "The Datadog monitor ID."
- name: service_name
in: body
type: string
description: "The affected service name."
steps:
- name: get-monitor
type: call
call: "datadog.get-monitor"
with:
monitor_id: "{{monitor_id}}"
- name: create-pagerduty-incident
type: call
call: "pagerduty.create-incident"
with:
service_id: "$secrets.pagerduty_service_id"
title: "Critical: {{get-monitor.name}} — {{service_name}}"
urgency: "high"
- name: notify-oncall
type: call
call: "msteams.post-channel-message"
with:
channel_id: "$secrets.teams_oncall_channel"
text: "PagerDuty incident created: {{create-pagerduty-incident.incident_number}} | Monitor: {{get-monitor.name}} | Service: {{service_name}}"
consumes:
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: apikey
key: "DD-API-KEY"
value: "$secrets.datadog_api_key"
placement: header
resources:
- name: monitors
path: "/monitor/{{monitor_id}}"
inputParameters:
- name: monitor_id
in: path
operations:
- name: get-monitor
method: GET
- type: http
namespace: pagerduty
baseUri: "https://api.pagerduty.com"
authentication:
type: bearer
token: "$secrets.pagerduty_token"
resources:
- name: incidents
path: "/incidents"
operations:
- name: create-incident
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/sre/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Retrieves the current status and configuration of a Datadog monitor by ID for observability triage.
naftiko: "0.5"
info:
label: "Datadog Monitor Status Check"
description: "Retrieves the current status and configuration of a Datadog monitor by ID for observability triage."
tags:
- observability
- datadog
capability:
exposes:
- type: mcp
namespace: monitoring
port: 8080
tools:
- name: get-monitor-status
description: "Check the status of a Datadog monitor by ID. Returns overall state, message, and last triggered timestamp."
inputParameters:
- name: monitor_id
in: body
type: string
description: "The Datadog monitor ID."
call: "datadog.get-monitor"
with:
monitor_id: "{{monitor_id}}"
outputParameters:
- name: status
type: string
mapping: "$.overall_state"
- name: message
type: string
mapping: "$.message"
- name: name
type: string
mapping: "$.name"
consumes:
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: apikey
key: "DD-API-KEY"
value: "$secrets.datadog_api_key"
placement: header
resources:
- name: monitors
path: "/monitor/{{monitor_id}}"
inputParameters:
- name: monitor_id
in: path
operations:
- name: get-monitor
method: GET
When an employee termination is recorded in Workday, disables the Microsoft 365 account, revokes Okta sessions, and opens a ServiceNow offboarding ticket for equipment retrieval.
naftiko: "0.5"
info:
label: "Employee Offboarding Workflow"
description: "When an employee termination is recorded in Workday, disables the Microsoft 365 account, revokes Okta sessions, and opens a ServiceNow offboarding ticket for equipment retrieval."
tags:
- hr
- offboarding
- workday
- okta
- servicenow
- microsoft-365
capability:
exposes:
- type: mcp
namespace: hr-offboarding
port: 8080
tools:
- name: trigger-offboarding
description: "Given a Workday employee ID and termination date, disable the employee's Microsoft 365 account, revoke all Okta sessions, and open a ServiceNow offboarding ticket for IT equipment collection."
inputParameters:
- name: workday_employee_id
in: body
type: string
description: "The Workday worker ID for the departing employee."
- name: termination_date
in: body
type: string
description: "The employee's last day in YYYY-MM-DD format."
steps:
- name: get-employee
type: call
call: "workday-hr.get-worker"
with:
worker_id: "{{workday_employee_id}}"
- name: disable-m365
type: call
call: "msgraph-offboard.disable-user"
with:
user_id: "{{get-employee.azure_ad_id}}"
- name: revoke-okta
type: call
call: "okta.clear-user-sessions"
with:
user_id: "{{get-employee.okta_id}}"
- name: open-offboard-ticket
type: call
call: "servicenow-offboard.create-incident"
with:
short_description: "Offboarding: {{get-employee.full_name}} — termination {{termination_date}}"
category: "hr_offboarding"
consumes:
- type: http
namespace: workday-hr
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: workers
path: "/texaco/workers/{{worker_id}}"
inputParameters:
- name: worker_id
in: path
operations:
- name: get-worker
method: GET
- type: http
namespace: msgraph-offboard
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: users
path: "/users/{{user_id}}"
inputParameters:
- name: user_id
in: path
operations:
- name: disable-user
method: PATCH
- type: http
namespace: okta
baseUri: "https://texaco.okta.com/api/v1"
authentication:
type: apikey
key: "Authorization"
value: "$secrets.okta_api_token"
placement: header
resources:
- name: user-sessions
path: "/users/{{user_id}}/sessions"
inputParameters:
- name: user_id
in: path
operations:
- name: clear-user-sessions
method: DELETE
- type: http
namespace: servicenow-offboard
baseUri: "https://texaco.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
When a new hire is created in Workday, opens a ServiceNow onboarding ticket, provisions a Microsoft 365 account, and sends a Teams welcome message to the new employee.
naftiko: "0.5"
info:
label: "Employee Onboarding Orchestrator"
description: "When a new hire is created in Workday, opens a ServiceNow onboarding ticket, provisions a Microsoft 365 account, and sends a Teams welcome message to the new employee."
tags:
- hr
- onboarding
- workday
- servicenow
- microsoft-teams
- microsoft-365
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 onboarding sequence: fetch employee details from Workday, open a ServiceNow onboarding ticket, provision a Microsoft 365 account via Graph API, and send a Teams welcome message."
inputParameters:
- name: workday_employee_id
in: body
type: string
description: "The Workday worker ID for the new hire."
- name: start_date
in: body
type: string
description: "The employee's start date in YYYY-MM-DD format."
steps:
- name: get-employee
type: call
call: "workday.get-worker"
with:
worker_id: "{{workday_employee_id}}"
- name: open-ticket
type: call
call: "servicenow.create-incident"
with:
short_description: "New hire onboarding: {{get-employee.full_name}}"
category: "hr_onboarding"
assigned_group: "IT_Onboarding"
- name: provision-account
type: call
call: "msgraph.create-user"
with:
display_name: "{{get-employee.full_name}}"
mail_nickname: "{{get-employee.email_alias}}"
department: "{{get-employee.department}}"
- name: send-welcome
type: call
call: "msteams.send-message"
with:
recipient_upn: "{{get-employee.work_email}}"
text: "Welcome to Texaco, {{get-employee.first_name}}! Your onboarding ticket is {{open-ticket.number}}."
consumes:
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: workers
path: "/texaco/workers/{{worker_id}}"
inputParameters:
- name: worker_id
in: path
operations:
- name: get-worker
method: GET
- type: http
namespace: servicenow
baseUri: "https://texaco.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: msgraph
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: users
path: "/users"
operations:
- name: create-user
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: chats
path: "/users/{{recipient_upn}}/sendMail"
inputParameters:
- name: recipient_upn
in: path
operations:
- name: send-message
method: POST
Pulls emissions data from Snowflake, generates a compliance report in Confluence, and sends the report link to the EHS team via Teams.
naftiko: "0.5"
info:
label: "Environmental Compliance Report Generator"
description: "Pulls emissions data from Snowflake, generates a compliance report in Confluence, and sends the report link to the EHS team via Teams."
tags:
- compliance
- environment
- snowflake
- confluence
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: ehs-reporting
port: 8080
tools:
- name: generate-compliance-report
description: "Given a facility name and reporting period, pull emissions data, publish to Confluence, and notify EHS."
inputParameters:
- name: facility_name
in: body
type: string
description: "The facility name for the report."
- name: reporting_period
in: body
type: string
description: "The reporting period (e.g., 2026-Q1)."
steps:
- name: get-emissions-data
type: call
call: "snowflake.execute-query"
with:
statement: "SELECT emission_type, SUM(quantity) as total FROM EHS_DB.PUBLIC.EMISSIONS WHERE facility='{{facility_name}}' AND period='{{reporting_period}}' GROUP BY emission_type"
- name: publish-report
type: call
call: "confluence.create-page"
with:
space_key: "EHS"
title: "Environmental Compliance: {{facility_name}} — {{reporting_period}}"
body: "Emissions data for {{facility_name}} during {{reporting_period}}: {{get-emissions-data.results}}"
- name: notify-ehs
type: call
call: "msteams.post-channel-message"
with:
channel_id: "$secrets.teams_ehs_channel"
text: "Environmental compliance report published: {{facility_name}} {{reporting_period}} | {{publish-report.url}}"
consumes:
- type: http
namespace: snowflake
baseUri: "https://texaco.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-query
method: POST
- type: http
namespace: confluence
baseUri: "https://texaco.atlassian.net/wiki/rest/api"
authentication:
type: basic
username: "$secrets.confluence_user"
password: "$secrets.confluence_api_token"
resources:
- name: pages
path: "/content"
operations:
- name: create-page
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/ehs/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
When SAP detects fuel inventory below threshold at a distribution terminal, creates a ServiceNow replenishment request and notifies the supply chain team via Microsoft Teams.
naftiko: "0.5"
info:
label: "Fuel Inventory Low Stock Alert Workflow"
description: "When SAP detects fuel inventory below threshold at a distribution terminal, creates a ServiceNow replenishment request and notifies the supply chain team via Microsoft Teams."
tags:
- supply-chain
- sap
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: supply-chain-ops
port: 8080
tools:
- name: handle-low-stock-alert
description: "Given a SAP plant and material number with low stock, create a ServiceNow replenishment request and alert the supply chain team on Teams."
inputParameters:
- name: plant_code
in: body
type: string
description: "The SAP plant code for the distribution terminal."
- name: material_number
in: body
type: string
description: "The SAP material number for the fuel product."
- name: current_quantity
in: body
type: string
description: "The current stock quantity."
steps:
- name: get-material-details
type: call
call: "sap.get-material"
with:
material_number: "{{material_number}}"
- name: create-replenishment-request
type: call
call: "servicenow.create-request"
with:
short_description: "Low stock alert: {{get-material-details.description}} at plant {{plant_code}}"
description: "Current quantity: {{current_quantity}}. Material: {{material_number}}."
category: "supply_chain"
urgency: "2"
- name: notify-supply-chain
type: call
call: "msteams.post-channel-message"
with:
channel_id: "$secrets.teams_supply_chain_channel"
text: "Low Stock: {{get-material-details.description}} at {{plant_code}} — Qty: {{current_quantity}} | Request: {{create-replenishment-request.number}}"
consumes:
- type: http
namespace: sap
baseUri: "https://texaco-s4.sap.com/sap/opu/odata/sap/API_MATERIAL_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: materials
path: "/A_Material('{{material_number}}')"
inputParameters:
- name: material_number
in: path
operations:
- name: get-material
method: GET
- type: http
namespace: servicenow
baseUri: "https://texaco.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: requests
path: "/table/sc_request"
operations:
- name: create-request
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/supply-chain/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
When a GitHub Actions production deployment is requested, creates a ServiceNow change request, waits for approval, and posts deployment status to the release channel on Teams.
naftiko: "0.5"
info:
label: "GitHub Actions Deployment Approval Gate"
description: "When a GitHub Actions production deployment is requested, creates a ServiceNow change request, waits for approval, and posts deployment status to the release channel on Teams."
tags:
- devops
- github
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: release-mgmt
port: 8080
tools:
- name: gate-deployment
description: "Given a GitHub repo and workflow run ID, create a change request and notify the release channel."
inputParameters:
- name: repo_name
in: body
type: string
description: "The GitHub repository name."
- name: run_id
in: body
type: string
description: "The GitHub Actions workflow run ID."
- name: environment
in: body
type: string
description: "The target deployment environment."
steps:
- name: get-workflow-run
type: call
call: "github.get-workflow-run"
with:
repo_name: "{{repo_name}}"
run_id: "{{run_id}}"
- name: create-change-request
type: call
call: "servicenow.create-change"
with:
short_description: "Production deployment: {{repo_name}} to {{environment}}"
description: "Workflow: {{get-workflow-run.name}}. Commit: {{get-workflow-run.head_sha}}. Actor: {{get-workflow-run.actor}}."
category: "deployment"
- name: notify-release-channel
type: call
call: "msteams.post-channel-message"
with:
channel_id: "$secrets.teams_release_channel"
text: "Deployment gate: {{repo_name}} to {{environment}} | CR: {{create-change-request.number}} | Commit: {{get-workflow-run.head_sha}}"
consumes:
- type: http
namespace: github
baseUri: "https://api.github.com"
authentication:
type: bearer
token: "$secrets.github_token"
resources:
- name: workflow-runs
path: "/repos/{{repo_name}}/actions/runs/{{run_id}}"
inputParameters:
- name: repo_name
in: path
- name: run_id
in: path
operations:
- name: get-workflow-run
method: GET
- type: http
namespace: servicenow
baseUri: "https://texaco.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: changes
path: "/table/change_request"
operations:
- name: create-change
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/release/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Retrieves branch protection rules for a GitHub repository to verify compliance with security policies.
naftiko: "0.5"
info:
label: "GitHub Repository Branch Protection Check"
description: "Retrieves branch protection rules for a GitHub repository to verify compliance with security policies."
tags:
- security
- devops
- github
capability:
exposes:
- type: mcp
namespace: devsecops
port: 8080
tools:
- name: get-branch-protection
description: "Check branch protection rules on a GitHub repo. Returns required reviews, status checks, and enforcement settings."
inputParameters:
- name: repo_name
in: body
type: string
description: "The GitHub repository name (org/repo format)."
- name: branch
in: body
type: string
description: "The branch name to check (e.g., main)."
call: "github.get-branch-protection"
with:
repo_name: "{{repo_name}}"
branch: "{{branch}}"
outputParameters:
- name: required_reviews
type: integer
mapping: "$.required_pull_request_reviews.required_approving_review_count"
- name: enforce_admins
type: boolean
mapping: "$.enforce_admins.enabled"
consumes:
- type: http
namespace: github
baseUri: "https://api.github.com"
authentication:
type: bearer
token: "$secrets.github_token"
resources:
- name: branch-protection
path: "/repos/{{repo_name}}/branches/{{branch}}/protection"
inputParameters:
- name: repo_name
in: path
- name: branch
in: path
operations:
- name: get-branch-protection
method: GET
Fetches an invoice from SAP S/4HANA and checks its approval and payment status, then posts a summary to Microsoft Teams for finance team review.
naftiko: "0.5"
info:
label: "Invoice Approval and Payment Status"
description: "Fetches an invoice from SAP S/4HANA and checks its approval and payment status, then posts a summary to Microsoft Teams for finance team review."
tags:
- finance
- accounts-payable
- sap
- microsoft-teams
- erp
capability:
exposes:
- type: mcp
namespace: finance-ap
port: 8080
tools:
- name: get-invoice-status
description: "Given a SAP invoice document number, retrieve its approval and payment status from SAP S/4HANA and post a summary card to the finance Microsoft Teams channel."
inputParameters:
- name: invoice_number
in: body
type: string
description: "The SAP Accounts Payable invoice document number."
- name: fiscal_year
in: body
type: string
description: "The fiscal year for the invoice, e.g. 2025."
steps:
- name: get-invoice
type: call
call: "sap-fi.get-invoice"
with:
invoice_number: "{{invoice_number}}"
fiscal_year: "{{fiscal_year}}"
- name: post-summary
type: call
call: "teams-finance.send-message"
with:
channel: "finance-ap-alerts"
text: "Invoice {{invoice_number}} | Vendor: {{get-invoice.vendor_name}} | Amount: {{get-invoice.amount}} {{get-invoice.currency}} | Status: {{get-invoice.payment_status}}"
consumes:
- type: http
namespace: sap-fi
baseUri: "https://texaco-s4.sap.com/sap/opu/odata/sap/API_SUPPLIER_INVOICE_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: invoices
path: "/A_SupplierInvoice(FiscalYear='{{fiscal_year}}',SupplierInvoice='{{invoice_number}}')"
inputParameters:
- name: invoice_number
in: path
- name: fiscal_year
in: path
operations:
- name: get-invoice
method: GET
outputRawFormat: xml
- type: http
namespace: teams-finance
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-message
method: POST
When GitHub Dependabot finds a critical vulnerability, creates a Jira remediation ticket and a ServiceNow change request, then notifies the security team on Teams.
naftiko: "0.5"
info:
label: "IT Security Vulnerability Remediation Workflow"
description: "When GitHub Dependabot finds a critical vulnerability, creates a Jira remediation ticket and a ServiceNow change request, then notifies the security team on Teams."
tags:
- security
- devops
- github
- jira
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: devsecops
port: 8080
tools:
- name: handle-vulnerability-alert
description: "Given a GitHub vulnerability alert, create a Jira ticket, a ServiceNow change request, and notify the security team."
inputParameters:
- name: repo_name
in: body
type: string
description: "The GitHub repository name."
- name: alert_number
in: body
type: string
description: "The Dependabot alert number."
- name: severity
in: body
type: string
description: "Vulnerability severity (critical, high, medium, low)."
- name: package_name
in: body
type: string
description: "The affected package or dependency name."
steps:
- name: get-alert-details
type: call
call: "github.get-dependabot-alert"
with:
repo_name: "{{repo_name}}"
alert_number: "{{alert_number}}"
- name: create-jira-ticket
type: call
call: "jira.create-issue"
with:
project: "SEC"
summary: "Vulnerability: {{package_name}} in {{repo_name}} ({{severity}})"
description: "Dependabot alert #{{alert_number}}: {{get-alert-details.description}}"
issue_type: "Bug"
priority: "High"
- name: create-change-request
type: call
call: "servicenow.create-change"
with:
short_description: "Security patch: {{package_name}} in {{repo_name}}"
description: "Remediate vulnerability in {{package_name}}. Jira: {{create-jira-ticket.key}}"
category: "security"
- name: notify-security-team
type: call
call: "msteams.post-channel-message"
with:
channel_id: "$secrets.teams_security_channel"
text: "Vulnerability detected: {{severity}} in {{repo_name}}/{{package_name}} | Jira: {{create-jira-ticket.key}} | CR: {{create-change-request.number}}"
consumes:
- type: http
namespace: github
baseUri: "https://api.github.com"
authentication:
type: bearer
token: "$secrets.github_token"
resources:
- name: dependabot-alerts
path: "/repos/{{repo_name}}/dependabot/alerts/{{alert_number}}"
inputParameters:
- name: repo_name
in: path
- name: alert_number
in: path
operations:
- name: get-dependabot-alert
method: GET
- type: http
namespace: jira
baseUri: "https://texaco.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
- type: http
namespace: servicenow
baseUri: "https://texaco.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: changes
path: "/table/change_request"
operations:
- name: create-change
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/security/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Retrieves the current status, assignee, and priority of a Jira issue by key for project tracking.
naftiko: "0.5"
info:
label: "Jira Issue Status Lookup"
description: "Retrieves the current status, assignee, and priority of a Jira issue by key for project tracking."
tags:
- project-management
- jira
capability:
exposes:
- type: mcp
namespace: project-mgmt
port: 8080
tools:
- name: get-jira-issue
description: "Look up a Jira issue by key. Returns status, assignee, priority, and summary."
inputParameters:
- name: issue_key
in: body
type: string
description: "The Jira issue key (e.g., PROJ-1234)."
call: "jira.get-issue"
with:
issue_key: "{{issue_key}}"
outputParameters:
- name: status
type: string
mapping: "$.fields.status.name"
- name: assignee
type: string
mapping: "$.fields.assignee.displayName"
- name: priority
type: string
mapping: "$.fields.priority.name"
consumes:
- type: http
namespace: jira
baseUri: "https://texaco.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: issues
path: "/issue/{{issue_key}}"
inputParameters:
- name: issue_key
in: path
operations:
- name: get-issue
method: GET
At sprint close, fetches sprint metrics from Jira, generates a summary, publishes it to Confluence, and notifies the project team on Teams.
naftiko: "0.5"
info:
label: "Jira Sprint Completion Report to Confluence"
description: "At sprint close, fetches sprint metrics from Jira, generates a summary, publishes it to Confluence, and notifies the project team on Teams."
tags:
- project-management
- jira
- confluence
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: agile-reporting
port: 8080
tools:
- name: publish-sprint-report
description: "Given a Jira board ID and sprint ID, pull metrics, publish to Confluence, and notify the team."
inputParameters:
- name: board_id
in: body
type: string
description: "The Jira board ID."
- name: sprint_id
in: body
type: string
description: "The Jira sprint ID."
- name: confluence_space_key
in: body
type: string
description: "The Confluence space key for the report."
steps:
- name: get-sprint-report
type: call
call: "jira.get-sprint-report"
with:
board_id: "{{board_id}}"
sprint_id: "{{sprint_id}}"
- name: create-confluence-page
type: call
call: "confluence.create-page"
with:
space_key: "{{confluence_space_key}}"
title: "Sprint Report: {{get-sprint-report.sprint_name}}"
body: "Completed: {{get-sprint-report.completed_points}} pts | Incomplete: {{get-sprint-report.incomplete_points}} pts | Velocity: {{get-sprint-report.velocity}}"
- name: notify-team
type: call
call: "msteams.post-channel-message"
with:
channel_id: "$secrets.teams_project_channel"
text: "Sprint report published: {{get-sprint-report.sprint_name}} | {{create-confluence-page.url}}"
consumes:
- type: http
namespace: jira
baseUri: "https://texaco.atlassian.net/rest/agile/1.0"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: sprint-reports
path: "/board/{{board_id}}/sprint/{{sprint_id}}/report"
inputParameters:
- name: board_id
in: path
- name: sprint_id
in: path
operations:
- name: get-sprint-report
method: GET
- type: http
namespace: confluence
baseUri: "https://texaco.atlassian.net/wiki/rest/api"
authentication:
type: basic
username: "$secrets.confluence_user"
password: "$secrets.confluence_api_token"
resources:
- name: pages
path: "/content"
operations:
- name: create-page
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/engineering/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Publishes a company update to the Texaco LinkedIn organization page, then posts a confirmation with the published URL to the marketing Microsoft Teams channel.
naftiko: "0.5"
info:
label: "LinkedIn Employer Brand Post Publishing"
description: "Publishes a company update to the Texaco LinkedIn organization page, then posts a confirmation with the published URL to the marketing Microsoft Teams channel."
tags:
- marketing
- social-media
- linkedin
- microsoft-teams
- employer-brand
capability:
exposes:
- type: mcp
namespace: marketing-social
port: 8080
tools:
- name: publish-linkedin-post
description: "Publish a company update to the Texaco LinkedIn organization page. Provide the post text and optional media. Posts a confirmation with the LinkedIn post URL to the marketing Teams channel."
inputParameters:
- name: post_text
in: body
type: string
description: "The text content of the LinkedIn company update."
- name: organization_id
in: body
type: string
description: "The LinkedIn organization URN ID for Texaco."
steps:
- name: publish-post
type: call
call: "linkedin.create-share"
with:
organization_id: "{{organization_id}}"
text: "{{post_text}}"
- name: notify-marketing
type: call
call: "teams-marketing.send-message"
with:
channel: "marketing-social"
text: "LinkedIn post published | ID: {{publish-post.id}} | Preview: {{post_text}}"
consumes:
- type: http
namespace: linkedin
baseUri: "https://api.linkedin.com/v2"
authentication:
type: bearer
token: "$secrets.linkedin_token"
resources:
- name: shares
path: "/shares"
operations:
- name: create-share
method: POST
- type: http
namespace: teams-marketing
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Creates a job posting on LinkedIn based on a Workday requisition, then creates a Jira tracking task for the recruiting team.
naftiko: "0.5"
info:
label: "LinkedIn Job Posting and Tracking"
description: "Creates a job posting on LinkedIn based on a Workday requisition, then creates a Jira tracking task for the recruiting team."
tags:
- hr
- recruiting
- linkedin
- workday
- jira
capability:
exposes:
- type: mcp
namespace: talent-acquisition
port: 8080
tools:
- name: post-job-to-linkedin
description: "Given a Workday requisition ID, fetch details, create a LinkedIn job post, and track in Jira."
inputParameters:
- name: requisition_id
in: body
type: string
description: "The Workday job requisition ID."
steps:
- name: get-requisition
type: call
call: "workday.get-requisition"
with:
requisition_id: "{{requisition_id}}"
- name: create-linkedin-post
type: call
call: "linkedin.create-job-post"
with:
title: "{{get-requisition.job_title}}"
description: "{{get-requisition.job_description}}"
location: "{{get-requisition.location}}"
- name: create-tracking-task
type: call
call: "jira.create-issue"
with:
project: "RECRUIT"
summary: "LinkedIn posting: {{get-requisition.job_title}} ({{requisition_id}})"
description: "LinkedIn post ID: {{create-linkedin-post.post_id}}. Location: {{get-requisition.location}}."
issue_type: "Task"
consumes:
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: requisitions
path: "/texaco/jobRequisitions/{{requisition_id}}"
inputParameters:
- name: requisition_id
in: path
operations:
- name: get-requisition
method: GET
- type: http
namespace: linkedin
baseUri: "https://api.linkedin.com/v2"
authentication:
type: bearer
token: "$secrets.linkedin_token"
resources:
- name: job-posts
path: "/simpleJobPostings"
operations:
- name: create-job-post
method: POST
- type: http
namespace: jira
baseUri: "https://texaco.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
Posts a message to a specified Microsoft Teams channel using the Graph API for automated notifications.
naftiko: "0.5"
info:
label: "Microsoft Teams Channel Message Post"
description: "Posts a message to a specified Microsoft Teams channel using the Graph API for automated notifications."
tags:
- communications
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: comms
port: 8080
tools:
- name: post-teams-message
description: "Send a message to a Microsoft Teams channel. Provide the team and channel IDs along with the message text."
inputParameters:
- name: team_id
in: body
type: string
description: "The Microsoft Teams team ID."
- name: channel_id
in: body
type: string
description: "The Teams channel ID."
- name: message_text
in: body
type: string
description: "The message content to post."
call: "msteams.post-channel-message"
with:
team_id: "{{team_id}}"
channel_id: "{{channel_id}}"
text: "{{message_text}}"
outputParameters:
- name: message_id
type: string
mapping: "$.id"
consumes:
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Creates a Microsoft Teams online meeting for a project kick-off or recurring sync, sends calendar invites to attendees, and logs the meeting link in the ServiceNow project record.
naftiko: "0.5"
info:
label: "Microsoft Teams Meeting Scheduling for Projects"
description: "Creates a Microsoft Teams online meeting for a project kick-off or recurring sync, sends calendar invites to attendees, and logs the meeting link in the ServiceNow project record."
tags:
- communication
- microsoft-teams
- servicenow
- project-management
capability:
exposes:
- type: mcp
namespace: comms-meetings
port: 8080
tools:
- name: schedule-teams-meeting
description: "Create a Microsoft Teams online meeting and send calendar invites to the specified attendees. Log the meeting link in a ServiceNow project task. Use for project kick-offs, sprint reviews, or executive briefings."
inputParameters:
- name: subject
in: body
type: string
description: "Meeting subject or title."
- name: start_datetime
in: body
type: string
description: "Meeting start time in ISO 8601 format."
- name: end_datetime
in: body
type: string
description: "Meeting end time in ISO 8601 format."
- name: attendee_emails
in: body
type: string
description: "Comma-separated list of attendee email addresses."
- name: servicenow_task_id
in: body
type: string
description: "ServiceNow task sys_id to log the meeting link against."
steps:
- name: create-meeting
type: call
call: "msgraph-cal.create-meeting"
with:
subject: "{{subject}}"
start: "{{start_datetime}}"
end: "{{end_datetime}}"
attendees: "{{attendee_emails}}"
- name: log-meeting
type: call
call: "servicenow-proj.update-task"
with:
sys_id: "{{servicenow_task_id}}"
work_notes: "Teams meeting scheduled: {{create-meeting.join_url}}"
consumes:
- type: http
namespace: msgraph-cal
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: online-meetings
path: "/me/onlineMeetings"
operations:
- name: create-meeting
method: POST
- type: http
namespace: servicenow-proj
baseUri: "https://texaco.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task/{{sys_id}}"
inputParameters:
- name: sys_id
in: path
operations:
- name: update-task
method: PATCH
Checks whether a user is assigned to a specific Okta application, returning assignment status and role.
naftiko: "0.5"
info:
label: "Okta Application Assignment Check"
description: "Checks whether a user is assigned to a specific Okta application, returning assignment status and role."
tags:
- security
- identity
- okta
capability:
exposes:
- type: mcp
namespace: iam-apps
port: 8080
tools:
- name: check-app-assignment
description: "Check if a user is assigned to an Okta application. Returns assignment status and assigned role."
inputParameters:
- name: app_id
in: body
type: string
description: "The Okta application ID."
- name: user_id
in: body
type: string
description: "The Okta user ID."
call: "okta.get-app-user"
with:
app_id: "{{app_id}}"
user_id: "{{user_id}}"
outputParameters:
- name: status
type: string
mapping: "$.status"
- name: role
type: string
mapping: "$.profile.role"
consumes:
- type: http
namespace: okta
baseUri: "https://texaco.okta.com/api/v1"
authentication:
type: bearer
token: "$secrets.okta_api_token"
resources:
- name: app-users
path: "/apps/{{app_id}}/users/{{user_id}}"
inputParameters:
- name: app_id
in: path
- name: user_id
in: path
operations:
- name: get-app-user
method: GET
Identifies Okta users without MFA enrolled, sends enrollment reminders via Outlook, and creates a ServiceNow compliance tracking task.
naftiko: "0.5"
info:
label: "Okta MFA Enrollment Enforcement"
description: "Identifies Okta users without MFA enrolled, sends enrollment reminders via Outlook, and creates a ServiceNow compliance tracking task."
tags:
- security
- identity
- okta
- microsoft-outlook
- servicenow
capability:
exposes:
- type: mcp
namespace: security-compliance
port: 8080
tools:
- name: enforce-mfa-enrollment
description: "Find users without MFA, send reminders, and create a compliance task."
inputParameters:
- name: group_id
in: body
type: string
description: "The Okta group ID to check."
steps:
- name: get-users-without-mfa
type: call
call: "okta.list-users-without-mfa"
with:
group_id: "{{group_id}}"
- name: send-reminder
type: call
call: "msgraph.send-mail"
with:
recipient: "$secrets.security_admin_email"
subject: "MFA Enrollment Required — {{get-users-without-mfa.count}} users"
body: "The following users in group {{group_id}} have not enrolled in MFA. Count: {{get-users-without-mfa.count}}."
- name: create-compliance-task
type: call
call: "servicenow.create-task"
with:
short_description: "MFA enforcement: {{get-users-without-mfa.count}} users unenrolled"
assignment_group: "IT_Security"
consumes:
- type: http
namespace: okta
baseUri: "https://texaco.okta.com/api/v1"
authentication:
type: bearer
token: "$secrets.okta_api_token"
resources:
- name: groups
path: "/groups/{{group_id}}/users"
inputParameters:
- name: group_id
in: path
operations:
- name: list-users-without-mfa
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/$secrets.service_account_upn/sendMail"
operations:
- name: send-mail
method: POST
- type: http
namespace: servicenow
baseUri: "https://texaco.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: create-task
method: POST
When an Okta system log shows a suspicious login event, suspends the user account, creates a ServiceNow security incident, and alerts the security team on Teams.
naftiko: "0.5"
info:
label: "Okta Suspicious Login Response"
description: "When an Okta system log shows a suspicious login event, suspends the user account, creates a ServiceNow security incident, and alerts the security team on Teams."
tags:
- security
- identity
- okta
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: security-response
port: 8080
tools:
- name: respond-to-suspicious-login
description: "Given an Okta user ID flagged for suspicious login, suspend the account, create a security incident, and notify the team."
inputParameters:
- name: user_id
in: body
type: string
description: "The Okta user ID."
- name: event_details
in: body
type: string
description: "Details of the suspicious login event."
steps:
- name: suspend-user
type: call
call: "okta.suspend-user"
with:
user_id: "{{user_id}}"
- name: create-security-incident
type: call
call: "servicenow.create-incident"
with:
short_description: "Suspicious login: user {{user_id}} suspended"
description: "{{event_details}}"
category: "security"
urgency: "1"
- name: alert-security
type: call
call: "msteams.post-channel-message"
with:
channel_id: "$secrets.teams_security_channel"
text: "Suspicious login detected for {{user_id}} — account suspended | Incident: {{create-security-incident.number}} | {{event_details}}"
consumes:
- type: http
namespace: okta
baseUri: "https://texaco.okta.com/api/v1"
authentication:
type: bearer
token: "$secrets.okta_api_token"
resources:
- name: users
path: "/users/{{user_id}}/lifecycle/suspend"
inputParameters:
- name: user_id
in: path
operations:
- name: suspend-user
method: POST
- type: http
namespace: servicenow
baseUri: "https://texaco.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/security/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Provisions a new Okta user account with role-appropriate group assignments based on Workday department and job code, enabling SSO access to business applications.
naftiko: "0.5"
info:
label: "Okta User Access Provisioning"
description: "Provisions a new Okta user account with role-appropriate group assignments based on Workday department and job code, enabling SSO access to business applications."
tags:
- identity
- security
- okta
- workday
- access-management
capability:
exposes:
- type: mcp
namespace: identity-provisioning
port: 8080
tools:
- name: provision-okta-user
description: "Given a Workday employee ID, fetch their profile and department, create an Okta user account, and assign the appropriate Okta groups for SSO application access. Use during employee onboarding or role changes."
inputParameters:
- name: workday_employee_id
in: body
type: string
description: "The Workday worker ID to provision in Okta."
steps:
- name: get-worker
type: call
call: "workday-idm.get-worker"
with:
worker_id: "{{workday_employee_id}}"
- name: create-okta-user
type: call
call: "okta-idm.create-user"
with:
first_name: "{{get-worker.first_name}}"
last_name: "{{get-worker.last_name}}"
email: "{{get-worker.work_email}}"
login: "{{get-worker.work_email}}"
- name: assign-group
type: call
call: "okta-idm.add-user-to-group"
with:
user_id: "{{create-okta-user.id}}"
group_id: "{{get-worker.default_group_id}}"
consumes:
- type: http
namespace: workday-idm
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: workers
path: "/texaco/workers/{{worker_id}}"
inputParameters:
- name: worker_id
in: path
operations:
- name: get-worker
method: GET
- type: http
namespace: okta-idm
baseUri: "https://texaco.okta.com/api/v1"
authentication:
type: apikey
key: "Authorization"
value: "$secrets.okta_api_token"
placement: header
resources:
- name: users
path: "/users"
operations:
- name: create-user
method: POST
- name: group-membership
path: "/groups/{{group_id}}/users/{{user_id}}"
inputParameters:
- name: group_id
in: path
- name: user_id
in: path
operations:
- name: add-user-to-group
method: PUT
Retrieves all Okta group memberships for a given user ID to support access reviews and compliance checks.
naftiko: "0.5"
info:
label: "Okta User Group Membership Lookup"
description: "Retrieves all Okta group memberships for a given user ID to support access reviews and compliance checks."
tags:
- security
- identity
- okta
capability:
exposes:
- type: mcp
namespace: iam
port: 8080
tools:
- name: get-user-groups
description: "List all Okta groups a user belongs to by user ID. Returns group names and IDs for access review."
inputParameters:
- name: user_id
in: body
type: string
description: "The Okta user ID or login email."
call: "okta.list-user-groups"
with:
user_id: "{{user_id}}"
outputParameters:
- name: groups
type: array
mapping: "$.groups[*].profile.name"
consumes:
- type: http
namespace: okta
baseUri: "https://texaco.okta.com/api/v1"
authentication:
type: bearer
token: "$secrets.okta_api_token"
resources:
- name: user-groups
path: "/users/{{user_id}}/groups"
inputParameters:
- name: user_id
in: path
operations:
- name: list-user-groups
method: GET
When a Power BI data alert triggers, fetches the alert details and affected dataset info, then posts a formatted summary to the relevant Teams channel.
naftiko: "0.5"
info:
label: "Power BI Dashboard Alert to Teams"
description: "When a Power BI data alert triggers, fetches the alert details and affected dataset info, then posts a formatted summary to the relevant Teams channel."
tags:
- analytics
- power-bi
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: bi-alerts
port: 8080
tools:
- name: forward-bi-alert
description: "Given a Power BI alert ID, fetch details and notify the appropriate Teams channel."
inputParameters:
- name: alert_id
in: body
type: string
description: "The Power BI data alert ID."
- name: dashboard_id
in: body
type: string
description: "The Power BI dashboard ID."
steps:
- name: get-alert
type: call
call: "powerbi.get-alert"
with:
alert_id: "{{alert_id}}"
dashboard_id: "{{dashboard_id}}"
- name: notify-stakeholders
type: call
call: "msteams.post-channel-message"
with:
channel_id: "$secrets.teams_analytics_channel"
text: "BI Alert: {{get-alert.title}} | Dashboard: {{dashboard_id}} | Condition: {{get-alert.condition}} | Value: {{get-alert.current_value}}"
consumes:
- type: http
namespace: powerbi
baseUri: "https://api.powerbi.com/v1.0/myorg"
authentication:
type: bearer
token: "$secrets.powerbi_token"
resources:
- name: alerts
path: "/dashboards/{{dashboard_id}}/alerts/{{alert_id}}"
inputParameters:
- name: dashboard_id
in: path
- name: alert_id
in: path
operations:
- name: get-alert
method: GET
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/analytics/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Triggers a manual refresh of a Power BI dataset and monitors completion status, posting a notification to the data team Teams channel when the refresh completes or fails.
naftiko: "0.5"
info:
label: "Power BI Dataset Refresh Trigger"
description: "Triggers a manual refresh of a Power BI dataset and monitors completion status, posting a notification to the data team Teams channel when the refresh completes or fails."
tags:
- data-analytics
- power-bi
- microsoft-teams
- reporting
- monitoring
capability:
exposes:
- type: mcp
namespace: data-reporting
port: 8080
tools:
- name: trigger-dataset-refresh
description: "Given a Power BI workspace ID and dataset ID, trigger a manual dataset refresh and post a status notification to the data team Teams channel. Use when reports need to be updated outside the scheduled refresh window."
inputParameters:
- name: workspace_id
in: body
type: string
description: "The Power BI workspace (group) ID containing the dataset."
- name: dataset_id
in: body
type: string
description: "The Power BI dataset ID to refresh."
steps:
- name: refresh-dataset
type: call
call: "powerbi.trigger-refresh"
with:
workspace_id: "{{workspace_id}}"
dataset_id: "{{dataset_id}}"
- name: notify-team
type: call
call: "teams-data.send-message"
with:
channel: "data-ops"
text: "Power BI dataset refresh triggered | Workspace: {{workspace_id}} | Dataset: {{dataset_id}} | Status: In Progress"
consumes:
- type: http
namespace: powerbi
baseUri: "https://api.powerbi.com/v1.0/myorg"
authentication:
type: bearer
token: "$secrets.powerbi_token"
resources:
- name: dataset-refreshes
path: "/groups/{{workspace_id}}/datasets/{{dataset_id}}/refreshes"
inputParameters:
- name: workspace_id
in: path
- name: dataset_id
in: path
operations:
- name: trigger-refresh
method: POST
- type: http
namespace: teams-data
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Checks the export status of a Power BI report by export ID, returning completion state and download URL.
naftiko: "0.5"
info:
label: "Power BI Report Export Status"
description: "Checks the export status of a Power BI report by export ID, returning completion state and download URL."
tags:
- analytics
- power-bi
capability:
exposes:
- type: mcp
namespace: bi-reporting
port: 8080
tools:
- name: get-export-status
description: "Check a Power BI report export by ID. Returns the export status and file download URL when complete."
inputParameters:
- name: group_id
in: body
type: string
description: "The Power BI workspace (group) ID."
- name: report_id
in: body
type: string
description: "The Power BI report ID."
- name: export_id
in: body
type: string
description: "The export operation ID."
call: "powerbi.get-export"
with:
group_id: "{{group_id}}"
report_id: "{{report_id}}"
export_id: "{{export_id}}"
outputParameters:
- name: status
type: string
mapping: "$.status"
- name: resource_location
type: string
mapping: "$.resourceLocation"
consumes:
- type: http
namespace: powerbi
baseUri: "https://api.powerbi.com/v1.0/myorg"
authentication:
type: bearer
token: "$secrets.powerbi_token"
resources:
- name: exports
path: "/groups/{{group_id}}/reports/{{report_id}}/exports/{{export_id}}"
inputParameters:
- name: group_id
in: path
- name: report_id
in: path
- name: export_id
in: path
operations:
- name: get-export
method: GET
When a safety alert is received from the SCADA monitoring system, creates a ServiceNow P1 incident, notifies the HSE team on Teams, and logs the event in Snowflake for compliance tracking.
naftiko: "0.5"
info:
label: "Refinery Safety Incident Response"
description: "When a safety alert is received from the SCADA monitoring system, creates a ServiceNow P1 incident, notifies the HSE team on Teams, and logs the event in Snowflake for compliance tracking."
tags:
- safety
- operations
- servicenow
- microsoft-teams
- snowflake
capability:
exposes:
- type: mcp
namespace: safety-ops
port: 8080
tools:
- name: handle-safety-incident
description: "Given a safety alert from a refinery facility, create a P1 incident, notify HSE, and log the event for audit."
inputParameters:
- name: facility_name
in: body
type: string
description: "The refinery or plant facility name."
- name: alert_type
in: body
type: string
description: "Type of safety alert (e.g., gas_leak, pressure_exceedance)."
- name: alert_description
in: body
type: string
description: "Detailed description of the safety alert."
steps:
- name: create-p1-incident
type: call
call: "servicenow.create-incident"
with:
short_description: "Safety alert: {{alert_type}} at {{facility_name}}"
urgency: "1"
impact: "1"
description: "{{alert_description}}"
category: "safety"
- name: notify-hse-team
type: call
call: "msteams.post-channel-message"
with:
channel_id: "$secrets.teams_hse_channel"
text: "SAFETY ALERT: {{alert_type}} at {{facility_name}} | Incident: {{create-p1-incident.number}} | {{alert_description}}"
- name: log-safety-event
type: call
call: "snowflake.execute-query"
with:
statement: "INSERT INTO SAFETY_DB.PUBLIC.INCIDENT_LOG (facility, alert_type, description, incident_number, created_at) VALUES ('{{facility_name}}', '{{alert_type}}', '{{alert_description}}', '{{create-p1-incident.number}}', CURRENT_TIMESTAMP())"
consumes:
- type: http
namespace: servicenow
baseUri: "https://texaco.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/hse/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
- type: http
namespace: snowflake
baseUri: "https://texaco.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-query
method: POST
Fetches planned maintenance orders from SAP, creates a turnaround project plan in Jira, and publishes the schedule to Confluence for operations review.
naftiko: "0.5"
info:
label: "Refinery Turnaround Planning Workflow"
description: "Fetches planned maintenance orders from SAP, creates a turnaround project plan in Jira, and publishes the schedule to Confluence for operations review."
tags:
- operations
- maintenance
- sap
- jira
- confluence
capability:
exposes:
- type: mcp
namespace: turnaround-planning
port: 8080
tools:
- name: plan-turnaround
description: "Given a plant code and date range, fetch maintenance orders, create Jira epics, and publish to Confluence."
inputParameters:
- name: plant_code
in: body
type: string
description: "The SAP plant code."
- name: start_date
in: body
type: string
description: "Turnaround start date (YYYY-MM-DD)."
- name: end_date
in: body
type: string
description: "Turnaround end date (YYYY-MM-DD)."
steps:
- name: get-maintenance-orders
type: call
call: "sap.list-maintenance-orders"
with:
plant_code: "{{plant_code}}"
date_from: "{{start_date}}"
date_to: "{{end_date}}"
- name: create-jira-epic
type: call
call: "jira.create-issue"
with:
project: "OPS"
summary: "Turnaround: Plant {{plant_code}} ({{start_date}} — {{end_date}})"
description: "{{get-maintenance-orders.count}} maintenance orders planned."
issue_type: "Epic"
- name: publish-schedule
type: call
call: "confluence.create-page"
with:
space_key: "OPS"
title: "Turnaround Schedule: Plant {{plant_code}} {{start_date}}"
body: "Total orders: {{get-maintenance-orders.count}} | Jira Epic: {{create-jira-epic.key}} | Period: {{start_date}} to {{end_date}}"
consumes:
- type: http
namespace: sap
baseUri: "https://texaco-s4.sap.com/sap/opu/odata/sap/API_MAINTENANCEORDER_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: maintenance-orders
path: "/A_MaintenanceOrder"
operations:
- name: list-maintenance-orders
method: GET
- type: http
namespace: jira
baseUri: "https://texaco.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
- type: http
namespace: confluence
baseUri: "https://texaco.atlassian.net/wiki/rest/api"
authentication:
type: basic
username: "$secrets.confluence_user"
password: "$secrets.confluence_api_token"
resources:
- name: pages
path: "/content"
operations:
- name: create-page
method: POST
Retrieves a Salesforce account record by account ID, returning key health indicators including open cases, recent activity, and contract status for customer success review.
naftiko: "0.5"
info:
label: "Salesforce Account Health Check"
description: "Retrieves a Salesforce account record by account ID, returning key health indicators including open cases, recent activity, and contract status for customer success review."
tags:
- sales
- crm
- salesforce
- customer-success
capability:
exposes:
- type: mcp
namespace: crm-accounts
port: 8080
tools:
- name: get-account-health
description: "Given a Salesforce account ID, retrieve account health data including open support cases, last activity date, and active contract count. Use for customer success reviews and QBR preparation."
inputParameters:
- name: account_id
in: body
type: string
description: "The Salesforce Account ID (18-character Salesforce ID)."
call: "salesforce-accounts.get-account"
with:
account_id: "{{account_id}}"
outputParameters:
- name: account_name
type: string
mapping: "$.Name"
- name: industry
type: string
mapping: "$.Industry"
- name: annual_revenue
type: string
mapping: "$.AnnualRevenue"
- name: open_cases
type: string
mapping: "$.OpenCases__c"
consumes:
- type: http
namespace: salesforce-accounts
baseUri: "https://texaco.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
Retrieves a Salesforce contact record by email address, returning name, account, title, and phone number.
naftiko: "0.5"
info:
label: "Salesforce Contact Lookup"
description: "Retrieves a Salesforce contact record by email address, returning name, account, title, and phone number."
tags:
- crm
- salesforce
capability:
exposes:
- type: mcp
namespace: crm
port: 8080
tools:
- name: get-contact-by-email
description: "Look up a Salesforce contact by email address. Returns full name, associated account, title, and phone."
inputParameters:
- name: email
in: body
type: string
description: "The contact email address."
call: "salesforce.query-contact"
with:
email: "{{email}}"
outputParameters:
- name: name
type: string
mapping: "$.records[0].Name"
- name: account_name
type: string
mapping: "$.records[0].Account.Name"
- name: title
type: string
mapping: "$.records[0].Title"
consumes:
- type: http
namespace: salesforce
baseUri: "https://texaco.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: contacts
path: "/query?q=SELECT+Name,Account.Name,Title,Phone+FROM+Contact+WHERE+Email='{{email}}'"
inputParameters:
- name: email
in: query
operations:
- name: query-contact
method: GET
Queries Salesforce for contracts expiring within 90 days, identifies the account owner, and sends a renewal reminder to the account manager via Microsoft Teams.
naftiko: "0.5"
info:
label: "Salesforce Contract Renewal Alert"
description: "Queries Salesforce for contracts expiring within 90 days, identifies the account owner, and sends a renewal reminder to the account manager via Microsoft Teams."
tags:
- sales
- crm
- salesforce
- contract-management
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: crm-contracts
port: 8080
tools:
- name: alert-expiring-contracts
description: "Query Salesforce for active contracts expiring within 90 days and post renewal reminder alerts to the account manager's Teams channel. Use for proactive contract renewal management."
inputParameters:
- name: days_to_expiry
in: body
type: integer
description: "Number of days ahead to look for expiring contracts. Typically 90."
steps:
- name: query-contracts
type: call
call: "salesforce-contracts.query-expiring"
with:
days_to_expiry: "{{days_to_expiry}}"
- name: post-alerts
type: call
call: "teams-contracts.send-message"
with:
channel: "sales-contract-alerts"
text: "Contract Renewal Alert | Expiring in {{days_to_expiry}} days: {{query-contracts.total_size}} contracts | Total Value at Risk: {{query-contracts.total_value}}"
consumes:
- type: http
namespace: salesforce-contracts
baseUri: "https://texaco.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: contracts
path: "/query"
inputParameters:
- name: q
in: query
operations:
- name: query-expiring
method: GET
- type: http
namespace: teams-contracts
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-message
method: POST
When a Salesforce account health score drops below threshold, fetches account details, creates a Jira retention task, and alerts the account manager via Teams.
naftiko: "0.5"
info:
label: "Salesforce Customer Churn Risk Alert"
description: "When a Salesforce account health score drops below threshold, fetches account details, creates a Jira retention task, and alerts the account manager via Teams."
tags:
- crm
- salesforce
- jira
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: customer-success
port: 8080
tools:
- name: handle-churn-risk
description: "Given a Salesforce account ID with low health score, create a retention task and notify the account manager."
inputParameters:
- name: account_id
in: body
type: string
description: "The Salesforce account ID."
steps:
- name: get-account
type: call
call: "salesforce.get-account"
with:
account_id: "{{account_id}}"
- name: create-retention-task
type: call
call: "jira.create-issue"
with:
project: "CS"
summary: "Churn risk: {{get-account.name}} — health score {{get-account.health_score}}"
description: "Account {{get-account.name}} dropped below churn threshold. Revenue at risk: ${{get-account.annual_revenue}}."
issue_type: "Task"
priority: "High"
- name: notify-account-manager
type: call
call: "msteams.post-channel-message"
with:
channel_id: "$secrets.teams_cs_channel"
text: "Churn Risk: {{get-account.name}} (score: {{get-account.health_score}}) | Owner: {{get-account.owner_name}} | Jira: {{create-retention-task.key}}"
consumes:
- type: http
namespace: salesforce
baseUri: "https://texaco.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
- type: http
namespace: jira
baseUri: "https://texaco.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/customer-success/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
When a Salesforce opportunity is marked as Closed Won, fetches deal details, updates SAP with the new revenue booking, and sends a celebratory Teams message to the sales channel.
naftiko: "0.5"
info:
label: "Salesforce Deal Close Notification Workflow"
description: "When a Salesforce opportunity is marked as Closed Won, fetches deal details, updates SAP with the new revenue booking, and sends a celebratory Teams message to the sales channel."
tags:
- sales
- crm
- salesforce
- sap
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: sales-ops
port: 8080
tools:
- name: process-deal-close
description: "Given a Salesforce opportunity ID that was closed won, fetch details, post revenue to SAP, and notify the sales team."
inputParameters:
- name: opportunity_id
in: body
type: string
description: "The Salesforce opportunity ID."
steps:
- name: get-opportunity
type: call
call: "salesforce.get-opportunity"
with:
opportunity_id: "{{opportunity_id}}"
- name: post-revenue
type: call
call: "sap.create-sales-order"
with:
customer_name: "{{get-opportunity.account_name}}"
amount: "{{get-opportunity.amount}}"
currency: "{{get-opportunity.currency}}"
- name: notify-sales-team
type: call
call: "msteams.post-channel-message"
with:
channel_id: "$secrets.teams_sales_channel"
text: "Deal Closed! {{get-opportunity.name}} — ${{get-opportunity.amount}} with {{get-opportunity.account_name}} | SAP Order: {{post-revenue.order_number}}"
consumes:
- type: http
namespace: salesforce
baseUri: "https://texaco.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: opportunities
path: "/sobjects/Opportunity/{{opportunity_id}}"
inputParameters:
- name: opportunity_id
in: path
operations:
- name: get-opportunity
method: GET
- type: http
namespace: sap
baseUri: "https://texaco-s4.sap.com/sap/opu/odata/sap/API_SALES_ORDER_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: sales-orders
path: "/A_SalesOrder"
operations:
- name: create-sales-order
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/sales/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
When a new lead is created in Salesforce, enriches the record with company data from an external lookup, scores it, and assigns it to the appropriate sales territory owner.
naftiko: "0.5"
info:
label: "Salesforce Lead Enrichment and Assignment"
description: "When a new lead is created in Salesforce, enriches the record with company data from an external lookup, scores it, and assigns it to the appropriate sales territory owner."
tags:
- sales
- crm
- salesforce
- lead-management
- automation
capability:
exposes:
- type: mcp
namespace: crm-leads
port: 8080
tools:
- name: enrich-and-assign-lead
description: "Given a Salesforce lead ID, retrieve the lead record, update it with enriched company data, assign a lead score, and route it to the correct territory owner in Salesforce. Use when new leads need qualification and routing."
inputParameters:
- name: lead_id
in: body
type: string
description: "The Salesforce Lead record ID to enrich and assign."
steps:
- name: get-lead
type: call
call: "salesforce-leads.get-lead"
with:
lead_id: "{{lead_id}}"
- name: update-lead
type: call
call: "salesforce-leads.update-lead"
with:
lead_id: "{{lead_id}}"
status: "Working"
lead_score: "75"
consumes:
- type: http
namespace: salesforce-leads
baseUri: "https://texaco.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: leads
path: "/sobjects/Lead/{{lead_id}}"
inputParameters:
- name: lead_id
in: path
operations:
- name: get-lead
method: GET
- name: update-lead
method: PATCH
When a lead reaches qualified status in Salesforce, converts it to an opportunity, creates an account in SAP, and notifies the sales rep via Teams.
naftiko: "0.5"
info:
label: "Salesforce Lead to Opportunity Conversion"
description: "When a lead reaches qualified status in Salesforce, converts it to an opportunity, creates an account in SAP, and notifies the sales rep via Teams."
tags:
- sales
- crm
- salesforce
- sap
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: sales-pipeline
port: 8080
tools:
- name: convert-qualified-lead
description: "Given a Salesforce lead ID, convert to opportunity, create SAP account, and notify the rep."
inputParameters:
- name: lead_id
in: body
type: string
description: "The Salesforce lead ID."
steps:
- name: get-lead
type: call
call: "salesforce.get-lead"
with:
lead_id: "{{lead_id}}"
- name: convert-lead
type: call
call: "salesforce.convert-lead"
with:
lead_id: "{{lead_id}}"
- name: create-sap-customer
type: call
call: "sap.create-business-partner"
with:
name: "{{get-lead.company}}"
country: "{{get-lead.country}}"
- name: notify-rep
type: call
call: "msteams.post-channel-message"
with:
channel_id: "$secrets.teams_sales_channel"
text: "Lead converted: {{get-lead.company}} | Opportunity: {{convert-lead.opportunity_id}} | SAP BP: {{create-sap-customer.partner_id}}"
consumes:
- type: http
namespace: salesforce
baseUri: "https://texaco.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: leads
path: "/sobjects/Lead/{{lead_id}}"
inputParameters:
- name: lead_id
in: path
operations:
- name: get-lead
method: GET
- name: convert-lead
method: POST
- type: http
namespace: sap
baseUri: "https://texaco-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: business-partners
path: "/A_BusinessPartner"
operations:
- name: create-business-partner
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/sales/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Queries Salesforce for NPS survey responses submitted in the past 30 days, calculates the net score, and posts a customer sentiment digest to the customer success Microsoft Teams channel.
naftiko: "0.5"
info:
label: "Salesforce NPS Survey Score Aggregator"
description: "Queries Salesforce for NPS survey responses submitted in the past 30 days, calculates the net score, and posts a customer sentiment digest to the customer success Microsoft Teams channel."
tags:
- sales
- customer-success
- salesforce
- microsoft-teams
- nps
- reporting
capability:
exposes:
- type: mcp
namespace: cx-reporting
port: 8080
tools:
- name: aggregate-nps-scores
description: "Query Salesforce NPS survey records from the past 30 days, calculate the aggregate Net Promoter Score, and post a sentiment digest to the customer success Teams channel. Use for monthly CX reporting."
inputParameters:
- name: survey_campaign_id
in: body
type: string
description: "The Salesforce campaign ID for the NPS survey to aggregate."
steps:
- name: query-nps
type: call
call: "salesforce-nps.query-survey-responses"
with:
campaign_id: "{{survey_campaign_id}}"
- name: post-digest
type: call
call: "teams-cx.send-message"
with:
channel: "customer-success-ops"
text: "NPS Digest | Campaign: {{survey_campaign_id}} | Responses: {{query-nps.total_responses}} | Promoters: {{query-nps.promoters}} | Detractors: {{query-nps.detractors}} | NPS: {{query-nps.net_score}}"
consumes:
- type: http
namespace: salesforce-nps
baseUri: "https://texaco.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: survey-responses
path: "/query"
inputParameters:
- name: q
in: query
operations:
- name: query-survey-responses
method: GET
- type: http
namespace: teams-cx
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Queries open Salesforce opportunities by stage and owner, then publishes a pipeline summary to a Microsoft Teams channel for weekly sales review meetings.
naftiko: "0.5"
info:
label: "Salesforce Opportunity Pipeline Digest"
description: "Queries open Salesforce opportunities by stage and owner, then publishes a pipeline summary to a Microsoft Teams channel for weekly sales review meetings."
tags:
- sales
- crm
- salesforce
- microsoft-teams
- reporting
capability:
exposes:
- type: mcp
namespace: sales-reporting
port: 8080
tools:
- name: digest-opportunity-pipeline
description: "Query open Salesforce opportunities filtered by stage and optionally by owner, then post a pipeline digest to the sales Microsoft Teams channel. Use for weekly pipeline reviews and sales forecasting."
inputParameters:
- name: stage_name
in: body
type: string
description: "The Salesforce opportunity stage to filter by, e.g. 'Proposal/Price Quote'."
- name: owner_name
in: body
type: string
description: "Optional sales rep name to filter opportunities by owner."
required: false
steps:
- name: query-opps
type: call
call: "salesforce-crm.query-opportunities"
with:
stage_name: "{{stage_name}}"
owner_name: "{{owner_name}}"
- name: post-digest
type: call
call: "teams-sales.send-message"
with:
channel: "sales-pipeline"
text: "Pipeline Digest | Stage: {{stage_name}} | Open Opps: {{query-opps.total_size}} | Total Value: {{query-opps.total_amount}}"
consumes:
- type: http
namespace: salesforce-crm
baseUri: "https://texaco.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: opportunities
path: "/query"
inputParameters:
- name: q
in: query
operations:
- name: query-opportunities
method: GET
- type: http
namespace: teams-sales
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Pulls account metrics from Salesforce, support ticket history from ServiceNow, and publishes a QBR deck outline to Confluence for the account team.
naftiko: "0.5"
info:
label: "Salesforce Quarterly Business Review Prep"
description: "Pulls account metrics from Salesforce, support ticket history from ServiceNow, and publishes a QBR deck outline to Confluence for the account team."
tags:
- sales
- salesforce
- servicenow
- confluence
capability:
exposes:
- type: mcp
namespace: sales-qbr
port: 8080
tools:
- name: prepare-qbr
description: "Given a Salesforce account ID, pull metrics, get support history, and publish a QBR outline."
inputParameters:
- name: account_id
in: body
type: string
description: "The Salesforce account ID."
- name: quarter
in: body
type: string
description: "The quarter (e.g., Q1-2026)."
steps:
- name: get-account-metrics
type: call
call: "salesforce.get-account"
with:
account_id: "{{account_id}}"
- name: get-support-history
type: call
call: "servicenow.query-incidents"
with:
query: "account={{account_id}}^opened_at>=javascript:gs.beginningOfQuarter()"
- name: publish-qbr-outline
type: call
call: "confluence.create-page"
with:
space_key: "SALES"
title: "QBR: {{get-account-metrics.name}} — {{quarter}}"
body: "Account: {{get-account-metrics.name}} | Revenue: ${{get-account-metrics.annual_revenue}} | Support tickets: {{get-support-history.count}} | Health: {{get-account-metrics.health_score}}"
consumes:
- type: http
namespace: salesforce
baseUri: "https://texaco.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
- type: http
namespace: servicenow
baseUri: "https://texaco.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: query-incidents
method: GET
- type: http
namespace: confluence
baseUri: "https://texaco.atlassian.net/wiki/rest/api"
authentication:
type: basic
username: "$secrets.confluence_user"
password: "$secrets.confluence_api_token"
resources:
- name: pages
path: "/content"
operations:
- name: create-page
method: POST
Extracts upcoming contract renewals from Salesforce, posts revenue forecast data to Snowflake, and sends a summary to the finance planning team on Teams.
naftiko: "0.5"
info:
label: "Salesforce Renewal Pipeline to Finance"
description: "Extracts upcoming contract renewals from Salesforce, posts revenue forecast data to Snowflake, and sends a summary to the finance planning team on Teams."
tags:
- sales
- finance
- salesforce
- snowflake
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: revenue-planning
port: 8080
tools:
- name: sync-renewal-pipeline
description: "Fetch renewal opportunities from Salesforce, store in Snowflake, and notify finance."
inputParameters:
- name: close_date_from
in: body
type: string
description: "Start date for renewal window (YYYY-MM-DD)."
- name: close_date_to
in: body
type: string
description: "End date for renewal window (YYYY-MM-DD)."
steps:
- name: get-renewals
type: call
call: "salesforce.query-renewals"
with:
date_from: "{{close_date_from}}"
date_to: "{{close_date_to}}"
- name: store-forecast
type: call
call: "snowflake.execute-query"
with:
statement: "INSERT INTO FINANCE_DB.PUBLIC.RENEWAL_FORECAST (period_start, period_end, total_value, count) VALUES ('{{close_date_from}}', '{{close_date_to}}', '{{get-renewals.total_value}}', '{{get-renewals.count}}')"
- name: notify-finance
type: call
call: "msteams.post-channel-message"
with:
channel_id: "$secrets.teams_finance_planning_channel"
text: "Renewal Pipeline: {{close_date_from}} to {{close_date_to}} | {{get-renewals.count}} renewals | ${{get-renewals.total_value}} total"
consumes:
- type: http
namespace: salesforce
baseUri: "https://texaco.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: renewals
path: "/query"
operations:
- name: query-renewals
method: GET
- type: http
namespace: snowflake
baseUri: "https://texaco.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-query
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/finance-planning/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Creates a new Salesforce service case from a customer issue report, assigns it to the correct support queue based on product line, and sends an acknowledgment email via Microsoft 365.
naftiko: "0.5"
info:
label: "Salesforce Service Case Creation and Routing"
description: "Creates a new Salesforce service case from a customer issue report, assigns it to the correct support queue based on product line, and sends an acknowledgment email via Microsoft 365."
tags:
- customer-support
- crm
- salesforce
- microsoft-365
- case-management
capability:
exposes:
- type: mcp
namespace: support-cases
port: 8080
tools:
- name: create-and-route-case
description: "Create a Salesforce service case for a customer issue, assign it to the appropriate product support queue, and send an email acknowledgment to the customer via Microsoft 365. Use for customer support intake."
inputParameters:
- name: account_id
in: body
type: string
description: "The Salesforce Account ID of the reporting customer."
- name: subject
in: body
type: string
description: "Case subject summarizing the issue."
- name: description
in: body
type: string
description: "Full description of the customer issue."
- name: product_line
in: body
type: string
description: "The product line or category for queue routing."
- name: customer_email
in: body
type: string
description: "Customer email for acknowledgment."
steps:
- name: create-case
type: call
call: "salesforce-support.create-case"
with:
account_id: "{{account_id}}"
subject: "{{subject}}"
description: "{{description}}"
product_line: "{{product_line}}"
- name: send-ack
type: call
call: "msgraph-mail.send-email"
with:
to: "{{customer_email}}"
subject: "Case {{create-case.case_number}} Received: {{subject}}"
body: "Thank you for contacting Texaco support. Your case number is {{create-case.case_number}}. We will respond within 24 hours."
consumes:
- type: http
namespace: salesforce-support
baseUri: "https://texaco.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: msgraph-mail
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: user-mail
path: "/users/{{sender_upn}}/sendMail"
inputParameters:
- name: sender_upn
in: path
operations:
- name: send-email
method: POST
Retrieves the status and key terms of an SAP Ariba contract by contract ID for procurement compliance checks.
naftiko: "0.5"
info:
label: "SAP Ariba Contract Status Lookup"
description: "Retrieves the status and key terms of an SAP Ariba contract by contract ID for procurement compliance checks."
tags:
- procurement
- sap-ariba
capability:
exposes:
- type: mcp
namespace: procurement-contracts
port: 8080
tools:
- name: get-contract-status
description: "Look up an SAP Ariba contract by ID. Returns status, expiry date, total value, and supplier name."
inputParameters:
- name: contract_id
in: body
type: string
description: "The SAP Ariba contract document ID."
call: "ariba.get-contract"
with:
contract_id: "{{contract_id}}"
outputParameters:
- name: status
type: string
mapping: "$.status"
- name: expiry_date
type: string
mapping: "$.expirationDate"
- name: total_value
type: string
mapping: "$.amount.value"
consumes:
- type: http
namespace: ariba
baseUri: "https://openapi.ariba.com/api/contract-management/v1"
authentication:
type: bearer
token: "$secrets.ariba_token"
resources:
- name: contracts
path: "/contracts/{{contract_id}}"
inputParameters:
- name: contract_id
in: path
operations:
- name: get-contract
method: GET
Submits a procurement requisition to SAP Ariba for a non-catalog purchase, routes it through the approval workflow, and notifies the requester via Microsoft Teams.
naftiko: "0.5"
info:
label: "SAP Ariba Procurement Request Submission"
description: "Submits a procurement requisition to SAP Ariba for a non-catalog purchase, routes it through the approval workflow, and notifies the requester via Microsoft Teams."
tags:
- procurement
- sap-ariba
- microsoft-teams
- approval
- finance
capability:
exposes:
- type: mcp
namespace: procurement-ariba
port: 8080
tools:
- name: submit-procurement-request
description: "Submit a non-catalog purchase requisition to SAP Ariba with item details, cost center, and spend category. Notifies the requester in Teams when the request enters the approval queue. Use for ad-hoc procurement needs."
inputParameters:
- name: item_description
in: body
type: string
description: "Description of the item or service being requested."
- name: amount
in: body
type: number
description: "Estimated purchase amount in USD."
- name: cost_center
in: body
type: string
description: "Cost center code for budget allocation."
- name: requester_email
in: body
type: string
description: "Email of the employee submitting the request."
steps:
- name: create-requisition
type: call
call: "ariba.create-requisition"
with:
description: "{{item_description}}"
amount: "{{amount}}"
cost_center: "{{cost_center}}"
- name: notify-requester
type: call
call: "teams-procurement.send-message"
with:
channel: "procurement-requests"
text: "Procurement Request Submitted | {{item_description}} | Amount: ${{amount}} | Cost Center: {{cost_center}} | Req ID: {{create-requisition.requisition_id}} | Status: Pending Approval"
consumes:
- type: http
namespace: ariba
baseUri: "https://openapi.ariba.com/api/purchase-req/v1"
authentication:
type: bearer
token: "$secrets.ariba_token"
resources:
- name: requisitions
path: "/requisitions"
operations:
- name: create-requisition
method: POST
- type: http
namespace: teams-procurement
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Creates an RFx event in SAP Ariba based on a procurement request, invites qualified suppliers, and posts the event details to the procurement Teams channel.
naftiko: "0.5"
info:
label: "SAP Ariba RFx Creation Workflow"
description: "Creates an RFx event in SAP Ariba based on a procurement request, invites qualified suppliers, and posts the event details to the procurement Teams channel."
tags:
- procurement
- sourcing
- sap-ariba
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: strategic-sourcing
port: 8080
tools:
- name: create-rfx-event
description: "Given procurement details, create an Ariba RFx, invite suppliers, and notify procurement."
inputParameters:
- name: title
in: body
type: string
description: "The RFx event title."
- name: category
in: body
type: string
description: "The procurement category."
- name: budget_amount
in: body
type: string
description: "The budget amount for the RFx."
steps:
- name: create-rfx
type: call
call: "ariba.create-rfx"
with:
title: "{{title}}"
category: "{{category}}"
budget: "{{budget_amount}}"
- name: invite-suppliers
type: call
call: "ariba.invite-suppliers"
with:
rfx_id: "{{create-rfx.rfx_id}}"
category: "{{category}}"
- name: notify-procurement
type: call
call: "msteams.post-channel-message"
with:
channel_id: "$secrets.teams_procurement_channel"
text: "RFx Created: {{title}} | ID: {{create-rfx.rfx_id}} | Budget: ${{budget_amount}} | Suppliers invited: {{invite-suppliers.count}}"
consumes:
- type: http
namespace: ariba
baseUri: "https://openapi.ariba.com/api/sourcing/v1"
authentication:
type: bearer
token: "$secrets.ariba_token"
resources:
- name: rfx-events
path: "/events"
operations:
- name: create-rfx
method: POST
- name: supplier-invitations
path: "/events/{{rfx_id}}/invitations"
inputParameters:
- name: rfx_id
in: path
operations:
- name: invite-suppliers
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/procurement/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Fetches supplier risk scores from SAP Ariba, checks for outstanding compliance items in ServiceNow, and generates a risk summary in Confluence.
naftiko: "0.5"
info:
label: "SAP Ariba Supplier Risk Assessment"
description: "Fetches supplier risk scores from SAP Ariba, checks for outstanding compliance items in ServiceNow, and generates a risk summary in Confluence."
tags:
- procurement
- risk
- sap-ariba
- servicenow
- confluence
capability:
exposes:
- type: mcp
namespace: supplier-risk
port: 8080
tools:
- name: assess-supplier-risk
description: "Given a supplier ID, pull risk data from Ariba, check ServiceNow compliance items, and publish a Confluence risk summary."
inputParameters:
- name: supplier_id
in: body
type: string
description: "The SAP Ariba supplier ID."
steps:
- name: get-supplier-risk
type: call
call: "ariba.get-supplier-risk"
with:
supplier_id: "{{supplier_id}}"
- name: get-compliance-items
type: call
call: "servicenow.query-tasks"
with:
query: "assignment_group=Supplier_Compliance^supplier_id={{supplier_id}}^state!=closed"
- name: publish-summary
type: call
call: "confluence.create-page"
with:
space_key: "PROCUREMENT"
title: "Supplier Risk: {{get-supplier-risk.supplier_name}} — {{get-supplier-risk.risk_score}}"
body: "Risk score: {{get-supplier-risk.risk_score}}. Open compliance items: {{get-compliance-items.count}}. Last assessed: {{get-supplier-risk.assessment_date}}."
consumes:
- type: http
namespace: ariba
baseUri: "https://openapi.ariba.com/api/supplier-management/v1"
authentication:
type: bearer
token: "$secrets.ariba_token"
resources:
- name: supplier-risk
path: "/suppliers/{{supplier_id}}/risk"
inputParameters:
- name: supplier_id
in: path
operations:
- name: get-supplier-risk
method: GET
- type: http
namespace: servicenow
baseUri: "https://texaco.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: query-tasks
method: GET
- type: http
namespace: confluence
baseUri: "https://texaco.atlassian.net/wiki/rest/api"
authentication:
type: basic
username: "$secrets.confluence_user"
password: "$secrets.confluence_api_token"
resources:
- name: pages
path: "/content"
operations:
- name: create-page
method: POST
When a fixed asset is flagged for retirement in SAP, creates the retirement posting, generates a ServiceNow disposal task, and updates the asset register in Snowflake.
naftiko: "0.5"
info:
label: "SAP Asset Retirement Workflow"
description: "When a fixed asset is flagged for retirement in SAP, creates the retirement posting, generates a ServiceNow disposal task, and updates the asset register in Snowflake."
tags:
- finance
- asset-management
- sap
- servicenow
- snowflake
capability:
exposes:
- type: mcp
namespace: asset-lifecycle
port: 8080
tools:
- name: retire-asset
description: "Given a SAP asset number, process retirement, create a disposal task, and update the register."
inputParameters:
- name: asset_number
in: body
type: string
description: "The SAP fixed asset number."
- name: company_code
in: body
type: string
description: "The SAP company code."
steps:
- name: get-asset
type: call
call: "sap.get-fixed-asset"
with:
asset_number: "{{asset_number}}"
company_code: "{{company_code}}"
- name: create-disposal-task
type: call
call: "servicenow.create-task"
with:
short_description: "Asset disposal: {{get-asset.description}} ({{asset_number}})"
description: "Book value: {{get-asset.net_book_value}}. Location: {{get-asset.location}}."
assignment_group: "Facilities_Disposal"
- name: update-register
type: call
call: "snowflake.execute-query"
with:
statement: "UPDATE FINANCE_DB.PUBLIC.ASSET_REGISTER SET status='RETIRED', retirement_date=CURRENT_DATE() WHERE asset_number='{{asset_number}}'"
consumes:
- type: http
namespace: sap
baseUri: "https://texaco-s4.sap.com/sap/opu/odata/sap/API_FIXEDASSET_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: fixed-assets
path: "/A_FixedAsset(CompanyCode='{{company_code}}',MasterFixedAsset='{{asset_number}}')"
inputParameters:
- name: asset_number
in: path
- name: company_code
in: path
operations:
- name: get-fixed-asset
method: GET
- type: http
namespace: servicenow
baseUri: "https://texaco.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: create-task
method: POST
- type: http
namespace: snowflake
baseUri: "https://texaco.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-query
method: POST
When a capex request is submitted in SAP, validates the budget, creates a ServiceNow approval task, and notifies the finance director via Teams for sign-off.
naftiko: "0.5"
info:
label: "SAP Capital Expenditure Approval Workflow"
description: "When a capex request is submitted in SAP, validates the budget, creates a ServiceNow approval task, and notifies the finance director via Teams for sign-off."
tags:
- finance
- sap
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: finance-capex
port: 8080
tools:
- name: process-capex-request
description: "Given a SAP investment order number, validate budget and route for approval."
inputParameters:
- name: investment_order
in: body
type: string
description: "The SAP investment order number."
- name: cost_center
in: body
type: string
description: "The cost center for budget validation."
steps:
- name: get-investment-order
type: call
call: "sap.get-investment-order"
with:
investment_order: "{{investment_order}}"
- name: create-approval
type: call
call: "servicenow.create-task"
with:
short_description: "Capex approval: {{get-investment-order.description}} — ${{get-investment-order.amount}}"
assignment_group: "Finance_Capex_Approval"
description: "Investment order: {{investment_order}}. Amount: ${{get-investment-order.amount}}. Cost center: {{cost_center}}."
- name: notify-finance-director
type: call
call: "msteams.post-channel-message"
with:
channel_id: "$secrets.teams_finance_channel"
text: "Capex approval needed: {{get-investment-order.description}} — ${{get-investment-order.amount}} | Approval: {{create-approval.number}}"
consumes:
- type: http
namespace: sap
baseUri: "https://texaco-s4.sap.com/sap/opu/odata/sap/API_INVESTMENTORDER_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: investment-orders
path: "/A_InvestmentOrder('{{investment_order}}')"
inputParameters:
- name: investment_order
in: path
operations:
- name: get-investment-order
method: GET
- type: http
namespace: servicenow
baseUri: "https://texaco.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: create-task
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/finance/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Fetches a pending expense report from SAP Concur, validates it against policy thresholds, and either auto-approves or escalates to the manager via Microsoft Teams notification.
naftiko: "0.5"
info:
label: "SAP Concur Expense Report Approval"
description: "Fetches a pending expense report from SAP Concur, validates it against policy thresholds, and either auto-approves or escalates to the manager via Microsoft Teams notification."
tags:
- finance
- expense-management
- sap-concur
- microsoft-teams
- approval
capability:
exposes:
- type: mcp
namespace: finance-expense
port: 8080
tools:
- name: process-expense-report
description: "Given a SAP Concur expense report ID, fetch report details, check the total against the auto-approval threshold, and either approve it or escalate to the submitter's manager via Teams. Use for automated expense report processing."
inputParameters:
- name: report_id
in: body
type: string
description: "The SAP Concur expense report ID."
- name: approval_threshold
in: body
type: number
description: "Maximum USD amount for auto-approval. Reports above this will be escalated."
steps:
- name: get-report
type: call
call: "concur.get-expense-report"
with:
report_id: "{{report_id}}"
- name: notify-manager
type: call
call: "teams-expense.send-message"
with:
channel: "finance-approvals"
text: "Expense Report Pending Approval | Submitter: {{get-report.owner_name}} | Amount: {{get-report.total}} {{get-report.currency_code}} | Report ID: {{report_id}}"
consumes:
- type: http
namespace: concur
baseUri: "https://www.concursolutions.com/api/v3.0"
authentication:
type: bearer
token: "$secrets.concur_token"
resources:
- name: expense-reports
path: "/expense/reports/{{report_id}}"
inputParameters:
- name: report_id
in: path
operations:
- name: get-expense-report
method: GET
- type: http
namespace: teams-expense
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-message
method: POST
When a travel request is submitted in Concur, validates against corporate travel policy rules stored in SharePoint and flags non-compliant bookings via ServiceNow.
naftiko: "0.5"
info:
label: "SAP Concur Travel Booking Compliance Check"
description: "When a travel request is submitted in Concur, validates against corporate travel policy rules stored in SharePoint and flags non-compliant bookings via ServiceNow."
tags:
- travel
- compliance
- sap-concur
- sharepoint
- servicenow
capability:
exposes:
- type: mcp
namespace: travel-compliance
port: 8080
tools:
- name: check-travel-compliance
description: "Given a Concur travel request ID, validate it against policy and flag non-compliance."
inputParameters:
- name: request_id
in: body
type: string
description: "The SAP Concur travel request ID."
steps:
- name: get-travel-request
type: call
call: "concur.get-request"
with:
request_id: "{{request_id}}"
- name: get-policy
type: call
call: "sharepoint.get-item"
with:
site_id: "$secrets.sharepoint_policy_site"
item_id: "$secrets.travel_policy_doc_id"
- name: flag-noncompliance
type: call
call: "servicenow.create-task"
with:
short_description: "Travel policy review: Request {{request_id}} by {{get-travel-request.traveler_name}}"
description: "Total estimated cost: {{get-travel-request.total_amount}}. Destination: {{get-travel-request.destination}}."
assignment_group: "Travel_Compliance"
consumes:
- type: http
namespace: concur
baseUri: "https://us.api.concursolutions.com/api/v3.0"
authentication:
type: bearer
token: "$secrets.concur_token"
resources:
- name: requests
path: "/travelrequest/requests/{{request_id}}"
inputParameters:
- name: request_id
in: path
operations:
- name: get-request
method: GET
- type: http
namespace: sharepoint
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: items
path: "/sites/{{site_id}}/drive/items/{{item_id}}"
inputParameters:
- name: site_id
in: path
- name: item_id
in: path
operations:
- name: get-item
method: GET
- type: http
namespace: servicenow
baseUri: "https://texaco.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: create-task
method: POST
Submits a business travel request in SAP Concur with trip details, links it to the employee's cost center in SAP, and sends a confirmation to the traveler via Microsoft Teams.
naftiko: "0.5"
info:
label: "SAP Concur Travel Request Submission"
description: "Submits a business travel request in SAP Concur with trip details, links it to the employee's cost center in SAP, and sends a confirmation to the traveler via Microsoft Teams."
tags:
- finance
- travel-management
- sap-concur
- sap
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: finance-travel
port: 8080
tools:
- name: submit-travel-request
description: "Submit a new SAP Concur travel request for a business trip. Provide trip name, destination, start and end dates, and estimated cost. Sends a Teams confirmation to the traveler on submission."
inputParameters:
- name: trip_name
in: body
type: string
description: "Name or purpose of the business trip."
- name: destination
in: body
type: string
description: "Travel destination city and country."
- name: start_date
in: body
type: string
description: "Trip start date in YYYY-MM-DD format."
- name: end_date
in: body
type: string
description: "Trip end date in YYYY-MM-DD format."
- name: traveler_email
in: body
type: string
description: "The corporate email of the traveler."
steps:
- name: submit-request
type: call
call: "concur-travel.create-travel-request"
with:
name: "{{trip_name}}"
destination: "{{destination}}"
start_date: "{{start_date}}"
end_date: "{{end_date}}"
- name: notify-traveler
type: call
call: "teams-travel.send-message"
with:
recipient: "{{traveler_email}}"
text: "Travel request submitted: {{trip_name}} | {{destination}} | {{start_date}} to {{end_date}} | Request ID: {{submit-request.id}}"
consumes:
- type: http
namespace: concur-travel
baseUri: "https://www.concursolutions.com/api/v3.0"
authentication:
type: bearer
token: "$secrets.concur_token"
resources:
- name: travel-requests
path: "/travelrequest/requests"
operations:
- name: create-travel-request
method: POST
- type: http
namespace: teams-travel
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: user-mail
path: "/users/{{recipient}}/sendMail"
inputParameters:
- name: recipient
in: path
operations:
- name: send-message
method: POST
Retrieves budget and actual spend data from SAP S/4HANA for a given cost center and fiscal period, and posts a variance summary to the finance Microsoft Teams channel.
naftiko: "0.5"
info:
label: "SAP Cost Center Budget vs. Actuals Report"
description: "Retrieves budget and actual spend data from SAP S/4HANA for a given cost center and fiscal period, and posts a variance summary to the finance Microsoft Teams channel."
tags:
- finance
- budgeting
- sap
- microsoft-teams
- reporting
capability:
exposes:
- type: mcp
namespace: finance-budgets
port: 8080
tools:
- name: get-budget-vs-actuals
description: "Retrieve budget and actual spend for a SAP cost center in a given fiscal period. Posts a variance report to the finance channel in Teams. Use for monthly budget reviews and cost center reporting."
inputParameters:
- name: cost_center
in: body
type: string
description: "The SAP cost center code."
- name: fiscal_period
in: body
type: string
description: "The fiscal period in YYYYMM format."
- name: controlling_area
in: body
type: string
description: "The SAP controlling area, e.g. 1000."
steps:
- name: get-variance
type: call
call: "sap-co.get-cost-center-actuals"
with:
cost_center: "{{cost_center}}"
fiscal_period: "{{fiscal_period}}"
controlling_area: "{{controlling_area}}"
- name: post-report
type: call
call: "teams-budget.send-message"
with:
channel: "finance-budgets"
text: "Budget Report | Cost Center: {{cost_center}} | Period: {{fiscal_period}} | Budget: {{get-variance.budget_amount}} | Actuals: {{get-variance.actual_amount}} | Variance: {{get-variance.variance}}"
consumes:
- type: http
namespace: sap-co
baseUri: "https://texaco-s4.sap.com/sap/opu/odata/sap/API_COSTCENTER_0101_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: cost-center-actuals
path: "/A_CostCenter(ControllingArea='{{controlling_area}}',CostCenter='{{cost_center}}')"
inputParameters:
- name: controlling_area
in: path
- name: cost_center
in: path
operations:
- name: get-cost-center-actuals
method: GET
outputRawFormat: xml
- type: http
namespace: teams-budget
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-message
method: POST
When a credit memo request is received, validates the original invoice in SAP, creates the credit memo, and notifies the AR team via ServiceNow and Teams.
naftiko: "0.5"
info:
label: "SAP Credit Memo Processing Workflow"
description: "When a credit memo request is received, validates the original invoice in SAP, creates the credit memo, and notifies the AR team via ServiceNow and Teams."
tags:
- finance
- accounts-receivable
- sap
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: finance-ar
port: 8080
tools:
- name: process-credit-memo
description: "Given an original invoice number and credit amount, validate, create credit memo, and notify AR."
inputParameters:
- name: invoice_number
in: body
type: string
description: "The original SAP invoice number."
- name: credit_amount
in: body
type: string
description: "The credit memo amount."
- name: reason_code
in: body
type: string
description: "The reason code for the credit."
steps:
- name: validate-invoice
type: call
call: "sap.get-invoice"
with:
invoice_number: "{{invoice_number}}"
- name: create-credit-memo
type: call
call: "sap.create-credit-memo"
with:
reference_invoice: "{{invoice_number}}"
amount: "{{credit_amount}}"
reason: "{{reason_code}}"
- name: create-ar-task
type: call
call: "servicenow.create-task"
with:
short_description: "Credit memo issued: {{create-credit-memo.document_number}} for invoice {{invoice_number}}"
assignment_group: "AR_Team"
- name: notify-ar
type: call
call: "msteams.post-channel-message"
with:
channel_id: "$secrets.teams_finance_channel"
text: "Credit memo {{create-credit-memo.document_number}} created for ${{credit_amount}} against invoice {{invoice_number}} | Reason: {{reason_code}}"
consumes:
- type: http
namespace: sap
baseUri: "https://texaco-s4.sap.com/sap/opu/odata/sap/API_BILLING_DOCUMENT_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: invoices
path: "/A_BillingDocument('{{invoice_number}}')"
inputParameters:
- name: invoice_number
in: path
operations:
- name: get-invoice
method: GET
- name: credit-memos
path: "/A_BillingDocument"
operations:
- name: create-credit-memo
method: POST
- type: http
namespace: servicenow
baseUri: "https://texaco.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: create-task
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/finance/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Retrieves the SAP period-close task list for a given fiscal period, checks completion status of each step, and posts a close status summary to the finance Microsoft Teams channel.
naftiko: "0.5"
info:
label: "SAP Financial Period Close Checklist"
description: "Retrieves the SAP period-close task list for a given fiscal period, checks completion status of each step, and posts a close status summary to the finance Microsoft Teams channel."
tags:
- finance
- period-close
- sap
- microsoft-teams
- erp
capability:
exposes:
- type: mcp
namespace: finance-close
port: 8080
tools:
- name: check-period-close-status
description: "Given a fiscal period and company code, retrieve the SAP period-close task completion status and post a summary to the finance Teams channel. Use at month-end to track close progress."
inputParameters:
- name: company_code
in: body
type: string
description: "The SAP company code, e.g. 1000."
- name: fiscal_period
in: body
type: string
description: "The fiscal period in YYYYMM format, e.g. 202503."
steps:
- name: get-close-status
type: call
call: "sap-close.get-period-status"
with:
company_code: "{{company_code}}"
fiscal_period: "{{fiscal_period}}"
- name: post-summary
type: call
call: "teams-finclose.send-message"
with:
channel: "finance-period-close"
text: "Period Close Status | Company: {{company_code}} | Period: {{fiscal_period}} | Open Items: {{get-close-status.open_count}} | Completed: {{get-close-status.closed_count}}"
consumes:
- type: http
namespace: sap-close
baseUri: "https://texaco-s4.sap.com/sap/opu/odata/sap/API_FINANCEPERIODCLOSE_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: period-close-tasks
path: "/A_ClosingTaskCompletion"
inputParameters:
- name: company_code
in: query
- name: fiscal_period
in: query
operations:
- name: get-period-status
method: GET
outputRawFormat: xml
- type: http
namespace: teams-finclose
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Retrieves the current balance of a general ledger account from SAP S/4HANA by company code and GL account number.
naftiko: "0.5"
info:
label: "SAP GL Account Balance Lookup"
description: "Retrieves the current balance of a general ledger account from SAP S/4HANA by company code and GL account number."
tags:
- finance
- sap
- accounting
capability:
exposes:
- type: mcp
namespace: erp-finance
port: 8080
tools:
- name: get-gl-balance
description: "Look up the current balance for a SAP general ledger account. Returns debit total, credit total, and net balance."
inputParameters:
- name: company_code
in: body
type: string
description: "The SAP company code."
- name: gl_account
in: body
type: string
description: "The GL account number."
call: "sap.get-gl-balance"
with:
company_code: "{{company_code}}"
gl_account: "{{gl_account}}"
outputParameters:
- name: debit_total
type: string
mapping: "$.d.DebitAmount"
- name: credit_total
type: string
mapping: "$.d.CreditAmount"
- name: net_balance
type: string
mapping: "$.d.Balance"
consumes:
- type: http
namespace: sap
baseUri: "https://texaco-s4.sap.com/sap/opu/odata/sap/API_GLACCOUNTBALANCE_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: gl-balances
path: "/A_GLAccountBalance(CompanyCode='{{company_code}}',GLAccount='{{gl_account}}')"
inputParameters:
- name: company_code
in: path
- name: gl_account
in: path
operations:
- name: get-gl-balance
method: GET
When a goods receipt is posted in SAP, retrieves the PO and vendor invoice details, then triggers three-way match verification and creates a ServiceNow task if discrepancies are found.
naftiko: "0.5"
info:
label: "SAP Goods Receipt to Invoice Verification"
description: "When a goods receipt is posted in SAP, retrieves the PO and vendor invoice details, then triggers three-way match verification and creates a ServiceNow task if discrepancies are found."
tags:
- finance
- procurement
- sap
- servicenow
capability:
exposes:
- type: mcp
namespace: finance-verification
port: 8080
tools:
- name: verify-goods-receipt
description: "Given a SAP goods receipt document and PO number, verify the three-way match and create a ServiceNow task if discrepancies exist."
inputParameters:
- name: gr_document
in: body
type: string
description: "The SAP goods receipt document number."
- name: po_number
in: body
type: string
description: "The related purchase order number."
steps:
- name: get-goods-receipt
type: call
call: "sap.get-goods-receipt"
with:
gr_document: "{{gr_document}}"
- name: get-po-details
type: call
call: "sap.get-po"
with:
po_number: "{{po_number}}"
- name: create-discrepancy-task
type: call
call: "servicenow.create-task"
with:
short_description: "Three-way match discrepancy: GR {{gr_document}} vs PO {{po_number}}"
description: "GR qty: {{get-goods-receipt.quantity}}, PO qty: {{get-po-details.quantity}}. Vendor: {{get-po-details.vendor}}."
assignment_group: "AP_Verification"
consumes:
- type: http
namespace: sap
baseUri: "https://texaco-s4.sap.com/sap/opu/odata/sap/API_MATERIAL_DOCUMENT_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: goods-receipts
path: "/A_MaterialDocumentHeader('{{gr_document}}')"
inputParameters:
- name: gr_document
in: path
operations:
- name: get-goods-receipt
method: GET
- name: purchase-orders
path: "/A_PurchaseOrder('{{po_number}}')"
inputParameters:
- name: po_number
in: path
operations:
- name: get-po
method: GET
- type: http
namespace: servicenow
baseUri: "https://texaco.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: create-task
method: POST
Fetches intercompany billing documents from SAP, compares balances across company codes, and creates a ServiceNow task for the finance team when discrepancies are detected.
naftiko: "0.5"
info:
label: "SAP Intercompany Billing Reconciliation"
description: "Fetches intercompany billing documents from SAP, compares balances across company codes, and creates a ServiceNow task for the finance team when discrepancies are detected."
tags:
- finance
- sap
- servicenow
capability:
exposes:
- type: mcp
namespace: finance-recon
port: 8080
tools:
- name: reconcile-intercompany
description: "Given two company codes, fetch intercompany balances from SAP and create a ServiceNow task if discrepancies exist."
inputParameters:
- name: company_code_a
in: body
type: string
description: "The first SAP company code."
- name: company_code_b
in: body
type: string
description: "The second SAP company code."
steps:
- name: get-balance-a
type: call
call: "sap.get-intercompany-balance"
with:
company_code: "{{company_code_a}}"
partner_code: "{{company_code_b}}"
- name: get-balance-b
type: call
call: "sap.get-intercompany-balance"
with:
company_code: "{{company_code_b}}"
partner_code: "{{company_code_a}}"
- name: create-recon-task
type: call
call: "servicenow.create-task"
with:
short_description: "Intercompany reconciliation: {{company_code_a}} vs {{company_code_b}}"
description: "Balance A: {{get-balance-a.net_balance}}, Balance B: {{get-balance-b.net_balance}}."
assignment_group: "Finance_Intercompany"
consumes:
- type: http
namespace: sap
baseUri: "https://texaco-s4.sap.com/sap/opu/odata/sap/API_GLACCOUNTBALANCE_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: intercompany
path: "/A_GLAccountBalance"
operations:
- name: get-intercompany-balance
method: GET
- type: http
namespace: servicenow
baseUri: "https://texaco.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: create-task
method: POST
Retrieves material master data from SAP S/4HANA by material number, returning description, unit of measure, and stock levels.
naftiko: "0.5"
info:
label: "SAP Material Master Lookup"
description: "Retrieves material master data from SAP S/4HANA by material number, returning description, unit of measure, and stock levels."
tags:
- supply-chain
- sap
capability:
exposes:
- type: mcp
namespace: erp-materials
port: 8080
tools:
- name: get-material
description: "Look up a SAP material master record by material number. Returns description, base unit, and plant-level stock quantities."
inputParameters:
- name: material_number
in: body
type: string
description: "The SAP material number."
call: "sap.get-material"
with:
material_number: "{{material_number}}"
outputParameters:
- name: description
type: string
mapping: "$.d.MaterialDescription"
- name: base_unit
type: string
mapping: "$.d.BaseUnit"
- name: unrestricted_stock
type: string
mapping: "$.d.UnrestrictedStock"
consumes:
- type: http
namespace: sap
baseUri: "https://texaco-s4.sap.com/sap/opu/odata/sap/API_MATERIAL_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: materials
path: "/A_Material('{{material_number}}')"
inputParameters:
- name: material_number
in: path
operations:
- name: get-material
method: GET
Retrieves a plant maintenance order from SAP by order number, returning status, equipment details, and planned dates.
naftiko: "0.5"
info:
label: "SAP Plant Maintenance Order Lookup"
description: "Retrieves a plant maintenance order from SAP by order number, returning status, equipment details, and planned dates."
tags:
- operations
- sap
- maintenance
capability:
exposes:
- type: mcp
namespace: erp-maintenance
port: 8080
tools:
- name: get-maintenance-order
description: "Look up a SAP plant maintenance order. Returns order status, equipment ID, planned start/end dates, and work center."
inputParameters:
- name: order_number
in: body
type: string
description: "The SAP maintenance order number."
call: "sap.get-pm-order"
with:
order_number: "{{order_number}}"
outputParameters:
- name: status
type: string
mapping: "$.d.OrderStatus"
- name: equipment
type: string
mapping: "$.d.Equipment"
- name: planned_start
type: string
mapping: "$.d.PlannedStartDate"
consumes:
- type: http
namespace: sap
baseUri: "https://texaco-s4.sap.com/sap/opu/odata/sap/API_MAINTENANCEORDER_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: maintenance-orders
path: "/A_MaintenanceOrder('{{order_number}}')"
inputParameters:
- name: order_number
in: path
operations:
- name: get-pm-order
method: GET
Retrieves a SAP S/4HANA purchase order by PO number, returning header status, vendor, total value, and open line items for procurement review.
naftiko: "0.5"
info:
label: "SAP Purchase Order Lookup"
description: "Retrieves a SAP S/4HANA purchase order by PO number, returning header status, vendor, total value, and open line items for procurement review."
tags:
- finance
- procurement
- sap
- erp
capability:
exposes:
- type: mcp
namespace: erp-procurement
port: 8080
tools:
- name: get-purchase-order
description: "Look up a SAP S/4HANA purchase order by PO number. Returns overall status, vendor name, total amount, and currency. Use for procurement approvals and spend visibility."
inputParameters:
- name: po_number
in: body
type: string
description: "The SAP purchase order number, e.g. 4500001234."
call: "sap-po.get-po"
with:
po_number: "{{po_number}}"
outputParameters:
- name: status
type: string
mapping: "$.d.OverallStatus"
- name: vendor
type: string
mapping: "$.d.Supplier.CompanyName"
- name: total_value
type: string
mapping: "$.d.TotalAmount"
- name: currency
type: string
mapping: "$.d.TransactionCurrency"
consumes:
- type: http
namespace: sap-po
baseUri: "https://texaco-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
outputRawFormat: xml
Extracts regulatory reporting data from SAP, validates completeness against checklist in ServiceNow, and publishes the finalized report to SharePoint for submission.
naftiko: "0.5"
info:
label: "SAP Regulatory Reporting Submission"
description: "Extracts regulatory reporting data from SAP, validates completeness against checklist in ServiceNow, and publishes the finalized report to SharePoint for submission."
tags:
- compliance
- regulatory
- sap
- servicenow
- sharepoint
capability:
exposes:
- type: mcp
namespace: regulatory
port: 8080
tools:
- name: prepare-regulatory-report
description: "Given a report type and period, extract SAP data, validate, and publish to SharePoint."
inputParameters:
- name: report_type
in: body
type: string
description: "The regulatory report type."
- name: reporting_period
in: body
type: string
description: "The reporting period (e.g., 2026-Q1)."
steps:
- name: extract-data
type: call
call: "sap.get-regulatory-data"
with:
report_type: "{{report_type}}"
period: "{{reporting_period}}"
- name: validate-checklist
type: call
call: "servicenow.update-task"
with:
short_description: "Regulatory report validation: {{report_type}} — {{reporting_period}}"
description: "Data extracted: {{extract-data.record_count}} records. Validation required."
assignment_group: "Regulatory_Compliance"
- name: publish-report
type: call
call: "sharepoint.upload-file"
with:
site_id: "$secrets.sharepoint_regulatory_site"
folder: "Regulatory Reports/{{reporting_period}}"
file_name: "{{report_type}}_{{reporting_period}}.xlsx"
consumes:
- type: http
namespace: sap
baseUri: "https://texaco-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: get-regulatory-data
method: GET
- type: http
namespace: servicenow
baseUri: "https://texaco.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: update-task
method: POST
- type: http
namespace: sharepoint
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: uploads
path: "/sites/{{site_id}}/drive/root:/{{folder}}/{{file_name}}:/content"
inputParameters:
- name: site_id
in: path
operations:
- name: upload-file
method: PUT
Retrieves shipment status from SAP Transportation Management, updates the customer record in Salesforce, and notifies the logistics team on Teams.
naftiko: "0.5"
info:
label: "SAP Transportation Shipment Tracking"
description: "Retrieves shipment status from SAP Transportation Management, updates the customer record in Salesforce, and notifies the logistics team on Teams."
tags:
- logistics
- sap
- salesforce
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: logistics
port: 8080
tools:
- name: track-shipment
description: "Given a SAP shipment ID, get status, update Salesforce, and notify logistics."
inputParameters:
- name: shipment_id
in: body
type: string
description: "The SAP TM shipment ID."
- name: salesforce_case_id
in: body
type: string
description: "The related Salesforce case ID."
steps:
- name: get-shipment
type: call
call: "sap.get-shipment"
with:
shipment_id: "{{shipment_id}}"
- name: update-salesforce-case
type: call
call: "salesforce.update-case"
with:
case_id: "{{salesforce_case_id}}"
status: "{{get-shipment.status}}"
comment: "Shipment {{shipment_id}} status: {{get-shipment.status}}. ETA: {{get-shipment.eta}}."
- name: notify-logistics
type: call
call: "msteams.post-channel-message"
with:
channel_id: "$secrets.teams_logistics_channel"
text: "Shipment {{shipment_id}}: {{get-shipment.status}} | ETA: {{get-shipment.eta}} | SF Case: {{salesforce_case_id}}"
consumes:
- type: http
namespace: sap
baseUri: "https://texaco-s4.sap.com/sap/opu/odata/sap/API_SHIPMENT_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: shipments
path: "/A_Shipment('{{shipment_id}}')"
inputParameters:
- name: shipment_id
in: path
operations:
- name: get-shipment
method: GET
- type: http
namespace: salesforce
baseUri: "https://texaco.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: update-case
method: PATCH
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/logistics/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Retrieves vendor master data from SAP S/4HANA by vendor ID, returning contact information, payment terms, and compliance status for procurement and accounts payable teams.
naftiko: "0.5"
info:
label: "SAP Vendor Master Data Lookup"
description: "Retrieves vendor master data from SAP S/4HANA by vendor ID, returning contact information, payment terms, and compliance status for procurement and accounts payable teams."
tags:
- finance
- procurement
- sap
- vendor-management
- erp
capability:
exposes:
- type: mcp
namespace: erp-vendors
port: 8080
tools:
- name: get-vendor-master
description: "Look up a SAP vendor master record by vendor ID. Returns vendor name, payment terms, bank details flag, and tax classification. Use for vendor validation in procurement and AP workflows."
inputParameters:
- name: vendor_id
in: body
type: string
description: "The SAP vendor (supplier) ID number."
call: "sap-vendor.get-vendor"
with:
vendor_id: "{{vendor_id}}"
outputParameters:
- name: vendor_name
type: string
mapping: "$.d.SupplierFullName"
- name: payment_terms
type: string
mapping: "$.d.PaymentTerms"
- name: currency
type: string
mapping: "$.d.Currency"
- name: tax_number
type: string
mapping: "$.d.TaxNumber1"
consumes:
- type: http
namespace: sap-vendor
baseUri: "https://texaco-s4.sap.com/sap/opu/odata/sap/API_SUPPLIER_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: suppliers
path: "/A_Supplier('{{vendor_id}}')"
inputParameters:
- name: vendor_id
in: path
operations:
- name: get-vendor
method: GET
outputRawFormat: xml
Checks the payment status of a vendor invoice in SAP S/4HANA, returning payment date, clearing document, and amount.
naftiko: "0.5"
info:
label: "SAP Vendor Payment Status Check"
description: "Checks the payment status of a vendor invoice in SAP S/4HANA, returning payment date, clearing document, and amount."
tags:
- finance
- sap
- accounts-payable
capability:
exposes:
- type: mcp
namespace: erp-ap
port: 8080
tools:
- name: get-payment-status
description: "Check vendor payment status in SAP by invoice reference. Returns payment date, clearing document number, and paid amount."
inputParameters:
- name: invoice_reference
in: body
type: string
description: "The SAP vendor invoice reference number."
- name: company_code
in: body
type: string
description: "The SAP company code."
call: "sap.get-payment"
with:
invoice_reference: "{{invoice_reference}}"
company_code: "{{company_code}}"
outputParameters:
- name: payment_date
type: string
mapping: "$.d.ClearingDate"
- name: clearing_document
type: string
mapping: "$.d.ClearingDocument"
- name: paid_amount
type: string
mapping: "$.d.AmountInCompanyCodeCurrency"
consumes:
- type: http
namespace: sap
baseUri: "https://texaco-s4.sap.com/sap/opu/odata/sap/API_SUPPLIERINVOICE_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: invoices
path: "/A_SupplierInvoice(SupplierInvoice='{{invoice_reference}}',CompanyCode='{{company_code}}')"
inputParameters:
- name: invoice_reference
in: path
- name: company_code
in: path
operations:
- name: get-payment
method: GET
Retrieves an asset record from the ServiceNow CMDB by asset tag or serial number, returning hardware details, assigned user, and maintenance history for IT asset management.
naftiko: "0.5"
info:
label: "ServiceNow Asset Inventory Lookup"
description: "Retrieves an asset record from the ServiceNow CMDB by asset tag or serial number, returning hardware details, assigned user, and maintenance history for IT asset management."
tags:
- itsm
- asset-management
- servicenow
- cmdb
capability:
exposes:
- type: mcp
namespace: itsm-assets
port: 8080
tools:
- name: get-asset-record
description: "Look up a ServiceNow CMDB asset by asset tag. Returns hardware model, assigned user, location, and last maintenance date. Use for IT asset audits, refresh planning, and support escalations."
inputParameters:
- name: asset_tag
in: body
type: string
description: "The asset tag or serial number of the hardware item."
call: "servicenow-cmdb.get-asset"
with:
asset_tag: "{{asset_tag}}"
outputParameters:
- name: display_name
type: string
mapping: "$.result[0].display_name"
- name: assigned_to
type: string
mapping: "$.result[0].assigned_to.display_value"
- name: location
type: string
mapping: "$.result[0].location.display_value"
- name: model
type: string
mapping: "$.result[0].model_id.display_value"
consumes:
- type: http
namespace: servicenow-cmdb
baseUri: "https://texaco.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: hardware-assets
path: "/table/alm_hardware"
inputParameters:
- name: asset_tag
in: query
operations:
- name: get-asset
method: GET
Retrieves the latest backup job status from ServiceNow for a given configuration item, flags any failures, and posts a backup health summary to the infrastructure Teams channel.
naftiko: "0.5"
info:
label: "ServiceNow Backup Verification Check"
description: "Retrieves the latest backup job status from ServiceNow for a given configuration item, flags any failures, and posts a backup health summary to the infrastructure Teams channel."
tags:
- operations
- backup
- servicenow
- microsoft-teams
- monitoring
capability:
exposes:
- type: mcp
namespace: infra-backup
port: 8080
tools:
- name: verify-backup-status
description: "Given a ServiceNow CI name, retrieve the most recent backup job results, identify failures or missed windows, and post a status summary to the infrastructure Teams channel. Use for daily backup health verification."
inputParameters:
- name: ci_name
in: body
type: string
description: "The ServiceNow configuration item (server or database) name."
steps:
- name: get-backup-jobs
type: call
call: "servicenow-backup.get-backup-jobs"
with:
ci_name: "{{ci_name}}"
- name: post-status
type: call
call: "teams-infra.send-message"
with:
channel: "infrastructure-ops"
text: "Backup Check | CI: {{ci_name}} | Last Job: {{get-backup-jobs.last_run}} | Status: {{get-backup-jobs.status}} | Duration: {{get-backup-jobs.duration_minutes}} min"
consumes:
- type: http
namespace: servicenow-backup
baseUri: "https://texaco.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: backup-jobs
path: "/table/backup_job"
inputParameters:
- name: ci_name
in: query
operations:
- name: get-backup-jobs
method: GET
- type: http
namespace: teams-infra
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Submits a ServiceNow change request for a planned infrastructure change, routes it to the CAB approval queue, and notifies stakeholders via Microsoft Teams.
naftiko: "0.5"
info:
label: "ServiceNow Change Request Approval Workflow"
description: "Submits a ServiceNow change request for a planned infrastructure change, routes it to the CAB approval queue, and notifies stakeholders via Microsoft Teams."
tags:
- itsm
- change-management
- servicenow
- microsoft-teams
- operations
capability:
exposes:
- type: mcp
namespace: itsm-change
port: 8080
tools:
- name: create-change-request
description: "Submit a ServiceNow change request for a planned infrastructure change, set the approval state, and notify the change stakeholders in the IT ops Teams channel. Use before any production infrastructure modification."
inputParameters:
- name: change_title
in: body
type: string
description: "Short description of the planned change."
- name: change_description
in: body
type: string
description: "Detailed description of the change, including rollback plan."
- name: planned_start
in: body
type: string
description: "Planned start datetime in ISO 8601 format."
- name: planned_end
in: body
type: string
description: "Planned end datetime in ISO 8601 format."
steps:
- name: create-cr
type: call
call: "servicenow-change.create-change"
with:
short_description: "{{change_title}}"
description: "{{change_description}}"
start_date: "{{planned_start}}"
end_date: "{{planned_end}}"
state: "pending_approval"
- name: notify-stakeholders
type: call
call: "teams-change.send-message"
with:
channel: "it-change-management"
text: "Change Request Submitted: {{change_title}} | CR#: {{create-cr.number}} | Scheduled: {{planned_start}} to {{planned_end}} | Awaiting CAB approval."
consumes:
- type: http
namespace: servicenow-change
baseUri: "https://texaco.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: change-requests
path: "/table/change_request"
operations:
- name: create-change
method: POST
- type: http
namespace: teams-change
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Retrieves the current status, priority, and assigned group of a ServiceNow incident by incident number.
naftiko: "0.5"
info:
label: "ServiceNow Incident Status Lookup"
description: "Retrieves the current status, priority, and assigned group of a ServiceNow incident by incident number."
tags:
- itsm
- servicenow
capability:
exposes:
- type: mcp
namespace: itsm
port: 8080
tools:
- name: get-incident-status
description: "Look up a ServiceNow incident by number. Returns state, priority, assigned group, and short description."
inputParameters:
- name: incident_number
in: body
type: string
description: "The ServiceNow incident number (e.g., INC0012345)."
call: "servicenow.get-incident"
with:
incident_number: "{{incident_number}}"
outputParameters:
- name: state
type: string
mapping: "$.result.state"
- name: priority
type: string
mapping: "$.result.priority"
- name: assigned_group
type: string
mapping: "$.result.assignment_group.display_value"
consumes:
- type: http
namespace: servicenow
baseUri: "https://texaco.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident?sysparm_query=number={{incident_number}}"
inputParameters:
- name: incident_number
in: query
operations:
- name: get-incident
method: GET
When a critical ServiceNow incident is opened, enriches it with asset details, assigns it to the appropriate on-call group, and sends a priority alert to the IT operations Microsoft Teams channel.
naftiko: "0.5"
info:
label: "ServiceNow Incident Triage and Escalation"
description: "When a critical ServiceNow incident is opened, enriches it with asset details, assigns it to the appropriate on-call group, and sends a priority alert to the IT operations Microsoft Teams channel."
tags:
- itsm
- incident-response
- servicenow
- microsoft-teams
- operations
capability:
exposes:
- type: mcp
namespace: itsm-ops
port: 8080
tools:
- name: handle-critical-incident
description: "Given a ServiceNow incident number, retrieve incident details, escalate priority, assign to the on-call group, and post a critical alert to the IT ops Teams channel. Use when a P1/P2 incident requires immediate escalation."
inputParameters:
- name: incident_number
in: body
type: string
description: "The ServiceNow incident number, e.g. INC0012345."
- name: on_call_group
in: body
type: string
description: "The ServiceNow assignment group for escalation."
steps:
- name: get-incident
type: call
call: "servicenow-itsm.get-incident"
with:
number: "{{incident_number}}"
- name: escalate-incident
type: call
call: "servicenow-itsm.update-incident"
with:
sys_id: "{{get-incident.sys_id}}"
priority: "1"
assignment_group: "{{on_call_group}}"
- name: post-alert
type: call
call: "teams-ops.send-message"
with:
channel: "it-operations-alerts"
text: "CRITICAL: {{incident_number}} | {{get-incident.short_description}} | Assigned to: {{on_call_group}}"
consumes:
- type: http
namespace: servicenow-itsm
baseUri: "https://texaco.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
inputParameters:
- name: number
in: query
operations:
- name: get-incident
method: GET
- name: incident-record
path: "/table/incident/{{sys_id}}"
inputParameters:
- name: sys_id
in: path
operations:
- name: update-incident
method: PATCH
- type: http
namespace: teams-ops
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-message
method: POST
When a ServiceNow P1 incident is created, automatically sets up a Teams meeting bridge, invites the on-call responders from PagerDuty, and updates the incident with bridge details.
naftiko: "0.5"
info:
label: "ServiceNow Major Incident Bridge Setup"
description: "When a ServiceNow P1 incident is created, automatically sets up a Teams meeting bridge, invites the on-call responders from PagerDuty, and updates the incident with bridge details."
tags:
- itsm
- incident-response
- servicenow
- microsoft-teams
- pagerduty
capability:
exposes:
- type: mcp
namespace: incident-bridge
port: 8080
tools:
- name: setup-incident-bridge
description: "Given a ServiceNow P1 incident number, create a Teams bridge, get on-call from PagerDuty, and update the incident."
inputParameters:
- name: incident_number
in: body
type: string
description: "The ServiceNow incident number."
steps:
- name: get-incident
type: call
call: "servicenow.get-incident"
with:
incident_number: "{{incident_number}}"
- name: get-oncall
type: call
call: "pagerduty.get-oncall"
with:
schedule_id: "$secrets.pagerduty_oncall_schedule"
- name: create-bridge
type: call
call: "msgraph.create-meeting"
with:
subject: "P1 Bridge: {{get-incident.short_description}}"
attendees: "{{get-oncall.email}}"
- name: update-incident
type: call
call: "servicenow.update-incident"
with:
incident_number: "{{incident_number}}"
work_notes: "Teams bridge created: {{create-bridge.join_url}}. On-call: {{get-oncall.name}}."
consumes:
- type: http
namespace: servicenow
baseUri: "https://texaco.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: get-incident
method: GET
- name: update-incident
method: PATCH
- type: http
namespace: pagerduty
baseUri: "https://api.pagerduty.com"
authentication:
type: bearer
token: "$secrets.pagerduty_token"
resources:
- name: oncalls
path: "/oncalls?schedule_ids[]={{schedule_id}}"
inputParameters:
- name: schedule_id
in: query
operations:
- name: get-oncall
method: GET
- type: http
namespace: msgraph
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: meetings
path: "/users/$secrets.service_account_upn/onlineMeetings"
operations:
- name: create-meeting
method: POST
Detects recurring incident patterns in ServiceNow, creates a problem record for root cause analysis, and notifies the problem management team on Teams.
naftiko: "0.5"
info:
label: "ServiceNow Problem Record from Recurring Incidents"
description: "Detects recurring incident patterns in ServiceNow, creates a problem record for root cause analysis, and notifies the problem management team on Teams."
tags:
- itsm
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: problem-mgmt
port: 8080
tools:
- name: create-problem-from-pattern
description: "Given a recurring incident pattern description, create a problem record and notify the team."
inputParameters:
- name: pattern_description
in: body
type: string
description: "Description of the recurring incident pattern."
- name: affected_ci
in: body
type: string
description: "The affected configuration item."
- name: incident_count
in: body
type: string
description: "Number of related incidents."
steps:
- name: create-problem
type: call
call: "servicenow.create-problem"
with:
short_description: "Recurring pattern: {{pattern_description}}"
description: "{{incident_count}} incidents linked to {{affected_ci}}. Pattern: {{pattern_description}}."
affected_ci: "{{affected_ci}}"
- name: notify-problem-team
type: call
call: "msteams.post-channel-message"
with:
channel_id: "$secrets.teams_problem_mgmt_channel"
text: "Problem record created: {{create-problem.number}} | Pattern: {{pattern_description}} | CI: {{affected_ci}} | Incidents: {{incident_count}}"
consumes:
- type: http
namespace: servicenow
baseUri: "https://texaco.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: problems
path: "/table/problem"
operations:
- name: create-problem
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/itsm/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
When a ServiceNow ticket approaches SLA breach, escalates priority, reassigns to the lead resolver group, and notifies the service delivery manager via Teams.
naftiko: "0.5"
info:
label: "ServiceNow SLA Breach Escalation"
description: "When a ServiceNow ticket approaches SLA breach, escalates priority, reassigns to the lead resolver group, and notifies the service delivery manager via Teams."
tags:
- itsm
- sla
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: itsm-sla
port: 8080
tools:
- name: escalate-sla-breach
description: "Given a ServiceNow incident near SLA breach, escalate and notify management."
inputParameters:
- name: incident_number
in: body
type: string
description: "The ServiceNow incident number approaching SLA breach."
steps:
- name: get-incident
type: call
call: "servicenow.get-incident"
with:
incident_number: "{{incident_number}}"
- name: escalate-incident
type: call
call: "servicenow.update-incident"
with:
incident_number: "{{incident_number}}"
urgency: "1"
assignment_group: "Lead_Resolvers"
- name: notify-sdm
type: call
call: "msteams.post-channel-message"
with:
channel_id: "$secrets.teams_service_delivery_channel"
text: "SLA Breach Warning: {{incident_number}} — {{get-incident.short_description}} | Escalated to Lead Resolvers | Original group: {{get-incident.assignment_group}}"
consumes:
- type: http
namespace: servicenow
baseUri: "https://texaco.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: get-incident
method: GET
- name: update-incident
method: PATCH
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/service-delivery/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Retrieves metadata for a SharePoint document including title, author, modification date, and file size.
naftiko: "0.5"
info:
label: "SharePoint Document Metadata Lookup"
description: "Retrieves metadata for a SharePoint document including title, author, modification date, and file size."
tags:
- document-management
- sharepoint
capability:
exposes:
- type: mcp
namespace: doc-mgmt
port: 8080
tools:
- name: get-document-metadata
description: "Retrieve metadata for a SharePoint document by site and item ID. Returns title, author, last modified date, and size."
inputParameters:
- name: site_id
in: body
type: string
description: "The SharePoint site ID."
- name: item_id
in: body
type: string
description: "The document item ID."
call: "sharepoint.get-item"
with:
site_id: "{{site_id}}"
item_id: "{{item_id}}"
outputParameters:
- name: title
type: string
mapping: "$.name"
- name: author
type: string
mapping: "$.createdBy.user.displayName"
- name: last_modified
type: string
mapping: "$.lastModifiedDateTime"
consumes:
- type: http
namespace: sharepoint
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: items
path: "/sites/{{site_id}}/drive/items/{{item_id}}"
inputParameters:
- name: site_id
in: path
- name: item_id
in: path
operations:
- name: get-item
method: GET
When a corporate policy document is updated in SharePoint, detects the change, sends notification emails to affected employees, and creates a ServiceNow acknowledgment task.
naftiko: "0.5"
info:
label: "SharePoint Policy Update Notification"
description: "When a corporate policy document is updated in SharePoint, detects the change, sends notification emails to affected employees, and creates a ServiceNow acknowledgment task."
tags:
- compliance
- sharepoint
- microsoft-outlook
- servicenow
capability:
exposes:
- type: mcp
namespace: policy-mgmt
port: 8080
tools:
- name: notify-policy-update
description: "Given a SharePoint document ID, detect the update, email affected users, and create an acknowledgment task."
inputParameters:
- name: site_id
in: body
type: string
description: "The SharePoint site ID."
- name: document_id
in: body
type: string
description: "The updated policy document ID."
- name: distribution_group
in: body
type: string
description: "The email distribution group for notification."
steps:
- name: get-document
type: call
call: "sharepoint.get-item"
with:
site_id: "{{site_id}}"
item_id: "{{document_id}}"
- name: send-notification
type: call
call: "msgraph.send-mail"
with:
recipient: "{{distribution_group}}"
subject: "Policy Updated: {{get-document.title}}"
body: "The policy '{{get-document.title}}' has been updated. Please review and acknowledge."
- name: create-acknowledgment-task
type: call
call: "servicenow.create-task"
with:
short_description: "Policy acknowledgment required: {{get-document.title}}"
assignment_group: "Compliance"
consumes:
- type: http
namespace: sharepoint
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: items
path: "/sites/{{site_id}}/drive/items/{{item_id}}"
inputParameters:
- name: site_id
in: path
- name: item_id
in: path
operations:
- name: get-item
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/$secrets.service_account_upn/sendMail"
operations:
- name: send-mail
method: POST
- type: http
namespace: servicenow
baseUri: "https://texaco.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: create-task
method: POST
Queries Snowflake task execution history to identify failed or delayed pipeline tasks, and posts a health summary to the data engineering Teams channel.
naftiko: "0.5"
info:
label: "Snowflake Data Pipeline Health Check"
description: "Queries Snowflake task execution history to identify failed or delayed pipeline tasks, and posts a health summary to the data engineering Teams channel."
tags:
- data-analytics
- snowflake
- microsoft-teams
- monitoring
- data-engineering
capability:
exposes:
- type: mcp
namespace: data-pipeline-ops
port: 8080
tools:
- name: check-pipeline-health
description: "Query Snowflake task history for a given database to identify failed or delayed tasks over the past 24 hours, and post a health report to the data engineering Teams channel. Use for daily data pipeline monitoring."
inputParameters:
- name: snowflake_database
in: body
type: string
description: "The Snowflake database name to check task history for."
steps:
- name: get-task-history
type: call
call: "snowflake-api.get-task-history"
with:
database: "{{snowflake_database}}"
- name: post-health
type: call
call: "teams-de.send-message"
with:
channel: "data-engineering-ops"
text: "Snowflake Pipeline Health | Database: {{snowflake_database}} | Task Status: {{get-task-history.summary}} | Failed Tasks: {{get-task-history.failed_count}}"
consumes:
- type: http
namespace: snowflake-api
baseUri: "https://texaco.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: task-history
path: "/databases/{{database}}/tasks/history"
inputParameters:
- name: database
in: path
operations:
- name: get-task-history
method: GET
- type: http
namespace: teams-de
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Runs data quality checks on Snowflake tables, creates Jira tickets for failed checks, and sends a summary to the data governance channel on Teams.
naftiko: "0.5"
info:
label: "Snowflake Data Quality Alert Workflow"
description: "Runs data quality checks on Snowflake tables, creates Jira tickets for failed checks, and sends a summary to the data governance channel on Teams."
tags:
- data
- data-quality
- snowflake
- jira
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: data-quality
port: 8080
tools:
- name: run-data-quality-check
description: "Given a Snowflake table and quality rule, run the check, create Jira for failures, and notify."
inputParameters:
- name: database_name
in: body
type: string
description: "The Snowflake database."
- name: table_name
in: body
type: string
description: "The table to check."
- name: quality_rule
in: body
type: string
description: "The SQL quality check expression."
steps:
- name: run-check
type: call
call: "snowflake.execute-query"
with:
statement: "SELECT COUNT(*) as violations FROM {{database_name}}.PUBLIC.{{table_name}} WHERE {{quality_rule}}"
- name: create-jira-ticket
type: call
call: "jira.create-issue"
with:
project: "DQ"
summary: "Data quality violation: {{table_name}} — {{run-check.violations}} rows"
description: "Rule: {{quality_rule}}. Violations: {{run-check.violations}}."
issue_type: "Bug"
- name: notify-data-governance
type: call
call: "msteams.post-channel-message"
with:
channel_id: "$secrets.teams_data_governance_channel"
text: "DQ Alert: {{table_name}} has {{run-check.violations}} violations | Rule: {{quality_rule}} | Jira: {{create-jira-ticket.key}}"
consumes:
- type: http
namespace: snowflake
baseUri: "https://texaco.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-query
method: POST
- type: http
namespace: jira
baseUri: "https://texaco.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/data-governance/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
When a Snowflake ETL pipeline fails, queries the error log, creates a Jira ticket for the data engineering team, and notifies the analytics channel on Teams.
naftiko: "0.5"
info:
label: "Snowflake ETL Failure Remediation"
description: "When a Snowflake ETL pipeline fails, queries the error log, creates a Jira ticket for the data engineering team, and notifies the analytics channel on Teams."
tags:
- data
- snowflake
- jira
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: data-ops
port: 8080
tools:
- name: handle-etl-failure
description: "Given a Snowflake task name that failed, query errors, create a Jira ticket, and alert the data team."
inputParameters:
- name: task_name
in: body
type: string
description: "The Snowflake task name that failed."
- name: database_name
in: body
type: string
description: "The Snowflake database name."
steps:
- name: get-task-error
type: call
call: "snowflake.execute-query"
with:
statement: "SELECT * FROM TABLE(INFORMATION_SCHEMA.TASK_HISTORY(TASK_NAME=>'{{task_name}}')) ORDER BY SCHEDULED_TIME DESC LIMIT 1"
- name: create-jira-ticket
type: call
call: "jira.create-issue"
with:
project: "DATA"
summary: "ETL failure: {{task_name}} in {{database_name}}"
description: "Error: {{get-task-error.error_message}}. Scheduled: {{get-task-error.scheduled_time}}."
issue_type: "Bug"
- name: notify-data-team
type: call
call: "msteams.post-channel-message"
with:
channel_id: "$secrets.teams_data_channel"
text: "ETL Failure: {{task_name}} in {{database_name}} | Jira: {{create-jira-ticket.key}} | Error: {{get-task-error.error_message}}"
consumes:
- type: http
namespace: snowflake
baseUri: "https://texaco.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-query
method: POST
- type: http
namespace: jira
baseUri: "https://texaco.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/data-eng/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Queries Snowflake query history for long-running and expensive queries in the past 24 hours, and posts a performance digest to the data engineering Microsoft Teams channel.
naftiko: "0.5"
info:
label: "Snowflake Query Performance Digest"
description: "Queries Snowflake query history for long-running and expensive queries in the past 24 hours, and posts a performance digest to the data engineering Microsoft Teams channel."
tags:
- data-analytics
- snowflake
- microsoft-teams
- performance
- monitoring
capability:
exposes:
- type: mcp
namespace: data-performance
port: 8080
tools:
- name: digest-query-performance
description: "Query Snowflake account usage for the top 10 most expensive queries in the past 24 hours and post a performance digest to the data engineering Teams channel. Use for proactive query optimization and cost management."
inputParameters:
- name: warehouse_name
in: body
type: string
description: "The Snowflake virtual warehouse name to analyze."
steps:
- name: get-query-stats
type: call
call: "snowflake-perf.get-query-history"
with:
warehouse_name: "{{warehouse_name}}"
- name: post-digest
type: call
call: "teams-dperf.send-message"
with:
channel: "data-engineering-ops"
text: "Query Performance Digest | Warehouse: {{warehouse_name}} | Top Query Duration: {{get-query-stats.max_duration_seconds}}s | Total Credits Used: {{get-query-stats.total_credits}}"
consumes:
- type: http
namespace: snowflake-perf
baseUri: "https://texaco.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: query-history
path: "/databases/snowflake/schemas/account_usage/views/query_history"
inputParameters:
- name: warehouse_name
in: query
operations:
- name: get-query-history
method: GET
- type: http
namespace: teams-dperf
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Queries a Snowflake table to return the current row count, used for data pipeline completeness verification.
naftiko: "0.5"
info:
label: "Snowflake Table Row Count Check"
description: "Queries a Snowflake table to return the current row count, used for data pipeline completeness verification."
tags:
- data
- snowflake
- analytics
capability:
exposes:
- type: mcp
namespace: data-ops
port: 8080
tools:
- name: get-table-row-count
description: "Execute a row count query against a Snowflake table. Returns the count for pipeline health checks."
inputParameters:
- name: database_name
in: body
type: string
description: "The Snowflake database name."
- name: schema_name
in: body
type: string
description: "The Snowflake schema name."
- name: table_name
in: body
type: string
description: "The target table name."
call: "snowflake.execute-query"
with:
statement: "SELECT COUNT(*) AS row_count FROM {{database_name}}.{{schema_name}}.{{table_name}}"
outputParameters:
- name: row_count
type: integer
mapping: "$.data[0].row_count"
consumes:
- type: http
namespace: snowflake
baseUri: "https://texaco.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-query
method: POST
Pulls vendor details from SAP Ariba and compliance documents from SharePoint, then creates a Jira review task for the procurement compliance team.
naftiko: "0.5"
info:
label: "Vendor Compliance Review Orchestrator"
description: "Pulls vendor details from SAP Ariba and compliance documents from SharePoint, then creates a Jira review task for the procurement compliance team."
tags:
- procurement
- compliance
- sap-ariba
- sharepoint
- jira
capability:
exposes:
- type: mcp
namespace: procurement-compliance
port: 8080
tools:
- name: initiate-vendor-review
description: "Given a vendor ID, fetch vendor profile from Ariba and compliance docs from SharePoint, then create a Jira task for compliance review."
inputParameters:
- name: vendor_id
in: body
type: string
description: "The SAP Ariba vendor ID."
- name: compliance_folder_id
in: body
type: string
description: "The SharePoint folder ID containing compliance documents."
steps:
- name: get-vendor
type: call
call: "ariba.get-vendor"
with:
vendor_id: "{{vendor_id}}"
- name: get-compliance-docs
type: call
call: "sharepoint.list-folder"
with:
folder_id: "{{compliance_folder_id}}"
- name: create-review-task
type: call
call: "jira.create-issue"
with:
project: "COMPLIANCE"
summary: "Vendor compliance review: {{get-vendor.name}} ({{vendor_id}})"
description: "Review compliance documents ({{get-compliance-docs.count}} files) for vendor {{get-vendor.name}}."
issue_type: "Task"
consumes:
- type: http
namespace: ariba
baseUri: "https://openapi.ariba.com/api/supplier-management/v1"
authentication:
type: bearer
token: "$secrets.ariba_token"
resources:
- name: vendors
path: "/vendors/{{vendor_id}}"
inputParameters:
- name: vendor_id
in: path
operations:
- name: get-vendor
method: GET
- type: http
namespace: sharepoint
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: folders
path: "/drives/items/{{folder_id}}/children"
inputParameters:
- name: folder_id
in: path
operations:
- name: list-folder
method: GET
- type: http
namespace: jira
baseUri: "https://texaco.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
Extracts compensation review data from Workday, generates department-level summaries in Snowflake, and distributes review packets to managers via SharePoint.
naftiko: "0.5"
info:
label: "Workday Annual Compensation Review Distribution"
description: "Extracts compensation review data from Workday, generates department-level summaries in Snowflake, and distributes review packets to managers via SharePoint."
tags:
- hr
- compensation
- workday
- snowflake
- sharepoint
capability:
exposes:
- type: mcp
namespace: hr-comp
port: 8080
tools:
- name: distribute-comp-reviews
description: "Given a review cycle ID, extract data, summarize in Snowflake, and distribute to SharePoint."
inputParameters:
- name: review_cycle_id
in: body
type: string
description: "The Workday compensation review cycle ID."
- name: department
in: body
type: string
description: "The department to process."
steps:
- name: get-comp-data
type: call
call: "workday.get-comp-review"
with:
review_cycle_id: "{{review_cycle_id}}"
department: "{{department}}"
- name: store-summary
type: call
call: "snowflake.execute-query"
with:
statement: "INSERT INTO HR_DB.PUBLIC.COMP_REVIEWS (cycle_id, department, avg_increase, total_budget) VALUES ('{{review_cycle_id}}', '{{department}}', '{{get-comp-data.avg_increase}}', '{{get-comp-data.total_budget}}')"
- name: upload-to-sharepoint
type: call
call: "sharepoint.upload-file"
with:
site_id: "$secrets.sharepoint_hr_site"
folder: "Compensation Reviews/{{review_cycle_id}}"
file_name: "{{department}}_review.pdf"
consumes:
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: comp-reviews
path: "/texaco/compensationReviews/{{review_cycle_id}}"
inputParameters:
- name: review_cycle_id
in: path
operations:
- name: get-comp-review
method: GET
- type: http
namespace: snowflake
baseUri: "https://texaco.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-query
method: POST
- type: http
namespace: sharepoint
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: uploads
path: "/sites/{{site_id}}/drive/root:/{{folder}}/{{file_name}}:/content"
inputParameters:
- name: site_id
in: path
operations:
- name: upload-file
method: PUT
Processes a compensation change request in Workday for a given employee, updates the salary band, and notifies HR and the employee's manager via Microsoft Teams.
naftiko: "0.5"
info:
label: "Workday Compensation Adjustment Processing"
description: "Processes a compensation change request in Workday for a given employee, updates the salary band, and notifies HR and the employee's manager via Microsoft Teams."
tags:
- hr
- compensation
- workday
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: hr-compensation
port: 8080
tools:
- name: process-compensation-change
description: "Submit a compensation adjustment for a Workday employee — update base pay and grade, then notify the employee's manager and HR partner via Teams. Use for merit increases, promotions, and equity adjustments."
inputParameters:
- name: workday_employee_id
in: body
type: string
description: "The Workday worker ID for the employee receiving the comp change."
- name: new_salary
in: body
type: number
description: "The new annual base salary amount in local currency."
- name: effective_date
in: body
type: string
description: "The effective date of the compensation change in YYYY-MM-DD format."
- name: reason
in: body
type: string
description: "Reason code for the change, e.g. Merit, Promotion, MarketAdjustment."
steps:
- name: update-comp
type: call
call: "workday-comp.update-compensation"
with:
worker_id: "{{workday_employee_id}}"
new_salary: "{{new_salary}}"
effective_date: "{{effective_date}}"
reason: "{{reason}}"
- name: notify-manager
type: call
call: "teams-comp.send-message"
with:
channel: "hr-compensation-ops"
text: "Compensation Change Processed | Employee: {{workday_employee_id}} | Effective: {{effective_date}} | Reason: {{reason}} | Transaction ID: {{update-comp.transaction_id}}"
consumes:
- type: http
namespace: workday-comp
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: compensation
path: "/texaco/workers/{{worker_id}}/compensation"
inputParameters:
- name: worker_id
in: path
operations:
- name: update-compensation
method: PUT
- type: http
namespace: teams-comp
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Fetches an employee profile from Workday by worker ID, returning name, department, manager, and job title.
naftiko: "0.5"
info:
label: "Workday Employee Profile Lookup"
description: "Fetches an employee profile from Workday by worker ID, returning name, department, manager, and job title."
tags:
- hr
- workday
capability:
exposes:
- type: mcp
namespace: hr-directory
port: 8080
tools:
- name: get-employee-profile
description: "Retrieve an employee profile from Workday by worker ID. Returns full name, department, job title, and manager name."
inputParameters:
- name: worker_id
in: body
type: string
description: "The Workday worker ID."
call: "workday.get-worker"
with:
worker_id: "{{worker_id}}"
outputParameters:
- name: full_name
type: string
mapping: "$.worker.fullName"
- name: department
type: string
mapping: "$.worker.department"
- name: job_title
type: string
mapping: "$.worker.jobTitle"
- name: manager
type: string
mapping: "$.worker.managerName"
consumes:
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: workers
path: "/texaco/workers/{{worker_id}}"
inputParameters:
- name: worker_id
in: path
operations:
- name: get-worker
method: GET
Exports active employee headcount grouped by cost center and department from Workday, returning a snapshot for workforce planning and finance reporting.
naftiko: "0.5"
info:
label: "Workday Headcount Report by Cost Center"
description: "Exports active employee headcount grouped by cost center and department from Workday, returning a snapshot for workforce planning and finance reporting."
tags:
- hr
- reporting
- workday
- headcount
- finance
capability:
exposes:
- type: mcp
namespace: hr-reporting
port: 8080
tools:
- name: get-headcount-by-cost-center
description: "Return active employee headcount grouped by cost center and department from Workday. Use for workforce planning, budget reconciliation, and periodic headcount reporting."
call: "workday-rpt.get-headcount"
outputParameters:
- name: employees
type: array
mapping: "$.Report_Entry"
items:
- name: employee_id
type: string
mapping: "$.Employee_ID"
- name: full_name
type: string
mapping: "$.Worker"
- name: cost_center
type: string
mapping: "$.Cost_Center"
- name: department
type: string
mapping: "$.Department"
consumes:
- type: http
namespace: workday-rpt
baseUri: "https://wd2-impl-services1.workday.com/ccx/service/customreport2"
authentication:
type: basic
username: "$secrets.workday_report_user"
password: "$secrets.workday_report_password"
resources:
- name: headcount-report
path: "/texaco/headcount_by_cost_center"
operations:
- name: get-headcount
method: GET
outputRawFormat: json
Creates a new job requisition in Workday for an approved headcount, links it to the cost center and hiring manager, and posts a notification to the talent acquisition Teams channel.
naftiko: "0.5"
info:
label: "Workday Job Requisition Creation"
description: "Creates a new job requisition in Workday for an approved headcount, links it to the cost center and hiring manager, and posts a notification to the talent acquisition Teams channel."
tags:
- hr
- recruiting
- workday
- microsoft-teams
- talent-acquisition
capability:
exposes:
- type: mcp
namespace: hr-recruiting
port: 8080
tools:
- name: create-job-requisition
description: "Create a new Workday job requisition for an approved headcount opening. Provide job title, department, cost center, and hiring manager ID. Posts notification to the talent acquisition Teams channel on success."
inputParameters:
- name: job_title
in: body
type: string
description: "The job title for the open position."
- name: department
in: body
type: string
description: "The Workday department ID for the requisition."
- name: cost_center
in: body
type: string
description: "The cost center code for budget allocation."
- name: hiring_manager_id
in: body
type: string
description: "The Workday worker ID of the hiring manager."
steps:
- name: create-req
type: call
call: "workday-rec.create-requisition"
with:
job_title: "{{job_title}}"
department: "{{department}}"
cost_center: "{{cost_center}}"
hiring_manager_id: "{{hiring_manager_id}}"
- name: notify-ta
type: call
call: "teams-hr.send-message"
with:
channel: "talent-acquisition"
text: "New Job Requisition Created: {{job_title}} | Dept: {{department}} | Req ID: {{create-req.requisition_id}} | Hiring Manager: {{hiring_manager_id}}"
consumes:
- type: http
namespace: workday-rec
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: job-requisitions
path: "/texaco/jobRequisitions"
operations:
- name: create-requisition
method: POST
- type: http
namespace: teams-hr
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Assigns a required training course in Workday Learning to an employee, creates a ServiceNow follow-up task for the manager, and sends a reminder email via Outlook.
naftiko: "0.5"
info:
label: "Workday Learning Assignment and Tracking"
description: "Assigns a required training course in Workday Learning to an employee, creates a ServiceNow follow-up task for the manager, and sends a reminder email via Outlook."
tags:
- hr
- training
- workday
- servicenow
- microsoft-outlook
capability:
exposes:
- type: mcp
namespace: hr-learning
port: 8080
tools:
- name: assign-training
description: "Given a worker ID and course ID, assign training in Workday, create a tracking task, and send a reminder."
inputParameters:
- name: worker_id
in: body
type: string
description: "The Workday worker ID."
- name: course_id
in: body
type: string
description: "The Workday Learning course ID."
- name: due_date
in: body
type: string
description: "The training completion due date (YYYY-MM-DD)."
steps:
- name: get-employee
type: call
call: "workday.get-worker"
with:
worker_id: "{{worker_id}}"
- name: assign-course
type: call
call: "workday.assign-learning"
with:
worker_id: "{{worker_id}}"
course_id: "{{course_id}}"
- name: create-tracking-task
type: call
call: "servicenow.create-task"
with:
short_description: "Training tracking: {{get-employee.full_name}} — Course {{course_id}}"
description: "Due date: {{due_date}}. Manager follow-up required."
assignment_group: "HR_Learning"
- name: send-reminder
type: call
call: "msgraph.send-mail"
with:
recipient: "{{get-employee.work_email}}"
subject: "Required Training Assignment"
body: "Hi {{get-employee.first_name}}, you have been assigned training course {{course_id}}. Please complete by {{due_date}}."
consumes:
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: workers
path: "/texaco/workers/{{worker_id}}"
inputParameters:
- name: worker_id
in: path
operations:
- name: get-worker
method: GET
- name: learning
path: "/texaco/learning/assignments"
operations:
- name: assign-learning
method: POST
- type: http
namespace: servicenow
baseUri: "https://texaco.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: create-task
method: POST
- type: http
namespace: msgraph
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: mail
path: "/users/$secrets.service_account_upn/sendMail"
operations:
- name: send-mail
method: POST
When a new hire record is created in Workday, fetches employee details, creates a benefits enrollment task in ServiceNow, and sends an enrollment reminder via Outlook.
naftiko: "0.5"
info:
label: "Workday New Hire Benefits Enrollment Kickoff"
description: "When a new hire record is created in Workday, fetches employee details, creates a benefits enrollment task in ServiceNow, and sends an enrollment reminder via Outlook."
tags:
- hr
- benefits
- workday
- servicenow
- microsoft-outlook
capability:
exposes:
- type: mcp
namespace: hr-benefits
port: 8080
tools:
- name: kickoff-benefits-enrollment
description: "Given a Workday employee ID, fetch their details, create a benefits enrollment task, and send an email reminder."
inputParameters:
- name: worker_id
in: body
type: string
description: "The Workday worker ID for the new hire."
steps:
- name: get-employee
type: call
call: "workday.get-worker"
with:
worker_id: "{{worker_id}}"
- name: create-enrollment-task
type: call
call: "servicenow.create-task"
with:
short_description: "Benefits enrollment: {{get-employee.full_name}}"
assignment_group: "HR_Benefits"
description: "New hire {{get-employee.full_name}} ({{worker_id}}) needs benefits enrollment by 30 days from start date."
- name: send-enrollment-email
type: call
call: "msgraph.send-mail"
with:
recipient: "{{get-employee.work_email}}"
subject: "Welcome to Texaco — Benefits Enrollment"
body: "Hi {{get-employee.first_name}}, please complete your benefits enrollment within 30 days. Reference: {{create-enrollment-task.number}}."
consumes:
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: workers
path: "/texaco/workers/{{worker_id}}"
inputParameters:
- name: worker_id
in: path
operations:
- name: get-worker
method: GET
- type: http
namespace: servicenow
baseUri: "https://texaco.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: create-task
method: POST
- type: http
namespace: msgraph
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: mail
path: "/users/$secrets.service_account_upn/sendMail"
operations:
- name: send-mail
method: POST
When an org chart change is made in Workday, updates the reporting structure in Salesforce and sends a notification to the affected department on Teams.
naftiko: "0.5"
info:
label: "Workday Org Chart Change Propagation"
description: "When an org chart change is made in Workday, updates the reporting structure in Salesforce and sends a notification to the affected department on Teams."
tags:
- hr
- workday
- salesforce
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: hr-org
port: 8080
tools:
- name: propagate-org-change
description: "Given a Workday worker ID with a new manager, update Salesforce and notify the department."
inputParameters:
- name: worker_id
in: body
type: string
description: "The Workday worker ID."
- name: new_manager_id
in: body
type: string
description: "The new manager's Workday worker ID."
steps:
- name: get-employee
type: call
call: "workday.get-worker"
with:
worker_id: "{{worker_id}}"
- name: update-salesforce-owner
type: call
call: "salesforce.update-user-manager"
with:
user_email: "{{get-employee.work_email}}"
manager_id: "{{new_manager_id}}"
- name: notify-department
type: call
call: "msteams.post-channel-message"
with:
channel_id: "$secrets.teams_hr_channel"
text: "Org change: {{get-employee.full_name}} now reports to new manager (ID: {{new_manager_id}}). Salesforce updated."
consumes:
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: workers
path: "/texaco/workers/{{worker_id}}"
inputParameters:
- name: worker_id
in: path
operations:
- name: get-worker
method: GET
- type: http
namespace: salesforce
baseUri: "https://texaco.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: users
path: "/sobjects/User"
operations:
- name: update-user-manager
method: PATCH
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/hr/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
When a payroll variance is detected in Workday, pulls employee and pay period details, creates a ServiceNow investigation task, and notifies HR via Teams.
naftiko: "0.5"
info:
label: "Workday Payroll Discrepancy Investigation"
description: "When a payroll variance is detected in Workday, pulls employee and pay period details, creates a ServiceNow investigation task, and notifies HR via Teams."
tags:
- hr
- payroll
- workday
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: hr-payroll
port: 8080
tools:
- name: investigate-payroll-discrepancy
description: "Given a worker ID and pay period, pull details and create an investigation task."
inputParameters:
- name: worker_id
in: body
type: string
description: "The Workday worker ID."
- name: pay_period
in: body
type: string
description: "The pay period identifier."
steps:
- name: get-employee
type: call
call: "workday.get-worker"
with:
worker_id: "{{worker_id}}"
- name: create-investigation
type: call
call: "servicenow.create-task"
with:
short_description: "Payroll discrepancy: {{get-employee.full_name}} — {{pay_period}}"
assignment_group: "Payroll_Team"
- name: notify-hr
type: call
call: "msteams.post-channel-message"
with:
channel_id: "$secrets.teams_payroll_channel"
text: "Payroll discrepancy flagged: {{get-employee.full_name}} ({{worker_id}}) for {{pay_period}} | Task: {{create-investigation.number}}"
consumes:
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: workers
path: "/texaco/workers/{{worker_id}}"
inputParameters:
- name: worker_id
in: path
operations:
- name: get-worker
method: GET
- type: http
namespace: servicenow
baseUri: "https://texaco.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: create-task
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/hr/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Initiates a performance review cycle in Workday for a specified management unit, notifies managers via Microsoft Teams, and opens a ServiceNow task for HR to track completion.
naftiko: "0.5"
info:
label: "Workday Performance Review Cycle Kick-off"
description: "Initiates a performance review cycle in Workday for a specified management unit, notifies managers via Microsoft Teams, and opens a ServiceNow task for HR to track completion."
tags:
- hr
- performance-management
- workday
- microsoft-teams
- servicenow
capability:
exposes:
- type: mcp
namespace: hr-performance
port: 8080
tools:
- name: kickoff-review-cycle
description: "Start a Workday performance review cycle for a given management unit and review period. Notify impacted managers via Teams and create a ServiceNow HR tracking task. Use at the start of annual or mid-year review periods."
inputParameters:
- name: management_unit_id
in: body
type: string
description: "The Workday management unit (organization) ID for the review cycle."
- name: review_period
in: body
type: string
description: "The review period label, e.g. 2025 Annual Review."
steps:
- name: create-review-cycle
type: call
call: "workday-perf.create-review-cycle"
with:
management_unit_id: "{{management_unit_id}}"
review_period: "{{review_period}}"
- name: notify-managers
type: call
call: "teams-perf.send-message"
with:
channel: "hr-announcements"
text: "Performance Review Cycle Started: {{review_period}} | Management Unit: {{management_unit_id}} | Cycle ID: {{create-review-cycle.cycle_id}}"
- name: open-hr-task
type: call
call: "servicenow-hr.create-incident"
with:
short_description: "Track completion: {{review_period}} performance reviews"
category: "hr_performance"
assignment_group: "HR_Operations"
consumes:
- type: http
namespace: workday-perf
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: review-cycles
path: "/texaco/performanceManagement/reviewCycles"
operations:
- name: create-review-cycle
method: POST
- type: http
namespace: teams-perf
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-message
method: POST
- type: http
namespace: servicenow-hr
baseUri: "https://texaco.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
When a termination event is detected in Workday, deactivates the user in Okta, disables the Microsoft 365 account, and logs the action in ServiceNow.
naftiko: "0.5"
info:
label: "Workday Termination Access Revocation"
description: "When a termination event is detected in Workday, deactivates the user in Okta, disables the Microsoft 365 account, and logs the action in ServiceNow."
tags:
- hr
- security
- workday
- okta
- microsoft-365
- servicenow
capability:
exposes:
- type: mcp
namespace: hr-offboarding-access
port: 8080
tools:
- name: revoke-terminated-access
description: "Given a Workday worker ID for a terminated employee, deactivate Okta, disable M365, and log in ServiceNow."
inputParameters:
- name: worker_id
in: body
type: string
description: "The Workday worker ID of the terminated employee."
steps:
- name: get-employee
type: call
call: "workday.get-worker"
with:
worker_id: "{{worker_id}}"
- name: deactivate-okta
type: call
call: "okta.deactivate-user"
with:
user_login: "{{get-employee.work_email}}"
- name: disable-m365
type: call
call: "msgraph.disable-user"
with:
user_upn: "{{get-employee.work_email}}"
- name: log-offboarding
type: call
call: "servicenow.create-task"
with:
short_description: "Access revoked for terminated employee: {{get-employee.full_name}}"
description: "Okta deactivated, M365 disabled for {{get-employee.work_email}}."
assignment_group: "IT_Security"
consumes:
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: workers
path: "/texaco/workers/{{worker_id}}"
inputParameters:
- name: worker_id
in: path
operations:
- name: get-worker
method: GET
- type: http
namespace: okta
baseUri: "https://texaco.okta.com/api/v1"
authentication:
type: bearer
token: "$secrets.okta_api_token"
resources:
- name: users
path: "/users/{{user_login}}/lifecycle/deactivate"
inputParameters:
- name: user_login
in: path
operations:
- name: deactivate-user
method: POST
- type: http
namespace: msgraph
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: users
path: "/users/{{user_upn}}"
inputParameters:
- name: user_upn
in: path
operations:
- name: disable-user
method: PATCH
- type: http
namespace: servicenow
baseUri: "https://texaco.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: create-task
method: POST
Retrieves a pending time-off request from Workday, validates the employee's available balance, and either auto-approves it or escalates to the manager with a Teams notification.
naftiko: "0.5"
info:
label: "Workday Time-Off Request Approval"
description: "Retrieves a pending time-off request from Workday, validates the employee's available balance, and either auto-approves it or escalates to the manager with a Teams notification."
tags:
- hr
- time-off
- workday
- microsoft-teams
- approval
capability:
exposes:
- type: mcp
namespace: hr-timeoff
port: 8080
tools:
- name: process-time-off-request
description: "Given a Workday time-off request ID, retrieve request details and the employee's leave balance, approve if balance is sufficient, or escalate to the manager via Teams. Use for automated time-off approval processing."
inputParameters:
- name: request_id
in: body
type: string
description: "The Workday time-off request ID."
- name: manager_email
in: body
type: string
description: "The manager's email address for escalation notifications."
steps:
- name: get-request
type: call
call: "workday-timeoff.get-time-off-request"
with:
request_id: "{{request_id}}"
- name: notify-manager
type: call
call: "teams-timeoff.send-message"
with:
channel: "hr-approvals"
text: "Time-Off Request | Employee: {{get-request.employee_name}} | Dates: {{get-request.start_date}} to {{get-request.end_date}} | Days: {{get-request.total_days}} | Balance: {{get-request.available_balance}} — Awaiting approval."
consumes:
- type: http
namespace: workday-timeoff
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: time-off-requests
path: "/texaco/timeOff/{{request_id}}"
inputParameters:
- name: request_id
in: path
operations:
- name: get-time-off-request
method: GET
- type: http
namespace: teams-timeoff
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-message
method: POST