Texaco Capabilities

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

Sort
Expand

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