Halliburton Capabilities

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

Sort
Expand

Uses an AI model endpoint to analyze drilling telemetry and recommend optimal parameters, posting recommendations to the drilling engineering Teams channel.

naftiko: "0.5"
info:
  label: "AI-Assisted Drilling Parameter Optimization"
  description: "Uses an AI model endpoint to analyze drilling telemetry and recommend optimal parameters, posting recommendations to the drilling engineering Teams channel."
  tags:
    - drilling
    - artificial-intelligence
    - field-operations
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: drilling-ai
      port: 8080
      tools:
        - name: optimize-drilling-params
          description: "Given a well ID, analyze telemetry via AI model and post optimization recommendations to drilling engineering."
          inputParameters:
            - name: well_id
              in: body
              type: string
              description: "The well identifier."
          steps:
            - name: get-telemetry
              type: call
              call: iot-platform.get-drilling-data
              with:
                well_id: "{{well_id}}"
            - name: get-recommendations
              type: call
              call: ai-model.predict
              with:
                telemetry: "{{get-telemetry.data}}"
            - name: post-recommendations
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_drilling_eng_channel_id"
                text: "Drilling Optimization: Well {{well_id}} | Recommended WOB: {{get-recommendations.wob}} | RPM: {{get-recommendations.rpm}} | Flow: {{get-recommendations.flow_rate}}"
  consumes:
    - type: http
      namespace: iot-platform
      baseUri: "https://halliburton-iot.azure-devices.net/api/v1"
      authentication:
        type: bearer
        token: "$secrets.iot_platform_token"
      resources:
        - name: drilling-data
          path: "/wells/{{well_id}}/drilling/latest"
          inputParameters:
            - name: well_id
              in: path
          operations:
            - name: get-drilling-data
              method: GET
    - type: http
      namespace: ai-model
      baseUri: "https://halliburton-ml.azureml.ms/score"
      authentication:
        type: bearer
        token: "$secrets.azureml_token"
      resources:
        - name: predictions
          path: "/drilling-optimizer"
          operations:
            - name: predict
              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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Uses Anthropic to analyze an HSE incident report and draft a root cause analysis document, then posts the findings to the HSE compliance team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "AI-Assisted HSE Incident Root Cause Analysis"
  description: "Uses Anthropic to analyze an HSE incident report and draft a root cause analysis document, then posts the findings to the HSE compliance team in Microsoft Teams."
  tags:
    - hse
    - safety
    - anthropic
    - microsoft-teams
    - ai
    - root-cause-analysis
capability:
  exposes:
    - type: mcp
      namespace: hse-ai
      port: 8080
      tools:
        - name: draft-rca-for-hse-incident
          description: "Given HSE incident details, use Anthropic to draft a structured root cause analysis with corrective actions and post findings to the HSE compliance Teams channel."
          inputParameters:
            - name: incident_description
              in: body
              type: string
              description: "The full description of the HSE incident for root cause analysis."
            - name: incident_type
              in: body
              type: string
              description: "The type of HSE incident, e.g. Spill, Injury, Near Miss, Fire."
            - name: location
              in: body
              type: string
              description: "The field site location where the incident occurred."
          steps:
            - name: draft-rca
              type: call
              call: anthropic.analyze-hse-incident
              with:
                model: claude-opus-4-5
                prompt: "Draft a structured root cause analysis for this Halliburton HSE incident. Include immediate causes, root causes, contributing factors, and corrective actions. Incident type: {{incident_type}}. Location: {{location}}. Description: {{incident_description}}"
            - name: post-rca
              type: call
              call: msteams.post-rca-findings
              with:
                channel: "hse-compliance"
                text: "AI-drafted RCA for {{incident_type}} at {{location}}:\n{{draft-rca.content}}"
  consumes:
    - type: http
      namespace: anthropic
      baseUri: "https://api.anthropic.com/v1"
      authentication:
        type: apikey
        key: "x-api-key"
        value: "$secrets.anthropic_api_key"
        placement: header
      resources:
        - name: messages
          path: "/messages"
          operations:
            - name: analyze-hse-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/hse/channels/compliance/messages"
          operations:
            - name: post-rca-findings
              method: POST

Searches Confluence for technical documentation pages matching a query, returning page title, space key, and author.

naftiko: "0.5"
info:
  label: "Confluence Technical Doc Search"
  description: "Searches Confluence for technical documentation pages matching a query, returning page title, space key, and author."
  tags:
    - collaboration
    - confluence
    - knowledge-management
capability:
  exposes:
    - type: mcp
      namespace: collab-wiki
      port: 8080
      tools:
        - name: search-confluence
          description: "Search Confluence for technical docs by keyword. Returns page title, space key, and author."
          inputParameters:
            - name: query
              in: body
              type: string
              description: "Search query string."
          call: confluence.search-pages
          with:
            query: "{{query}}"
          outputParameters:
            - name: results
              type: array
              mapping: "$.results"
  consumes:
    - type: http
      namespace: confluence
      baseUri: "https://halliburton.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_token"
      resources:
        - name: search
          path: "/search?cql=text~'{{query}}'"
          inputParameters:
            - name: query
              in: path
          operations:
            - name: search-pages
              method: GET

Retrieves APM latency metrics from Datadog for a service, returning P50, P95, and P99 latency for performance review.

naftiko: "0.5"
info:
  label: "Datadog APM Latency Report"
  description: "Retrieves APM latency metrics from Datadog for a service, returning P50, P95, and P99 latency for performance review."
  tags:
    - observability
    - datadog
    - monitoring
    - performance
capability:
  exposes:
    - type: mcp
      namespace: observability
      port: 8080
      tools:
        - name: get-service-latency
          description: "Get APM latency metrics for a Datadog service. Returns P50, P95, and P99 latency values."
          inputParameters:
            - name: service_name
              in: body
              type: string
              description: "The Datadog service name."
          call: datadog.get-latency
          with:
            service: "{{service_name}}"
          outputParameters:
            - name: p50
              type: number
              mapping: "$.p50"
            - name: p95
              type: number
              mapping: "$.p95"
            - name: p99
              type: number
              mapping: "$.p99"
  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: apm
          path: "/trace/stats?service={{service}}"
          inputParameters:
            - name: service
              in: path
          operations:
            - name: get-latency
              method: GET

Detects cloud infrastructure cost anomalies via Datadog, creates a ServiceNow change request for remediation, and notifies the FinOps team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Datadog Cloud Cost Anomaly Responder"
  description: "Detects cloud infrastructure cost anomalies via Datadog, creates a ServiceNow change request for remediation, and notifies the FinOps team in Microsoft Teams."
  tags:
    - cloud
    - observability
    - datadog
    - servicenow
    - cost-management
capability:
  exposes:
    - type: mcp
      namespace: finops-ops
      port: 8080
      tools:
        - name: respond-to-cost-anomaly
          description: "Given a Datadog monitor ID for a cost anomaly, retrieve monitor details, open a ServiceNow change request, and alert the FinOps team in Teams."
          inputParameters:
            - name: monitor_id
              in: body
              type: string
              description: "The Datadog monitor ID flagging the cost anomaly."
            - name: resource_type
              in: body
              type: string
              description: "The cloud resource type, e.g. EC2, S3, Azure VM."
          steps:
            - name: get-monitor
              type: call
              call: datadog.get-monitor
              with:
                monitor_id: "{{monitor_id}}"
            - name: create-change
              type: call
              call: servicenow.create-change
              with:
                short_description: "Cost anomaly: {{resource_type}} — {{get-monitor.name}}"
                category: cloud_cost
                priority: "2"
            - name: notify-finops
              type: call
              call: msteams.post-cost-alert
              with:
                channel: "cloud-finops"
                text: "Cost anomaly on {{resource_type}}: {{get-monitor.name}}. Change: {{create-change.number}}"
  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: servicenow
      baseUri: "https://halliburton.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: messages
          path: "/teams/finops/channels/general/messages"
          operations:
            - name: post-cost-alert
              method: POST

Queries Datadog for active infrastructure alerts, returning host count, triggered monitors, and overall health status.

naftiko: "0.5"
info:
  label: "Datadog Infrastructure Health Check"
  description: "Queries Datadog for active infrastructure alerts, returning host count, triggered monitors, and overall health status."
  tags:
    - observability
    - datadog
    - monitoring
    - infrastructure
capability:
  exposes:
    - type: mcp
      namespace: observability
      port: 8080
      tools:
        - name: get-infra-health
          description: "Check Datadog for active infrastructure alerts. Returns triggered monitor count, host count, and health status."
          inputParameters:
            - name: tag_filter
              in: body
              type: string
              description: "Datadog tag filter, e.g. env:production."
          call: datadog.get-monitor-summary
          with:
            tag: "{{tag_filter}}"
          outputParameters:
            - name: triggered_count
              type: number
              mapping: "$.counts.triggered"
            - name: ok_count
              type: number
              mapping: "$.counts.ok"
  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/search?query=tag:{{tag}}"
          inputParameters:
            - name: tag
              in: path
          operations:
            - name: get-monitor-summary
              method: GET

When Datadog detects a log error spike, retrieves error details and creates a Jira investigation ticket for the engineering team.

naftiko: "0.5"
info:
  label: "Datadog Log Error Spike to Jira"
  description: "When Datadog detects a log error spike, retrieves error details and creates a Jira investigation ticket for the engineering team."
  tags:
    - observability
    - datadog
    - jira
    - incident-management
capability:
  exposes:
    - type: mcp
      namespace: observability
      port: 8080
      tools:
        - name: escalate-error-spike
          description: "Given a Datadog alert event ID, retrieve error details and create a Jira ticket."
          inputParameters:
            - name: alert_id
              in: body
              type: string
              description: "The Datadog alert event ID."
          steps:
            - name: get-alert
              type: call
              call: datadog.get-event
              with:
                event_id: "{{alert_id}}"
            - name: create-ticket
              type: call
              call: jira.create-issue
              with:
                project_key: "OPS"
                summary: "Error spike: {{get-alert.title}}"
                description: "Source: {{get-alert.source}} | Tags: {{get-alert.tags}}"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: events
          path: "/events/{{event_id}}"
          inputParameters:
            - name: event_id
              in: path
          operations:
            - name: get-event
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://halliburton.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Retrieves SLO compliance status for all production systems from Datadog and posts a weekly digest to the engineering and operations teams in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Datadog SLO Compliance Report"
  description: "Retrieves SLO compliance status for all production systems from Datadog and posts a weekly digest to the engineering and operations teams in Microsoft Teams."
  tags:
    - observability
    - datadog
    - microsoft-teams
    - slo
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: slo-reporting
      port: 8080
      tools:
        - name: digest-slo-compliance
          description: "Retrieve all SLO statuses from Datadog and post a compliance digest to the operations Teams channel, highlighting any breached SLOs."
          inputParameters:
            - name: timeframe
              in: body
              type: string
              description: "SLO evaluation window: 7d, 30d, or 90d."
          steps:
            - name: get-slos
              type: call
              call: datadog.list-slos
              with:
                timeframe: "{{timeframe}}"
            - name: post-report
              type: call
              call: msteams.post-slo-report
              with:
                channel: "ops-slo-reports"
                text: "SLO Compliance ({{timeframe}}): {{get-slos.compliant}} compliant, {{get-slos.breached}} breached."
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: slos
          path: "/slo"
          operations:
            - name: list-slos
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/operations/channels/slo/messages"
          operations:
            - name: post-slo-report
              method: POST

Retrieves the signing status of a DocuSign envelope including signer progress, completion date, and document metadata.

naftiko: "0.5"
info:
  label: "DocuSign Contract Tracking"
  description: "Retrieves the signing status of a DocuSign envelope including signer progress, completion date, and document metadata."
  tags:
    - legal
    - docusign
    - contract-management
capability:
  exposes:
    - type: mcp
      namespace: legal-contracts
      port: 8080
      tools:
        - name: get-envelope-status
          description: "Look up a DocuSign envelope status. Returns signer progress and completion date."
          inputParameters:
            - name: envelope_id
              in: body
              type: string
              description: "The DocuSign envelope ID."
          call: docusign.get-envelope
          with:
            envelope_id: "{{envelope_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.status"
            - name: completed_date
              type: string
              mapping: "$.completedDateTime"
  consumes:
    - type: http
      namespace: docusign
      baseUri: "https://na4.docusign.net/restapi/v2.1/accounts/$secrets.docusign_account_id"
      authentication:
        type: bearer
        token: "$secrets.docusign_token"
      resources:
        - name: envelopes
          path: "/envelopes/{{envelope_id}}"
          inputParameters:
            - name: envelope_id
              in: path
          operations:
            - name: get-envelope
              method: GET

Monitors drilling fluid stock levels in SAP and creates a purchase requisition when levels fall below threshold, notifying the supply chain team.

naftiko: "0.5"
info:
  label: "Drilling Fluid Inventory Alert"
  description: "Monitors drilling fluid stock levels in SAP and creates a purchase requisition when levels fall below threshold, notifying the supply chain team."
  tags:
    - supply-chain
    - drilling
    - sap
    - microsoft-teams
    - inventory
capability:
  exposes:
    - type: mcp
      namespace: drilling-supply
      port: 8080
      tools:
        - name: check-fluid-inventory
          description: "Check drilling fluid stock in SAP and auto-create a purchase requisition if below threshold."
          inputParameters:
            - name: material_number
              in: body
              type: string
              description: "The SAP material number for drilling fluid."
            - name: min_threshold
              in: body
              type: number
              description: "Minimum stock threshold."
          steps:
            - name: get-stock
              type: call
              call: sap.get-material-stock
              with:
                material: "{{material_number}}"
            - name: create-pr
              type: call
              call: sap.create-purchase-requisition
              with:
                material: "{{material_number}}"
                quantity: "1000"
                plant: "{{get-stock.plant}}"
            - name: notify-supply
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_supply_channel_id"
                text: "Low Stock Alert: Material {{material_number}} at {{get-stock.quantity}} (threshold: {{min_threshold}}) | PR created: {{create-pr.requisition_number}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://halliburton-s4.sap.com/sap/opu/odata/sap/API_MATERIAL_STOCK_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: stock
          path: "/A_MatlStkInAcctMod(Material='{{material}}')"
          inputParameters:
            - name: material
              in: path
          operations:
            - name: get-material-stock
              method: GET
        - name: requisitions
          path: "/A_PurchaseRequisition"
          operations:
            - name: create-purchase-requisition
              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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Retrieves current costs for a drilling job from SAP, compares against budget, and posts a variance report to the project management Teams channel.

naftiko: "0.5"
info:
  label: "Drilling Job Cost Tracker"
  description: "Retrieves current costs for a drilling job from SAP, compares against budget, and posts a variance report to the project management Teams channel."
  tags:
    - finance
    - drilling
    - sap
    - microsoft-teams
    - cost-management
capability:
  exposes:
    - type: mcp
      namespace: drilling-finance
      port: 8080
      tools:
        - name: track-drilling-costs
          description: "Given a SAP project number for a drilling job, retrieve actual costs, compare to budget, and post variance to Teams."
          inputParameters:
            - name: project_number
              in: body
              type: string
              description: "The SAP project number for the drilling job."
          steps:
            - name: get-costs
              type: call
              call: sap.get-project-costs
              with:
                project: "{{project_number}}"
            - name: notify-pm
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_drilling_pm_channel_id"
                text: "Drilling Cost Report: Project {{project_number}} | Budget: ${{get-costs.budget}} | Actual: ${{get-costs.actual}} | Variance: ${{get-costs.variance}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://halliburton-s4.sap.com/sap/opu/odata/sap/API_PROJECT_COST_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: project-costs
          path: "/A_ProjectCost('{{project}}')"
          inputParameters:
            - name: project
              in: path
          operations:
            - name: get-project-costs
              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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

When a departure is logged in Workday, deactivates the Okta account, closes open ServiceNow tickets, and notifies IT in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Employee Offboarding and Access Revocation"
  description: "When a departure is logged in Workday, deactivates the Okta account, closes open ServiceNow tickets, and notifies IT in Microsoft Teams."
  tags:
    - hr
    - offboarding
    - workday
    - okta
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-offboarding
      port: 8080
      tools:
        - name: trigger-offboarding
          description: "Given a departing employee Workday ID and Okta user ID, deactivate Okta access, close open ServiceNow tickets, and notify IT in Microsoft Teams."
          inputParameters:
            - name: workday_employee_id
              in: body
              type: string
              description: "The Workday worker ID of the departing employee."
            - name: okta_user_id
              in: body
              type: string
              description: "The Okta user ID to deactivate."
          steps:
            - name: deactivate-okta
              type: call
              call: okta.deactivate-user
              with:
                user_id: "{{okta_user_id}}"
            - name: close-tickets
              type: call
              call: servicenow.close-user-tickets
              with:
                assigned_to: "{{workday_employee_id}}"
            - name: notify-it
              type: call
              call: msteams.notify-it
              with:
                channel: "it-ops"
                text: "Offboarding complete for employee {{workday_employee_id}}. Okta deactivated, open tickets closed."
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://halliburton.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_api_token"
        placement: header
      resources:
        - name: user-lifecycle
          path: "/users/{{user_id}}/lifecycle/deactivate"
          inputParameters:
            - name: user_id
              in: path
          operations:
            - name: deactivate-user
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://halliburton.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: close-user-tickets
              method: PATCH
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/it-ops/channels/general/messages"
          operations:
            - name: notify-it
              method: POST

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

naftiko: "0.5"
info:
  label: "Employee Onboarding Orchestrator"
  description: "When a new hire is created in Workday, opens a ServiceNow onboarding ticket, provisions an Okta account, and sends a Microsoft Teams welcome message."
  tags:
    - hr
    - onboarding
    - workday
    - servicenow
    - okta
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-onboarding
      port: 8080
      tools:
        - name: trigger-onboarding
          description: "Given a Workday employee ID and start date, open a ServiceNow onboarding ticket, provision an Okta account, and send a Teams welcome message to the new hire."
          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 first day in ISO 8601 format, e.g. 2026-04-01."
          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_to: IT_Onboarding
            - name: provision-okta
              type: call
              call: okta.create-user
              with:
                firstName: "{{get-employee.first_name}}"
                lastName: "{{get-employee.last_name}}"
                email: "{{get-employee.work_email}}"
                login: "{{get-employee.work_email}}"
            - name: send-welcome
              type: call
              call: msteams.send-message
              with:
                recipient: "{{get-employee.work_email}}"
                text: "Welcome to Halliburton, {{get-employee.first_name}}! Your IT onboarding ticket: {{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: "/halliburton/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://halliburton.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: okta
      baseUri: "https://halliburton.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
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient}}/sendMail"
          inputParameters:
            - name: recipient
              in: path
          operations:
            - name: send-message
              method: POST

Checks Workday for field crew members with expiring safety certifications, creates a Jira task for HR follow-up, and notifies the HSE team via Teams.

naftiko: "0.5"
info:
  label: "Field Crew Certification Expiry Alert"
  description: "Checks Workday for field crew members with expiring safety certifications, creates a Jira task for HR follow-up, and notifies the HSE team via Teams."
  tags:
    - hse
    - safety
    - workday
    - jira
    - microsoft-teams
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: hse-compliance
      port: 8080
      tools:
        - name: alert-expiring-certifications
          description: "Check Workday for field crew with expiring certifications, create Jira tasks, and alert the HSE team."
          inputParameters:
            - name: days_until_expiry
              in: body
              type: number
              description: "Number of days to look ahead for expiring certifications."
          steps:
            - name: get-expiring
              type: call
              call: workday.get-expiring-certifications
              with:
                days: "{{days_until_expiry}}"
            - name: create-task
              type: call
              call: jira.create-issue
              with:
                project_key: "HSE"
                summary: "Certification renewal: {{get-expiring.count}} field crew members expiring within {{days_until_expiry}} days"
                description: "Affected employees: {{get-expiring.employee_list}}"
            - name: notify-hse
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_hse_channel_id"
                text: "Certification Alert: {{get-expiring.count}} crew certifications expiring within {{days_until_expiry}} days | Jira: {{create-task.key}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: certifications
          path: "/workers/certifications?expiringWithinDays={{days}}"
          inputParameters:
            - name: days
              in: path
          operations:
            - name: get-expiring-certifications
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://halliburton.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Retrieves the current GPS location and status of field equipment from the IoT platform for logistics and asset tracking.

naftiko: "0.5"
info:
  label: "Field Equipment GPS Tracking"
  description: "Retrieves the current GPS location and status of field equipment from the IoT platform for logistics and asset tracking."
  tags:
    - field-operations
    - iot
    - logistics
    - asset-management
capability:
  exposes:
    - type: mcp
      namespace: field-logistics
      port: 8080
      tools:
        - name: get-equipment-location
          description: "Look up current GPS location of field equipment. Returns latitude, longitude, and last update time."
          inputParameters:
            - name: equipment_id
              in: body
              type: string
              description: "The field equipment identifier."
          call: iot-platform.get-location
          with:
            equipment_id: "{{equipment_id}}"
          outputParameters:
            - name: latitude
              type: number
              mapping: "$.location.lat"
            - name: longitude
              type: number
              mapping: "$.location.lng"
            - name: last_update
              type: string
              mapping: "$.location.timestamp"
  consumes:
    - type: http
      namespace: iot-platform
      baseUri: "https://halliburton-iot.azure-devices.net/api/v1"
      authentication:
        type: bearer
        token: "$secrets.iot_platform_token"
      resources:
        - name: locations
          path: "/equipment/{{equipment_id}}/location"
          inputParameters:
            - name: equipment_id
              in: path
          operations:
            - name: get-location
              method: GET

When a Health, Safety, and Environment (HSE) incident is logged in ServiceNow from the field, notifies the HSE compliance team in Teams and creates a Jira CAPA task.

naftiko: "0.5"
info:
  label: "Field HSE Incident Reporting and Escalation"
  description: "When a Health, Safety, and Environment (HSE) incident is logged in ServiceNow from the field, notifies the HSE compliance team in Teams and creates a Jira CAPA task."
  tags:
    - hse
    - safety
    - servicenow
    - jira
    - microsoft-teams
    - field-operations
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: hse-ops
      port: 8080
      tools:
        - name: escalate-hse-incident
          description: "Given a ServiceNow HSE incident number, retrieve details, create a Jira CAPA task for root cause analysis, and notify the HSE compliance team in Teams."
          inputParameters:
            - name: incident_number
              in: body
              type: string
              description: "The ServiceNow HSE incident number to escalate, e.g. INC0012345."
          steps:
            - name: get-incident
              type: call
              call: servicenow.get-hse-incident
              with:
                incident_number: "{{incident_number}}"
            - name: create-capa
              type: call
              call: jira.create-capa
              with:
                project_key: "HSE"
                summary: "CAPA: {{get-incident.short_description}}"
                description: "ServiceNow: {{incident_number}}\nLocation: {{get-incident.location}}\nSeverity: {{get-incident.severity}}"
            - name: notify-hse-team
              type: call
              call: msteams.notify-hse
              with:
                channel: "hse-compliance"
                text: "HSE incident escalated: {{incident_number}} | {{get-incident.short_description}} | CAPA: {{create-capa.key}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://halliburton.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: hse-incidents
          path: "/table/u_hse_incident/{{incident_number}}"
          inputParameters:
            - name: incident_number
              in: path
          operations:
            - name: get-hse-incident
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://halliburton.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-capa
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/hse/channels/compliance/messages"
          operations:
            - name: notify-hse
              method: POST

When a Datadog sensor alert fires for oil & gas field equipment, creates a ServiceNow P1 incident for field maintenance and notifies the operations team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Field Operations Equipment Maintenance Alert"
  description: "When a Datadog sensor alert fires for oil & gas field equipment, creates a ServiceNow P1 incident for field maintenance and notifies the operations team in Microsoft Teams."
  tags:
    - operations
    - field-operations
    - datadog
    - servicenow
    - microsoft-teams
    - maintenance
capability:
  exposes:
    - type: mcp
      namespace: field-ops
      port: 8080
      tools:
        - name: handle-equipment-alert
          description: "Given a Datadog monitor ID for equipment anomaly and asset ID, create a ServiceNow maintenance incident and notify the field operations Teams channel."
          inputParameters:
            - name: monitor_id
              in: body
              type: string
              description: "The Datadog monitor ID that fired the equipment alert."
            - name: asset_id
              in: body
              type: string
              description: "The field equipment asset ID with the anomaly."
            - name: location
              in: body
              type: string
              description: "The field site location where the equipment is deployed."
          steps:
            - name: get-monitor
              type: call
              call: datadog.get-monitor
              with:
                monitor_id: "{{monitor_id}}"
            - name: create-maintenance-incident
              type: call
              call: servicenow.create-maintenance-incident
              with:
                short_description: "Equipment alert: {{asset_id}} at {{location}}"
                category: field_maintenance
                impact: "1"
                description: "Monitor: {{get-monitor.name}}\nAsset: {{asset_id}}\nLocation: {{location}}"
            - name: notify-field-ops
              type: call
              call: msteams.post-field-alert
              with:
                channel: "field-operations"
                text: "Equipment alert at {{location}} — Asset: {{asset_id}} | Incident: {{create-maintenance-incident.number}} | Monitor: {{get-monitor.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: servicenow
      baseUri: "https://halliburton.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-maintenance-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/field-ops/channels/general/messages"
          operations:
            - name: post-field-alert
              method: POST

Retrieves the latest GitHub Actions workflow run status for a repository, returning conclusion, duration, and triggering commit.

naftiko: "0.5"
info:
  label: "GitHub Actions Build Status Check"
  description: "Retrieves the latest GitHub Actions workflow run status for a repository, returning conclusion, duration, and triggering commit."
  tags:
    - devops
    - github
    - github-actions
    - ci-cd
capability:
  exposes:
    - type: mcp
      namespace: devops-ci
      port: 8080
      tools:
        - name: get-build-status
          description: "Check latest GitHub Actions build status for a repository. Returns conclusion, duration, and commit SHA."
          inputParameters:
            - name: repo
              in: body
              type: string
              description: "Repository in org/repo format."
          call: github.get-latest-run
          with:
            repo: "{{repo}}"
          outputParameters:
            - name: conclusion
              type: string
              mapping: "$.workflow_runs[0].conclusion"
            - name: head_sha
              type: string
              mapping: "$.workflow_runs[0].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}}/actions/runs?per_page=1"
          inputParameters:
            - name: repo
              in: path
          operations:
            - name: get-latest-run
              method: GET

On a GitHub Actions pipeline failure on a protected branch, creates a Jira bug, fires a Datadog deployment event, and notifies the engineering team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "GitHub CI/CD Pipeline Failure Response"
  description: "On a GitHub Actions pipeline failure on a protected branch, creates a Jira bug, fires a Datadog deployment event, and notifies the engineering team in Microsoft Teams."
  tags:
    - devops
    - cicd
    - github
    - jira
    - datadog
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: devops-ops
      port: 8080
      tools:
        - name: handle-pipeline-failure
          description: "Given a GitHub Actions run ID, repo, and branch, open a Jira bug, create a Datadog event, and notify the engineering Teams channel."
          inputParameters:
            - name: run_id
              in: body
              type: string
              description: "The GitHub Actions workflow run ID that failed."
            - name: repo
              in: body
              type: string
              description: "The GitHub repository full name, e.g. halliburton/platform."
            - name: branch
              in: body
              type: string
              description: "The branch on which the failure occurred."
            - name: workflow_name
              in: body
              type: string
              description: "The name of the failed GitHub Actions workflow."
          steps:
            - name: create-bug
              type: call
              call: jira.create-issue
              with:
                project_key: "ENG"
                issuetype: "Bug"
                summary: "[CI Failure] {{repo}} / {{branch}} — {{workflow_name}}"
                description: "Run ID: {{run_id}}"
            - name: create-dd-event
              type: call
              call: datadog.create-event
              with:
                title: "CI Failure: {{workflow_name}} on {{branch}}"
                text: "Run {{run_id}} failed. Jira: {{create-bug.key}}"
                alert_type: "error"
            - name: notify-engineering
              type: call
              call: msteams.notify-engineering
              with:
                channel: "engineering-alerts"
                text: "Pipeline failure: {{repo}} | Branch: {{branch}} | Jira: {{create-bug.key}}"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://halliburton.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: events
          path: "/events"
          operations:
            - name: create-event
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/engineering/channels/general/messages"
          operations:
            - name: notify-engineering
              method: POST

Retrieves Dependabot security alerts for a repository, creates a Jira ticket for critical vulnerabilities, and notifies the security channel in Teams.

naftiko: "0.5"
info:
  label: "GitHub Dependabot Alert Triage"
  description: "Retrieves Dependabot security alerts for a repository, creates a Jira ticket for critical vulnerabilities, and notifies the security channel in Teams."
  tags:
    - security
    - github
    - jira
    - microsoft-teams
    - vulnerability-management
capability:
  exposes:
    - type: mcp
      namespace: security-ops
      port: 8080
      tools:
        - name: triage-dependabot-alerts
          description: "Given a GitHub repository, retrieve Dependabot alerts, create Jira tickets for critical ones, and notify security team."
          inputParameters:
            - name: repo
              in: body
              type: string
              description: "Repository in org/repo format."
          steps:
            - name: get-alerts
              type: call
              call: github.get-dependabot-alerts
              with:
                repo: "{{repo}}"
            - name: create-ticket
              type: call
              call: jira.create-issue
              with:
                project_key: "SEC"
                summary: "Dependabot alerts: {{get-alerts.critical_count}} critical in {{repo}}"
                description: "Total alerts: {{get-alerts.total}} | Critical: {{get-alerts.critical_count}} | High: {{get-alerts.high_count}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_security_channel_id"
                text: "Dependabot Alert: {{repo}} | Critical: {{get-alerts.critical_count}} | Jira: {{create-ticket.key}}"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: dependabot
          path: "/repos/{{repo}}/dependabot/alerts?severity=critical,high"
          inputParameters:
            - name: repo
              in: path
          operations:
            - name: get-dependabot-alerts
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://halliburton.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

When a GitHub pull request is opened, assigns reviewers based on CODEOWNERS, posts PR details to the engineering Teams channel.

naftiko: "0.5"
info:
  label: "GitHub Pull Request Review Assignment"
  description: "When a GitHub pull request is opened, assigns reviewers based on CODEOWNERS, posts PR details to the engineering Teams channel."
  tags:
    - devops
    - github
    - microsoft-teams
    - code-review
capability:
  exposes:
    - type: mcp
      namespace: devops-review
      port: 8080
      tools:
        - name: assign-pr-reviewers
          description: "Given a PR number and repo, assign reviewers and notify the engineering channel."
          inputParameters:
            - name: repo
              in: body
              type: string
              description: "Repository in org/repo format."
            - name: pr_number
              in: body
              type: number
              description: "The pull request number."
          steps:
            - name: get-pr
              type: call
              call: github.get-pull-request
              with:
                repo: "{{repo}}"
                pr_number: "{{pr_number}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_engineering_channel_id"
                text: "PR Review Needed: {{repo}}#{{pr_number}} | {{get-pr.title}} | Author: {{get-pr.user_login}}"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: pull-requests
          path: "/repos/{{repo}}/pulls/{{pr_number}}"
          inputParameters:
            - name: repo
              in: path
            - name: pr_number
              in: path
          operations:
            - name: get-pull-request
              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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Audits a GitHub repository for compliance with branch protection, required reviews, and code scanning, then creates a Jira ticket for findings.

naftiko: "0.5"
info:
  label: "GitHub Repository Compliance Audit"
  description: "Audits a GitHub repository for compliance with branch protection, required reviews, and code scanning, then creates a Jira ticket for findings."
  tags:
    - devops
    - github
    - jira
    - security
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: devops-compliance
      port: 8080
      tools:
        - name: audit-repo-compliance
          description: "Given a GitHub repository, check security settings and create a Jira ticket for non-compliant findings."
          inputParameters:
            - name: repo
              in: body
              type: string
              description: "Repository in org/repo format."
          steps:
            - name: get-protection
              type: call
              call: github.get-branch-protection
              with:
                repo: "{{repo}}"
            - name: create-ticket
              type: call
              call: jira.create-issue
              with:
                project_key: "SEC"
                summary: "Repo compliance audit: {{repo}}"
                description: "Branch protection: {{get-protection.enforce_admins}} | Required reviews: {{get-protection.required_reviewers}}"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: branch-protection
          path: "/repos/{{repo}}/branches/main/protection"
          inputParameters:
            - name: repo
              in: path
          operations:
            - name: get-branch-protection
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://halliburton.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Audits Halliburton GitHub repositories for required security settings and files Jira compliance tasks for any violations found.

naftiko: "0.5"
info:
  label: "GitHub Repository Security Policy Audit"
  description: "Audits Halliburton GitHub repositories for required security settings and files Jira compliance tasks for any violations found."
  tags:
    - security
    - devops
    - github
    - jira
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: repo-governance
      port: 8080
      tools:
        - name: enforce-repo-security-policy
          description: "Given a GitHub repository and default branch name, check branch protection rules; if non-compliant, create a Jira security task for the engineering team."
          inputParameters:
            - name: repo
              in: body
              type: string
              description: "The GitHub repository full name, e.g. halliburton/platform."
            - name: default_branch
              in: body
              type: string
              description: "The default branch to check, e.g. main."
          steps:
            - name: check-protection
              type: call
              call: github.get-branch-protection
              with:
                repo: "{{repo}}"
                branch: "{{default_branch}}"
            - name: create-compliance-task
              type: call
              call: jira.create-security-task
              with:
                project_key: "SEC"
                summary: "Repo policy violation: {{repo}}"
                description: "Branch {{default_branch}} missing required branch protection rules."
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: branch-protection
          path: "/repos/{{repo}}/branches/{{branch}}/protection"
          inputParameters:
            - name: repo
              in: path
            - name: branch
              in: path
          operations:
            - name: get-branch-protection
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://halliburton.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-security-task
              method: POST

Retrieves GitHub Advanced Security code scanning alerts and creates Jira security backlog issues for the application security team.

naftiko: "0.5"
info:
  label: "GitHub Security Scanning Sync to Jira"
  description: "Retrieves GitHub Advanced Security code scanning alerts and creates Jira security backlog issues for the application security team."
  tags:
    - security
    - devops
    - github
    - jira
    - code-scanning
capability:
  exposes:
    - type: mcp
      namespace: appsec-ops
      port: 8080
      tools:
        - name: sync-security-alerts-to-jira
          description: "Given a GitHub repository and severity filter, fetch open code scanning alerts and create a Jira security issue summarizing findings for the security team."
          inputParameters:
            - name: repo
              in: body
              type: string
              description: "The GitHub repository full name to scan, e.g. halliburton/platform."
            - name: severity_filter
              in: body
              type: string
              description: "Minimum severity to import: critical, high, or medium."
          steps:
            - name: get-alerts
              type: call
              call: github.list-code-scanning-alerts
              with:
                repo: "{{repo}}"
                severity: "{{severity_filter}}"
            - name: create-security-issue
              type: call
              call: jira.create-security-issue
              with:
                project_key: "SEC"
                summary: "Security alerts in {{repo}}: {{get-alerts.total}} {{severity_filter}}+ findings"
                description: "Top finding: {{get-alerts.top_rule}}"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: code-scanning-alerts
          path: "/repos/{{repo}}/code-scanning/alerts"
          inputParameters:
            - name: repo
              in: path
          operations:
            - name: list-code-scanning-alerts
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://halliburton.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-security-issue
              method: POST

Retrieves environmental permit status from a compliance database, returning permit type, expiration date, and renewal status for regulatory compliance.

naftiko: "0.5"
info:
  label: "HSE Environmental Permit Tracking"
  description: "Retrieves environmental permit status from a compliance database, returning permit type, expiration date, and renewal status for regulatory compliance."
  tags:
    - hse
    - compliance
    - environmental
    - regulatory
capability:
  exposes:
    - type: mcp
      namespace: hse-compliance
      port: 8080
      tools:
        - name: get-permit-status
          description: "Look up an environmental permit by ID. Returns permit type, expiration, and renewal status."
          inputParameters:
            - name: permit_id
              in: body
              type: string
              description: "The environmental permit identifier."
          call: compliance-db.get-permit
          with:
            permit_id: "{{permit_id}}"
          outputParameters:
            - name: permit_type
              type: string
              mapping: "$.permitType"
            - name: expiration_date
              type: string
              mapping: "$.expirationDate"
            - name: renewal_status
              type: string
              mapping: "$.renewalStatus"
  consumes:
    - type: http
      namespace: compliance-db
      baseUri: "https://halliburton-compliance.azurewebsites.net/api/v1"
      authentication:
        type: bearer
        token: "$secrets.compliance_api_token"
      resources:
        - name: permits
          path: "/permits/{{permit_id}}"
          inputParameters:
            - name: permit_id
              in: path
          operations:
            - name: get-permit
              method: GET

When a near-miss report is submitted via the field reporting app, creates a Jira ticket for HSE investigation and notifies the safety team.

naftiko: "0.5"
info:
  label: "HSE Near-Miss Report to Jira"
  description: "When a near-miss report is submitted via the field reporting app, creates a Jira ticket for HSE investigation and notifies the safety team."
  tags:
    - hse
    - safety
    - jira
    - microsoft-teams
    - field-operations
capability:
  exposes:
    - type: mcp
      namespace: hse-reporting
      port: 8080
      tools:
        - name: log-near-miss
          description: "Given near-miss report details, create a Jira investigation ticket and notify the safety team."
          inputParameters:
            - name: location
              in: body
              type: string
              description: "Location of the near-miss event."
            - name: description
              in: body
              type: string
              description: "Description of the near-miss event."
            - name: reporter
              in: body
              type: string
              description: "Name of the reporter."
          steps:
            - name: create-ticket
              type: call
              call: jira.create-issue
              with:
                project_key: "HSE"
                summary: "Near-Miss: {{location}} — {{description}}"
                description: "Reporter: {{reporter}} | Location: {{location}} | Details: {{description}}"
            - name: notify-safety
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_hse_channel_id"
                text: "Near-Miss Report: {{location}} | {{description}} | Reporter: {{reporter}} | Jira: {{create-ticket.key}}"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://halliburton.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Retrieves a Jira project backlog summary grouped by priority, returning counts for critical, high, medium, and low items.

naftiko: "0.5"
info:
  label: "Jira Backlog Priority Report"
  description: "Retrieves a Jira project backlog summary grouped by priority, returning counts for critical, high, medium, and low items."
  tags:
    - devops
    - jira
    - project-management
capability:
  exposes:
    - type: mcp
      namespace: devops-pm
      port: 8080
      tools:
        - name: get-backlog-summary
          description: "Get backlog summary by priority for a Jira project. Returns counts per priority level."
          inputParameters:
            - name: project_key
              in: body
              type: string
              description: "The Jira project key."
          call: jira.search-issues
          with:
            project_key: "{{project_key}}"
          outputParameters:
            - name: total
              type: number
              mapping: "$.total"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://halliburton.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: search
          path: "/search?jql=project={{project_key}}+AND+status!=Done&groupBy=priority"
          inputParameters:
            - name: project_key
              in: path
          operations:
            - name: search-issues
              method: GET

Retrieves a Jira issue by key and returns summary, status, assignee, and priority for engineering project tracking.

naftiko: "0.5"
info:
  label: "Jira Issue Lookup"
  description: "Retrieves a Jira issue by key and returns summary, status, assignee, and priority for engineering project tracking."
  tags:
    - devops
    - jira
    - project-management
capability:
  exposes:
    - type: mcp
      namespace: devops-pm
      port: 8080
      tools:
        - name: get-issue
          description: "Look up a Jira issue by key. Returns summary, status, assignee, and priority."
          inputParameters:
            - name: issue_key
              in: body
              type: string
              description: "The Jira issue key, e.g. OPS-1234."
          call: jira.get-issue
          with:
            issue_key: "{{issue_key}}"
          outputParameters:
            - name: summary
              type: string
              mapping: "$.fields.summary"
            - name: status
              type: string
              mapping: "$.fields.status.name"
            - name: assignee
              type: string
              mapping: "$.fields.assignee.displayName"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://halliburton.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue/{{issue_key}}"
          inputParameters:
            - name: issue_key
              in: path
          operations:
            - name: get-issue
              method: GET

Compiles an engineering sprint planning digest from Jira and posts a prioritized summary to the engineering team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Jira Sprint Planning Digest"
  description: "Compiles an engineering sprint planning digest from Jira and posts a prioritized summary to the engineering team in Microsoft Teams."
  tags:
    - devops
    - jira
    - microsoft-teams
    - sprint-planning
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: devops-reporting
      port: 8080
      tools:
        - name: digest-sprint-backlog
          description: "Given a Jira project key and sprint name, retrieve open sprint issues and post a digest to the engineering Teams channel."
          inputParameters:
            - name: project_key
              in: body
              type: string
              description: "The Jira project key, e.g. ENG."
            - name: sprint_name
              in: body
              type: string
              description: "The sprint name to filter, e.g. Sprint 42."
          steps:
            - name: get-sprint-issues
              type: call
              call: jira.search-issues
              with:
                jql: "project={{project_key}} AND sprint='{{sprint_name}}' AND status!=Done"
            - name: post-digest
              type: call
              call: msteams.post-sprint-digest
              with:
                channel: "engineering-planning"
                text: "Sprint digest {{sprint_name}} ({{project_key}}): {{get-sprint-issues.total}} open issues."
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://halliburton.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/search"
          operations:
            - name: search-issues
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/engineering/channels/planning/messages"
          operations:
            - name: post-sprint-digest
              method: POST

Generates a sprint retrospective summary from Jira, including completed stories, carry-over items, and velocity, then posts to the engineering Teams channel.

naftiko: "0.5"
info:
  label: "Jira Sprint Retrospective Digest"
  description: "Generates a sprint retrospective summary from Jira, including completed stories, carry-over items, and velocity, then posts to the engineering Teams channel."
  tags:
    - devops
    - jira
    - microsoft-teams
    - agile
capability:
  exposes:
    - type: mcp
      namespace: devops-agile
      port: 8080
      tools:
        - name: generate-retro-digest
          description: "Given a Jira board ID and sprint ID, generate a retrospective summary and post to Teams."
          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."
          steps:
            - name: get-sprint-report
              type: call
              call: jira.get-sprint-report
              with:
                board_id: "{{board_id}}"
                sprint_id: "{{sprint_id}}"
            - name: post-digest
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_engineering_channel_id"
                text: "Sprint Retro: {{get-sprint-report.sprint_name}} | Completed: {{get-sprint-report.completed_count}} | Carried Over: {{get-sprint-report.incomplete_count}} | Velocity: {{get-sprint-report.velocity}}"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://halliburton.atlassian.net/rest/agile/1.0"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_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: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Retrieves LinkedIn Recruiter campaign metrics including applicant count, views, and click-through rate for a job posting.

naftiko: "0.5"
info:
  label: "LinkedIn Talent Acquisition Campaign Report"
  description: "Retrieves LinkedIn Recruiter campaign metrics including applicant count, views, and click-through rate for a job posting."
  tags:
    - hr
    - recruiting
    - linkedin
    - analytics
capability:
  exposes:
    - type: mcp
      namespace: hr-recruiting
      port: 8080
      tools:
        - name: get-campaign-metrics
          description: "Get LinkedIn recruiting campaign metrics for a job posting. Returns views, applicants, and CTR."
          inputParameters:
            - name: job_posting_id
              in: body
              type: string
              description: "The LinkedIn job posting ID."
          call: linkedin.get-job-analytics
          with:
            posting_id: "{{job_posting_id}}"
          outputParameters:
            - name: views
              type: number
              mapping: "$.views"
            - name: applicants
              type: number
              mapping: "$.applicants"
  consumes:
    - type: http
      namespace: linkedin
      baseUri: "https://api.linkedin.com/v2"
      authentication:
        type: bearer
        token: "$secrets.linkedin_token"
      resources:
        - name: job-analytics
          path: "/jobPostings/{{posting_id}}/analytics"
          inputParameters:
            - name: posting_id
              in: path
          operations:
            - name: get-job-analytics
              method: GET

Retrieves active Halliburton job postings from LinkedIn and posts a weekly talent acquisition pipeline summary to the HR team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "LinkedIn Talent Pipeline Digest"
  description: "Retrieves active Halliburton job postings from LinkedIn and posts a weekly talent acquisition pipeline summary to the HR team in Microsoft Teams."
  tags:
    - hr
    - recruiting
    - linkedin
    - microsoft-teams
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: talent-reporting
      port: 8080
      tools:
        - name: digest-talent-pipeline
          description: "Fetch active LinkedIn job postings and applicant counts for Halliburton and post a weekly summary to the HR talent Teams channel."
          inputParameters:
            - name: organization_id
              in: body
              type: string
              description: "The LinkedIn organization URN for Halliburton."
          steps:
            - name: get-postings
              type: call
              call: linkedin.list-job-postings
              with:
                organization_id: "{{organization_id}}"
            - name: post-digest
              type: call
              call: msteams.post-talent-digest
              with:
                channel: "hr-talent-acquisition"
                text: "Weekly talent pipeline: {{get-postings.total}} active postings, {{get-postings.applicant_count}} applicants."
  consumes:
    - type: http
      namespace: linkedin
      baseUri: "https://api.linkedin.com/v2"
      authentication:
        type: bearer
        token: "$secrets.linkedin_token"
      resources:
        - name: job-postings
          path: "/jobPostings"
          operations:
            - name: list-job-postings
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/hr/channels/talent/messages"
          operations:
            - name: post-talent-digest
              method: POST

Posts a safety alert broadcast message to multiple Microsoft Teams channels for field operations, HSE, and management notification.

naftiko: "0.5"
info:
  label: "Microsoft Teams Field Safety Broadcast"
  description: "Posts a safety alert broadcast message to multiple Microsoft Teams channels for field operations, HSE, and management notification."
  tags:
    - hse
    - safety
    - microsoft-teams
    - field-operations
    - notifications
capability:
  exposes:
    - type: mcp
      namespace: safety-comms
      port: 8080
      tools:
        - name: broadcast-safety-alert
          description: "Post a safety alert to field operations and HSE Teams channels simultaneously."
          inputParameters:
            - name: alert_title
              in: body
              type: string
              description: "Title of the safety alert."
            - name: alert_details
              in: body
              type: string
              description: "Detailed safety alert message."
          steps:
            - name: notify-field-ops
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_field_ops_channel_id"
                text: "SAFETY ALERT: {{alert_title}} | {{alert_details}}"
            - name: notify-hse
              type: call
              call: msteams.post-hse-message
              with:
                channel_id: "$secrets.teams_hse_channel_id"
                text: "SAFETY ALERT: {{alert_title}} | {{alert_details}}"
  consumes:
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: field-messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST
        - name: hse-messages
          path: "/teams/$secrets.teams_hse_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-hse-message
              method: POST

Lists all users assigned to a critical Okta application and posts a quarterly access review to the security team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Okta Application Access Quarterly Review"
  description: "Lists all users assigned to a critical Okta application and posts a quarterly access review to the security team in Microsoft Teams."
  tags:
    - identity
    - security
    - okta
    - microsoft-teams
    - access-review
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: access-review
      port: 8080
      tools:
        - name: run-app-access-review
          description: "Given an Okta application ID and name, list all assigned users and post a quarterly access review summary to the security Teams channel."
          inputParameters:
            - name: app_id
              in: body
              type: string
              description: "The Okta application ID to review."
            - name: app_name
              in: body
              type: string
              description: "Human-readable application name for the report."
          steps:
            - name: list-app-users
              type: call
              call: okta.list-app-users
              with:
                app_id: "{{app_id}}"
            - name: post-review
              type: call
              call: msteams.post-access-review
              with:
                channel: "security-access-reviews"
                text: "Quarterly access review for {{app_name}}: {{list-app-users.total}} users assigned. Please certify by end of quarter."
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://halliburton.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_api_token"
        placement: header
      resources:
        - name: app-users
          path: "/apps/{{app_id}}/users"
          inputParameters:
            - name: app_id
              in: path
          operations:
            - name: list-app-users
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/security/channels/reviews/messages"
          operations:
            - name: post-access-review
              method: POST

Retrieves all members of an Okta group and cross-references with Workday active employees to flag stale accounts for quarterly access review.

naftiko: "0.5"
info:
  label: "Okta Group Access Review"
  description: "Retrieves all members of an Okta group and cross-references with Workday active employees to flag stale accounts for quarterly access review."
  tags:
    - security
    - identity
    - okta
    - workday
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: identity-governance
      port: 8080
      tools:
        - name: review-group-access
          description: "Given an Okta group ID, retrieve members and cross-check against Workday active employees to identify stale accounts."
          inputParameters:
            - name: group_id
              in: body
              type: string
              description: "The Okta group ID."
          steps:
            - name: get-group-members
              type: call
              call: okta.get-group-members
              with:
                group_id: "{{group_id}}"
            - name: get-active-employees
              type: call
              call: workday.get-active-workers
              with:
                as_of_date: "today"
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://halliburton.okta.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.okta_token"
      resources:
        - name: groups
          path: "/groups/{{group_id}}/users"
          inputParameters:
            - name: group_id
              in: path
          operations:
            - name: get-group-members
              method: GET
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers?activeAsOf={{as_of_date}}"
          inputParameters:
            - name: as_of_date
              in: path
          operations:
            - name: get-active-workers
              method: GET

Audits Okta for users without MFA enrollment and creates a ServiceNow compliance incident when non-compliance exceeds the threshold.

naftiko: "0.5"
info:
  label: "Okta MFA Compliance Audit"
  description: "Audits Okta for users without MFA enrollment and creates a ServiceNow compliance incident when non-compliance exceeds the threshold."
  tags:
    - identity
    - security
    - okta
    - servicenow
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: security-compliance
      port: 8080
      tools:
        - name: audit-mfa-compliance
          description: "List all active Okta users, identify those without MFA enrolled, and open a ServiceNow compliance incident when the non-compliance rate exceeds the threshold."
          inputParameters:
            - name: compliance_threshold
              in: body
              type: number
              description: "Allowed percentage of non-MFA users before opening an incident."
          steps:
            - name: list-users
              type: call
              call: okta.list-active-users
            - name: create-compliance-incident
              type: call
              call: servicenow.create-compliance-incident
              with:
                short_description: "Okta MFA non-compliance exceeds {{compliance_threshold}}%"
                category: security_compliance
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://halliburton.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_api_token"
        placement: header
      resources:
        - name: users
          path: "/users"
          operations:
            - name: list-active-users
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://halliburton.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-compliance-incident
              method: POST

Triggers an Okta password reset for a user account and sends a confirmation notification via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Okta Password Reset Request"
  description: "Triggers an Okta password reset for a user account and sends a confirmation notification via Microsoft Teams."
  tags:
    - security
    - identity
    - okta
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: identity-ops
      port: 8080
      tools:
        - name: reset-password
          description: "Trigger an Okta password reset for a user and notify them via Teams."
          inputParameters:
            - name: user_login
              in: body
              type: string
              description: "The Okta user login email."
          steps:
            - name: trigger-reset
              type: call
              call: okta.reset-password
              with:
                login: "{{user_login}}"
            - name: notify-user
              type: call
              call: msteams.send-message
              with:
                recipient_upn: "{{user_login}}"
                text: "Your Okta password reset has been initiated. Please check your email for reset instructions."
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://halliburton.okta.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.okta_token"
      resources:
        - name: users
          path: "/users/{{login}}/lifecycle/reset_password"
          inputParameters:
            - name: login
              in: path
          operations:
            - name: reset-password
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves an Okta user profile by login email, returning account status, last login time, and MFA enrollment state.

naftiko: "0.5"
info:
  label: "Okta User Status Check"
  description: "Retrieves an Okta user profile by login email, returning account status, last login time, and MFA enrollment state."
  tags:
    - security
    - identity
    - okta
capability:
  exposes:
    - type: mcp
      namespace: identity-security
      port: 8080
      tools:
        - name: get-user-status
          description: "Look up an Okta user by login. Returns account status, last login, and MFA state."
          inputParameters:
            - name: user_login
              in: body
              type: string
              description: "The Okta user login email."
          call: okta.get-user
          with:
            login: "{{user_login}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.status"
            - name: last_login
              type: string
              mapping: "$.lastLogin"
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://halliburton.okta.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.okta_token"
      resources:
        - name: users
          path: "/users/{{login}}"
          inputParameters:
            - name: login
              in: path
          operations:
            - name: get-user
              method: GET

Retrieves the current on-call engineer from PagerDuty for a given schedule and returns their contact details.

naftiko: "0.5"
info:
  label: "PagerDuty On-Call Engineer Lookup"
  description: "Retrieves the current on-call engineer from PagerDuty for a given schedule and returns their contact details."
  tags:
    - itsm
    - pagerduty
    - on-call
    - operations
capability:
  exposes:
    - type: mcp
      namespace: oncall-lookup
      port: 8080
      tools:
        - name: get-oncall-engineer
          description: "Given a PagerDuty schedule ID, return the current on-call engineer name, email, and escalation policy. Use to identify the escalation target for production incidents."
          inputParameters:
            - name: schedule_id
              in: body
              type: string
              description: "The PagerDuty schedule ID to query."
          call: pagerduty.get-oncall
          with:
            schedule_id: "{{schedule_id}}"
          outputParameters:
            - name: user_name
              type: string
              mapping: "$.oncalls[0].user.summary"
            - name: user_email
              type: string
              mapping: "$.oncalls[0].user.email"
            - name: escalation_policy
              type: string
              mapping: "$.oncalls[0].escalation_policy.summary"
  consumes:
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.pagerduty_token"
        placement: header
      resources:
        - name: oncalls
          path: "/oncalls"
          operations:
            - name: get-oncall
              method: GET

Retrieves the current on-call engineer for a PagerDuty escalation policy, returning name, email, and shift end time.

naftiko: "0.5"
info:
  label: "PagerDuty On-Call Schedule Lookup"
  description: "Retrieves the current on-call engineer for a PagerDuty escalation policy, returning name, email, and shift end time."
  tags:
    - it-ops
    - pagerduty
    - incident-management
capability:
  exposes:
    - type: mcp
      namespace: incident-response
      port: 8080
      tools:
        - name: get-on-call
          description: "Look up current on-call engineer for a PagerDuty policy. Returns name, email, and shift end."
          inputParameters:
            - name: policy_id
              in: body
              type: string
              description: "The PagerDuty escalation policy ID."
          call: pagerduty.get-oncall
          with:
            policy_id: "{{policy_id}}"
          outputParameters:
            - name: name
              type: string
              mapping: "$.oncalls[0].user.name"
            - name: email
              type: string
              mapping: "$.oncalls[0].user.email"
  consumes:
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: bearer
        token: "$secrets.pagerduty_token"
      resources:
        - name: oncalls
          path: "/oncalls?escalation_policy_ids[]={{policy_id}}"
          inputParameters:
            - name: policy_id
              in: path
          operations:
            - name: get-oncall
              method: GET

Checks the latest refresh status of a Power BI dataset and returns completion time, status, and any error messages.

naftiko: "0.5"
info:
  label: "Power BI Dataset Refresh Status"
  description: "Checks the latest refresh status of a Power BI dataset and returns completion time, status, and any error messages."
  tags:
    - analytics
    - power-bi
    - monitoring
capability:
  exposes:
    - type: mcp
      namespace: analytics-ops
      port: 8080
      tools:
        - name: get-dataset-refresh-status
          description: "Check the latest Power BI dataset refresh status. Returns completion time and status."
          inputParameters:
            - name: dataset_id
              in: body
              type: string
              description: "The Power BI dataset ID."
            - name: group_id
              in: body
              type: string
              description: "The Power BI workspace ID."
          call: powerbi.get-refresh-history
          with:
            group_id: "{{group_id}}"
            dataset_id: "{{dataset_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.value[0].status"
            - name: end_time
              type: string
              mapping: "$.value[0].endTime"
  consumes:
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: refreshes
          path: "/groups/{{group_id}}/datasets/{{dataset_id}}/refreshes?$top=1"
          inputParameters:
            - name: group_id
              in: path
            - name: dataset_id
              in: path
          operations:
            - name: get-refresh-history
              method: GET

Triggers a refresh of the drilling performance Power BI dataset and notifies the operations team when complete.

naftiko: "0.5"
info:
  label: "Power BI Drilling Performance Dashboard Refresh"
  description: "Triggers a refresh of the drilling performance Power BI dataset and notifies the operations team when complete."
  tags:
    - analytics
    - power-bi
    - drilling
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: analytics-ops
      port: 8080
      tools:
        - name: refresh-drilling-dashboard
          description: "Trigger a Power BI dataset refresh for drilling performance and notify ops team."
          inputParameters:
            - name: dataset_id
              in: body
              type: string
              description: "The Power BI dataset ID."
          steps:
            - name: trigger-refresh
              type: call
              call: powerbi.refresh-dataset
              with:
                dataset_id: "{{dataset_id}}"
            - name: notify-ops
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_drilling_ops_channel_id"
                text: "Drilling Performance Dashboard refresh triggered for dataset {{dataset_id}}."
  consumes:
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: refreshes
          path: "/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: refresh-dataset
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Triggers a Power BI dataset refresh for the operational performance dashboard and notifies the operations analytics team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Power BI Operations Dashboard Refresh"
  description: "Triggers a Power BI dataset refresh for the operational performance dashboard and notifies the operations analytics team in Microsoft Teams."
  tags:
    - operations
    - data-analytics
    - power-bi
    - microsoft-teams
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: ops-reporting
      port: 8080
      tools:
        - name: refresh-ops-dashboard
          description: "Given a Power BI workspace and dataset ID for the operations dashboard, trigger a refresh and notify the operations analytics team in Teams."
          inputParameters:
            - name: workspace_id
              in: body
              type: string
              description: "The Power BI workspace GUID containing the operations dashboard."
            - name: dataset_id
              in: body
              type: string
              description: "The Power BI dataset GUID to refresh."
          steps:
            - name: trigger-refresh
              type: call
              call: powerbi.refresh-dataset
              with:
                workspace_id: "{{workspace_id}}"
                dataset_id: "{{dataset_id}}"
            - name: notify-ops-analytics
              type: call
              call: msteams.notify-ops-analytics
              with:
                channel: "operations-analytics"
                text: "Operations dashboard dataset {{dataset_id}} refresh triggered."
  consumes:
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/groups/{{workspace_id}}/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: workspace_id
              in: path
            - name: dataset_id
              in: path
          operations:
            - name: refresh-dataset
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/operations/channels/analytics/messages"
          operations:
            - name: notify-ops-analytics
              method: POST

Compiles a weekly Salesforce account health digest for energy sector accounts and posts it to the commercial team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Salesforce Account Health Digest"
  description: "Compiles a weekly Salesforce account health digest for energy sector accounts and posts it to the commercial team in Microsoft Teams."
  tags:
    - sales
    - crm
    - salesforce
    - microsoft-teams
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: commercial-reporting
      port: 8080
      tools:
        - name: digest-account-health
          description: "Retrieve open opportunities and recent activity for energy sector accounts from Salesforce and post a weekly account health digest to the commercial Teams channel."
          inputParameters:
            - name: account_segment
              in: body
              type: string
              description: "The account segment to report on, e.g. Major Operators, National Oil Companies."
          steps:
            - name: get-opportunities
              type: call
              call: salesforce.query-opportunities
              with:
                segment: "{{account_segment}}"
            - name: post-digest
              type: call
              call: msteams.post-account-digest
              with:
                channel: "commercial-ops"
                text: "Weekly account health ({{account_segment}}): {{get-opportunities.total}} open deals, ${{get-opportunities.pipeline_value}} pipeline."
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://halliburton.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opportunities
          path: "/query"
          operations:
            - name: query-opportunities
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/commercial/channels/general/messages"
          operations:
            - name: post-account-digest
              method: POST

Retrieves a Salesforce contact by email, returning full name, title, account name, and phone number.

naftiko: "0.5"
info:
  label: "Salesforce Contact Lookup"
  description: "Retrieves a Salesforce contact by email, returning full name, title, account name, and phone number."
  tags:
    - sales
    - salesforce
    - crm
capability:
  exposes:
    - type: mcp
      namespace: crm-contacts
      port: 8080
      tools:
        - name: get-contact-by-email
          description: "Look up a Salesforce contact by email. Returns name, title, and account."
          inputParameters:
            - name: email
              in: body
              type: string
              description: "The contact email address."
          call: salesforce.query-contact
          with:
            email: "{{email}}"
          outputParameters:
            - name: full_name
              type: string
              mapping: "$.records[0].Name"
            - name: title
              type: string
              mapping: "$.records[0].Title"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://halliburton.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: query
          path: "/query?q=SELECT+Name,Title,Phone,Account.Name+FROM+Contact+WHERE+Email='{{email}}'"
          inputParameters:
            - name: email
              in: path
          operations:
            - name: query-contact
              method: GET

Retrieves a Salesforce opportunity by ID and returns stage, amount, close date, and account name for well services sales tracking.

naftiko: "0.5"
info:
  label: "Salesforce Opportunity Lookup"
  description: "Retrieves a Salesforce opportunity by ID and returns stage, amount, close date, and account name for well services sales tracking."
  tags:
    - sales
    - salesforce
    - crm
capability:
  exposes:
    - type: mcp
      namespace: crm-sales
      port: 8080
      tools:
        - name: get-opportunity
          description: "Look up a Salesforce opportunity by ID. Returns stage, amount, close date, and account name."
          inputParameters:
            - name: opportunity_id
              in: body
              type: string
              description: "The Salesforce opportunity ID."
          call: salesforce.get-opportunity
          with:
            opportunity_id: "{{opportunity_id}}"
          outputParameters:
            - name: stage
              type: string
              mapping: "$.StageName"
            - name: amount
              type: number
              mapping: "$.Amount"
            - name: close_date
              type: string
              mapping: "$.CloseDate"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://halliburton.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

Extracts quarterly sales pipeline data from Salesforce and pushes to Power BI for executive reporting.

naftiko: "0.5"
info:
  label: "Salesforce Pipeline Report to Power BI"
  description: "Extracts quarterly sales pipeline data from Salesforce and pushes to Power BI for executive reporting."
  tags:
    - sales
    - salesforce
    - power-bi
    - analytics
capability:
  exposes:
    - type: mcp
      namespace: sales-analytics
      port: 8080
      tools:
        - name: sync-pipeline-to-powerbi
          description: "Extract pipeline data from Salesforce and push to Power BI for dashboards."
          inputParameters:
            - name: fiscal_quarter
              in: body
              type: string
              description: "Fiscal quarter, e.g. 2026-Q1."
          steps:
            - name: get-pipeline
              type: call
              call: salesforce.query-pipeline
              with:
                quarter: "{{fiscal_quarter}}"
            - name: push-to-powerbi
              type: call
              call: powerbi.push-rows
              with:
                dataset_id: "$secrets.powerbi_pipeline_dataset_id"
                table_name: "PipelineData"
                rows: "{{get-pipeline.records}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://halliburton.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: query
          path: "/query?q=SELECT+Name,Amount,StageName,CloseDate+FROM+Opportunity+WHERE+FiscalQuarter='{{quarter}}'"
          inputParameters:
            - name: quarter
              in: path
          operations:
            - name: query-pipeline
              method: GET
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: push-datasets
          path: "/datasets/{{dataset_id}}/tables/{{table_name}}/rows"
          inputParameters:
            - name: dataset_id
              in: path
            - name: table_name
              in: path
          operations:
            - name: push-rows
              method: POST

When a Salesforce well services opportunity advances to Closed-Won, creates a Jira project management epic and notifies the delivery team in Teams.

naftiko: "0.5"
info:
  label: "Salesforce Well Services Opportunity Sync to Jira"
  description: "When a Salesforce well services opportunity advances to Closed-Won, creates a Jira project management epic and notifies the delivery team in Teams."
  tags:
    - sales
    - crm
    - salesforce
    - jira
    - microsoft-teams
    - project-delivery
capability:
  exposes:
    - type: mcp
      namespace: sales-ops
      port: 8080
      tools:
        - name: sync-opportunity-to-jira
          description: "Given a Salesforce opportunity ID at Closed-Won, create a Jira delivery epic for the well services engagement and notify the project delivery team in Teams."
          inputParameters:
            - name: opportunity_id
              in: body
              type: string
              description: "The Salesforce Opportunity record ID at Closed-Won."
          steps:
            - name: get-opportunity
              type: call
              call: salesforce.get-opportunity
              with:
                opportunity_id: "{{opportunity_id}}"
            - name: create-delivery-epic
              type: call
              call: jira.create-epic
              with:
                project_key: "DELIVERY"
                summary: "Well Services: {{get-opportunity.account_name}}"
                description: "Salesforce Opp: {{opportunity_id}} | Value: {{get-opportunity.amount}}"
            - name: notify-delivery
              type: call
              call: msteams.notify-delivery
              with:
                channel: "project-delivery"
                text: "New well services engagement for {{get-opportunity.account_name}}. Delivery epic: {{create-delivery-epic.key}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://halliburton.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: jira
      baseUri: "https://halliburton.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-epic
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/delivery/channels/general/messages"
          operations:
            - name: notify-delivery
              method: POST

Given a Salesforce opportunity for well services, generates a quote in SAP and updates the opportunity with the quote reference.

naftiko: "0.5"
info:
  label: "Salesforce Well Services Quote Generation"
  description: "Given a Salesforce opportunity for well services, generates a quote in SAP and updates the opportunity with the quote reference."
  tags:
    - sales
    - salesforce
    - sap
    - well-services
    - quoting
capability:
  exposes:
    - type: mcp
      namespace: sales-erp
      port: 8080
      tools:
        - name: generate-well-services-quote
          description: "Given a Salesforce opportunity ID, create a SAP sales quote for well services and link it back to Salesforce."
          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: create-quote
              type: call
              call: sap.create-sales-quote
              with:
                customer_id: "{{get-opportunity.account_sap_id}}"
                amount: "{{get-opportunity.amount}}"
                service_type: "{{get-opportunity.service_type}}"
            - name: update-opportunity
              type: call
              call: salesforce.update-opportunity
              with:
                opportunity_id: "{{opportunity_id}}"
                sap_quote_number: "{{create-quote.document_number}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://halliburton.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
            - name: update-opportunity
              method: PATCH
    - type: http
      namespace: sap
      baseUri: "https://halliburton-s4.sap.com/sap/opu/odata/sap/SD_SLS_QUOTATION_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: quotations
          path: "/A_SalesQuotation"
          operations:
            - name: create-sales-quote
              method: POST

Checks SAP Ariba for supplier contracts expiring within a specified window and creates ServiceNow tasks for procurement renewal review.

naftiko: "0.5"
info:
  label: "SAP Ariba Contract Expiry Monitor"
  description: "Checks SAP Ariba for supplier contracts expiring within a specified window and creates ServiceNow tasks for procurement renewal review."
  tags:
    - procurement
    - sap-ariba
    - servicenow
    - contract-management
capability:
  exposes:
    - type: mcp
      namespace: procurement-contracts
      port: 8080
      tools:
        - name: monitor-expiring-contracts
          description: "Query SAP Ariba for contracts expiring soon and create ServiceNow review tasks."
          inputParameters:
            - name: days_until_expiry
              in: body
              type: number
              description: "Days to look ahead for expiring contracts."
          steps:
            - name: get-expiring
              type: call
              call: ariba.get-expiring-contracts
              with:
                days: "{{days_until_expiry}}"
            - name: create-task
              type: call
              call: servicenow.create-task
              with:
                short_description: "Contract renewal: {{get-expiring.contract_count}} contracts expiring within {{days_until_expiry}} days"
                category: "procurement"
  consumes:
    - type: http
      namespace: ariba
      baseUri: "https://openapi.ariba.com/api/procurement-reporting/v1"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: contracts
          path: "/contracts?expiringWithinDays={{days}}"
          inputParameters:
            - name: days
              in: path
          operations:
            - name: get-expiring-contracts
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://halliburton.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 SAP Ariba invoice, validates it against the SAP purchase order, and creates a ServiceNow approval task for the finance team.

naftiko: "0.5"
info:
  label: "SAP Ariba Invoice Approval Routing"
  description: "Retrieves a pending SAP Ariba invoice, validates it against the SAP purchase order, and creates a ServiceNow approval task for the finance team."
  tags:
    - finance
    - procurement
    - sap-ariba
    - sap
    - servicenow
    - approval
capability:
  exposes:
    - type: mcp
      namespace: invoice-ops
      port: 8080
      tools:
        - name: route-invoice-approval
          description: "Given an Ariba invoice ID and matching SAP PO number, validate the invoice against the PO and create a ServiceNow approval task for the procurement finance team."
          inputParameters:
            - name: invoice_id
              in: body
              type: string
              description: "The SAP Ariba invoice document ID."
            - name: po_number
              in: body
              type: string
              description: "The related SAP purchase order number."
          steps:
            - name: get-invoice
              type: call
              call: ariba.get-invoice
              with:
                invoice_id: "{{invoice_id}}"
            - name: get-po
              type: call
              call: sap.get-po-header
              with:
                po_number: "{{po_number}}"
            - name: create-approval
              type: call
              call: servicenow.create-approval-task
              with:
                short_description: "Invoice approval: {{invoice_id}} against PO {{po_number}}"
                amount: "{{get-invoice.total_amount}}"
                vendor: "{{get-invoice.vendor_name}}"
                po_status: "{{get-po.status}}"
  consumes:
    - type: http
      namespace: ariba
      baseUri: "https://openapi.ariba.com/api/invoice/v1"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: invoices
          path: "/invoices/{{invoice_id}}"
          inputParameters:
            - name: invoice_id
              in: path
          operations:
            - name: get-invoice
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://halliburton-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-header
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://halliburton.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: approval-tasks
          path: "/table/sysapproval_approver"
          operations:
            - name: create-approval-task
              method: POST

Reconciles SAP Ariba invoices against purchase orders and goods receipts, flagging discrepancies for finance review via Teams.

naftiko: "0.5"
info:
  label: "SAP Ariba Invoice Reconciliation"
  description: "Reconciles SAP Ariba invoices against purchase orders and goods receipts, flagging discrepancies for finance review via Teams."
  tags:
    - procurement
    - sap-ariba
    - microsoft-teams
    - accounts-payable
capability:
  exposes:
    - type: mcp
      namespace: procurement-ops
      port: 8080
      tools:
        - name: reconcile-invoices
          description: "Reconcile Ariba invoices against POs and GRs, flag discrepancies."
          inputParameters:
            - name: invoice_id
              in: body
              type: string
              description: "The Ariba invoice ID."
          steps:
            - name: get-invoice
              type: call
              call: ariba.get-invoice
              with:
                invoice_id: "{{invoice_id}}"
            - name: check-match
              type: call
              call: sap.check-three-way-match
              with:
                po_number: "{{get-invoice.po_number}}"
            - name: notify-finance
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_finance_channel_id"
                text: "Invoice {{invoice_id}} reconciliation: {{check-match.status}}"
  consumes:
    - type: http
      namespace: ariba
      baseUri: "https://openapi.ariba.com/api/procurement-reporting/v1"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: invoices
          path: "/invoices/{{invoice_id}}"
          inputParameters:
            - name: invoice_id
              in: path
          operations:
            - name: get-invoice
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://halliburton-s4.sap.com/sap/opu/odata/sap/API_SUPPLIERINVOICE_PROCESS_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: match
          path: "/A_SupplierInvoice('{{po_number}}')/to_Match"
          inputParameters:
            - name: po_number
              in: path
          operations:
            - name: check-three-way-match
              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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Retrieves a SAP Ariba purchase requisition by ID and returns approval status, requester, total amount, and line items.

naftiko: "0.5"
info:
  label: "SAP Ariba Purchase Requisition Approval"
  description: "Retrieves a SAP Ariba purchase requisition by ID and returns approval status, requester, total amount, and line items."
  tags:
    - procurement
    - sap-ariba
    - approval
capability:
  exposes:
    - type: mcp
      namespace: procurement
      port: 8080
      tools:
        - name: get-requisition-status
          description: "Look up a SAP Ariba purchase requisition. Returns approval status, requester, and total amount."
          inputParameters:
            - name: requisition_id
              in: body
              type: string
              description: "The Ariba requisition ID."
          call: ariba.get-requisition
          with:
            requisition_id: "{{requisition_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.approvalStatus"
            - name: requester
              type: string
              mapping: "$.requester.name"
            - name: total_amount
              type: number
              mapping: "$.totalAmount"
  consumes:
    - type: http
      namespace: ariba
      baseUri: "https://openapi.ariba.com/api/procurement-reporting/v1"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: requisitions
          path: "/requisitions/{{requisition_id}}"
          inputParameters:
            - name: requisition_id
              in: path
          operations:
            - name: get-requisition
              method: GET

Retrieves the status of a SAP Ariba sourcing event, returning bid count, event stage, and deadline.

naftiko: "0.5"
info:
  label: "SAP Ariba Sourcing Event Status"
  description: "Retrieves the status of a SAP Ariba sourcing event, returning bid count, event stage, and deadline."
  tags:
    - procurement
    - sap-ariba
    - sourcing
capability:
  exposes:
    - type: mcp
      namespace: procurement-sourcing
      port: 8080
      tools:
        - name: get-sourcing-event
          description: "Look up a SAP Ariba sourcing event. Returns bid count, stage, and deadline."
          inputParameters:
            - name: event_id
              in: body
              type: string
              description: "The Ariba sourcing event ID."
          call: ariba.get-sourcing-event
          with:
            event_id: "{{event_id}}"
          outputParameters:
            - name: stage
              type: string
              mapping: "$.status"
            - name: bid_count
              type: number
              mapping: "$.bidCount"
  consumes:
    - type: http
      namespace: ariba
      baseUri: "https://openapi.ariba.com/api/sourcing-reporting/v1"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: events
          path: "/sourcingEvents/{{event_id}}"
          inputParameters:
            - name: event_id
              in: path
          operations:
            - name: get-sourcing-event
              method: GET

Registers a new supplier in SAP Ariba for oilfield services, creates a ServiceNow vendor request ticket, and notifies the procurement team in Teams.

naftiko: "0.5"
info:
  label: "SAP Ariba Supplier Onboarding"
  description: "Registers a new supplier in SAP Ariba for oilfield services, creates a ServiceNow vendor request ticket, and notifies the procurement team in Teams."
  tags:
    - procurement
    - sap-ariba
    - servicenow
    - microsoft-teams
    - supplier-management
capability:
  exposes:
    - type: mcp
      namespace: supplier-onboarding
      port: 8080
      tools:
        - name: onboard-supplier
          description: "Given a supplier name, contact email, and spend category, register in SAP Ariba, create a ServiceNow vendor request, and notify the procurement team in Teams."
          inputParameters:
            - name: supplier_name
              in: body
              type: string
              description: "Legal name of the new supplier."
            - name: supplier_email
              in: body
              type: string
              description: "Primary contact email for the supplier."
            - name: spend_category
              in: body
              type: string
              description: "Ariba spend category, e.g. Oilfield Services, Drilling Equipment, Chemicals."
          steps:
            - name: register-supplier
              type: call
              call: ariba.create-supplier
              with:
                name: "{{supplier_name}}"
                email: "{{supplier_email}}"
                category: "{{spend_category}}"
            - name: create-vendor-ticket
              type: call
              call: servicenow.create-vendor-request
              with:
                short_description: "Supplier onboarding: {{supplier_name}}"
                supplier_id: "{{register-supplier.supplier_id}}"
            - name: notify-procurement
              type: call
              call: msteams.notify-procurement
              with:
                channel: "procurement-ops"
                text: "Supplier {{supplier_name}} registered (ID: {{register-supplier.supplier_id}}). SN ticket: {{create-vendor-ticket.number}}"
  consumes:
    - type: http
      namespace: ariba
      baseUri: "https://openapi.ariba.com/api/supplier/v1"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: suppliers
          path: "/suppliers"
          operations:
            - name: create-supplier
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://halliburton.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: vendor-requests
          path: "/table/u_vendor_request"
          operations:
            - name: create-vendor-request
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/procurement/channels/general/messages"
          operations:
            - name: notify-procurement
              method: POST

Retrieves submitted SAP Concur expense reports for a period, flags policy violations using Anthropic, and creates ServiceNow audit tasks for non-compliant items.

naftiko: "0.5"
info:
  label: "SAP Concur Expense Report Audit"
  description: "Retrieves submitted SAP Concur expense reports for a period, flags policy violations using Anthropic, and creates ServiceNow audit tasks for non-compliant items."
  tags:
    - finance
    - expense-management
    - sap-concur
    - anthropic
    - servicenow
    - audit
capability:
  exposes:
    - type: mcp
      namespace: expense-audit
      port: 8080
      tools:
        - name: audit-expense-reports
          description: "Given a date range, retrieve SAP Concur expense reports, analyze them with Anthropic for policy violations, and create ServiceNow audit tasks for non-compliant reports."
          inputParameters:
            - name: start_date
              in: body
              type: string
              description: "Start of the expense period in YYYY-MM-DD format."
            - name: end_date
              in: body
              type: string
              description: "End of the expense period in YYYY-MM-DD format."
          steps:
            - name: get-reports
              type: call
              call: concur.list-expense-reports
              with:
                startDate: "{{start_date}}"
                endDate: "{{end_date}}"
            - name: flag-violations
              type: call
              call: anthropic.analyze-expenses
              with:
                model: claude-opus-4-5
                prompt: "Review these Halliburton expense reports for policy violations: {{get-reports.reports}}"
            - name: create-audit-task
              type: call
              call: servicenow.create-audit-task
              with:
                short_description: "Expense audit {{start_date}} to {{end_date}}"
                description: "{{flag-violations.violations_summary}}"
  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/reportdigests"
          operations:
            - name: list-expense-reports
              method: GET
    - type: http
      namespace: anthropic
      baseUri: "https://api.anthropic.com/v1"
      authentication:
        type: apikey
        key: "x-api-key"
        value: "$secrets.anthropic_api_key"
        placement: header
      resources:
        - name: messages
          path: "/messages"
          operations:
            - name: analyze-expenses
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://halliburton.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/u_audit_task"
          operations:
            - name: create-audit-task
              method: POST

Validates a SAP Concur mileage expense claim by cross-checking reported distance against mapping API data and flags discrepancies for audit review.

naftiko: "0.5"
info:
  label: "SAP Concur Mileage Claim Validation"
  description: "Validates a SAP Concur mileage expense claim by cross-checking reported distance against mapping API data and flags discrepancies for audit review."
  tags:
    - travel
    - sap-concur
    - compliance
    - audit
capability:
  exposes:
    - type: mcp
      namespace: expense-audit
      port: 8080
      tools:
        - name: validate-mileage-claim
          description: "Given a Concur expense entry ID, validate mileage against mapping data and flag discrepancies."
          inputParameters:
            - name: entry_id
              in: body
              type: string
              description: "The Concur expense entry ID."
          steps:
            - name: get-entry
              type: call
              call: concur.get-expense-entry
              with:
                entry_id: "{{entry_id}}"
            - name: verify-distance
              type: call
              call: maps.get-distance
              with:
                origin: "{{get-entry.origin}}"
                destination: "{{get-entry.destination}}"
  consumes:
    - type: http
      namespace: concur
      baseUri: "https://us.api.concursolutions.com/api/v3.0"
      authentication:
        type: bearer
        token: "$secrets.concur_token"
      resources:
        - name: entries
          path: "/expense/entries/{{entry_id}}"
          inputParameters:
            - name: entry_id
              in: path
          operations:
            - name: get-expense-entry
              method: GET
    - type: http
      namespace: maps
      baseUri: "https://maps.googleapis.com/maps/api"
      authentication:
        type: apikey
        key: "key"
        value: "$secrets.google_maps_key"
        placement: query
      resources:
        - name: directions
          path: "/directions/json?origin={{origin}}&destination={{destination}}"
          inputParameters:
            - name: origin
              in: path
            - name: destination
              in: path
          operations:
            - name: get-distance
              method: GET

Audits SAP Concur expense reports for missing receipts above the policy threshold and alerts the finance team via Teams.

naftiko: "0.5"
info:
  label: "SAP Concur Receipt Compliance Check"
  description: "Audits SAP Concur expense reports for missing receipts above the policy threshold and alerts the finance team via Teams."
  tags:
    - travel
    - sap-concur
    - compliance
    - microsoft-teams
    - audit
capability:
  exposes:
    - type: mcp
      namespace: expense-compliance
      port: 8080
      tools:
        - name: check-receipt-compliance
          description: "Audit Concur expense reports for missing receipts and alert finance team."
          inputParameters:
            - name: report_id
              in: body
              type: string
              description: "The Concur expense report ID."
          steps:
            - name: get-report
              type: call
              call: concur.get-expense-report
              with:
                report_id: "{{report_id}}"
            - name: notify-finance
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_finance_channel_id"
                text: "Receipt Compliance: Report {{report_id}} | Missing receipts: {{get-report.missing_receipt_count}} | Total: ${{get-report.total_amount}}"
  consumes:
    - type: http
      namespace: concur
      baseUri: "https://us.api.concursolutions.com/api/v3.0"
      authentication:
        type: bearer
        token: "$secrets.concur_token"
      resources:
        - name: reports
          path: "/expense/reports/{{report_id}}"
          inputParameters:
            - name: report_id
              in: path
          operations:
            - name: get-expense-report
              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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Retrieves a SAP Concur travel request, validates it against Halliburton travel policy using Anthropic, and routes it for approval in ServiceNow.

naftiko: "0.5"
info:
  label: "SAP Concur Travel Request Approval"
  description: "Retrieves a SAP Concur travel request, validates it against Halliburton travel policy using Anthropic, and routes it for approval in ServiceNow."
  tags:
    - finance
    - travel
    - sap-concur
    - anthropic
    - servicenow
    - approval
capability:
  exposes:
    - type: mcp
      namespace: travel-ops
      port: 8080
      tools:
        - name: route-travel-approval
          description: "Given a SAP Concur travel request ID, retrieve details, validate against travel policy using Anthropic, and create a ServiceNow approval task."
          inputParameters:
            - name: request_id
              in: body
              type: string
              description: "The SAP Concur travel request ID to process."
          steps:
            - name: get-travel-request
              type: call
              call: concur.get-travel-request
              with:
                request_id: "{{request_id}}"
            - name: validate-policy
              type: call
              call: anthropic.validate-travel-policy
              with:
                model: claude-opus-4-5
                prompt: "Review this Halliburton travel request for policy compliance: {{get-travel-request.details}}"
            - name: create-approval
              type: call
              call: servicenow.create-approval
              with:
                short_description: "Travel approval: {{get-travel-request.traveler_name}} to {{get-travel-request.destination}}"
                policy_notes: "{{validate-policy.compliance_notes}}"
  consumes:
    - type: http
      namespace: concur
      baseUri: "https://www.concursolutions.com/api/v3.0"
      authentication:
        type: bearer
        token: "$secrets.concur_token"
      resources:
        - name: travel-requests
          path: "/travelrequest/requests/{{request_id}}"
          inputParameters:
            - name: request_id
              in: path
          operations:
            - name: get-travel-request
              method: GET
    - type: http
      namespace: anthropic
      baseUri: "https://api.anthropic.com/v1"
      authentication:
        type: apikey
        key: "x-api-key"
        value: "$secrets.anthropic_api_key"
        placement: header
      resources:
        - name: messages
          path: "/messages"
          operations:
            - name: validate-travel-policy
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://halliburton.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: approvals
          path: "/table/sysapproval_approver"
          operations:
            - name: create-approval
              method: POST

Retrieves budget vs actual spend for a SAP cost center, returning planned budget, actual spend, and variance.

naftiko: "0.5"
info:
  label: "SAP Cost Center Budget Check"
  description: "Retrieves budget vs actual spend for a SAP cost center, returning planned budget, actual spend, and variance."
  tags:
    - finance
    - sap
    - erp
    - budgeting
capability:
  exposes:
    - type: mcp
      namespace: finance-budget
      port: 8080
      tools:
        - name: get-budget-status
          description: "Look up budget vs actual for a SAP cost center. Returns planned budget, actual spend, and variance."
          inputParameters:
            - name: cost_center
              in: body
              type: string
              description: "The SAP cost center code."
            - name: fiscal_year
              in: body
              type: string
              description: "Fiscal year in YYYY format."
          call: sap.get-cost-center-budget
          with:
            cost_center: "{{cost_center}}"
            fiscal_year: "{{fiscal_year}}"
          outputParameters:
            - name: planned_budget
              type: number
              mapping: "$.d.PlannedAmount"
            - name: actual_spend
              type: number
              mapping: "$.d.ActualAmount"
            - name: variance
              type: number
              mapping: "$.d.VarianceAmount"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://halliburton-s4.sap.com/sap/opu/odata/sap/API_COSTCENTER_PLAN_ACTUAL_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: cost-centers
          path: "/A_CostCenterBudget(CostCenter='{{cost_center}}',FiscalYear='{{fiscal_year}}')"
          inputParameters:
            - name: cost_center
              in: path
            - name: fiscal_year
              in: path
          operations:
            - name: get-cost-center-budget
              method: GET

Retrieves the status of an outbound delivery from SAP including shipping point, goods issue date, and carrier tracking information.

naftiko: "0.5"
info:
  label: "SAP Delivery Note Tracking"
  description: "Retrieves the status of an outbound delivery from SAP including shipping point, goods issue date, and carrier tracking information."
  tags:
    - logistics
    - sap
    - erp
    - shipping
capability:
  exposes:
    - type: mcp
      namespace: logistics
      port: 8080
      tools:
        - name: get-delivery-status
          description: "Look up a SAP outbound delivery. Returns shipping point, goods issue date, and tracking."
          inputParameters:
            - name: delivery_number
              in: body
              type: string
              description: "The SAP delivery document number."
          call: sap.get-delivery
          with:
            delivery_number: "{{delivery_number}}"
          outputParameters:
            - name: shipping_point
              type: string
              mapping: "$.d.ShippingPoint"
            - name: goods_issue_date
              type: string
              mapping: "$.d.GoodsMovementDate"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://halliburton-s4.sap.com/sap/opu/odata/sap/API_OUTBOUND_DELIVERY_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: deliveries
          path: "/A_OutbDeliveryHeader('{{delivery_number}}')"
          inputParameters:
            - name: delivery_number
              in: path
          operations:
            - name: get-delivery
              method: GET

Creates a plant maintenance work order in SAP PM for field equipment and notifies the field maintenance crew via Microsoft Teams.

naftiko: "0.5"
info:
  label: "SAP Equipment Maintenance Order Create"
  description: "Creates a plant maintenance work order in SAP PM for field equipment and notifies the field maintenance crew via Microsoft Teams."
  tags:
    - field-operations
    - sap
    - erp
    - maintenance
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: field-maintenance
      port: 8080
      tools:
        - name: create-maintenance-order
          description: "Create a SAP PM work order for field equipment and notify the maintenance team in Teams."
          inputParameters:
            - name: equipment_id
              in: body
              type: string
              description: "The SAP equipment number."
            - name: fault_description
              in: body
              type: string
              description: "Description of the equipment fault."
          steps:
            - name: create-order
              type: call
              call: sap.create-maintenance-order
              with:
                equipment: "{{equipment_id}}"
                description: "{{fault_description}}"
                order_type: "PM02"
            - name: notify-crew
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_field_maint_channel_id"
                text: "Maintenance Order: {{create-order.order_number}} | Equipment: {{equipment_id}} | {{fault_description}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://halliburton-s4.sap.com/sap/opu/odata/sap/API_MAINTENANCEORDER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: orders
          path: "/MaintenanceOrder"
          operations:
            - name: create-maintenance-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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Checks the status of SAP financial posting periods for a company code and generates a close readiness summary for the finance team.

naftiko: "0.5"
info:
  label: "SAP Financial Period Close Checklist"
  description: "Checks the status of SAP financial posting periods for a company code and generates a close readiness summary for the finance team."
  tags:
    - finance
    - sap
    - erp
    - accounting
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: finance-close
      port: 8080
      tools:
        - name: check-period-close
          description: "Check SAP posting period status and post close readiness summary to finance channel."
          inputParameters:
            - name: company_code
              in: body
              type: string
              description: "The SAP company code."
            - name: fiscal_year
              in: body
              type: string
              description: "Fiscal year."
            - name: period
              in: body
              type: string
              description: "Posting period number."
          steps:
            - name: check-period
              type: call
              call: sap.get-posting-period
              with:
                company_code: "{{company_code}}"
                fiscal_year: "{{fiscal_year}}"
                period: "{{period}}"
            - name: notify-finance
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_finance_channel_id"
                text: "Period Close: Company {{company_code}} | FY{{fiscal_year}} Period {{period}} | Status: {{check-period.status}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://halliburton-s4.sap.com/sap/opu/odata/sap/API_FINANCIALPERIOD_CLOSE_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: periods
          path: "/A_FinancialPeriodClose(CompanyCode='{{company_code}}',FiscalYear='{{fiscal_year}}',Period='{{period}}')"
          inputParameters:
            - name: company_code
              in: path
            - name: fiscal_year
              in: path
            - name: period
              in: path
          operations:
            - name: get-posting-period
              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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Posts a goods receipt against a SAP purchase order for field materials delivery, updating inventory records.

naftiko: "0.5"
info:
  label: "SAP Goods Receipt Posting"
  description: "Posts a goods receipt against a SAP purchase order for field materials delivery, updating inventory records."
  tags:
    - supply-chain
    - sap
    - erp
    - inventory
capability:
  exposes:
    - type: mcp
      namespace: supply-chain
      port: 8080
      tools:
        - name: post-goods-receipt
          description: "Post a goods receipt in SAP against a purchase order. Updates inventory for field materials."
          inputParameters:
            - name: po_number
              in: body
              type: string
              description: "The SAP purchase order number."
            - name: plant
              in: body
              type: string
              description: "The receiving plant code."
            - name: quantity
              in: body
              type: number
              description: "Quantity received."
          call: sap.post-goods-receipt
          with:
            po_number: "{{po_number}}"
            plant: "{{plant}}"
            quantity: "{{quantity}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://halliburton-s4.sap.com/sap/opu/odata/sap/API_MATERIAL_DOCUMENT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: material-documents
          path: "/A_MaterialDocumentHeader"
          operations:
            - name: post-goods-receipt
              method: POST

Retrieves invoice payment status from SAP including approval state, payment date, and clearing document number.

naftiko: "0.5"
info:
  label: "SAP Invoice Payment Status"
  description: "Retrieves invoice payment status from SAP including approval state, payment date, and clearing document number."
  tags:
    - finance
    - sap
    - erp
    - accounts-payable
capability:
  exposes:
    - type: mcp
      namespace: finance-ap
      port: 8080
      tools:
        - name: get-invoice-status
          description: "Look up SAP invoice payment status. Returns approval state, payment date, and clearing doc."
          inputParameters:
            - name: invoice_number
              in: body
              type: string
              description: "The SAP invoice number."
          call: sap.get-invoice
          with:
            invoice_number: "{{invoice_number}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.d.PaymentStatus"
            - name: payment_date
              type: string
              mapping: "$.d.PaymentDate"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://halliburton-s4.sap.com/sap/opu/odata/sap/API_SUPPLIERINVOICE_PROCESS_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: invoices
          path: "/A_SupplierInvoice('{{invoice_number}}')"
          inputParameters:
            - name: invoice_number
              in: path
          operations:
            - name: get-invoice
              method: GET

Retrieves material master data from SAP S/4HANA including description, material group, and unit of measure for field supply chain.

naftiko: "0.5"
info:
  label: "SAP Material Master Lookup"
  description: "Retrieves material master data from SAP S/4HANA including description, material group, and unit of measure for field supply chain."
  tags:
    - supply-chain
    - sap
    - erp
    - materials
capability:
  exposes:
    - type: mcp
      namespace: supply-chain
      port: 8080
      tools:
        - name: get-material-master
          description: "Look up a material in SAP. Returns description, material group, and base unit."
          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.MaterialName"
            - name: material_group
              type: string
              mapping: "$.d.MaterialGroup"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://halliburton-s4.sap.com/sap/opu/odata/sap/API_PRODUCT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: materials
          path: "/A_Product('{{material_number}}')"
          inputParameters:
            - name: material_number
              in: path
          operations:
            - name: get-material
              method: GET

Queries SAP S/4HANA for current stock levels of drilling materials across plants, returning available quantity and plant location.

naftiko: "0.5"
info:
  label: "SAP Material Stock Level Check"
  description: "Queries SAP S/4HANA for current stock levels of drilling materials across plants, returning available quantity and plant location."
  tags:
    - supply-chain
    - sap
    - erp
    - inventory
capability:
  exposes:
    - type: mcp
      namespace: supply-chain
      port: 8080
      tools:
        - name: get-stock-level
          description: "Check current stock levels for a material in SAP. Returns available quantity, unit, and plant. Use for drilling material planning."
          inputParameters:
            - name: material_number
              in: body
              type: string
              description: "The SAP material number."
          call: sap.get-material-stock
          with:
            material_number: "{{material_number}}"
          outputParameters:
            - name: available_quantity
              type: number
              mapping: "$.d.MatlWrhsStkQtyInMatlBaseUnit"
            - name: plant
              type: string
              mapping: "$.d.Plant"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://halliburton-s4.sap.com/sap/opu/odata/sap/API_MATERIAL_STOCK_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: material-stock
          path: "/A_MatlStkInAcctMod(Material='{{material_number}}')"
          inputParameters:
            - name: material_number
              in: path
          operations:
            - name: get-material-stock
              method: GET

Retrieves a SAP PM work order by number, returning status, equipment, description, and planned completion date.

naftiko: "0.5"
info:
  label: "SAP Plant Maintenance Work Order Lookup"
  description: "Retrieves a SAP PM work order by number, returning status, equipment, description, and planned completion date."
  tags:
    - field-operations
    - sap
    - erp
    - maintenance
capability:
  exposes:
    - type: mcp
      namespace: field-maintenance
      port: 8080
      tools:
        - name: get-work-order
          description: "Look up a SAP PM work order. Returns status, equipment, and planned completion."
          inputParameters:
            - name: order_number
              in: body
              type: string
              description: "The SAP maintenance order number."
          call: sap.get-maintenance-order
          with:
            order_number: "{{order_number}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.d.OrderStatus"
            - name: equipment
              type: string
              mapping: "$.d.Equipment"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://halliburton-s4.sap.com/sap/opu/odata/sap/API_MAINTENANCEORDER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: orders
          path: "/MaintenanceOrder('{{order_number}}')"
          inputParameters:
            - name: order_number
              in: path
          operations:
            - name: get-maintenance-order
              method: GET

Retrieves the status of a SAP production order for manufacturing equipment, including planned and confirmed quantities.

naftiko: "0.5"
info:
  label: "SAP Production Order Status"
  description: "Retrieves the status of a SAP production order for manufacturing equipment, including planned and confirmed quantities."
  tags:
    - manufacturing
    - sap
    - erp
    - production
capability:
  exposes:
    - type: mcp
      namespace: manufacturing
      port: 8080
      tools:
        - name: get-production-order
          description: "Look up a SAP production order. Returns planned quantity, confirmed quantity, and status."
          inputParameters:
            - name: order_number
              in: body
              type: string
              description: "The SAP production order number."
          call: sap.get-production-order
          with:
            order_number: "{{order_number}}"
          outputParameters:
            - name: planned_qty
              type: number
              mapping: "$.d.TotalQuantity"
            - name: status
              type: string
              mapping: "$.d.ManufacturingOrderStatus"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://halliburton-s4.sap.com/sap/opu/odata/sap/API_PRODUCTION_ORDER_2_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: production-orders
          path: "/A_ProductionOrder_2('{{order_number}}')"
          inputParameters:
            - name: order_number
              in: path
          operations:
            - name: get-production-order
              method: GET

Retrieves a quality inspection lot result from SAP QM, returning inspection result, usage decision, and defect count.

naftiko: "0.5"
info:
  label: "SAP Quality Inspection Result"
  description: "Retrieves a quality inspection lot result from SAP QM, returning inspection result, usage decision, and defect count."
  tags:
    - manufacturing
    - sap
    - erp
    - quality
capability:
  exposes:
    - type: mcp
      namespace: quality-mgmt
      port: 8080
      tools:
        - name: get-inspection-result
          description: "Look up a SAP quality inspection lot. Returns result, usage decision, and defect count."
          inputParameters:
            - name: inspection_lot
              in: body
              type: string
              description: "The SAP inspection lot number."
          call: sap.get-inspection-lot
          with:
            lot_number: "{{inspection_lot}}"
          outputParameters:
            - name: result
              type: string
              mapping: "$.d.InspectionResult"
            - name: defect_count
              type: number
              mapping: "$.d.NumberOfDefects"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://halliburton-s4.sap.com/sap/opu/odata/sap/API_INSPECTIONLOT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: inspection-lots
          path: "/A_InspectionLot('{{lot_number}}')"
          inputParameters:
            - name: lot_number
              in: path
          operations:
            - name: get-inspection-lot
              method: GET

Looks up an SAP S/4HANA purchase order by number and returns header status, vendor name, and total value for procurement tracking.

naftiko: "0.5"
info:
  label: "SAP S/4HANA Purchase Order Lookup"
  description: "Looks up an SAP S/4HANA purchase order by number and returns header status, vendor name, and total value for procurement tracking."
  tags:
    - finance
    - procurement
    - sap
    - erp
capability:
  exposes:
    - type: mcp
      namespace: erp-finance
      port: 8080
      tools:
        - name: get-purchase-order
          description: "Given an SAP purchase order number, return the header status, vendor name, total amount, and currency from SAP S/4HANA. Use for procurement status checks and approvals."
          inputParameters:
            - name: po_number
              in: body
              type: string
              description: "The SAP purchase order number to look up, e.g. 4500001234."
          call: sap.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
      baseUri: "https://halliburton-s4.sap.com/sap/opu/odata/sap/MM_PUR_PO_MAINT_V2_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: purchase-orders
          path: "/A_PurchaseOrder('{{po_number}}')"
          inputParameters:
            - name: po_number
              in: path
          operations:
            - name: get-po
              method: GET

Retrieves the status of a SAP transport request including release status, target system, and owner.

naftiko: "0.5"
info:
  label: "SAP Transport Request Status"
  description: "Retrieves the status of a SAP transport request including release status, target system, and owner."
  tags:
    - devops
    - sap
    - erp
    - transport-management
capability:
  exposes:
    - type: mcp
      namespace: sap-basis
      port: 8080
      tools:
        - name: get-transport-status
          description: "Look up a SAP transport request. Returns release status, target, and owner."
          inputParameters:
            - name: transport_number
              in: body
              type: string
              description: "The SAP transport request number."
          call: sap.get-transport
          with:
            transport: "{{transport_number}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.d.Status"
            - name: owner
              type: string
              mapping: "$.d.Owner"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://halliburton-s4.sap.com/sap/opu/odata/sap/TRANSPORT_REQUEST_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: transports
          path: "/TransportRequests('{{transport}}')"
          inputParameters:
            - name: transport
              in: path
          operations:
            - name: get-transport
              method: GET

Retrieves vendor master data from SAP S/4HANA including company name, payment terms, and tax classification for procurement verification.

naftiko: "0.5"
info:
  label: "SAP Vendor Master Lookup"
  description: "Retrieves vendor master data from SAP S/4HANA including company name, payment terms, and tax classification for procurement verification."
  tags:
    - finance
    - procurement
    - sap
    - erp
capability:
  exposes:
    - type: mcp
      namespace: erp-procurement
      port: 8080
      tools:
        - name: get-vendor-master
          description: "Look up a vendor in SAP by vendor number. Returns company name, payment terms, and tax classification."
          inputParameters:
            - name: vendor_number
              in: body
              type: string
              description: "The SAP vendor number."
          call: sap.get-vendor
          with:
            vendor_number: "{{vendor_number}}"
          outputParameters:
            - name: company_name
              type: string
              mapping: "$.d.CompanyName"
            - name: payment_terms
              type: string
              mapping: "$.d.PaymentTerms"
            - name: tax_number
              type: string
              mapping: "$.d.TaxNumber1"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://halliburton-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: vendors
          path: "/A_Supplier('{{vendor_number}}')"
          inputParameters:
            - name: vendor_number
              in: path
          operations:
            - name: get-vendor
              method: GET

Checks the status of a SAP vendor payment run, returning processed count, total amount, and any failed payments.

naftiko: "0.5"
info:
  label: "SAP Vendor Payment Run Status"
  description: "Checks the status of a SAP vendor payment run, returning processed count, total amount, and any failed payments."
  tags:
    - finance
    - sap
    - erp
    - accounts-payable
capability:
  exposes:
    - type: mcp
      namespace: finance-ap
      port: 8080
      tools:
        - name: get-payment-run
          description: "Check SAP vendor payment run status. Returns processed count, total, and failures."
          inputParameters:
            - name: run_id
              in: body
              type: string
              description: "The SAP payment run identifier."
          call: sap.get-payment-run
          with:
            run_id: "{{run_id}}"
          outputParameters:
            - name: processed_count
              type: number
              mapping: "$.d.ProcessedCount"
            - name: total_amount
              type: number
              mapping: "$.d.TotalAmount"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://halliburton-s4.sap.com/sap/opu/odata/sap/API_PAYMENTRUN_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: payment-runs
          path: "/A_PaymentRun('{{run_id}}')"
          inputParameters:
            - name: run_id
              in: path
          operations:
            - name: get-payment-run
              method: GET

Triggers a cycle count workflow in SAP for warehouse inventory and notifies the warehouse team of any discrepancies found.

naftiko: "0.5"
info:
  label: "SAP Warehouse Inventory Cycle Count"
  description: "Triggers a cycle count workflow in SAP for warehouse inventory and notifies the warehouse team of any discrepancies found."
  tags:
    - supply-chain
    - sap
    - microsoft-teams
    - inventory
    - warehouse
capability:
  exposes:
    - type: mcp
      namespace: supply-chain-ops
      port: 8080
      tools:
        - name: trigger-cycle-count
          description: "Trigger a SAP cycle count for a storage location and notify the warehouse team."
          inputParameters:
            - name: plant
              in: body
              type: string
              description: "The SAP plant code."
            - name: storage_location
              in: body
              type: string
              description: "The storage location code."
          steps:
            - name: create-count
              type: call
              call: sap.create-physical-inventory
              with:
                plant: "{{plant}}"
                storage_location: "{{storage_location}}"
            - name: notify-warehouse
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_warehouse_channel_id"
                text: "Cycle count initiated: Plant {{plant}} | Location: {{storage_location}} | Doc: {{create-count.document_number}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://halliburton-s4.sap.com/sap/opu/odata/sap/API_PHYSICAL_INVENTORY_DOC_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: physical-inventory
          path: "/A_PhysInventoryDocHeader"
          operations:
            - name: create-physical-inventory
              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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Initiates the asset retirement process in ServiceNow CMDB, updates the asset status, and notifies the IT finance team via Teams.

naftiko: "0.5"
info:
  label: "ServiceNow Asset Retirement Workflow"
  description: "Initiates the asset retirement process in ServiceNow CMDB, updates the asset status, and notifies the IT finance team via Teams."
  tags:
    - it-ops
    - servicenow
    - asset-management
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: it-assets
      port: 8080
      tools:
        - name: retire-asset
          description: "Given a ServiceNow asset tag, initiate retirement and notify IT finance."
          inputParameters:
            - name: asset_tag
              in: body
              type: string
              description: "The ServiceNow asset tag."
          steps:
            - name: update-asset
              type: call
              call: servicenow.update-ci
              with:
                asset_tag: "{{asset_tag}}"
                status: "retired"
            - name: notify-finance
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_it_finance_channel_id"
                text: "Asset Retired: {{asset_tag}} | Updated in ServiceNow CMDB"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://halliburton.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: cmdb
          path: "/table/cmdb_ci/{{asset_tag}}"
          inputParameters:
            - name: asset_tag
              in: path
          operations:
            - name: update-ci
              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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Submits a ServiceNow change request for drilling system modifications, routes it to the CAB for approval, and notifies stakeholders in Microsoft Teams.

naftiko: "0.5"
info:
  label: "ServiceNow Change Management for Drilling Operations"
  description: "Submits a ServiceNow change request for drilling system modifications, routes it to the CAB for approval, and notifies stakeholders in Microsoft Teams."
  tags:
    - itsm
    - change-management
    - servicenow
    - microsoft-teams
    - drilling-operations
capability:
  exposes:
    - type: mcp
      namespace: change-mgmt
      port: 8080
      tools:
        - name: submit-drilling-change-request
          description: "Given change details for a drilling system modification, create a ServiceNow change request, assign to the drilling CAB group, and notify the approver in Teams."
          inputParameters:
            - name: short_description
              in: body
              type: string
              description: "Description of the drilling system change being requested."
            - name: change_type
              in: body
              type: string
              description: "ServiceNow change type: normal, standard, or emergency."
            - name: risk_level
              in: body
              type: string
              description: "Risk level of the change: low, medium, or high."
            - name: approver_email
              in: body
              type: string
              description: "Email of the primary change approver."
          steps:
            - name: create-change
              type: call
              call: servicenow.create-change-request
              with:
                short_description: "{{short_description}}"
                type: "{{change_type}}"
                risk: "{{risk_level}}"
                assignment_group: "Drilling_CAB"
            - name: notify-approver
              type: call
              call: msteams.notify-approver
              with:
                recipient: "{{approver_email}}"
                text: "Change request {{create-change.number}} pending your approval: {{short_description}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://halliburton.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-request
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient}}/sendMail"
          inputParameters:
            - name: recipient
              in: path
          operations:
            - name: notify-approver
              method: POST

Retrieves a ServiceNow change request and returns its approval status, risk level, and implementation window.

naftiko: "0.5"
info:
  label: "ServiceNow Change Request Approval Check"
  description: "Retrieves a ServiceNow change request and returns its approval status, risk level, and implementation window."
  tags:
    - it-ops
    - servicenow
    - change-management
capability:
  exposes:
    - type: mcp
      namespace: it-change
      port: 8080
      tools:
        - name: get-change-approval
          description: "Look up a ServiceNow change request. Returns approval status, risk level, and window."
          inputParameters:
            - name: change_number
              in: body
              type: string
              description: "The ServiceNow change request number."
          call: servicenow.get-change
          with:
            change_number: "{{change_number}}"
          outputParameters:
            - name: approval_status
              type: string
              mapping: "$.result.approval"
            - name: risk
              type: string
              mapping: "$.result.risk"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://halliburton.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: changes
          path: "/table/change_request/{{change_number}}"
          inputParameters:
            - name: change_number
              in: path
          operations:
            - name: get-change
              method: GET

Retrieves a ServiceNow CMDB configuration item by asset tag, returning serial number, assigned user, location, and lifecycle status.

naftiko: "0.5"
info:
  label: "ServiceNow CMDB Asset Lookup"
  description: "Retrieves a ServiceNow CMDB configuration item by asset tag, returning serial number, assigned user, location, and lifecycle status."
  tags:
    - it-ops
    - servicenow
    - asset-management
capability:
  exposes:
    - type: mcp
      namespace: it-assets
      port: 8080
      tools:
        - name: get-asset
          description: "Look up a ServiceNow CMDB asset by tag. Returns serial number, assigned user, and location."
          inputParameters:
            - name: asset_tag
              in: body
              type: string
              description: "The asset tag or CI name."
          call: servicenow.get-ci
          with:
            asset_tag: "{{asset_tag}}"
          outputParameters:
            - name: serial_number
              type: string
              mapping: "$.result.serial_number"
            - name: assigned_to
              type: string
              mapping: "$.result.assigned_to.display_value"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://halliburton.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: cmdb
          path: "/table/cmdb_ci?sysparm_query=asset_tag={{asset_tag}}"
          inputParameters:
            - name: asset_tag
              in: path
          operations:
            - name: get-ci
              method: GET

Retrieves a ServiceNow incident by number and returns its priority, state, assigned group, and short description.

naftiko: "0.5"
info:
  label: "ServiceNow Incident Lookup"
  description: "Retrieves a ServiceNow incident by number and returns its priority, state, assigned group, and short description."
  tags:
    - it-ops
    - servicenow
    - incident-management
capability:
  exposes:
    - type: mcp
      namespace: it-ops
      port: 8080
      tools:
        - name: get-incident
          description: "Look up a ServiceNow incident by number. Returns priority, state, assigned group, and description."
          inputParameters:
            - name: incident_number
              in: body
              type: string
              description: "The ServiceNow incident number."
          call: servicenow.get-incident
          with:
            incident_number: "{{incident_number}}"
          outputParameters:
            - name: priority
              type: string
              mapping: "$.result.priority"
            - name: state
              type: string
              mapping: "$.result.state"
            - name: assigned_group
              type: string
              mapping: "$.result.assignment_group.display_value"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://halliburton.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident/{{incident_number}}"
          inputParameters:
            - name: incident_number
              in: path
          operations:
            - name: get-incident
              method: GET

Searches the ServiceNow knowledge base for articles matching a query, returning article title, number, and snippet.

naftiko: "0.5"
info:
  label: "ServiceNow Knowledge Article Search"
  description: "Searches the ServiceNow knowledge base for articles matching a query, returning article title, number, and snippet."
  tags:
    - it-ops
    - servicenow
    - knowledge-management
capability:
  exposes:
    - type: mcp
      namespace: it-selfservice
      port: 8080
      tools:
        - name: search-knowledge-base
          description: "Search ServiceNow knowledge base by keyword. Returns article title, number, and snippet."
          inputParameters:
            - name: query
              in: body
              type: string
              description: "Search keyword or phrase."
          call: servicenow.search-kb
          with:
            query: "{{query}}"
          outputParameters:
            - name: articles
              type: array
              mapping: "$.result"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://halliburton.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: knowledge
          path: "/table/kb_knowledge?sysparm_query=short_descriptionLIKE{{query}}&sysparm_limit=10"
          inputParameters:
            - name: query
              in: path
          operations:
            - name: search-kb
              method: GET

When a P1 incident is created in ServiceNow, pages the on-call engineer via PagerDuty and posts incident details to the incident bridge Teams channel.

naftiko: "0.5"
info:
  label: "ServiceNow Major Incident Bridge Launcher"
  description: "When a P1 incident is created in ServiceNow, pages the on-call engineer via PagerDuty and posts incident details to the incident bridge Teams channel."
  tags:
    - it-ops
    - incident-management
    - servicenow
    - pagerduty
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: incident-response
      port: 8080
      tools:
        - name: launch-incident-bridge
          description: "Given a ServiceNow P1 incident, page on-call via PagerDuty and create a Teams bridge."
          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: page-oncall
              type: call
              call: pagerduty.create-incident
              with:
                service_id: "{{get-incident.service_id}}"
                title: "P1: {{get-incident.short_description}}"
            - name: post-bridge
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_incident_channel_id"
                text: "P1 Bridge: {{incident_number}} | {{get-incident.short_description}} | PagerDuty: {{page-oncall.incident_key}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://halliburton.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident/{{incident_number}}"
          inputParameters:
            - name: incident_number
              in: path
          operations:
            - name: get-incident
              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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

On a critical Datadog infrastructure alert, creates a ServiceNow P1 incident, pages the on-call team via PagerDuty, and posts to the IT ops Teams channel.

naftiko: "0.5"
info:
  label: "ServiceNow P1 Incident Response with PagerDuty"
  description: "On a critical Datadog infrastructure alert, creates a ServiceNow P1 incident, pages the on-call team via PagerDuty, and posts to the IT ops Teams channel."
  tags:
    - itsm
    - incident-response
    - datadog
    - servicenow
    - pagerduty
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: itsm-ops
      port: 8080
      tools:
        - name: handle-critical-alert
          description: "Given a Datadog alert ID and monitor name, create a ServiceNow P1 incident, trigger PagerDuty escalation, and notify the IT ops Teams channel."
          inputParameters:
            - name: alert_id
              in: body
              type: string
              description: "The Datadog alert ID triggering the P1 incident."
            - name: monitor_name
              in: body
              type: string
              description: "The Datadog monitor name that fired."
          steps:
            - name: create-p1
              type: call
              call: servicenow.create-p1-incident
              with:
                short_description: "P1 Alert: {{monitor_name}}"
                impact: "1"
                urgency: "1"
            - name: page-oncall
              type: call
              call: pagerduty.create-incident
              with:
                title: "P1: {{monitor_name}}"
                service_id: "$secrets.pagerduty_service_id"
                body: "ServiceNow: {{create-p1.number}}"
            - name: notify-ops
              type: call
              call: msteams.post-p1-alert
              with:
                channel: "it-ops-p1"
                text: "P1 Incident: {{monitor_name}} | SN: {{create-p1.number}} | PD: {{page-oncall.id}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://halliburton.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-p1-incident
              method: POST
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.pagerduty_token"
        placement: header
      resources:
        - name: incidents
          path: "/incidents"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/it-ops/channels/p1/messages"
          operations:
            - name: post-p1-alert
              method: POST

Archives a daily drilling report to SharePoint, creating a folder structure by well and date, and notifies the operations team.

naftiko: "0.5"
info:
  label: "SharePoint Drilling Report Archive"
  description: "Archives a daily drilling report to SharePoint, creating a folder structure by well and date, and notifies the operations team."
  tags:
    - collaboration
    - sharepoint
    - drilling
    - field-operations
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: field-docs
      port: 8080
      tools:
        - name: archive-drilling-report
          description: "Given a well ID and report date, create a SharePoint folder and archive the drilling report, then notify ops team."
          inputParameters:
            - name: well_id
              in: body
              type: string
              description: "The well identifier."
            - name: report_date
              in: body
              type: string
              description: "Report date in YYYY-MM-DD format."
          steps:
            - name: create-folder
              type: call
              call: sharepoint.create-folder
              with:
                site_id: "$secrets.sharepoint_drilling_site_id"
                folder_path: "DrillingReports/{{well_id}}/{{report_date}}"
            - name: notify-ops
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_drilling_ops_channel_id"
                text: "Drilling report archived: Well {{well_id}} | Date: {{report_date}} | Folder: {{create-folder.web_url}}"
  consumes:
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: drive-items
          path: "/{{site_id}}/drive/root:/{{folder_path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
          operations:
            - name: create-folder
              method: PUT
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Searches the HSE SharePoint site for policy documents matching a keyword, returning document title, version, and download link.

naftiko: "0.5"
info:
  label: "SharePoint HSE Policy Document Lookup"
  description: "Searches the HSE SharePoint site for policy documents matching a keyword, returning document title, version, and download link."
  tags:
    - hse
    - sharepoint
    - document-management
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: hse-docs
      port: 8080
      tools:
        - name: search-hse-policies
          description: "Search HSE SharePoint site for policy documents by keyword. Returns title, version, and link."
          inputParameters:
            - name: query
              in: body
              type: string
              description: "Search keyword or phrase."
          call: sharepoint.search-hse
          with:
            query: "{{query}}"
          outputParameters:
            - name: results
              type: array
              mapping: "$.value"
  consumes:
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: search
          path: "/$secrets.sharepoint_hse_site_id/drive/root/search(q='{{query}}')"
          inputParameters:
            - name: query
              in: path
          operations:
            - name: search-hse
              method: GET

Extracts well completion data from the operations database and pushes it to a Power BI dataset for operational analytics and reporting.

naftiko: "0.5"
info:
  label: "Well Completion Report to Power BI"
  description: "Extracts well completion data from the operations database and pushes it to a Power BI dataset for operational analytics and reporting."
  tags:
    - field-operations
    - power-bi
    - analytics
    - drilling
capability:
  exposes:
    - type: mcp
      namespace: field-analytics
      port: 8080
      tools:
        - name: sync-completion-to-powerbi
          description: "Given a well ID, extract completion data and push to Power BI for executive dashboard reporting."
          inputParameters:
            - name: well_id
              in: body
              type: string
              description: "The well identifier."
          steps:
            - name: get-completion-data
              type: call
              call: ops-db.get-well-completion
              with:
                well_id: "{{well_id}}"
            - name: push-to-powerbi
              type: call
              call: powerbi.push-rows
              with:
                dataset_id: "$secrets.powerbi_wells_dataset_id"
                table_name: "CompletionData"
                rows: "{{get-completion-data.records}}"
  consumes:
    - type: http
      namespace: ops-db
      baseUri: "https://halliburton-ops.azurewebsites.net/api/v1"
      authentication:
        type: bearer
        token: "$secrets.ops_db_token"
      resources:
        - name: completions
          path: "/wells/{{well_id}}/completion"
          inputParameters:
            - name: well_id
              in: path
          operations:
            - name: get-well-completion
              method: GET
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: push-datasets
          path: "/datasets/{{dataset_id}}/tables/{{table_name}}/rows"
          inputParameters:
            - name: dataset_id
              in: path
            - name: table_name
              in: path
          operations:
            - name: push-rows
              method: POST

When drilling telemetry exceeds threshold parameters, retrieves sensor data, creates a ServiceNow incident, and alerts the well operations team via Teams.

naftiko: "0.5"
info:
  label: "Well Operations Telemetry Anomaly Alert"
  description: "When drilling telemetry exceeds threshold parameters, retrieves sensor data, creates a ServiceNow incident, and alerts the well operations team via Teams."
  tags:
    - field-operations
    - drilling
    - servicenow
    - microsoft-teams
    - iot
capability:
  exposes:
    - type: mcp
      namespace: well-ops
      port: 8080
      tools:
        - name: alert-telemetry-anomaly
          description: "Given a well ID and sensor type, retrieve anomalous telemetry data, create a ServiceNow incident, and notify the operations team."
          inputParameters:
            - name: well_id
              in: body
              type: string
              description: "The well identifier."
            - name: sensor_type
              in: body
              type: string
              description: "Sensor type, e.g. pressure, temperature, torque."
          steps:
            - name: get-telemetry
              type: call
              call: iot-platform.get-sensor-data
              with:
                well_id: "{{well_id}}"
                sensor: "{{sensor_type}}"
            - name: create-incident
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Well telemetry anomaly: {{well_id}} — {{sensor_type}}"
                description: "Value: {{get-telemetry.current_value}} | Threshold: {{get-telemetry.threshold}} | Well: {{well_id}}"
                category: "field_operations"
            - name: notify-ops
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_well_ops_channel_id"
                text: "Telemetry Alert: Well {{well_id}} | {{sensor_type}}: {{get-telemetry.current_value}} (threshold: {{get-telemetry.threshold}}) | Incident: {{create-incident.number}}"
  consumes:
    - type: http
      namespace: iot-platform
      baseUri: "https://halliburton-iot.azure-devices.net/api/v1"
      authentication:
        type: bearer
        token: "$secrets.iot_platform_token"
      resources:
        - name: sensors
          path: "/wells/{{well_id}}/sensors/{{sensor}}/latest"
          inputParameters:
            - name: well_id
              in: path
            - name: sensor
              in: path
          operations:
            - name: get-sensor-data
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://halliburton.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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Triggers a well site safety inspection workflow by creating a ServiceNow task, assigning an HSE inspector in Workday, and notifying the site team via Teams.

naftiko: "0.5"
info:
  label: "Well Site Safety Inspection Workflow"
  description: "Triggers a well site safety inspection workflow by creating a ServiceNow task, assigning an HSE inspector in Workday, and notifying the site team via Teams."
  tags:
    - hse
    - safety
    - servicenow
    - workday
    - microsoft-teams
    - field-operations
capability:
  exposes:
    - type: mcp
      namespace: hse-ops
      port: 8080
      tools:
        - name: initiate-safety-inspection
          description: "Create a safety inspection task, assign an HSE inspector, and notify the well site team."
          inputParameters:
            - name: well_site
              in: body
              type: string
              description: "The well site identifier."
            - name: inspection_type
              in: body
              type: string
              description: "Type of safety inspection."
          steps:
            - name: create-task
              type: call
              call: servicenow.create-task
              with:
                short_description: "Safety inspection: {{inspection_type}} at {{well_site}}"
                category: "hse"
                assigned_group: "HSE_Inspectors"
            - name: notify-site
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_field_ops_channel_id"
                text: "Safety Inspection Scheduled: {{well_site}} | Type: {{inspection_type}} | Task: {{create-task.number}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://halliburton.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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Checks Workday for employees with incomplete benefits enrollment and sends reminders via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Workday Benefits Enrollment Reminder"
  description: "Checks Workday for employees with incomplete benefits enrollment and sends reminders via Microsoft Teams."
  tags:
    - hr
    - workday
    - benefits
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-benefits
      port: 8080
      tools:
        - name: send-enrollment-reminders
          description: "Query Workday for incomplete benefits enrollment and send Teams reminders."
          inputParameters:
            - name: enrollment_event_id
              in: body
              type: string
              description: "The Workday benefits enrollment event ID."
          steps:
            - name: get-incomplete
              type: call
              call: workday.get-incomplete-enrollments
              with:
                event_id: "{{enrollment_event_id}}"
            - name: notify-hr
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_hr_channel_id"
                text: "Benefits Enrollment: {{get-incomplete.count}} employees pending | Deadline: {{get-incomplete.deadline}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: benefits
          path: "/benefitsEnrollment/{{event_id}}/incomplete"
          inputParameters:
            - name: event_id
              in: path
          operations:
            - name: get-incomplete-enrollments
              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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Retrieves a Workday employee compensation summary including base pay, bonus target, and total compensation.

naftiko: "0.5"
info:
  label: "Workday Compensation Summary"
  description: "Retrieves a Workday employee compensation summary including base pay, bonus target, and total compensation."
  tags:
    - hr
    - compensation
    - workday
capability:
  exposes:
    - type: mcp
      namespace: hr-compensation
      port: 8080
      tools:
        - name: get-compensation
          description: "Look up employee compensation in Workday by worker ID. Returns base pay, bonus target, and total compensation."
          inputParameters:
            - name: worker_id
              in: body
              type: string
              description: "The Workday worker ID."
          call: workday.get-compensation
          with:
            worker_id: "{{worker_id}}"
          outputParameters:
            - name: base_pay
              type: number
              mapping: "$.compensation.basePay"
            - name: total_comp
              type: number
              mapping: "$.compensation.totalCompensation"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: compensation
          path: "/workers/{{worker_id}}/compensation"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-compensation
              method: GET

When an employee transfers departments in Workday, updates their Okta group memberships and notifies the new manager via Teams.

naftiko: "0.5"
info:
  label: "Workday Employee Transfer Provisioning"
  description: "When an employee transfers departments in Workday, updates their Okta group memberships and notifies the new manager via Teams."
  tags:
    - hr
    - workday
    - okta
    - microsoft-teams
    - identity
capability:
  exposes:
    - type: mcp
      namespace: hr-provisioning
      port: 8080
      tools:
        - name: provision-transfer
          description: "Given a Workday worker ID and new department, update Okta groups and notify the new manager."
          inputParameters:
            - name: worker_id
              in: body
              type: string
              description: "The Workday worker ID."
            - name: new_department
              in: body
              type: string
              description: "The new department name."
          steps:
            - name: get-worker
              type: call
              call: workday.get-worker
              with:
                worker_id: "{{worker_id}}"
            - name: update-okta-groups
              type: call
              call: okta.update-group-membership
              with:
                user_login: "{{get-worker.work_email}}"
                new_group: "{{new_department}}_Team"
            - name: notify-manager
              type: call
              call: msteams.send-message
              with:
                recipient_upn: "{{get-worker.new_manager_email}}"
                text: "{{get-worker.full_name}} has transferred to {{new_department}}. Okta groups 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: "/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: okta
      baseUri: "https://halliburton.okta.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.okta_token"
      resources:
        - name: groups
          path: "/groups/{{new_group}}/users"
          inputParameters:
            - name: new_group
              in: path
          operations:
            - name: update-group-membership
              method: PUT
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Pulls current headcount by division and cost center from Workday for workforce planning and finance reporting.

naftiko: "0.5"
info:
  label: "Workday Headcount Snapshot"
  description: "Pulls current headcount by division and cost center from Workday for workforce planning and finance reporting."
  tags:
    - hr
    - finance
    - workday
    - reporting
    - headcount
capability:
  exposes:
    - type: mcp
      namespace: hr-reporting
      port: 8080
      tools:
        - name: get-headcount-snapshot
          description: "Returns active employees grouped by division and cost center from Workday with employment type. Use for workforce planning and cost analysis."
          call: workday.headcount-export
          outputParameters:
            - name: employees
              type: array
              mapping: "$.data"
              items:
                - name: employee_id
                  type: string
                  mapping: "$.id"
                - name: full_name
                  type: string
                  mapping: "$.displayName"
                - name: division
                  type: string
                  mapping: "$.businessUnit"
                - name: cost_center
                  type: string
                  mapping: "$.costCenter"
                - name: employment_type
                  type: string
                  mapping: "$.employmentType"
  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: "/halliburton/workers"
          operations:
            - name: headcount-export
              method: GET

Retrieves a Workday job requisition by ID and returns approval status, hiring manager, and target start date.

naftiko: "0.5"
info:
  label: "Workday Job Requisition Status"
  description: "Retrieves a Workday job requisition by ID and returns approval status, hiring manager, and target start date."
  tags:
    - hr
    - recruiting
    - workday
capability:
  exposes:
    - type: mcp
      namespace: hr-recruiting
      port: 8080
      tools:
        - name: get-job-requisition
          description: "Look up a Workday job requisition. Returns approval status, hiring manager, and target start."
          inputParameters:
            - name: requisition_id
              in: body
              type: string
              description: "The Workday job requisition ID."
          call: workday.get-requisition
          with:
            requisition_id: "{{requisition_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.requisitionStatus"
            - name: hiring_manager
              type: string
              mapping: "$.hiringManager.name"
  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: "/jobRequisitions/{{requisition_id}}"
          inputParameters:
            - name: requisition_id
              in: path
          operations:
            - name: get-requisition
              method: GET

Retrieves overdue learning assignments from Workday for a supervisory organization and sends a summary to the HR channel in Teams.

naftiko: "0.5"
info:
  label: "Workday Learning Assignment Tracker"
  description: "Retrieves overdue learning assignments from Workday for a supervisory organization and sends a summary to the HR channel in Teams."
  tags:
    - hr
    - workday
    - learning
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-learning
      port: 8080
      tools:
        - name: track-overdue-assignments
          description: "Query Workday for overdue learning assignments and notify HR via Teams."
          inputParameters:
            - name: org_id
              in: body
              type: string
              description: "The Workday supervisory org ID."
          steps:
            - name: get-overdue
              type: call
              call: workday.get-overdue-learning
              with:
                org_id: "{{org_id}}"
            - name: notify-hr
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_hr_channel_id"
                text: "Overdue Learning: Org {{org_id}} | {{get-overdue.count}} employees with overdue assignments"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: learning
          path: "/learningAssignments?orgId={{org_id}}&status=overdue"
          inputParameters:
            - name: org_id
              in: path
          operations:
            - name: get-overdue-learning
              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/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

When a new hire is created in Workday, creates a ServiceNow IT equipment request and notifies the hiring manager via Teams.

naftiko: "0.5"
info:
  label: "Workday New Hire IT Equipment Provisioning"
  description: "When a new hire is created in Workday, creates a ServiceNow IT equipment request and notifies the hiring manager via Teams."
  tags:
    - hr
    - workday
    - servicenow
    - microsoft-teams
    - onboarding
capability:
  exposes:
    - type: mcp
      namespace: hr-provisioning
      port: 8080
      tools:
        - name: provision-equipment
          description: "Create IT equipment request for a new hire and notify the hiring manager."
          inputParameters:
            - name: worker_id
              in: body
              type: string
              description: "The Workday worker ID."
          steps:
            - name: get-worker
              type: call
              call: workday.get-worker
              with:
                worker_id: "{{worker_id}}"
            - name: create-request
              type: call
              call: servicenow.create-request
              with:
                short_description: "IT equipment for {{get-worker.full_name}}"
                category: "it_provisioning"
            - name: notify-manager
              type: call
              call: msteams.send-message
              with:
                recipient_upn: "{{get-worker.manager_email}}"
                text: "IT equipment request created for {{get-worker.full_name}}: {{create-request.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: "/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://halliburton.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: mail
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves the organizational hierarchy for a Workday worker, returning their manager, direct reports count, and supervisory organization.

naftiko: "0.5"
info:
  label: "Workday Org Chart Lookup"
  description: "Retrieves the organizational hierarchy for a Workday worker, returning their manager, direct reports count, and supervisory organization."
  tags:
    - hr
    - workday
    - organization
capability:
  exposes:
    - type: mcp
      namespace: hr-org
      port: 8080
      tools:
        - name: get-org-hierarchy
          description: "Look up the org chart for a worker in Workday. Returns manager, direct reports, and supervisory org."
          inputParameters:
            - name: worker_id
              in: body
              type: string
              description: "The Workday worker ID."
          call: workday.get-org-chart
          with:
            worker_id: "{{worker_id}}"
          outputParameters:
            - name: manager
              type: string
              mapping: "$.manager.name"
            - name: direct_reports_count
              type: number
              mapping: "$.directReportsCount"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: org-chart
          path: "/workers/{{worker_id}}/organizationHierarchy"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-org-chart
              method: GET

Initiates the annual performance review cycle in Workday and sends manager notifications via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Workday Performance Review Cycle Launcher"
  description: "Initiates the annual performance review cycle in Workday and sends manager notifications via Microsoft Teams."
  tags:
    - hr
    - performance-management
    - workday
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-performance
      port: 8080
      tools:
        - name: launch-review-cycle
          description: "Given a review cycle name and due date, create performance review tasks in Workday and broadcast a notification to the people managers Teams channel."
          inputParameters:
            - name: cycle_name
              in: body
              type: string
              description: "The performance review cycle name, e.g. 2026 Annual Review."
            - name: due_date
              in: body
              type: string
              description: "Completion due date in YYYY-MM-DD format."
          steps:
            - name: create-review-cycle
              type: call
              call: workday.create-review-event
              with:
                cycle_name: "{{cycle_name}}"
                due_date: "{{due_date}}"
            - name: notify-managers
              type: call
              call: msteams.broadcast-review
              with:
                channel: "people-managers"
                text: "Performance review cycle '{{cycle_name}}' is open. Due: {{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: review-events
          path: "/halliburton/performanceReviews"
          operations:
            - name: create-review-event
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/hr/channels/managers/messages"
          operations:
            - name: broadcast-review
              method: POST

When an employee changes role in Workday, updates their Okta group memberships to reflect the new job function and department.

naftiko: "0.5"
info:
  label: "Workday Role Change and Okta Group Sync"
  description: "When an employee changes role in Workday, updates their Okta group memberships to reflect the new job function and department."
  tags:
    - hr
    - identity
    - workday
    - okta
    - access-management
capability:
  exposes:
    - type: mcp
      namespace: hr-access
      port: 8080
      tools:
        - name: sync-role-change
          description: "Given an Okta user ID, old group ID, and new group ID, remove the user from the old group and add them to the new group reflecting their role change."
          inputParameters:
            - name: okta_user_id
              in: body
              type: string
              description: "The Okta user ID of the employee changing roles."
            - name: old_group_id
              in: body
              type: string
              description: "The Okta group ID to remove the user from."
            - name: new_group_id
              in: body
              type: string
              description: "The Okta group ID to add the user to for their new role."
          steps:
            - name: remove-old-group
              type: call
              call: okta.remove-from-group
              with:
                user_id: "{{okta_user_id}}"
                group_id: "{{old_group_id}}"
            - name: add-new-group
              type: call
              call: okta-assign.add-to-group
              with:
                user_id: "{{okta_user_id}}"
                group_id: "{{new_group_id}}"
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://halliburton.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_api_token"
        placement: header
      resources:
        - name: group-members
          path: "/groups/{{group_id}}/users/{{user_id}}"
          inputParameters:
            - name: group_id
              in: path
            - name: user_id
              in: path
          operations:
            - name: remove-from-group
              method: DELETE
    - type: http
      namespace: okta-assign
      baseUri: "https://halliburton.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_api_token"
        placement: header
      resources:
        - name: group-members
          path: "/groups/{{group_id}}/users/{{user_id}}"
          inputParameters:
            - name: group_id
              in: path
            - name: user_id
              in: path
          operations:
            - name: add-to-group
              method: PUT

When an employee is terminated in Workday, deactivates their Okta account and notifies the security team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Workday Termination to Okta Deprovisioning"
  description: "When an employee is terminated in Workday, deactivates their Okta account and notifies the security team via Microsoft Teams."
  tags:
    - hr
    - security
    - workday
    - okta
    - microsoft-teams
    - identity
capability:
  exposes:
    - type: mcp
      namespace: hr-security
      port: 8080
      tools:
        - name: deprovision-terminated-employee
          description: "Given a Workday worker ID for a terminated employee, deactivate their Okta account and notify the security team."
          inputParameters:
            - name: worker_id
              in: body
              type: string
              description: "The Workday worker ID."
          steps:
            - name: get-worker
              type: call
              call: workday.get-worker
              with:
                worker_id: "{{worker_id}}"
            - name: deactivate-okta
              type: call
              call: okta.deactivate-user
              with:
                login: "{{get-worker.work_email}}"
            - name: notify-security
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_security_channel_id"
                text: "Okta account deactivated for {{get-worker.full_name}} — termination processed from Workday."
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: okta
      baseUri: "https://halliburton.okta.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.okta_token"
      resources:
        - name: users
          path: "/users/{{login}}/lifecycle/deactivate"
          inputParameters:
            - name: login
              in: path
          operations:
            - name: deactivate-user
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Retrieves an employee time off balance from Workday, returning available PTO days, sick leave, and floating holidays.

naftiko: "0.5"
info:
  label: "Workday Time Off Balance Lookup"
  description: "Retrieves an employee time off balance from Workday, returning available PTO days, sick leave, and floating holidays."
  tags:
    - hr
    - workday
    - time-management
capability:
  exposes:
    - type: mcp
      namespace: hr-time
      port: 8080
      tools:
        - name: get-time-off-balance
          description: "Look up an employee time off balance in Workday. Returns available PTO, sick leave, and floating holidays."
          inputParameters:
            - name: worker_id
              in: body
              type: string
              description: "The Workday worker ID."
          call: workday.get-time-off-balance
          with:
            worker_id: "{{worker_id}}"
          outputParameters:
            - name: pto_balance
              type: number
              mapping: "$.timeOffBalance.pto"
            - name: sick_leave
              type: number
              mapping: "$.timeOffBalance.sickLeave"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: time-off
          path: "/workers/{{worker_id}}/timeOffBalance"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-time-off-balance
              method: GET