Exxon Mobil Capabilities

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

Sort
Expand

Uses Anthropic Claude to summarize incoming environmental or regulatory compliance documents, then stores summaries in Salesforce and notifies the compliance team via Teams.

naftiko: "0.5"
info:
  label: "AI-Assisted Regulatory Document Summarization"
  description: "Uses Anthropic Claude to summarize incoming environmental or regulatory compliance documents, then stores summaries in Salesforce and notifies the compliance team via Teams."
  tags:
    - ai
    - compliance
    - anthropic
    - salesforce
    - msteams
    - oil-gas
capability:
  exposes:
    - type: mcp
      namespace: compliance-ai
      port: 8080
      tools:
        - name: summarize-regulatory-document
          description: "Given a compliance document text and Salesforce case ID, call Anthropic Claude to generate an executive summary and action items, then store in Salesforce and alert the compliance team via Teams."
          inputParameters:
            - name: document_text
              in: body
              type: string
              description: "Full text of the regulatory or environmental compliance document."
            - name: salesforce_case_id
              in: body
              type: string
              description: "Salesforce case ID associated with this compliance matter."
          steps:
            - name: generate-summary
              type: call
              call: anthropic.create-message
              with:
                model: "claude-opus-4-5"
                max_tokens: "800"
                system: "You are a regulatory compliance analyst for an energy company. Summarize the key requirements, deadlines, and required actions from the following regulatory document in plain language. Provide: 1) Executive summary (3-4 sentences), 2) Key compliance deadlines, 3) Required actions."
                user_content: "{{document_text}}"
            - name: store-summary
              type: call
              call: salesforce.update-case-notes
              with:
                case_id: "{{salesforce_case_id}}"
                Regulatory_Summary__c: "{{generate-summary.content}}"
            - name: notify-compliance
              type: call
              call: msteams.send-message
              with:
                channel: "regulatory-compliance"
                text: "Regulatory document summarized and stored. Salesforce case: {{salesforce_case_id}}. Review required."
  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: create-message
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://exxon.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: cases
          path: "/sobjects/Case/{{case_id}}"
          inputParameters:
            - name: case_id
              in: path
          operations:
            - name: update-case-notes
              method: PATCH
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: channel-messages
          path: "/teams/compliance/channels/regulatory/messages"
          operations:
            - name: send-message
              method: POST

Monitors Azure daily spend for energy and technology subscriptions, records cost anomalies in Snowflake, and opens ServiceNow incidents when thresholds are exceeded.

naftiko: "0.5"
info:
  label: "Azure Cloud Cost Anomaly Alert"
  description: "Monitors Azure daily spend for energy and technology subscriptions, records cost anomalies in Snowflake, and opens ServiceNow incidents when thresholds are exceeded."
  tags:
    - cloud
    - finops
    - azure
    - snowflake
    - servicenow
    - cost-management
capability:
  exposes:
    - type: mcp
      namespace: cloud-cost
      port: 8080
      tools:
        - name: detect-cost-anomaly
          description: "Given an Azure subscription ID and daily spend threshold, query current daily costs, record to Snowflake, and raise a ServiceNow incident if the threshold is exceeded. Use for daily FinOps monitoring across E&P cloud subscriptions."
          inputParameters:
            - name: subscription_id
              in: body
              type: string
              description: "Azure subscription ID to check for cost anomalies."
            - name: threshold_usd
              in: body
              type: number
              description: "Daily spend threshold in USD above which an alert is raised."
          steps:
            - name: get-daily-cost
              type: call
              call: azure.query-cost
              with:
                subscription_id: "{{subscription_id}}"
            - name: log-cost
              type: call
              call: snowflake.insert-cost-record
              with:
                subscription_id: "{{subscription_id}}"
                daily_cost: "{{get-daily-cost.total_cost}}"
            - name: create-incident
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Azure cost anomaly: ${{get-daily-cost.total_cost}} exceeds threshold on {{subscription_id}}"
                urgency: "2"
                category: "cloud_cost"
  consumes:
    - type: http
      namespace: azure
      baseUri: "https://management.azure.com"
      authentication:
        type: bearer
        token: "$secrets.azure_token"
      resources:
        - name: cost-query
          path: "/subscriptions/{{subscription_id}}/providers/Microsoft.CostManagement/query"
          inputParameters:
            - name: subscription_id
              in: path
          operations:
            - name: query-cost
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://exxon.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: cost-records
          path: "/statements"
          operations:
            - name: insert-cost-record
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://exxon.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

Enforces a release gate in Azure DevOps for SCADA system deployments by verifying safety review approvals in ServiceNow and change window compliance before allowing production releases.

naftiko: "0.5"
info:
  label: "Azure DevOps Release Gate for SCADA Systems"
  description: "Enforces a release gate in Azure DevOps for SCADA system deployments by verifying safety review approvals in ServiceNow and change window compliance before allowing production releases."
  tags:
    - safety
    - devops
    - azure-devops
    - servicenow
    - ot
capability:
  exposes:
    - type: mcp
      namespace: scada-release-gate
      port: 8080
      tools:
        - name: check-scada-release-gate
          description: "Given an Azure DevOps release ID, verify ServiceNow safety review approval and change window compliance before allowing SCADA deployment."
          inputParameters:
            - name: release_id
              in: body
              type: string
              description: "Azure DevOps release pipeline ID."
            - name: change_request_id
              in: body
              type: string
              description: "ServiceNow change request number."
          steps:
            - name: check-approval
              type: call
              call: servicenow.get-change-request
              with:
                change_request_id: "{{change_request_id}}"
            - name: validate-window
              type: call
              call: servicenow.check-change-window
              with:
                change_request_id: "{{change_request_id}}"
            - name: update-release
              type: call
              call: azuredevops.update-release-gate
              with:
                release_id: "{{release_id}}"
                approved: "{{check-approval.state}}"
                in_window: "{{validate-window.in_window}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://exxon.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: change-requests
          path: "/table/change_request"
          operations:
            - name: get-change-request
              method: GET
            - name: check-change-window
              method: GET
    - type: http
      namespace: azuredevops
      baseUri: "https://dev.azure.com/exxon"
      authentication:
        type: bearer
        token: "$secrets.azuredevops_token"
      resources:
        - name: releases
          path: "/_apis/release/releases/{{release_id}}"
          inputParameters:
            - name: release_id
              in: path
          operations:
            - name: update-release-gate
              method: PATCH

Fetches current energy commodity prices from Bloomberg for crude oil, natural gas, and refined products, returning bid, ask, and last trade values.

naftiko: "0.5"
info:
  label: "Bloomberg Energy Market Price Snapshot"
  description: "Fetches current energy commodity prices from Bloomberg for crude oil, natural gas, and refined products, returning bid, ask, and last trade values."
  tags:
    - trading
    - bloomberg
    - energy-markets
capability:
  exposes:
    - type: mcp
      namespace: market-prices
      port: 8080
      tools:
        - name: get-energy-prices
          description: "Look up current energy commodity prices from Bloomberg by ticker symbol. Returns bid, ask, last trade price, and volume for trading desk queries."
          inputParameters:
            - name: ticker
              in: body
              type: string
              description: "Bloomberg ticker symbol (e.g., CL1 for WTI crude, NG1 for natural gas)."
          call: bloomberg.get-price
          with:
            ticker: "{{ticker}}"
          outputParameters:
            - name: bid
              type: number
              mapping: "$.data.bid"
            - name: ask
              type: number
              mapping: "$.data.ask"
            - name: last_trade
              type: number
              mapping: "$.data.lastTrade"
            - name: volume
              type: number
              mapping: "$.data.volume"
  consumes:
    - type: http
      namespace: bloomberg
      baseUri: "https://api.bloomberg.com/eap/catalogs/bbg/fields"
      authentication:
        type: bearer
        token: "$secrets.bloomberg_token"
      resources:
        - name: prices
          path: "/{{ticker}}/snapshot"
          inputParameters:
            - name: ticker
              in: path
          operations:
            - name: get-price
              method: GET

After a ServiceNow incident is closed, creates a Confluence post-incident review page in the IT knowledge base with incident details and lessons learned.

naftiko: "0.5"
info:
  label: "Confluence Post-Incident Review Knowledge Capture"
  description: "After a ServiceNow incident is closed, creates a Confluence post-incident review page in the IT knowledge base with incident details and lessons learned."
  tags:
    - itsm
    - knowledge-management
    - servicenow
    - confluence
    - incident-response
capability:
  exposes:
    - type: mcp
      namespace: incident-knowledge
      port: 8080
      tools:
        - name: capture-post-incident-review
          description: "Given a resolved ServiceNow incident number and Confluence space key, fetch incident close notes and resolution details, then create a post-incident review (PIR) page in Confluence."
          inputParameters:
            - name: incident_number
              in: body
              type: string
              description: "ServiceNow incident number (e.g., INC0099887)."
            - name: confluence_space_key
              in: body
              type: string
              description: "Confluence space key for the IT knowledge base (e.g., OPSOPS)."
          steps:
            - name: get-incident
              type: call
              call: servicenow.get-incident
              with:
                number: "{{incident_number}}"
            - name: create-pir-page
              type: call
              call: confluence.create-page
              with:
                space_key: "{{confluence_space_key}}"
                title: "PIR: {{incident_number}} — {{get-incident.short_description}}"
                body: "Incident: {{incident_number}}\nSummary: {{get-incident.short_description}}\nImpact: {{get-incident.impact}}\nRoot Cause: {{get-incident.close_notes}}\nResolution: {{get-incident.resolution_notes}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://exxon.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          inputParameters:
            - name: number
              in: query
          operations:
            - name: get-incident
              method: GET
    - type: http
      namespace: confluence
      baseUri: "https://exxon.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: pages
          path: "/content"
          operations:
            - name: create-page
              method: POST

Creates and updates Confluence pages for refinery turnaround planning, pulling scope details from SAP Plant Maintenance and resource plans from Workday to maintain a living knowledge base.

naftiko: "0.5"
info:
  label: "Confluence Turnaround Planning Knowledge Base"
  description: "Creates and updates Confluence pages for refinery turnaround planning, pulling scope details from SAP Plant Maintenance and resource plans from Workday to maintain a living knowledge base."
  tags:
    - refining
    - maintenance
    - confluence
    - sap
    - workday
capability:
  exposes:
    - type: mcp
      namespace: turnaround-kb
      port: 8080
      tools:
        - name: update-turnaround-plan
          description: "Given a turnaround project ID, pull SAP PM scope and Workday resource plan, then update the Confluence turnaround planning page."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "Turnaround project identifier."
            - name: plant_code
              in: body
              type: string
              description: "SAP plant code for the refinery."
          steps:
            - name: get-scope
              type: call
              call: sap.get-turnaround-scope
              with:
                project_id: "{{project_id}}"
                plant_code: "{{plant_code}}"
            - name: get-resources
              type: call
              call: workday.get-project-resources
              with:
                project_id: "{{project_id}}"
            - name: update-page
              type: call
              call: confluence.update-page
              with:
                space: "TURNAROUND"
                title: "TA-{{project_id}} Plan"
                body: "Scope: {{get-scope.summary}} | Resources: {{get-resources.headcount}} team members"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://exxon-s4.sap.com/sap/opu/odata/sap/PM_ORDER_CREATE_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: turnaround
          path: "/A_MaintenanceOrder"
          operations:
            - name: get-turnaround-scope
              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: project-resources
          path: "/workers"
          operations:
            - name: get-project-resources
              method: GET
    - type: http
      namespace: confluence
      baseUri: "https://exxon.atlassian.net/wiki/rest/api"
      authentication:
        type: bearer
        token: "$secrets.confluence_token"
      resources:
        - name: pages
          path: "/content"
          operations:
            - name: update-page
              method: PUT

When CrowdStrike detects a threat on a SCADA-adjacent endpoint, isolates the host, creates a ServiceNow security incident, and notifies the OT security team via Teams for immediate response.

naftiko: "0.5"
info:
  label: "CrowdStrike Endpoint Threat Response for SCADA"
  description: "When CrowdStrike detects a threat on a SCADA-adjacent endpoint, isolates the host, creates a ServiceNow security incident, and notifies the OT security team via Teams for immediate response."
  tags:
    - safety
    - security
    - crowdstrike
    - servicenow
    - msteams
    - ot
capability:
  exposes:
    - type: mcp
      namespace: scada-threat
      port: 8080
      tools:
        - name: respond-to-scada-threat
          description: "Given a CrowdStrike detection ID, isolate the endpoint, create a ServiceNow security incident, and notify OT security team."
          inputParameters:
            - name: detection_id
              in: body
              type: string
              description: "CrowdStrike detection ID."
            - name: hostname
              in: body
              type: string
              description: "Hostname of the affected endpoint."
          steps:
            - name: isolate-host
              type: call
              call: crowdstrike.contain-host
              with:
                hostname: "{{hostname}}"
            - name: create-incident
              type: call
              call: servicenow.create-security-incident
              with:
                hostname: "{{hostname}}"
                detection_id: "{{detection_id}}"
                category: "ot_security"
            - name: notify-ot-security
              type: call
              call: msteams.send-message
              with:
                channel: "ot-security"
                text: "SCADA THREAT | Host: {{hostname}} isolated | Detection: {{detection_id}} | INC: {{create-incident.number}} | Immediate review required"
  consumes:
    - type: http
      namespace: crowdstrike
      baseUri: "https://api.crowdstrike.com"
      authentication:
        type: bearer
        token: "$secrets.crowdstrike_token"
      resources:
        - name: hosts
          path: "/devices/entities/host-actions/v2"
          operations:
            - name: contain-host
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://exxon.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: security-incidents
          path: "/table/sn_si_incident"
          operations:
            - name: create-security-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: channel-messages
          path: "/teams/security/channels/ot/messages"
          operations:
            - name: send-message
              method: POST

Pulls compressor station telemetry from Datadog including vibration, temperature, and throughput metrics, and creates a SAP PM notification if readings exceed thresholds.

naftiko: "0.5"
info:
  label: "Datadog Compressor Station Health Check"
  description: "Pulls compressor station telemetry from Datadog including vibration, temperature, and throughput metrics, and creates a SAP PM notification if readings exceed thresholds."
  tags:
    - upstream
    - maintenance
    - datadog
    - sap
capability:
  exposes:
    - type: mcp
      namespace: compressor-health
      port: 8080
      tools:
        - name: check-compressor-health
          description: "Given a Datadog host tag for a compressor station, pull health metrics and create a SAP PM notification if thresholds are exceeded."
          inputParameters:
            - name: host_tag
              in: body
              type: string
              description: "Datadog host tag for the compressor station."
          steps:
            - name: get-metrics
              type: call
              call: datadog.query-metrics
              with:
                host_tag: "{{host_tag}}"
                metrics: "vibration,temperature,throughput"
            - name: create-notification
              type: call
              call: sap.create-pm-notification
              with:
                equipment: "{{host_tag}}"
                description: "Health check alert: {{get-metrics.summary}}"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "$secrets.datadog_api_key"
      resources:
        - name: metrics
          path: "/query"
          operations:
            - name: query-metrics
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://exxon-s4.sap.com/sap/opu/odata/sap/PM_NOTIFICATION_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: notifications
          path: "/A_MaintenanceNotification"
          operations:
            - name: create-pm-notification
              method: POST

Queries Datadog for SLO compliance across E&P production infrastructure, aggregates in Snowflake, and posts a weekly compliance digest to the IT operations Teams channel.

naftiko: "0.5"
info:
  label: "Datadog Infrastructure SLO Report"
  description: "Queries Datadog for SLO compliance across E&P production infrastructure, aggregates in Snowflake, and posts a weekly compliance digest to the IT operations Teams channel."
  tags:
    - observability
    - slo
    - datadog
    - snowflake
    - msteams
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: slo-ops
      port: 8080
      tools:
        - name: report-slo-compliance
          description: "Given a service tag and evaluation window, fetch SLO statuses from Datadog, write compliance metrics to Snowflake, and post a Teams digest if any SLOs are at risk. Use weekly for reliability reviews."
          inputParameters:
            - name: service_tag
              in: body
              type: string
              description: "Datadog service tag to filter (e.g., service:upstream-operations-api)."
            - name: time_window
              in: body
              type: string
              description: "Evaluation window: 7d, 30d, or 90d."
          steps:
            - name: get-slo-status
              type: call
              call: datadog.list-slos
              with:
                tags: "{{service_tag}}"
                time_window: "{{time_window}}"
            - name: write-compliance
              type: call
              call: snowflake.insert-slo-row
              with:
                service_tag: "{{service_tag}}"
                time_window: "{{time_window}}"
                at_risk_count: "{{get-slo-status.at_risk_count}}"
            - name: post-digest
              type: call
              call: msteams.send-message
              with:
                channel: "it-operations"
                text: "SLO Report ({{time_window}}) | {{service_tag}}: {{get-slo-status.at_risk_count}} SLOs at risk."
  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"
          inputParameters:
            - name: tags
              in: query
            - name: time_window
              in: query
          operations:
            - name: list-slos
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://exxon.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: slo-table
          path: "/statements"
          operations:
            - name: insert-slo-row
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: channel-messages
          path: "/teams/it/channels/operations/messages"
          operations:
            - name: send-message
              method: POST

When Datadog detects a refinery process alarm threshold breach, logs the event in Snowflake, creates a ServiceNow incident, and notifies the refinery operations team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Datadog Refinery Process Alarm Handler"
  description: "When Datadog detects a refinery process alarm threshold breach, logs the event in Snowflake, creates a ServiceNow incident, and notifies the refinery operations team via Microsoft Teams."
  tags:
    - refining
    - safety
    - datadog
    - snowflake
    - servicenow
    - msteams
capability:
  exposes:
    - type: mcp
      namespace: refinery-alarm
      port: 8080
      tools:
        - name: handle-refinery-alarm
          description: "Given a Datadog monitor ID and alarm severity, retrieve alarm details, log in Snowflake, create a ServiceNow incident, and alert the refinery ops team in Teams."
          inputParameters:
            - name: monitor_id
              in: body
              type: string
              description: "Datadog monitor ID that triggered the refinery process alarm."
            - name: severity
              in: body
              type: string
              description: "Alarm severity level: critical, high, medium, low."
          steps:
            - name: get-alarm-details
              type: call
              call: datadog.get-monitor-state
              with:
                monitor_id: "{{monitor_id}}"
            - name: log-alarm
              type: call
              call: snowflake.insert-alarm-record
              with:
                monitor_id: "{{monitor_id}}"
                severity: "{{severity}}"
                message: "{{get-alarm-details.message}}"
            - name: create-incident
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Refinery alarm: {{get-alarm-details.name}} - {{severity}}"
                urgency: "1"
                category: "refinery_safety"
            - name: notify-ops
              type: call
              call: msteams.send-message
              with:
                channel: "refinery-operations"
                text: "Refinery alarm triggered | Monitor: {{get-alarm-details.name}} | Severity: {{severity}} | INC: {{create-incident.number}}"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "$secrets.datadog_api_key"
      resources:
        - name: monitors
          path: "/monitor/{{monitor_id}}"
          inputParameters:
            - name: monitor_id
              in: path
          operations:
            - name: get-monitor-state
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://exxon.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: alarm-records
          path: "/statements"
          operations:
            - name: insert-alarm-record
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://exxon.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.msteams_token"
      resources:
        - name: channel-messages
          path: "/teams/operations/channels/refinery/messages"
          operations:
            - name: send-message
              method: POST

Routes joint venture operating agreements through DocuSign for signature, tracks completion status, and logs the executed agreement in SharePoint for records management.

naftiko: "0.5"
info:
  label: "DocuSign Joint Venture Agreement Routing"
  description: "Routes joint venture operating agreements through DocuSign for signature, tracks completion status, and logs the executed agreement in SharePoint for records management."
  tags:
    - upstream
    - legal
    - docusign
    - sharepoint
capability:
  exposes:
    - type: mcp
      namespace: jv-agreement
      port: 8080
      tools:
        - name: route-jv-agreement
          description: "Given an agreement document and signer list, create a DocuSign envelope and log in SharePoint upon completion."
          inputParameters:
            - name: agreement_title
              in: body
              type: string
              description: "Title of the joint venture agreement."
            - name: signers
              in: body
              type: string
              description: "Comma-separated list of signer email addresses."
          steps:
            - name: create-envelope
              type: call
              call: docusign.create-envelope
              with:
                title: "{{agreement_title}}"
                signers: "{{signers}}"
            - name: log-agreement
              type: call
              call: sharepoint.upload-document
              with:
                library: "JV-Agreements"
                filename: "{{agreement_title}}"
                envelope_id: "{{create-envelope.envelope_id}}"
  consumes:
    - type: http
      namespace: docusign
      baseUri: "https://na4.docusign.net/restapi/v2.1"
      authentication:
        type: bearer
        token: "$secrets.docusign_token"
      resources:
        - name: envelopes
          path: "/accounts/exxon/envelopes"
          operations:
            - name: create-envelope
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites/exxon.sharepoint.com"
      authentication:
        type: bearer
        token: "$secrets.sharepoint_token"
      resources:
        - name: documents
          path: "/drive/root:/JV-Agreements"
          operations:
            - name: upload-document
              method: PUT

On confirmed Workday termination, disables the Microsoft 365 account, revokes GitHub organization access, and creates a ServiceNow offboarding checklist ticket.

naftiko: "0.5"
info:
  label: "Employee Offboarding"
  description: "On confirmed Workday termination, disables the Microsoft 365 account, revokes GitHub organization access, and creates a ServiceNow offboarding checklist ticket."
  tags:
    - hr
    - offboarding
    - workday
    - microsoft-365
    - github
    - servicenow
    - identity
capability:
  exposes:
    - type: mcp
      namespace: hr-offboarding
      port: 8080
      tools:
        - name: trigger-offboarding
          description: "Given a Workday employee ID and termination date, disable Microsoft 365 account, remove GitHub org membership, and open a ServiceNow IT offboarding ticket. Use on confirmed Workday termination events."
          inputParameters:
            - name: workday_employee_id
              in: body
              type: string
              description: "Workday worker ID of the departing employee."
            - name: termination_date
              in: body
              type: string
              description: "Effective termination date in ISO 8601 format (YYYY-MM-DD)."
          steps:
            - name: get-worker
              type: call
              call: workday.get-worker
              with:
                worker_id: "{{workday_employee_id}}"
            - name: disable-m365
              type: call
              call: msgraph.disable-user
              with:
                user_id: "{{get-worker.email}}"
            - name: remove-github-access
              type: call
              call: github.remove-org-member
              with:
                org: "exxonmobil"
                username: "{{get-worker.github_username}}"
            - name: open-offboarding-ticket
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Offboarding: {{get-worker.full_name}} — {{termination_date}}"
                category: "offboarding"
                assignment_group: "IT_Security"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: msgraph
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: users
          path: "/users/{{user_id}}"
          inputParameters:
            - name: user_id
              in: path
          operations:
            - name: disable-user
              method: PATCH
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: org-members
          path: "/orgs/{{org}}/members/{{username}}"
          inputParameters:
            - name: org
              in: path
            - name: username
              in: path
          operations:
            - name: remove-org-member
              method: DELETE
    - type: http
      namespace: servicenow
      baseUri: "https://exxon.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

Triggers a GitHub Actions workflow to deploy OPC-UA gateway firmware to field edge devices, verifies deployment status, and logs results in ServiceNow for change management compliance.

naftiko: "0.5"
info:
  label: "GitHub Actions OPC-UA Gateway Deployment"
  description: "Triggers a GitHub Actions workflow to deploy OPC-UA gateway firmware to field edge devices, verifies deployment status, and logs results in ServiceNow for change management compliance."
  tags:
    - ot
    - devops
    - github
    - servicenow
    - upstream
capability:
  exposes:
    - type: mcp
      namespace: opcua-deploy
      port: 8080
      tools:
        - name: deploy-opcua-gateway
          description: "Given a firmware version and target device group, trigger GitHub Actions deployment, verify status, and log in ServiceNow."
          inputParameters:
            - name: firmware_version
              in: body
              type: string
              description: "Firmware version to deploy (e.g., v2.4.1)."
            - name: device_group
              in: body
              type: string
              description: "Target device group (e.g., permian-edge-gateways)."
            - name: change_request_id
              in: body
              type: string
              description: "ServiceNow change request number."
          steps:
            - name: trigger-deployment
              type: call
              call: github.trigger-workflow
              with:
                repo: "exxon/opcua-gateway"
                workflow: "deploy.yml"
                ref: "{{firmware_version}}"
                inputs: "{{device_group}}"
            - name: log-deployment
              type: call
              call: servicenow.update-change-request
              with:
                change_request_id: "{{change_request_id}}"
                status: "implemented"
                notes: "OPC-UA gateway {{firmware_version}} deployed to {{device_group}}"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: workflows
          path: "/repos/exxon/opcua-gateway/actions/workflows/deploy.yml/dispatches"
          operations:
            - name: trigger-workflow
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://exxon.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: change-requests
          path: "/table/change_request"
          operations:
            - name: update-change-request
              method: PATCH

On a GitHub Actions pipeline failure on a main branch in a digital or data engineering repository, creates a Jira bug, posts a Datadog event, and alerts the engineering team via Teams.

naftiko: "0.5"
info:
  label: "GitHub CI/CD Pipeline Failure Response"
  description: "On a GitHub Actions pipeline failure on a main branch in a digital or data engineering repository, creates a Jira bug, posts a Datadog event, and alerts the engineering team via Teams."
  tags:
    - devops
    - ci-cd
    - github
    - jira
    - datadog
    - msteams
capability:
  exposes:
    - type: mcp
      namespace: cicd-ops
      port: 8080
      tools:
        - name: handle-pipeline-failure
          description: "Given a GitHub repository, run ID, branch, and commit SHA, fetch run details, open a Jira bug, post a Datadog event, and alert the engineering channel in Teams."
          inputParameters:
            - name: repo_full_name
              in: body
              type: string
              description: "GitHub repository full name (e.g., exxonmobil/downstream-api)."
            - name: run_id
              in: body
              type: string
              description: "GitHub Actions workflow run ID."
            - name: branch
              in: body
              type: string
              description: "Branch where the failure occurred."
            - name: commit_sha
              in: body
              type: string
              description: "Commit SHA of the failing run."
          steps:
            - name: get-run
              type: call
              call: github.get-workflow-run
              with:
                repo: "{{repo_full_name}}"
                run_id: "{{run_id}}"
            - name: create-bug
              type: call
              call: jira.create-issue
              with:
                project_key: "ENG"
                issuetype: "Bug"
                summary: "[CI Failure] {{repo_full_name}} / {{branch}}"
                description: "Run: {{run_id}}\nBranch: {{branch}}\nCommit: {{commit_sha}}\nConclusion: {{get-run.conclusion}}"
            - name: post-event
              type: call
              call: datadog.create-event
              with:
                title: "CI Failure: {{repo_full_name}}"
                text: "Branch {{branch}} run {{run_id}} failed on commit {{commit_sha}}"
                alert_type: "error"
                tags: "repo:{{repo_full_name}},branch:{{branch}}"
            - name: alert-engineering
              type: call
              call: msteams.send-message
              with:
                channel: "engineering-alerts"
                text: "Pipeline failure: {{repo_full_name}} | Branch: {{branch}} | Jira: {{create-bug.key}}"
  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/{{run_id}}"
          inputParameters:
            - name: repo
              in: path
            - name: run_id
              in: path
          operations:
            - name: get-workflow-run
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://exxon.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: 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.msteams_token"
      resources:
        - name: channel-messages
          path: "/teams/engineering/channels/alerts/messages"
          operations:
            - name: send-message
              method: POST

Scans ExxonMobil GitHub organization repositories for critical Dependabot alerts, creates Jira security issues, and notifies the cybersecurity team via Teams.

naftiko: "0.5"
info:
  label: "GitHub Security Vulnerability Triage"
  description: "Scans ExxonMobil GitHub organization repositories for critical Dependabot alerts, creates Jira security issues, and notifies the cybersecurity team via Teams."
  tags:
    - security
    - devops
    - github
    - jira
    - msteams
    - vulnerability-management
capability:
  exposes:
    - type: mcp
      namespace: cyber-security
      port: 8080
      tools:
        - name: triage-dependabot-alerts
          description: "Given a GitHub organization and severity level, list open Dependabot vulnerability alerts, create a Jira security issue for findings, and post to the cybersecurity Teams channel. Use for weekly security hygiene reviews."
          inputParameters:
            - name: github_org
              in: body
              type: string
              description: "GitHub organization name to scan (e.g., exxonmobil)."
            - name: severity
              in: body
              type: string
              description: "Minimum alert severity: critical, high, medium, or low."
          steps:
            - name: list-alerts
              type: call
              call: github.list-dependabot-alerts
              with:
                org: "{{github_org}}"
                severity: "{{severity}}"
            - name: create-security-issue
              type: call
              call: jira.create-issue
              with:
                project_key: "CYBER"
                issuetype: "Security Vulnerability"
                summary: "Dependabot {{severity}} alerts in {{github_org}}: {{list-alerts.alert_count}} findings"
                description: "Repos: {{list-alerts.repo_names}}. Packages: {{list-alerts.package_names}}"
            - name: notify-cybersecurity
              type: call
              call: msteams.send-message
              with:
                channel: "cybersecurity-ops"
                text: "Dependabot triage: {{list-alerts.alert_count}} {{severity}} alerts | {{github_org}} | Jira: {{create-security-issue.key}}"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: dependabot-alerts
          path: "/orgs/{{org}}/dependabot/alerts"
          inputParameters:
            - name: org
              in: path
            - name: severity
              in: query
          operations:
            - name: list-dependabot-alerts
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://exxon.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: channel-messages
          path: "/teams/security/channels/ops/messages"
          operations:
            - name: send-message
              method: POST

Pulls active drilling project issues from Jira, aggregates status by well pad, and posts a daily digest to the drilling operations Teams channel with blockers highlighted.

naftiko: "0.5"
info:
  label: "Jira Drilling Project Status Digest"
  description: "Pulls active drilling project issues from Jira, aggregates status by well pad, and posts a daily digest to the drilling operations Teams channel with blockers highlighted."
  tags:
    - upstream
    - drilling
    - jira
    - msteams
capability:
  exposes:
    - type: mcp
      namespace: drilling-digest
      port: 8080
      tools:
        - name: generate-drilling-digest
          description: "Given a Jira project key for drilling operations, compile a status digest of active issues and post to the drilling ops Teams channel."
          inputParameters:
            - name: project_key
              in: body
              type: string
              description: "Jira project key for the drilling program (e.g., DRILL)."
          steps:
            - name: get-issues
              type: call
              call: jira.search-issues
              with:
                project_key: "{{project_key}}"
                status: "In Progress,Blocked"
            - name: post-digest
              type: call
              call: msteams.send-message
              with:
                channel: "drilling-operations"
                text: "Drilling Digest | Active: {{get-issues.in_progress_count}} | Blocked: {{get-issues.blocked_count}} | Top blocker: {{get-issues.top_blocker}}"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://exxon.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: search
          path: "/search"
          operations:
            - name: search-issues
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: channel-messages
          path: "/teams/drilling/channels/operations/messages"
          operations:
            - name: send-message
              method: POST

Fetches Jira sprint completion data for engineering teams, writes velocity metrics to Snowflake, and triggers a Power BI engineering performance dashboard refresh.

naftiko: "0.5"
info:
  label: "Jira Engineering Sprint Velocity Report"
  description: "Fetches Jira sprint completion data for engineering teams, writes velocity metrics to Snowflake, and triggers a Power BI engineering performance dashboard refresh."
  tags:
    - devops
    - agile
    - jira
    - snowflake
    - power-bi
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: sprint-reporting
      port: 8080
      tools:
        - name: publish-sprint-velocity
          description: "Given a Jira project key and sprint ID, fetch completed story points and issues, write to Snowflake, and trigger a Power BI engineering dashboard refresh for leadership review."
          inputParameters:
            - name: jira_project_key
              in: body
              type: string
              description: "Jira project key (e.g., DIG, API)."
            - name: sprint_id
              in: body
              type: integer
              description: "Jira sprint ID to analyze."
          steps:
            - name: get-sprint-data
              type: call
              call: jira.get-sprint
              with:
                sprint_id: "{{sprint_id}}"
            - name: write-velocity
              type: call
              call: snowflake.insert-velocity-row
              with:
                project_key: "{{jira_project_key}}"
                sprint_id: "{{sprint_id}}"
                completed_points: "{{get-sprint-data.completedPoints}}"
            - name: refresh-powerbi
              type: call
              call: powerbi.trigger-refresh
              with:
                dataset_id: "$secrets.powerbi_engineering_dataset_id"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://exxon.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: sprints
          path: "/sprint/{{sprint_id}}"
          inputParameters:
            - name: sprint_id
              in: path
          operations:
            - name: get-sprint
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://exxon.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: velocity-table
          path: "/statements"
          operations:
            - name: insert-velocity-row
              method: POST
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: dataset-refreshes
          path: "/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: trigger-refresh
              method: POST

Fetches ExxonMobil LinkedIn company page engagement metrics, aggregates in Snowflake, and sends a weekly digest to the corporate communications team via Teams.

naftiko: "0.5"
info:
  label: "LinkedIn Employer Brand Performance Digest"
  description: "Fetches ExxonMobil LinkedIn company page engagement metrics, aggregates in Snowflake, and sends a weekly digest to the corporate communications team via Teams."
  tags:
    - marketing
    - social
    - linkedin
    - snowflake
    - msteams
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: brand-reporting
      port: 8080
      tools:
        - name: digest-linkedin-brand
          description: "Given a LinkedIn organization ID and a date range, fetch post engagement and follower stats, write to Snowflake, and post a Teams digest to the corporate communications channel."
          inputParameters:
            - name: organization_id
              in: body
              type: string
              description: "LinkedIn organization ID (URN) for the ExxonMobil company page."
            - name: start_date
              in: body
              type: string
              description: "Report start date in ISO 8601 format (YYYY-MM-DD)."
            - name: end_date
              in: body
              type: string
              description: "Report end date in ISO 8601 format (YYYY-MM-DD)."
          steps:
            - name: get-engagement-stats
              type: call
              call: linkedin.get-share-statistics
              with:
                organization_id: "{{organization_id}}"
                start: "{{start_date}}"
                end: "{{end_date}}"
            - name: write-stats
              type: call
              call: snowflake.insert-social-row
              with:
                platform: "linkedin"
                impressions: "{{get-engagement-stats.totalImpressions}}"
                engagements: "{{get-engagement-stats.totalEngagements}}"
                start_date: "{{start_date}}"
            - name: send-digest
              type: call
              call: msteams.send-message
              with:
                channel: "corporate-comms"
                text: "LinkedIn Brand ({{start_date}} to {{end_date}}): {{get-engagement-stats.totalImpressions}} impressions, {{get-engagement-stats.totalEngagements}} engagements."
  consumes:
    - type: http
      namespace: linkedin
      baseUri: "https://api.linkedin.com/v2"
      authentication:
        type: bearer
        token: "$secrets.linkedin_token"
      resources:
        - name: share-statistics
          path: "/organizationalEntityShareStatistics"
          inputParameters:
            - name: organization_id
              in: query
            - name: start
              in: query
            - name: end
              in: query
          operations:
            - name: get-share-statistics
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://exxon.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: social-stats
          path: "/statements"
          operations:
            - name: insert-social-row
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: channel-messages
          path: "/teams/comms/channels/corporate/messages"
          operations:
            - name: send-message
              method: POST

When a new hire record is created in Workday, provisions a Microsoft 365 account, opens a ServiceNow IT onboarding ticket, and sends a Teams welcome message to the new hire and their manager.

naftiko: "0.5"
info:
  label: "New Employee Onboarding"
  description: "When a new hire record is created in Workday, provisions a Microsoft 365 account, opens a ServiceNow IT onboarding ticket, and sends a Teams welcome message to the new hire and their manager."
  tags:
    - hr
    - onboarding
    - workday
    - microsoft-365
    - servicenow
    - msteams
capability:
  exposes:
    - type: mcp
      namespace: hr-onboarding
      port: 8080
      tools:
        - name: trigger-employee-onboarding
          description: "Given a Workday employee ID and start date, provision a Microsoft 365 account, create a ServiceNow IT onboarding incident, and send a Teams welcome message. Use on new hire creation events in Workday."
          inputParameters:
            - name: workday_employee_id
              in: body
              type: string
              description: "Workday worker ID for the new hire."
            - name: start_date
              in: body
              type: string
              description: "Employee start date in ISO 8601 format (YYYY-MM-DD)."
          steps:
            - name: get-worker
              type: call
              call: workday.get-worker
              with:
                worker_id: "{{workday_employee_id}}"
            - name: provision-m365
              type: call
              call: msgraph.create-user
              with:
                displayName: "{{get-worker.full_name}}"
                userPrincipalName: "{{get-worker.email}}"
                department: "{{get-worker.department}}"
            - name: open-ticket
              type: call
              call: servicenow.create-incident
              with:
                short_description: "IT Onboarding: {{get-worker.full_name}} — start {{start_date}}"
                category: "onboarding"
                assignment_group: "IT_Onboarding"
            - name: send-welcome
              type: call
              call: msteams.send-message
              with:
                channel: "hr-announcements"
                text: "Welcome {{get-worker.full_name}} to ExxonMobil! Start: {{start_date}}. IT 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: "/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: msgraph
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: users
          path: "/users"
          operations:
            - name: create-user
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://exxon.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.msteams_token"
      resources:
        - name: channel-messages
          path: "/teams/hr/channels/announcements/messages"
          operations:
            - name: send-message
              method: POST

Performs a quarterly privileged access review for operational technology systems by pulling user assignments from Okta, cross-referencing active employees in Workday, and generating a compliance report in ServiceNow.

naftiko: "0.5"
info:
  label: "Okta Privileged Access Review for OT Systems"
  description: "Performs a quarterly privileged access review for operational technology systems by pulling user assignments from Okta, cross-referencing active employees in Workday, and generating a compliance report in ServiceNow."
  tags:
    - safety
    - security
    - okta
    - workday
    - servicenow
    - ot
capability:
  exposes:
    - type: mcp
      namespace: ot-access-review
      port: 8080
      tools:
        - name: review-ot-access
          description: "Given an Okta application ID for an OT system, pull privileged users, verify active status in Workday, and log findings in ServiceNow."
          inputParameters:
            - name: app_id
              in: body
              type: string
              description: "Okta application ID for the OT system."
          steps:
            - name: get-privileged-users
              type: call
              call: okta.get-app-users
              with:
                app_id: "{{app_id}}"
            - name: verify-employment
              type: call
              call: workday.verify-active-employees
              with:
                user_list: "{{get-privileged-users.users}}"
            - name: log-findings
              type: call
              call: servicenow.create-audit-record
              with:
                app_id: "{{app_id}}"
                total_users: "{{get-privileged-users.count}}"
                inactive_users: "{{verify-employment.inactive_count}}"
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://exxon.okta.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.okta_token"
      resources:
        - name: app-users
          path: "/apps/{{app_id}}/users"
          inputParameters:
            - name: app_id
              in: path
          operations:
            - name: get-app-users
              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"
          operations:
            - name: verify-active-employees
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://exxon.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: audit-records
          path: "/table/u_access_review"
          operations:
            - name: create-audit-record
              method: POST

Aggregates daily production data from Snowflake and triggers a Power BI energy production dashboard refresh for E&P operations leadership.

naftiko: "0.5"
info:
  label: "Power BI Energy Production Dashboard Refresh"
  description: "Aggregates daily production data from Snowflake and triggers a Power BI energy production dashboard refresh for E&P operations leadership."
  tags:
    - oil-gas
    - analytics
    - reporting
    - snowflake
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: production-reporting
      port: 8080
      tools:
        - name: refresh-production-dashboard
          description: "Given a reporting date and business unit, insert the daily production summary into Snowflake and trigger a Power BI dataset refresh for E&P leadership. Use for daily operational reporting."
          inputParameters:
            - name: report_date
              in: body
              type: string
              description: "Reporting date in ISO 8601 format (YYYY-MM-DD)."
            - name: business_unit
              in: body
              type: string
              description: "Business unit identifier (e.g., UPSTREAM, DOWNSTREAM, CHEMICAL)."
          steps:
            - name: write-summary
              type: call
              call: snowflake.insert-production-summary
              with:
                report_date: "{{report_date}}"
                business_unit: "{{business_unit}}"
            - name: refresh-dashboard
              type: call
              call: powerbi.trigger-refresh
              with:
                dataset_id: "$secrets.powerbi_production_dataset_id"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://exxon.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: production-table
          path: "/statements"
          operations:
            - name: insert-production-summary
              method: POST
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: dataset-refreshes
          path: "/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: trigger-refresh
              method: POST

When Datadog detects a critical SCADA or process control anomaly, creates a P1 ServiceNow incident, pages the on-call operations team, and opens a Jira tracking issue for root-cause analysis.

naftiko: "0.5"
info:
  label: "Production Operations Incident Response"
  description: "When Datadog detects a critical SCADA or process control anomaly, creates a P1 ServiceNow incident, pages the on-call operations team, and opens a Jira tracking issue for root-cause analysis."
  tags:
    - oil-gas
    - ot
    - incident-response
    - datadog
    - servicenow
    - jira
    - msteams
capability:
  exposes:
    - type: mcp
      namespace: production-ops
      port: 8080
      tools:
        - name: handle-production-incident
          description: "Given a Datadog alert ID, affected facility, and severity, create a ServiceNow P1 incident, open a Jira tracking issue, and alert the production operations channel in Teams."
          inputParameters:
            - name: datadog_alert_id
              in: body
              type: string
              description: "Datadog monitor alert ID from the SCADA or process control integration."
            - name: facility_id
              in: body
              type: string
              description: "Facility or asset identifier where the anomaly was detected (e.g., PERMIAN-COMPLEX-A)."
            - name: severity
              in: body
              type: string
              description: "Incident severity: P1, P2, or P3."
          steps:
            - name: get-alert-details
              type: call
              call: datadog.get-monitor
              with:
                alert_id: "{{datadog_alert_id}}"
            - name: create-incident
              type: call
              call: servicenow.create-incident
              with:
                short_description: "[{{severity}}] Production anomaly: {{facility_id}}"
                urgency: "1"
                impact: "1"
                description: "Datadog alert {{datadog_alert_id}}: {{get-alert-details.message}}. Facility: {{facility_id}}"
            - name: create-jira-issue
              type: call
              call: jira.create-issue
              with:
                project_key: "OPS"
                issuetype: "Bug"
                summary: "[{{severity}}] Production anomaly at {{facility_id}}"
                description: "Incident: {{create-incident.number}} | Alert: {{datadog_alert_id}} | Details: {{get-alert-details.message}}"
            - name: alert-ops-team
              type: call
              call: msteams.send-message
              with:
                channel: "production-operations"
                text: "INCIDENT {{create-incident.number}} | {{severity}} | Facility: {{facility_id}} | Jira: {{create-jira-issue.key}}"
  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/{{alert_id}}"
          inputParameters:
            - name: alert_id
              in: path
          operations:
            - name: get-monitor
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://exxon.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://exxon.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: channel-messages
          path: "/teams/operations/channels/production/messages"
          operations:
            - name: send-message
              method: POST

Periodically checks Salesforce customer accounts for open cases, stalled opportunities, and missing contacts, and generates a health summary report via Teams for the account management team.

naftiko: "0.5"
info:
  label: "Salesforce Customer Account Health Check"
  description: "Periodically checks Salesforce customer accounts for open cases, stalled opportunities, and missing contacts, and generates a health summary report via Teams for the account management team."
  tags:
    - sales
    - crm
    - salesforce
    - msteams
    - reporting
    - account-management
capability:
  exposes:
    - type: mcp
      namespace: account-health
      port: 8080
      tools:
        - name: check-account-health
          description: "Given a Salesforce account ID, fetch open case count, active opportunity pipeline, and last activity date, then post a health summary to the account-management Teams channel."
          inputParameters:
            - name: salesforce_account_id
              in: body
              type: string
              description: "Salesforce account ID to evaluate."
          steps:
            - name: get-account
              type: call
              call: salesforce.get-account
              with:
                account_id: "{{salesforce_account_id}}"
            - name: get-open-cases
              type: call
              call: salesforce-cases.list-open-cases
              with:
                account_id: "{{salesforce_account_id}}"
            - name: post-summary
              type: call
              call: msteams.send-message
              with:
                channel: "account-management"
                text: "Account health: {{get-account.name}} | Open cases: {{get-open-cases.count}} | Last activity: {{get-account.last_activity_date}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://exxon.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: accounts
          path: "/sobjects/Account/{{account_id}}"
          inputParameters:
            - name: account_id
              in: path
          operations:
            - name: get-account
              method: GET
    - type: http
      namespace: salesforce-cases
      baseUri: "https://exxon.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: cases
          path: "/query"
          inputParameters:
            - name: account_id
              in: query
          operations:
            - name: list-open-cases
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: channel-messages
          path: "/teams/sales/channels/account-mgmt/messages"
          operations:
            - name: send-message
              method: POST

Queries Salesforce for energy supply contracts approaching renewal, creates follow-up tasks for the account team, and sends a summary digest to the commercial operations channel in Teams.

naftiko: "0.5"
info:
  label: "Salesforce Energy Contract Renewal Tracker"
  description: "Queries Salesforce for energy supply contracts approaching renewal, creates follow-up tasks for the account team, and sends a summary digest to the commercial operations channel in Teams."
  tags:
    - trading
    - salesforce
    - msteams
    - downstream
capability:
  exposes:
    - type: mcp
      namespace: contract-renewal
      port: 8080
      tools:
        - name: track-contract-renewals
          description: "Given a number of days until expiry, find all energy contracts in Salesforce approaching renewal, create tasks, and notify commercial ops via Teams."
          inputParameters:
            - name: days_until_expiry
              in: body
              type: number
              description: "Number of days before contract expiry to flag (e.g., 90)."
          steps:
            - name: find-expiring-contracts
              type: call
              call: salesforce.query-contracts
              with:
                days_until_expiry: "{{days_until_expiry}}"
            - name: create-tasks
              type: call
              call: salesforce.create-renewal-tasks
              with:
                contracts: "{{find-expiring-contracts.records}}"
            - name: notify-commercial
              type: call
              call: msteams.send-message
              with:
                channel: "commercial-operations"
                text: "Contract renewal digest | {{find-expiring-contracts.total_count}} contracts expiring within {{days_until_expiry}} days | Tasks created: {{create-tasks.count}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://exxon.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: contracts
          path: "/query"
          operations:
            - name: query-contracts
              method: GET
        - name: tasks
          path: "/sobjects/Task"
          operations:
            - name: create-renewal-tasks
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: channel-messages
          path: "/teams/commercial/channels/operations/messages"
          operations:
            - name: send-message
              method: POST

Looks up a fuel card customer account in Salesforce, returning card status, credit limit, recent transactions, and loyalty points balance for retail customer service.

naftiko: "0.5"
info:
  label: "Salesforce Fuel Card Customer Inquiry"
  description: "Looks up a fuel card customer account in Salesforce, returning card status, credit limit, recent transactions, and loyalty points balance for retail customer service."
  tags:
    - downstream
    - retail
    - salesforce
capability:
  exposes:
    - type: mcp
      namespace: fuel-card
      port: 8080
      tools:
        - name: lookup-fuel-card
          description: "Look up fuel card customer by account number or card number. Returns account status, credit limit, last transactions, and loyalty balance."
          inputParameters:
            - name: card_number
              in: body
              type: string
              description: "Fuel card number or customer account number."
          call: salesforce.get-fuel-card-account
          with:
            card_number: "{{card_number}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.records[0].Status__c"
            - name: credit_limit
              type: number
              mapping: "$.records[0].Credit_Limit__c"
            - name: loyalty_points
              type: number
              mapping: "$.records[0].Loyalty_Points__c"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://exxon.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: accounts
          path: "/query"
          operations:
            - name: get-fuel-card-account
              method: GET

Exports open and committed Salesforce opportunities for the current fiscal quarter, writes forecast data to Snowflake, and triggers a Power BI quarterly revenue dashboard refresh.

naftiko: "0.5"
info:
  label: "Salesforce Quarterly Revenue Forecast Sync"
  description: "Exports open and committed Salesforce opportunities for the current fiscal quarter, writes forecast data to Snowflake, and triggers a Power BI quarterly revenue dashboard refresh."
  tags:
    - sales
    - finance
    - forecasting
    - salesforce
    - snowflake
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: revenue-forecast
      port: 8080
      tools:
        - name: sync-revenue-forecast
          description: "Given a fiscal quarter label, export pipeline opportunities from Salesforce, write to Snowflake, and trigger a Power BI refresh for quarterly business reviews."
          inputParameters:
            - name: fiscal_quarter
              in: body
              type: string
              description: "Salesforce fiscal quarter label (e.g., Q2-2026)."
          steps:
            - name: export-opportunities
              type: call
              call: salesforce.query-pipeline
              with:
                fiscal_quarter: "{{fiscal_quarter}}"
            - name: write-forecast
              type: call
              call: snowflake.insert-forecast
              with:
                fiscal_quarter: "{{fiscal_quarter}}"
                records: "{{export-opportunities.records}}"
            - name: refresh-powerbi
              type: call
              call: powerbi.trigger-refresh
              with:
                dataset_id: "$secrets.powerbi_forecast_dataset_id"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://exxon.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: pipeline
          path: "/query"
          inputParameters:
            - name: fiscal_quarter
              in: query
          operations:
            - name: query-pipeline
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://exxon.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: forecast-table
          path: "/statements"
          operations:
            - name: insert-forecast
              method: POST
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: dataset-refreshes
          path: "/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: trigger-refresh
              method: POST

Performs a credit review for wholesale fuel customers by pulling account data from Salesforce, checking payment history in SAP, and generating a risk assessment stored in Snowflake.

naftiko: "0.5"
info:
  label: "Salesforce Wholesale Customer Credit Review"
  description: "Performs a credit review for wholesale fuel customers by pulling account data from Salesforce, checking payment history in SAP, and generating a risk assessment stored in Snowflake."
  tags:
    - downstream
    - finance
    - salesforce
    - sap
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: credit-review
      port: 8080
      tools:
        - name: review-customer-credit
          description: "Given a Salesforce account ID, pull account details, check SAP payment history, and log risk assessment in Snowflake."
          inputParameters:
            - name: account_id
              in: body
              type: string
              description: "Salesforce account ID for the wholesale customer."
          steps:
            - name: get-account
              type: call
              call: salesforce.get-account
              with:
                account_id: "{{account_id}}"
            - name: get-payment-history
              type: call
              call: sap.get-ar-aging
              with:
                customer_number: "{{get-account.sap_customer_number}}"
            - name: log-assessment
              type: call
              call: snowflake.insert-credit-assessment
              with:
                account_id: "{{account_id}}"
                aging_balance: "{{get-payment-history.total_overdue}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://exxon.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: accounts
          path: "/sobjects/Account/{{account_id}}"
          inputParameters:
            - name: account_id
              in: path
          operations:
            - name: get-account
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://exxon-s4.sap.com/sap/opu/odata/sap/FI_AR_AGING_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: ar-aging
          path: "/A_AccountReceivable"
          operations:
            - name: get-ar-aging
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://exxon.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: credit-assessments
          path: "/statements"
          operations:
            - name: insert-credit-assessment
              method: POST

Pulls contract spend data from SAP Ariba for a given commodity category, compares against budgeted amounts in SAP, and generates a variance report in Snowflake.

naftiko: "0.5"
info:
  label: "SAP Ariba Contract Spend Analysis"
  description: "Pulls contract spend data from SAP Ariba for a given commodity category, compares against budgeted amounts in SAP, and generates a variance report in Snowflake."
  tags:
    - procurement
    - sap-ariba
    - sap
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: contract-spend
      port: 8080
      tools:
        - name: analyze-contract-spend
          description: "Given a commodity category and fiscal period, pull Ariba spend, compare to SAP budget, and log variance to Snowflake."
          inputParameters:
            - name: commodity_category
              in: body
              type: string
              description: "Commodity category code (e.g., drilling-services, chemicals)."
            - name: fiscal_period
              in: body
              type: string
              description: "Fiscal period (e.g., 2026-03)."
          steps:
            - name: get-ariba-spend
              type: call
              call: ariba.get-spend
              with:
                category: "{{commodity_category}}"
                period: "{{fiscal_period}}"
            - name: get-sap-budget
              type: call
              call: sap.get-budget
              with:
                category: "{{commodity_category}}"
                period: "{{fiscal_period}}"
            - name: log-variance
              type: call
              call: snowflake.insert-variance
              with:
                category: "{{commodity_category}}"
                actual_spend: "{{get-ariba-spend.total}}"
                budgeted: "{{get-sap-budget.amount}}"
  consumes:
    - type: http
      namespace: ariba
      baseUri: "https://exxon.ariba.com/api/spend-visibility"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: spend
          path: "/reports/spend"
          operations:
            - name: get-spend
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://exxon-s4.sap.com/sap/opu/odata/sap/FI_BUDGET_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: budget
          path: "/A_BudgetAllocation"
          operations:
            - name: get-budget
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://exxon.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: variance
          path: "/statements"
          operations:
            - name: insert-variance
              method: POST

Matches incoming supplier invoices in SAP Ariba to open SAP purchase orders, flags discrepancies beyond tolerance, and routes exceptions to the AP team via ServiceNow.

naftiko: "0.5"
info:
  label: "SAP Ariba Supplier Invoice Matching"
  description: "Matches incoming supplier invoices in SAP Ariba to open SAP purchase orders, flags discrepancies beyond tolerance, and routes exceptions to the AP team via ServiceNow."
  tags:
    - procurement
    - finance
    - sap-ariba
    - sap
    - servicenow
    - invoice-matching
capability:
  exposes:
    - type: mcp
      namespace: ap-invoice
      port: 8080
      tools:
        - name: match-supplier-invoice
          description: "Given an SAP Ariba invoice ID and SAP PO number, compare invoice amounts to PO values, flag discrepancies greater than 2%, and create a ServiceNow AP exception task for review."
          inputParameters:
            - name: ariba_invoice_id
              in: body
              type: string
              description: "SAP Ariba invoice document ID."
            - name: po_number
              in: body
              type: string
              description: "SAP purchase order number to match against."
          steps:
            - name: get-invoice
              type: call
              call: ariba.get-invoice
              with:
                invoice_id: "{{ariba_invoice_id}}"
            - name: get-po
              type: call
              call: sap.get-po-header
              with:
                po_number: "{{po_number}}"
            - name: create-exception-task
              type: call
              call: servicenow.create-task
              with:
                short_description: "AP invoice exception: Ariba {{ariba_invoice_id}} vs PO {{po_number}}"
                assignment_group: "AP_Team"
                description: "Invoice amount: {{get-invoice.net_amount}}. PO amount: {{get-po.total_amount}}. Discrepancy requires review."
  consumes:
    - type: http
      namespace: ariba
      baseUri: "https://openapi.ariba.com/api/invoice/v1"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: invoices
          path: "/{{invoice_id}}"
          inputParameters:
            - name: invoice_id
              in: path
          operations:
            - name: get-invoice
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://exxon-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://exxon.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/task"
          operations:
            - name: create-task
              method: POST

Retrieves asphalt production batch data from SAP, returning batch grade, penetration test results, production date, and available inventory for downstream distribution.

naftiko: "0.5"
info:
  label: "SAP Asphalt Production Batch Tracking"
  description: "Retrieves asphalt production batch data from SAP, returning batch grade, penetration test results, production date, and available inventory for downstream distribution."
  tags:
    - downstream
    - production
    - sap
capability:
  exposes:
    - type: mcp
      namespace: asphalt-batch
      port: 8080
      tools:
        - name: get-asphalt-batch
          description: "Look up asphalt batch by batch number. Returns grade, test results, production date, and available volume."
          inputParameters:
            - name: batch_number
              in: body
              type: string
              description: "SAP batch number for the asphalt production lot."
          call: sap.get-batch-details
          with:
            batch_number: "{{batch_number}}"
          outputParameters:
            - name: grade
              type: string
              mapping: "$.d.MaterialGrade"
            - name: penetration_value
              type: number
              mapping: "$.d.PenetrationTest"
            - name: available_tons
              type: number
              mapping: "$.d.AvailableQuantity"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://exxon-s4.sap.com/sap/opu/odata/sap/MM_BATCH_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: batches
          path: "/A_Batch('{{batch_number}}')"
          inputParameters:
            - name: batch_number
              in: path
          operations:
            - name: get-batch-details
              method: GET

Retrieves batch quality inspection results from SAP Quality Management for chemical plant production batches, returning test results, conformance status, and disposition.

naftiko: "0.5"
info:
  label: "SAP Chemical Plant Batch Quality Check"
  description: "Retrieves batch quality inspection results from SAP Quality Management for chemical plant production batches, returning test results, conformance status, and disposition."
  tags:
    - downstream
    - quality
    - sap
capability:
  exposes:
    - type: mcp
      namespace: batch-quality
      port: 8080
      tools:
        - name: get-batch-quality
          description: "Look up quality inspection results by batch number. Returns test results, conformance status, and disposition decision."
          inputParameters:
            - name: batch_number
              in: body
              type: string
              description: "SAP batch number for the production lot."
          call: sap.get-inspection-lot
          with:
            batch_number: "{{batch_number}}"
          outputParameters:
            - name: conformance
              type: string
              mapping: "$.d.ConformanceStatus"
            - name: disposition
              type: string
              mapping: "$.d.UsageDecision"
            - name: test_results
              type: string
              mapping: "$.d.InspectionResults"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://exxon-s4.sap.com/sap/opu/odata/sap/QM_INSPECTION_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: inspection-lots
          path: "/A_InspectionLot(Batch='{{batch_number}}')"
          inputParameters:
            - name: batch_number
              in: path
          operations:
            - name: get-inspection-lot
              method: GET

Queries SAP Concur for expense reports pending approval beyond the policy threshold, and sends Teams reminders to the overdue approvers.

naftiko: "0.5"
info:
  label: "SAP Concur Expense Approval Reminder"
  description: "Queries SAP Concur for expense reports pending approval beyond the policy threshold, and sends Teams reminders to the overdue approvers."
  tags:
    - finance
    - expense-management
    - sap-concur
    - msteams
    - approval
capability:
  exposes:
    - type: mcp
      namespace: expense-compliance
      port: 8080
      tools:
        - name: remind-expense-approvers
          description: "Fetch SAP Concur expense reports with pending approval status older than the specified number of business days, and send Teams reminders to each approver. Use for daily finance operations oversight."
          inputParameters:
            - name: pending_days_threshold
              in: body
              type: integer
              description: "Business days an expense report can be pending before triggering a reminder (e.g., 5)."
          steps:
            - name: get-pending-reports
              type: call
              call: concur.get-pending-reports
              with:
                approval_status: "A_PEND"
            - name: send-reminders
              type: call
              call: msteams.send-message
              with:
                channel: "finance-ops"
                text: "Expense approval overdue: {{get-pending-reports.report_count}} reports pending over {{pending_days_threshold}} days. Approvers: {{get-pending-reports.approver_list}}"
  consumes:
    - type: http
      namespace: concur
      baseUri: "https://www.concursolutions.com/api/v3.0"
      authentication:
        type: bearer
        token: "$secrets.concur_token"
      resources:
        - name: expense-reports
          path: "/expense/reports"
          inputParameters:
            - name: approval_status
              in: query
          operations:
            - name: get-pending-reports
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: channel-messages
          path: "/teams/finance/channels/ops/messages"
          operations:
            - name: send-message
              method: POST

Retrieves corrosion inhibitor injection rates from SAP for pipeline segments, returning current dosage, target rate, and compliance status.

naftiko: "0.5"
info:
  label: "SAP Corrosion Inhibitor Injection Rate"
  description: "Retrieves corrosion inhibitor injection rates from SAP for pipeline segments, returning current dosage, target rate, and compliance status."
  tags:
    - upstream
    - safety
    - sap
    - maintenance
capability:
  exposes:
    - type: mcp
      namespace: corrosion-inhibitor
      port: 8080
      tools:
        - name: get-inhibitor-rate
          description: "Look up corrosion inhibitor injection rate by pipeline equipment number. Returns current rate, target, and compliance."
          inputParameters:
            - name: equipment_number
              in: body
              type: string
              description: "SAP equipment number for the injection point."
          call: sap.get-inhibitor-data
          with:
            equipment_number: "{{equipment_number}}"
          outputParameters:
            - name: current_rate_ppm
              type: number
              mapping: "$.d.CurrentRate"
            - name: target_rate_ppm
              type: number
              mapping: "$.d.TargetRate"
            - name: compliant
              type: boolean
              mapping: "$.d.WithinSpec"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://exxon-s4.sap.com/sap/opu/odata/sap/PM_MEASUREMENT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: inhibitor-data
          path: "/A_MeasurementDocument(Equipment='{{equipment_number}}')"
          inputParameters:
            - name: equipment_number
              in: path
          operations:
            - name: get-inhibitor-data
              method: GET

Retrieves the crude blending recipe from SAP for a given refinery run, returning feedstock grades, blend ratios, and target API gravity specifications.

naftiko: "0.5"
info:
  label: "SAP Crude Blending Recipe Lookup"
  description: "Retrieves the crude blending recipe from SAP for a given refinery run, returning feedstock grades, blend ratios, and target API gravity specifications."
  tags:
    - refining
    - sap
    - production
capability:
  exposes:
    - type: mcp
      namespace: crude-blending
      port: 8080
      tools:
        - name: get-blend-recipe
          description: "Look up crude blending recipe by process order number. Returns feedstock grades, ratios, and target specifications."
          inputParameters:
            - name: process_order
              in: body
              type: string
              description: "SAP process order number for the refinery run."
          call: sap.get-recipe
          with:
            process_order: "{{process_order}}"
          outputParameters:
            - name: feedstocks
              type: string
              mapping: "$.d.FeedstockList"
            - name: target_api
              type: number
              mapping: "$.d.TargetAPIGravity"
            - name: target_sulfur_pct
              type: number
              mapping: "$.d.TargetSulfurContent"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://exxon-s4.sap.com/sap/opu/odata/sap/PP_PROCESS_ORDER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: recipes
          path: "/A_ProcessOrder('{{process_order}}')/to_Recipe"
          inputParameters:
            - name: process_order
              in: path
          operations:
            - name: get-recipe
              method: GET

Retrieves current crude oil inventory levels from SAP for a given storage terminal, returning tank volumes, product grades, and last measurement timestamps.

naftiko: "0.5"
info:
  label: "SAP Crude Oil Inventory Lookup"
  description: "Retrieves current crude oil inventory levels from SAP for a given storage terminal, returning tank volumes, product grades, and last measurement timestamps."
  tags:
    - upstream
    - inventory
    - sap
    - supply-chain
capability:
  exposes:
    - type: mcp
      namespace: crude-inventory
      port: 8080
      tools:
        - name: get-crude-inventory
          description: "Look up crude oil inventory by storage terminal ID. Returns tank volumes, product grades, and last measurement timestamps for upstream supply chain visibility."
          inputParameters:
            - name: terminal_id
              in: body
              type: string
              description: "SAP plant code for the storage terminal (e.g., BAYTOWN-T01)."
          call: sap.get-inventory
          with:
            terminal_id: "{{terminal_id}}"
          outputParameters:
            - name: total_volume_bbl
              type: number
              mapping: "$.d.TotalVolume"
            - name: product_grade
              type: string
              mapping: "$.d.MaterialGrade"
            - name: last_measured
              type: string
              mapping: "$.d.LastMeasurementDate"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://exxon-s4.sap.com/sap/opu/odata/sap/MM_INVENTORY_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: inventory
          path: "/A_MaterialStock(Plant='{{terminal_id}}')"
          inputParameters:
            - name: terminal_id
              in: path
          operations:
            - name: get-inventory
              method: GET

Retrieves demurrage claim data from SAP for marine terminal operations, returning vessel wait times, demurrage rates, and claim amounts for cost management.

naftiko: "0.5"
info:
  label: "SAP Demurrage Claim Tracker"
  description: "Retrieves demurrage claim data from SAP for marine terminal operations, returning vessel wait times, demurrage rates, and claim amounts for cost management."
  tags:
    - downstream
    - trading
    - sap
    - logistics
capability:
  exposes:
    - type: mcp
      namespace: demurrage
      port: 8080
      tools:
        - name: get-demurrage-claim
          description: "Look up demurrage claim by voyage number. Returns vessel wait time, rate, claim amount, and status."
          inputParameters:
            - name: voyage_number
              in: body
              type: string
              description: "SAP voyage/shipment reference number."
          call: sap.get-demurrage
          with:
            voyage_number: "{{voyage_number}}"
          outputParameters:
            - name: wait_hours
              type: number
              mapping: "$.d.WaitingHours"
            - name: demurrage_rate
              type: number
              mapping: "$.d.DailyRate"
            - name: claim_amount
              type: number
              mapping: "$.d.ClaimAmount"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://exxon-s4.sap.com/sap/opu/odata/sap/SD_SHIPMENT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: demurrage
          path: "/A_DemurrageClaim('{{voyage_number}}')"
          inputParameters:
            - name: voyage_number
              in: path
          operations:
            - name: get-demurrage
              method: GET

Looks up the shipment status of a downstream petroleum product delivery in SAP Transportation Management, returning carrier, ETA, and delivery quantity.

naftiko: "0.5"
info:
  label: "SAP Downstream Product Shipment Status"
  description: "Looks up the shipment status of a downstream petroleum product delivery in SAP Transportation Management, returning carrier, ETA, and delivery quantity."
  tags:
    - downstream
    - logistics
    - sap
    - supply-chain
capability:
  exposes:
    - type: mcp
      namespace: shipment-status
      port: 8080
      tools:
        - name: get-shipment-status
          description: "Look up a downstream product shipment by delivery number. Returns carrier name, current status, ETA, and quantity in barrels."
          inputParameters:
            - name: delivery_number
              in: body
              type: string
              description: "SAP delivery document number (e.g., 8000012345)."
          call: sap.get-delivery
          with:
            delivery_number: "{{delivery_number}}"
          outputParameters:
            - name: carrier
              type: string
              mapping: "$.d.CarrierName"
            - name: status
              type: string
              mapping: "$.d.OverallStatus"
            - name: eta
              type: string
              mapping: "$.d.PlannedArrivalDate"
            - name: quantity_bbl
              type: number
              mapping: "$.d.TotalQuantity"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://exxon-s4.sap.com/sap/opu/odata/sap/SD_DELIVERY_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: deliveries
          path: "/A_OutboundDelivery('{{delivery_number}}')"
          inputParameters:
            - name: delivery_number
              in: path
          operations:
            - name: get-delivery
              method: GET

Creates preventive maintenance work orders in SAP for electrical substations at refinery and upstream facilities, scheduling transformer oil testing, relay calibration, and switchgear inspections.

naftiko: "0.5"
info:
  label: "SAP Electrical Substation Preventive Maintenance"
  description: "Creates preventive maintenance work orders in SAP for electrical substations at refinery and upstream facilities, scheduling transformer oil testing, relay calibration, and switchgear inspections."
  tags:
    - maintenance
    - safety
    - sap
    - refining
capability:
  exposes:
    - type: mcp
      namespace: substation-pm
      port: 8080
      tools:
        - name: schedule-substation-pm
          description: "Given a substation functional location and PM type, create a preventive maintenance work order in SAP."
          inputParameters:
            - name: functional_location
              in: body
              type: string
              description: "SAP functional location for the electrical substation."
            - name: pm_type
              in: body
              type: string
              description: "PM type: transformer-oil-test, relay-calibration, switchgear-inspection."
          steps:
            - name: create-pm-order
              type: call
              call: sap.create-pm-work-order
              with:
                functional_location: "{{functional_location}}"
                order_type: "PM01"
                short_text: "Scheduled {{pm_type}} for substation {{functional_location}}"
            - name: notify-team
              type: call
              call: msteams.send-message
              with:
                channel: "electrical-maintenance"
                text: "PM scheduled | Substation: {{functional_location}} | Type: {{pm_type}} | WO: {{create-pm-order.order_number}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://exxon-s4.sap.com/sap/opu/odata/sap/PM_ORDER_CREATE_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: work-orders
          path: "/A_MaintenanceOrder"
          operations:
            - name: create-pm-work-order
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: channel-messages
          path: "/teams/maintenance/channels/electrical/messages"
          operations:
            - name: send-message
              method: POST

Retrieves flare gas recovery rates from SAP Plant Maintenance for a given refinery unit, returning recovery percentage, flare volume, and compliance status against regulatory limits.

naftiko: "0.5"
info:
  label: "SAP Flare Gas Recovery Monitoring"
  description: "Retrieves flare gas recovery rates from SAP Plant Maintenance for a given refinery unit, returning recovery percentage, flare volume, and compliance status against regulatory limits."
  tags:
    - environmental
    - refining
    - sap
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: flare-recovery
      port: 8080
      tools:
        - name: get-flare-recovery
          description: "Look up flare gas recovery metrics by refinery unit. Returns recovery rate, flare volume, and regulatory compliance status."
          inputParameters:
            - name: unit_id
              in: body
              type: string
              description: "SAP functional location for the refinery unit."
          call: sap.get-flare-metrics
          with:
            unit_id: "{{unit_id}}"
          outputParameters:
            - name: recovery_pct
              type: number
              mapping: "$.d.RecoveryPercentage"
            - name: flare_volume_mcf
              type: number
              mapping: "$.d.FlareVolume"
            - name: compliant
              type: boolean
              mapping: "$.d.RegulatoryCompliant"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://exxon-s4.sap.com/sap/opu/odata/sap/PM_MEASUREMENT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: flare-metrics
          path: "/A_MeasurementDocument(FunctionalLocation='{{unit_id}}')"
          inputParameters:
            - name: unit_id
              in: path
          operations:
            - name: get-flare-metrics
              method: GET

Retrieves current fuel rack prices from SAP for gasoline, diesel, and jet fuel at specified terminals, returning posted price, effective date, and pricing zone.

naftiko: "0.5"
info:
  label: "SAP Fuel Rack Pricing Update"
  description: "Retrieves current fuel rack prices from SAP for gasoline, diesel, and jet fuel at specified terminals, returning posted price, effective date, and pricing zone."
  tags:
    - downstream
    - trading
    - sap
capability:
  exposes:
    - type: mcp
      namespace: rack-pricing
      port: 8080
      tools:
        - name: get-rack-prices
          description: "Look up fuel rack prices by terminal and product type. Returns posted price, effective date, and pricing zone."
          inputParameters:
            - name: terminal_code
              in: body
              type: string
              description: "Terminal code for pricing lookup."
            - name: product_type
              in: body
              type: string
              description: "Product type: gasoline, diesel, jet-fuel."
          call: sap.get-rack-price
          with:
            terminal_code: "{{terminal_code}}"
            product_type: "{{product_type}}"
          outputParameters:
            - name: posted_price
              type: number
              mapping: "$.d.PostedPrice"
            - name: effective_date
              type: string
              mapping: "$.d.EffectiveDate"
            - name: pricing_zone
              type: string
              mapping: "$.d.PricingZone"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://exxon-s4.sap.com/sap/opu/odata/sap/SD_PRICING_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: rack-prices
          path: "/A_PricingCondition"
          inputParameters:
            - name: terminal_code
              in: query
            - name: product_type
              in: query
          operations:
            - name: get-rack-price
              method: GET

Retrieves natural gas liquids recovery data from SAP for a gas processing plant, returning NGL volumes by product, recovery efficiency, and shrinkage percentage.

naftiko: "0.5"
info:
  label: "SAP Gas Plant NGL Recovery Report"
  description: "Retrieves natural gas liquids recovery data from SAP for a gas processing plant, returning NGL volumes by product, recovery efficiency, and shrinkage percentage."
  tags:
    - upstream
    - production
    - sap
capability:
  exposes:
    - type: mcp
      namespace: ngl-recovery
      port: 8080
      tools:
        - name: get-ngl-recovery
          description: "Look up NGL recovery metrics by gas plant code. Returns ethane, propane, butane volumes, recovery efficiency, and shrinkage."
          inputParameters:
            - name: plant_code
              in: body
              type: string
              description: "SAP plant code for the gas processing facility."
          call: sap.get-ngl-data
          with:
            plant_code: "{{plant_code}}"
          outputParameters:
            - name: ethane_bbl
              type: number
              mapping: "$.d.EthaneVolume"
            - name: propane_bbl
              type: number
              mapping: "$.d.PropaneVolume"
            - name: recovery_efficiency_pct
              type: number
              mapping: "$.d.RecoveryEfficiency"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://exxon-s4.sap.com/sap/opu/odata/sap/OG_PRODUCTION_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: ngl-data
          path: "/A_GasPlantProduction"
          inputParameters:
            - name: plant_code
              in: query
          operations:
            - name: get-ngl-data
              method: GET

Retrieves heat exchanger performance data from SAP Plant Maintenance, calculating fouling factor trends and flagging units that need cleaning for refinery reliability.

naftiko: "0.5"
info:
  label: "SAP Heat Exchanger Fouling Monitor"
  description: "Retrieves heat exchanger performance data from SAP Plant Maintenance, calculating fouling factor trends and flagging units that need cleaning for refinery reliability."
  tags:
    - refining
    - maintenance
    - sap
capability:
  exposes:
    - type: mcp
      namespace: hx-fouling
      port: 8080
      tools:
        - name: get-fouling-status
          description: "Look up heat exchanger fouling metrics by equipment number. Returns fouling factor, duty degradation, and recommended cleaning date."
          inputParameters:
            - name: equipment_number
              in: body
              type: string
              description: "SAP equipment number for the heat exchanger."
          call: sap.get-hx-performance
          with:
            equipment_number: "{{equipment_number}}"
          outputParameters:
            - name: fouling_factor
              type: number
              mapping: "$.d.FoulingFactor"
            - name: duty_degradation_pct
              type: number
              mapping: "$.d.DutyDegradation"
            - name: cleaning_recommended
              type: boolean
              mapping: "$.d.CleaningRecommended"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://exxon-s4.sap.com/sap/opu/odata/sap/PM_MEASUREMENT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: hx-data
          path: "/A_MeasurementDocument(Equipment='{{equipment_number}}')"
          inputParameters:
            - name: equipment_number
              in: path
          operations:
            - name: get-hx-performance
              method: GET

Retrieves hydrogen production unit operating data from SAP for refinery operations, returning production rate, purity level, and feed gas consumption.

naftiko: "0.5"
info:
  label: "SAP Hydrogen Production Unit Status"
  description: "Retrieves hydrogen production unit operating data from SAP for refinery operations, returning production rate, purity level, and feed gas consumption."
  tags:
    - refining
    - production
    - sap
capability:
  exposes:
    - type: mcp
      namespace: hydrogen-unit
      port: 8080
      tools:
        - name: get-hydrogen-status
          description: "Look up hydrogen production unit status by equipment number. Returns production rate, purity, and feed gas usage."
          inputParameters:
            - name: unit_id
              in: body
              type: string
              description: "SAP equipment number for the hydrogen unit."
          call: sap.get-hydrogen-data
          with:
            unit_id: "{{unit_id}}"
          outputParameters:
            - name: production_rate_scfh
              type: number
              mapping: "$.d.ProductionRate"
            - name: purity_pct
              type: number
              mapping: "$.d.H2Purity"
            - name: feed_gas_mcf
              type: number
              mapping: "$.d.FeedGasConsumption"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://exxon-s4.sap.com/sap/opu/odata/sap/PP_PRODUCTION_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: hydrogen
          path: "/A_ProductionUnit('{{unit_id}}')"
          inputParameters:
            - name: unit_id
              in: path
          operations:
            - name: get-hydrogen-data
              method: GET

Retrieves intercompany crude oil transfer pricing from SAP, returning transfer price, quality adjustment, and transportation differential for internal accounting.

naftiko: "0.5"
info:
  label: "SAP Intercompany Crude Transfer Pricing"
  description: "Retrieves intercompany crude oil transfer pricing from SAP, returning transfer price, quality adjustment, and transportation differential for internal accounting."
  tags:
    - trading
    - finance
    - sap
capability:
  exposes:
    - type: mcp
      namespace: transfer-pricing
      port: 8080
      tools:
        - name: get-transfer-price
          description: "Look up intercompany crude transfer price by contract and period. Returns base price, quality differential, and transport cost."
          inputParameters:
            - name: contract_number
              in: body
              type: string
              description: "SAP intercompany contract number."
            - name: period
              in: body
              type: string
              description: "Pricing period in YYYY-MM format."
          call: sap.get-transfer-price
          with:
            contract_number: "{{contract_number}}"
            period: "{{period}}"
          outputParameters:
            - name: base_price
              type: number
              mapping: "$.d.BasePrice"
            - name: quality_adjustment
              type: number
              mapping: "$.d.QualityDifferential"
            - name: transport_cost
              type: number
              mapping: "$.d.TransportCost"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://exxon-s4.sap.com/sap/opu/odata/sap/SD_PRICING_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: transfer-prices
          path: "/A_IntercompanyPrice"
          inputParameters:
            - name: contract_number
              in: query
            - name: period
              in: query
          operations:
            - name: get-transfer-price
              method: GET

Retrieves production volumes from SAP and calculates royalty payments owed to mineral rights owners based on lease terms, posting results to Snowflake for audit and reporting.

naftiko: "0.5"
info:
  label: "SAP Lease Royalty Payment Calculation"
  description: "Retrieves production volumes from SAP and calculates royalty payments owed to mineral rights owners based on lease terms, posting results to Snowflake for audit and reporting."
  tags:
    - upstream
    - finance
    - sap
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: royalty-calc
      port: 8080
      tools:
        - name: calculate-royalties
          description: "Given a lease ID and production month, pull SAP volumes, calculate royalties, and log to Snowflake."
          inputParameters:
            - name: lease_id
              in: body
              type: string
              description: "SAP lease contract ID."
            - name: production_month
              in: body
              type: string
              description: "Production month in YYYY-MM format."
          steps:
            - name: get-production
              type: call
              call: sap.get-lease-production
              with:
                lease_id: "{{lease_id}}"
                month: "{{production_month}}"
            - name: log-royalty
              type: call
              call: snowflake.insert-royalty-record
              with:
                lease_id: "{{lease_id}}"
                volume: "{{get-production.total_volume}}"
                month: "{{production_month}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://exxon-s4.sap.com/sap/opu/odata/sap/OG_PRODUCTION_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: lease-production
          path: "/A_LeaseProduction"
          operations:
            - name: get-lease-production
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://exxon.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: royalties
          path: "/statements"
          operations:
            - name: insert-royalty-record
              method: POST

Retrieves LNG cargo nomination status from SAP, returning nominated volume, loading port, discharge port, vessel assignment, and laycan window.

naftiko: "0.5"
info:
  label: "SAP LNG Cargo Nomination Status"
  description: "Retrieves LNG cargo nomination status from SAP, returning nominated volume, loading port, discharge port, vessel assignment, and laycan window."
  tags:
    - trading
    - logistics
    - sap
    - downstream
capability:
  exposes:
    - type: mcp
      namespace: lng-nomination
      port: 8080
      tools:
        - name: get-lng-nomination
          description: "Look up LNG cargo nomination by contract number. Returns nominated volume, ports, vessel, and laycan dates."
          inputParameters:
            - name: contract_number
              in: body
              type: string
              description: "SAP LNG contract/nomination number."
          call: sap.get-lng-nomination
          with:
            contract_number: "{{contract_number}}"
          outputParameters:
            - name: volume_mmbtu
              type: number
              mapping: "$.d.NominatedVolume"
            - name: loading_port
              type: string
              mapping: "$.d.LoadingPort"
            - name: vessel
              type: string
              mapping: "$.d.VesselName"
            - name: laycan_start
              type: string
              mapping: "$.d.LaycanStart"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://exxon-s4.sap.com/sap/opu/odata/sap/SD_SHIPMENT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: lng-nominations
          path: "/A_LNGNomination('{{contract_number}}')"
          inputParameters:
            - name: contract_number
              in: path
          operations:
            - name: get-lng-nomination
              method: GET

Tracks lubricant product order fulfillment in SAP, returning order status, shipped quantities, and delivery confirmation for downstream distribution operations.

naftiko: "0.5"
info:
  label: "SAP Lubricants Order Fulfillment Tracker"
  description: "Tracks lubricant product order fulfillment in SAP, returning order status, shipped quantities, and delivery confirmation for downstream distribution operations."
  tags:
    - downstream
    - sap
    - logistics
capability:
  exposes:
    - type: mcp
      namespace: lubricants-fulfillment
      port: 8080
      tools:
        - name: get-lubricant-order-status
          description: "Look up lubricant order fulfillment by sales order number. Returns line item status, shipped quantities, and delivery dates."
          inputParameters:
            - name: sales_order
              in: body
              type: string
              description: "SAP sales order number for the lubricant order."
          call: sap.get-sales-order
          with:
            sales_order: "{{sales_order}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.d.OverallDeliveryStatus"
            - name: shipped_qty
              type: number
              mapping: "$.d.TotalDeliveredQuantity"
            - name: delivery_date
              type: string
              mapping: "$.d.ActualDeliveryDate"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://exxon-s4.sap.com/sap/opu/odata/sap/SD_SALES_ORDER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: sales-orders
          path: "/A_SalesOrder('{{sales_order}}')"
          inputParameters:
            - name: sales_order
              in: path
          operations:
            - name: get-sales-order
              method: GET

Retrieves the marine vessel loading schedule from SAP for a given terminal, returning vessel name, cargo type, loading window, and nominated volume.

naftiko: "0.5"
info:
  label: "SAP Marine Vessel Loading Schedule"
  description: "Retrieves the marine vessel loading schedule from SAP for a given terminal, returning vessel name, cargo type, loading window, and nominated volume."
  tags:
    - downstream
    - logistics
    - sap
    - trading
capability:
  exposes:
    - type: mcp
      namespace: vessel-loading
      port: 8080
      tools:
        - name: get-loading-schedule
          description: "Look up vessel loading schedule by terminal and date range. Returns vessel names, cargo types, windows, and volumes."
          inputParameters:
            - name: terminal_code
              in: body
              type: string
              description: "SAP terminal plant code."
            - name: date_from
              in: body
              type: string
              description: "Start date in YYYY-MM-DD format."
          call: sap.get-vessel-schedule
          with:
            terminal_code: "{{terminal_code}}"
            date_from: "{{date_from}}"
          outputParameters:
            - name: vessels
              type: string
              mapping: "$.d.results"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://exxon-s4.sap.com/sap/opu/odata/sap/SD_SHIPMENT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: vessel-schedule
          path: "/A_Shipment"
          inputParameters:
            - name: terminal_code
              in: query
            - name: date_from
              in: query
          operations:
            - name: get-vessel-schedule
              method: GET

Checks SAP MRP for materials below reorder point at a given plant, creates SAP purchase requisitions, and notifies the procurement team via Teams.

naftiko: "0.5"
info:
  label: "SAP Material Inventory Reorder Alert"
  description: "Checks SAP MRP for materials below reorder point at a given plant, creates SAP purchase requisitions, and notifies the procurement team via Teams."
  tags:
    - supply-chain
    - procurement
    - sap
    - msteams
    - inventory
capability:
  exposes:
    - type: mcp
      namespace: inventory-ops
      port: 8080
      tools:
        - name: alert-material-reorder
          description: "Given a SAP plant code, query MRP for materials below reorder point, create purchase requisitions in SAP, and notify the procurement team via Teams with a reorder summary."
          inputParameters:
            - name: plant_code
              in: body
              type: string
              description: "SAP plant code to scan for low stock (e.g., 2001)."
          steps:
            - name: get-low-stock-materials
              type: call
              call: sap.list-below-reorder-point
              with:
                plant: "{{plant_code}}"
            - name: create-pr
              type: call
              call: sap-pr.create-purchase-requisition
              with:
                plant: "{{plant_code}}"
                materials: "{{get-low-stock-materials.material_list}}"
            - name: notify-procurement
              type: call
              call: msteams.send-message
              with:
                channel: "procurement"
                text: "Reorder alert at plant {{plant_code}}: {{get-low-stock-materials.count}} materials below minimum. PRs created: {{create-pr.requisition_numbers}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://exxon-s4.sap.com/sap/opu/odata/sap/API_MRP_MATERIALS_SRV_01"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: mrp-materials
          path: "/A_MRPMaterial"
          inputParameters:
            - name: plant
              in: query
          operations:
            - name: list-below-reorder-point
              method: GET
    - type: http
      namespace: sap-pr
      baseUri: "https://exxon-s4.sap.com/sap/opu/odata/sap/MM_PUR_REQ_MAINT_V2_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: purchase-requisitions
          path: "/A_PurchaseRequisitionHeader"
          operations:
            - name: create-purchase-requisition
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: channel-messages
          path: "/teams/procurement/channels/general/messages"
          operations:
            - name: send-message
              method: POST

Retrieves the material safety data sheet (MSDS) for a given chemical material number from SAP EHS, returning hazard classifications, handling instructions, and emergency contacts.

naftiko: "0.5"
info:
  label: "SAP Material Safety Data Sheet Lookup"
  description: "Retrieves the material safety data sheet (MSDS) for a given chemical material number from SAP EHS, returning hazard classifications, handling instructions, and emergency contacts."
  tags:
    - safety
    - environmental
    - sap
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: msds-lookup
      port: 8080
      tools:
        - name: get-msds
          description: "Look up an MSDS by SAP material number. Returns hazard class, handling instructions, PPE requirements, and emergency contact information."
          inputParameters:
            - name: material_number
              in: body
              type: string
              description: "SAP material number for the chemical (e.g., 000000001234)."
          call: sap.get-msds
          with:
            material_number: "{{material_number}}"
          outputParameters:
            - name: hazard_class
              type: string
              mapping: "$.d.HazardClassification"
            - name: handling_instructions
              type: string
              mapping: "$.d.HandlingInstructions"
            - name: ppe_required
              type: string
              mapping: "$.d.PPERequirements"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://exxon-s4.sap.com/sap/opu/odata/sap/EHS_MSDS_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: safety-data-sheets
          path: "/A_MaterialSafetySheet('{{material_number}}')"
          inputParameters:
            - name: material_number
              in: path
          operations:
            - name: get-msds
              method: GET

Retrieves operational status of a natural gas liquefaction train from SAP Plant Maintenance, returning throughput rate, temperature readings, and maintenance alerts.

naftiko: "0.5"
info:
  label: "SAP Natural Gas Liquefaction Unit Status"
  description: "Retrieves operational status of a natural gas liquefaction train from SAP Plant Maintenance, returning throughput rate, temperature readings, and maintenance alerts."
  tags:
    - lng
    - downstream
    - sap
    - production
capability:
  exposes:
    - type: mcp
      namespace: lng-unit-status
      port: 8080
      tools:
        - name: get-liquefaction-status
          description: "Look up natural gas liquefaction unit status by functional location."
          inputParameters:
            - name: functional_location
              in: body
              type: string
              description: "SAP functional location for the liquefaction train."
          call: "sap.get-unit-status"
          with:
            functional_location: "{{functional_location}}"
          outputParameters:
            - name: throughput_mmscfd
              type: number
              mapping: "$.d.Throughput"
            - name: operating_status
              type: string
              mapping: "$.d.OperatingStatus"
            - name: next_maintenance
              type: string
              mapping: "$.d.NextMaintenanceDate"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://exxon-s4.sap.com/sap/opu/odata/sap/PM_FUNCLOC_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: unit-status
          path: "/A_FunctionalLocation('{{functional_location}}')"
          inputParameters:
            - name: functional_location
              in: path
          operations:
            - name: get-unit-status
              method: GET

Retrieves natural gas pipeline nomination balances from SAP, returning nominated vs actual flow volumes, imbalance quantity, and penalty exposure.

naftiko: "0.5"
info:
  label: "SAP Natural Gas Nomination Balance"
  description: "Retrieves natural gas pipeline nomination balances from SAP, returning nominated vs actual flow volumes, imbalance quantity, and penalty exposure."
  tags:
    - trading
    - upstream
    - sap
capability:
  exposes:
    - type: mcp
      namespace: gas-nomination
      port: 8080
      tools:
        - name: get-nomination-balance
          description: "Look up gas nomination balance by pipeline contract. Returns nominated, actual, imbalance, and penalty exposure."
          inputParameters:
            - name: pipeline_contract
              in: body
              type: string
              description: "SAP pipeline transportation contract number."
          call: sap.get-gas-balance
          with:
            pipeline_contract: "{{pipeline_contract}}"
          outputParameters:
            - name: nominated_mcf
              type: number
              mapping: "$.d.NominatedVolume"
            - name: actual_mcf
              type: number
              mapping: "$.d.ActualVolume"
            - name: imbalance_mcf
              type: number
              mapping: "$.d.ImbalanceVolume"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://exxon-s4.sap.com/sap/opu/odata/sap/OG_GAS_BALANCE_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: gas-balances
          path: "/A_GasNominationBalance('{{pipeline_contract}}')"
          inputParameters:
            - name: pipeline_contract
              in: path
          operations:
            - name: get-gas-balance
              method: GET

Retrieves spare parts availability from SAP for offshore platform equipment, returning stock levels, warehouse location, and lead times for critical maintenance parts.

naftiko: "0.5"
info:
  label: "SAP Offshore Platform Spare Parts Lookup"
  description: "Retrieves spare parts availability from SAP for offshore platform equipment, returning stock levels, warehouse location, and lead times for critical maintenance parts."
  tags:
    - upstream
    - inventory
    - sap
    - maintenance
capability:
  exposes:
    - type: mcp
      namespace: offshore-spares
      port: 8080
      tools:
        - name: lookup-spare-parts
          description: "Look up spare parts availability by material number and offshore plant. Returns stock, location, and lead time."
          inputParameters:
            - name: material_number
              in: body
              type: string
              description: "SAP material number for the spare part."
            - name: platform_code
              in: body
              type: string
              description: "SAP plant code for the offshore platform."
          call: sap.get-spare-stock
          with:
            material_number: "{{material_number}}"
            platform_code: "{{platform_code}}"
          outputParameters:
            - name: available_qty
              type: number
              mapping: "$.d.AvailableStock"
            - name: warehouse
              type: string
              mapping: "$.d.StorageLocation"
            - name: lead_time_days
              type: number
              mapping: "$.d.ReplenishmentLeadTime"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://exxon-s4.sap.com/sap/opu/odata/sap/MM_INVENTORY_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: stock
          path: "/A_MaterialStock"
          inputParameters:
            - name: material_number
              in: query
            - name: platform_code
              in: query
          operations:
            - name: get-spare-stock
              method: GET

At month-end, queries SAP for open financial documents, creates a ServiceNow change request for the close checklist, and notifies the finance controller team via Teams.

naftiko: "0.5"
info:
  label: "SAP Period Close Checklist"
  description: "At month-end, queries SAP for open financial documents, creates a ServiceNow change request for the close checklist, and notifies the finance controller team via Teams."
  tags:
    - finance
    - erp
    - sap
    - servicenow
    - msteams
    - period-close
capability:
  exposes:
    - type: mcp
      namespace: finance-close
      port: 8080
      tools:
        - name: run-period-close
          description: "Given a SAP fiscal period and company code, query open FI posting documents, open a ServiceNow change request, and notify the controller team in Teams. Use at the start of month-end close."
          inputParameters:
            - name: fiscal_period
              in: body
              type: string
              description: "SAP fiscal period in YYYYMM format (e.g., 202503)."
            - name: company_code
              in: body
              type: string
              description: "SAP company code (e.g., XOM1)."
          steps:
            - name: get-open-items
              type: call
              call: sap.get-open-fi-items
              with:
                fiscal_period: "{{fiscal_period}}"
                company_code: "{{company_code}}"
            - name: create-change-request
              type: call
              call: servicenow.create-change-request
              with:
                short_description: "Period close {{fiscal_period}} — {{company_code}}"
                category: "financial_close"
                description: "Open FI items: {{get-open-items.count}}. Period: {{fiscal_period}}"
            - name: notify-controllers
              type: call
              call: msteams.send-message
              with:
                channel: "finance-controllers"
                text: "Period close initiated {{fiscal_period}} / {{company_code}}. Open items: {{get-open-items.count}}. Change: {{create-change-request.number}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://exxon-s4.sap.com/sap/opu/odata/sap/API_JOURNALENTRYITEMBASIC_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: fi-items
          path: "/A_JournalEntryItem"
          inputParameters:
            - name: fiscal_period
              in: query
            - name: company_code
              in: query
          operations:
            - name: get-open-fi-items
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://exxon.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: change-requests
          path: "/table/change_request"
          operations:
            - name: create-change-request
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: channel-messages
          path: "/teams/finance/channels/controllers/messages"
          operations:
            - name: send-message
              method: POST

Retrieves pipeline integrity inspection records from SAP Plant Maintenance, returning last inspection date, wall thickness readings, corrosion rate, and next scheduled inspection.

naftiko: "0.5"
info:
  label: "SAP Pipeline Integrity Inspection Tracker"
  description: "Retrieves pipeline integrity inspection records from SAP Plant Maintenance, returning last inspection date, wall thickness readings, corrosion rate, and next scheduled inspection."
  tags:
    - upstream
    - safety
    - sap
    - maintenance
capability:
  exposes:
    - type: mcp
      namespace: pipeline-integrity
      port: 8080
      tools:
        - name: get-inspection-status
          description: "Look up pipeline integrity inspection history by functional location. Returns last inspection, wall thickness, corrosion rate, and next due date."
          inputParameters:
            - name: functional_location
              in: body
              type: string
              description: "SAP functional location for the pipeline segment."
          call: sap.get-inspection-records
          with:
            functional_location: "{{functional_location}}"
          outputParameters:
            - name: last_inspection
              type: string
              mapping: "$.d.LastInspectionDate"
            - name: wall_thickness_mm
              type: number
              mapping: "$.d.WallThickness"
            - name: corrosion_rate
              type: number
              mapping: "$.d.CorrosionRate"
            - name: next_due
              type: string
              mapping: "$.d.NextInspectionDate"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://exxon-s4.sap.com/sap/opu/odata/sap/PM_MEASUREMENT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: inspections
          path: "/A_MeasurementDocument"
          inputParameters:
            - name: functional_location
              in: query
          operations:
            - name: get-inspection-records
              method: GET

Retrieves pipeline right-of-way inspection records from SAP, returning encroachment findings, vegetation status, and marker condition for pipeline safety compliance.

naftiko: "0.5"
info:
  label: "SAP Pipeline Right-of-Way Inspection"
  description: "Retrieves pipeline right-of-way inspection records from SAP, returning encroachment findings, vegetation status, and marker condition for pipeline safety compliance."
  tags:
    - upstream
    - safety
    - sap
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: row-inspection
      port: 8080
      tools:
        - name: get-row-inspection
          description: "Look up pipeline ROW inspection by functional location. Returns encroachment findings and marker status."
          inputParameters:
            - name: functional_location
              in: body
              type: string
              description: "SAP functional location for the pipeline segment."
          call: sap.get-row-records
          with:
            functional_location: "{{functional_location}}"
          outputParameters:
            - name: encroachments
              type: number
              mapping: "$.d.EncroachmentCount"
            - name: vegetation_status
              type: string
              mapping: "$.d.VegetationCondition"
            - name: markers_ok
              type: boolean
              mapping: "$.d.AllMarkersIntact"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://exxon-s4.sap.com/sap/opu/odata/sap/PM_MEASUREMENT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: row-inspections
          path: "/A_InspectionRecord"
          inputParameters:
            - name: functional_location
              in: query
          operations:
            - name: get-row-records
              method: GET

Looks up a SAP purchase order by number and returns structured header status, vendor name, total value, and open line items for procurement and supply chain queries.

naftiko: "0.5"
info:
  label: "SAP Purchase Order Status Lookup"
  description: "Looks up a SAP purchase order by number and returns structured header status, vendor name, total value, and open line items for procurement and supply chain queries."
  tags:
    - procurement
    - erp
    - sap
    - supply-chain
capability:
  exposes:
    - type: mcp
      namespace: procurement-lookup
      port: 8080
      tools:
        - name: get-purchase-order
          description: "Look up a SAP purchase order by PO number. Returns header status, vendor name, total value, currency, and delivery status. Use to verify procurement status for upstream or downstream supply chain queries."
          inputParameters:
            - name: po_number
              in: body
              type: string
              description: "SAP purchase order number (10-digit, e.g., 4500099876)."
          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://exxon-s4.sap.com/sap/opu/odata/sap/MM_PUR_PO_MAINT_V2_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: purchase-orders
          path: "/A_PurchaseOrder('{{po_number}}')"
          inputParameters:
            - name: po_number
              in: path
          operations:
            - name: get-po
              method: GET
              outputRawFormat: xml

Checks catalyst inventory levels in SAP for refinery process units, returning available quantity, reorder point status, and expected catalyst life remaining.

naftiko: "0.5"
info:
  label: "SAP Refinery Catalyst Inventory Check"
  description: "Checks catalyst inventory levels in SAP for refinery process units, returning available quantity, reorder point status, and expected catalyst life remaining."
  tags:
    - refining
    - inventory
    - sap
capability:
  exposes:
    - type: mcp
      namespace: catalyst-inventory
      port: 8080
      tools:
        - name: check-catalyst-inventory
          description: "Look up catalyst inventory by material number and plant. Returns available stock, reorder status, and remaining catalyst life."
          inputParameters:
            - name: material_number
              in: body
              type: string
              description: "SAP material number for the catalyst."
            - name: plant_code
              in: body
              type: string
              description: "SAP plant code for the refinery."
          call: sap.get-catalyst-stock
          with:
            material_number: "{{material_number}}"
            plant_code: "{{plant_code}}"
          outputParameters:
            - name: available_qty
              type: number
              mapping: "$.d.AvailableStock"
            - name: reorder_needed
              type: boolean
              mapping: "$.d.BelowReorderPoint"
            - name: catalyst_life_days
              type: number
              mapping: "$.d.RemainingLifeDays"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://exxon-s4.sap.com/sap/opu/odata/sap/MM_INVENTORY_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: stock
          path: "/A_MaterialStock"
          inputParameters:
            - name: material_number
              in: query
            - name: plant_code
              in: query
          operations:
            - name: get-catalyst-stock
              method: GET

Retrieves energy consumption data from SAP for refinery process units including steam, electricity, and fuel gas usage, and pushes to Power BI for energy efficiency tracking.

naftiko: "0.5"
info:
  label: "SAP Refinery Energy Consumption Report"
  description: "Retrieves energy consumption data from SAP for refinery process units including steam, electricity, and fuel gas usage, and pushes to Power BI for energy efficiency tracking."
  tags:
    - refining
    - environmental
    - sap
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: energy-consumption
      port: 8080
      tools:
        - name: generate-energy-report
          description: "Given a plant code and date range, pull energy consumption from SAP and push to Power BI for efficiency tracking."
          inputParameters:
            - name: plant_code
              in: body
              type: string
              description: "SAP plant code for the refinery."
            - name: date_from
              in: body
              type: string
              description: "Start date in YYYY-MM-DD format."
          steps:
            - name: get-consumption
              type: call
              call: sap.get-energy-consumption
              with:
                plant_code: "{{plant_code}}"
                date_from: "{{date_from}}"
            - name: push-to-dashboard
              type: call
              call: powerbi.push-rows
              with:
                dataset_id: "refinery-energy-consumption"
                rows: "{{get-consumption.results}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://exxon-s4.sap.com/sap/opu/odata/sap/PM_MEASUREMENT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: energy
          path: "/A_UtilityConsumption"
          operations:
            - name: get-energy-consumption
              method: GET
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/datasets/refinery-energy-consumption/rows"
          operations:
            - name: push-rows
              method: POST

Pulls daily refinery throughput data from SAP for a given plant, aggregates volumes by crude unit, and publishes a summary to a Power BI dataset for executive dashboards.

naftiko: "0.5"
info:
  label: "SAP Refinery Throughput Report"
  description: "Pulls daily refinery throughput data from SAP for a given plant, aggregates volumes by crude unit, and publishes a summary to a Power BI dataset for executive dashboards."
  tags:
    - refining
    - reporting
    - sap
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: refinery-throughput
      port: 8080
      tools:
        - name: generate-throughput-report
          description: "Given a SAP plant code and date range, pull throughput data, aggregate by unit, and push to Power BI for the refinery performance dashboard."
          inputParameters:
            - name: plant_code
              in: body
              type: string
              description: "SAP plant code for the refinery (e.g., BEAUMONT-REF)."
            - name: date_from
              in: body
              type: string
              description: "Start date in YYYY-MM-DD format."
            - name: date_to
              in: body
              type: string
              description: "End date in YYYY-MM-DD format."
          steps:
            - name: get-throughput
              type: call
              call: sap.get-throughput-data
              with:
                plant_code: "{{plant_code}}"
                date_from: "{{date_from}}"
                date_to: "{{date_to}}"
            - name: push-to-powerbi
              type: call
              call: powerbi.push-rows
              with:
                dataset_id: "refinery-throughput-daily"
                rows: "{{get-throughput.results}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://exxon-s4.sap.com/sap/opu/odata/sap/PP_PRODUCTION_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: throughput
          path: "/A_ProductionOutput"
          inputParameters:
            - name: plant_code
              in: query
            - name: date_from
              in: query
            - name: date_to
              in: query
          operations:
            - name: get-throughput-data
              method: GET
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/datasets/refinery-throughput-daily/rows"
          operations:
            - name: push-rows
              method: POST

Retrieves underground storage tank leak detection test results from SAP for retail fuel stations, returning test date, pass/fail status, and regulatory compliance flag.

naftiko: "0.5"
info:
  label: "SAP Retail Station Underground Tank Compliance"
  description: "Retrieves underground storage tank leak detection test results from SAP for retail fuel stations, returning test date, pass/fail status, and regulatory compliance flag."
  tags:
    - downstream
    - environmental
    - sap
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: ust-compliance
      port: 8080
      tools:
        - name: get-ust-compliance
          description: "Look up underground tank compliance status by retail station. Returns test results and regulatory status."
          inputParameters:
            - name: station_id
              in: body
              type: string
              description: "SAP functional location for the retail station."
          call: sap.get-ust-tests
          with:
            station_id: "{{station_id}}"
          outputParameters:
            - name: last_test_date
              type: string
              mapping: "$.d.LastTestDate"
            - name: test_result
              type: string
              mapping: "$.d.TestResult"
            - name: compliant
              type: boolean
              mapping: "$.d.RegulatoryCompliant"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://exxon-s4.sap.com/sap/opu/odata/sap/EHS_MONITORING_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: ust-tests
          path: "/A_TankCompliance(Station='{{station_id}}')"
          inputParameters:
            - name: station_id
              in: path
          operations:
            - name: get-ust-tests
              method: GET

Retrieves the latest tank gauge reading from SAP for a specified storage tank, returning product level, temperature, API gravity, and available capacity.

naftiko: "0.5"
info:
  label: "SAP Tank Farm Gauge Reading"
  description: "Retrieves the latest tank gauge reading from SAP for a specified storage tank, returning product level, temperature, API gravity, and available capacity."
  tags:
    - downstream
    - inventory
    - sap
capability:
  exposes:
    - type: mcp
      namespace: tank-gauge
      port: 8080
      tools:
        - name: get-tank-reading
          description: "Look up latest tank gauge reading by tank ID. Returns current level, temperature, API gravity, and available capacity in barrels."
          inputParameters:
            - name: tank_id
              in: body
              type: string
              description: "SAP equipment ID for the storage tank."
          call: sap.get-gauge-reading
          with:
            tank_id: "{{tank_id}}"
          outputParameters:
            - name: level_feet
              type: number
              mapping: "$.d.CurrentLevel"
            - name: temperature_f
              type: number
              mapping: "$.d.Temperature"
            - name: api_gravity
              type: number
              mapping: "$.d.APIGravity"
            - name: available_capacity_bbl
              type: number
              mapping: "$.d.AvailableCapacity"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://exxon-s4.sap.com/sap/opu/odata/sap/PM_MEASUREMENT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: measurements
          path: "/A_MeasurementDocument(Equipment='{{tank_id}}')"
          inputParameters:
            - name: tank_id
              in: path
          operations:
            - name: get-gauge-reading
              method: GET

Reconciles tank gauge readings with bill of lading quantities in SAP for marine terminal loadings, identifying discrepancies and logging results in Snowflake for loss control.

naftiko: "0.5"
info:
  label: "SAP Tank-to-Ship Transfer Reconciliation"
  description: "Reconciles tank gauge readings with bill of lading quantities in SAP for marine terminal loadings, identifying discrepancies and logging results in Snowflake for loss control."
  tags:
    - downstream
    - trading
    - sap
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: transfer-recon
      port: 8080
      tools:
        - name: reconcile-transfer
          description: "Given a shipment ID, pull tank gauge and bill of lading data from SAP, calculate variance, and log in Snowflake."
          inputParameters:
            - name: shipment_id
              in: body
              type: string
              description: "SAP shipment document number."
          steps:
            - name: get-transfer-data
              type: call
              call: sap.get-transfer-records
              with:
                shipment_id: "{{shipment_id}}"
            - name: log-reconciliation
              type: call
              call: snowflake.insert-recon-record
              with:
                shipment_id: "{{shipment_id}}"
                tank_volume: "{{get-transfer-data.tank_volume}}"
                bol_volume: "{{get-transfer-data.bol_volume}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://exxon-s4.sap.com/sap/opu/odata/sap/SD_SHIPMENT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: transfers
          path: "/A_Shipment('{{shipment_id}}')"
          inputParameters:
            - name: shipment_id
              in: path
          operations:
            - name: get-transfer-records
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://exxon.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: reconciliation
          path: "/statements"
          operations:
            - name: insert-recon-record
              method: POST

Pulls turnaround project cost actuals from SAP Project Systems, compares to budget, and posts a variance summary to the refinery management Teams channel.

naftiko: "0.5"
info:
  label: "SAP Turnaround Cost Tracking"
  description: "Pulls turnaround project cost actuals from SAP Project Systems, compares to budget, and posts a variance summary to the refinery management Teams channel."
  tags:
    - refining
    - finance
    - sap
    - msteams
    - maintenance
capability:
  exposes:
    - type: mcp
      namespace: ta-cost-tracking
      port: 8080
      tools:
        - name: track-turnaround-costs
          description: "Given a SAP project number for a turnaround, pull cost actuals vs budget and post variance to Teams."
          inputParameters:
            - name: project_number
              in: body
              type: string
              description: "SAP Project Systems project number."
          steps:
            - name: get-costs
              type: call
              call: sap.get-project-costs
              with:
                project_number: "{{project_number}}"
            - name: post-variance
              type: call
              call: msteams.send-message
              with:
                channel: "refinery-management"
                text: "TA Cost Update | Project: {{project_number}} | Actual: ${{get-costs.actual_cost}} | Budget: ${{get-costs.planned_cost}} | Variance: {{get-costs.variance_pct}}%"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://exxon-s4.sap.com/sap/opu/odata/sap/PS_PROJECT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: project-costs
          path: "/A_ProjectCost('{{project_number}}')"
          inputParameters:
            - name: project_number
              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.msteams_token"
      resources:
        - name: channel-messages
          path: "/teams/refinery/channels/management/messages"
          operations:
            - name: send-message
              method: POST

Retrieves the payment status of a vendor invoice from SAP Accounts Payable, returning payment date, amount, clearing document, and payment method.

naftiko: "0.5"
info:
  label: "SAP Vendor Payment Status Lookup"
  description: "Retrieves the payment status of a vendor invoice from SAP Accounts Payable, returning payment date, amount, clearing document, and payment method."
  tags:
    - procurement
    - sap
    - finance
capability:
  exposes:
    - type: mcp
      namespace: vendor-payment
      port: 8080
      tools:
        - name: get-payment-status
          description: "Look up vendor payment status by invoice number. Returns payment date, amount, clearing document number, and payment method."
          inputParameters:
            - name: invoice_number
              in: body
              type: string
              description: "SAP vendor invoice number."
          call: sap.get-payment
          with:
            invoice_number: "{{invoice_number}}"
          outputParameters:
            - name: payment_date
              type: string
              mapping: "$.d.ClearingDate"
            - name: amount
              type: number
              mapping: "$.d.AmountInCompanyCodeCurrency"
            - name: clearing_document
              type: string
              mapping: "$.d.ClearingDocumentNumber"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://exxon-s4.sap.com/sap/opu/odata/sap/FI_AP_INVOICE_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-payment
              method: GET

Retrieves wastewater effluent quality data from SAP Environmental Health and Safety, returning pH, total suspended solids, and oil and grease levels against permit limits.

naftiko: "0.5"
info:
  label: "SAP Wastewater Treatment Compliance Check"
  description: "Retrieves wastewater effluent quality data from SAP Environmental Health and Safety, returning pH, total suspended solids, and oil and grease levels against permit limits."
  tags:
    - environmental
    - refining
    - sap
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: wastewater-compliance
      port: 8080
      tools:
        - name: check-effluent-quality
          description: "Look up wastewater treatment effluent quality by outfall ID. Returns measured values and compliance status against permit limits."
          inputParameters:
            - name: outfall_id
              in: body
              type: string
              description: "SAP outfall monitoring point ID."
          call: sap.get-effluent-data
          with:
            outfall_id: "{{outfall_id}}"
          outputParameters:
            - name: ph
              type: number
              mapping: "$.d.PHValue"
            - name: tss_mgl
              type: number
              mapping: "$.d.TotalSuspendedSolids"
            - name: oil_grease_mgl
              type: number
              mapping: "$.d.OilAndGrease"
            - name: compliant
              type: boolean
              mapping: "$.d.WithinPermitLimits"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://exxon-s4.sap.com/sap/opu/odata/sap/EHS_MONITORING_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: effluent
          path: "/A_EffluentMonitoring('{{outfall_id}}')"
          inputParameters:
            - name: outfall_id
              in: path
          operations:
            - name: get-effluent-data
              method: GET

Retrieves daily production allocation data for a well from SAP, returning oil, gas, and water volumes allocated to the well based on separator test results.

naftiko: "0.5"
info:
  label: "SAP Well Production Daily Allocation"
  description: "Retrieves daily production allocation data for a well from SAP, returning oil, gas, and water volumes allocated to the well based on separator test results."
  tags:
    - upstream
    - production
    - sap
capability:
  exposes:
    - type: mcp
      namespace: well-allocation
      port: 8080
      tools:
        - name: get-well-allocation
          description: "Look up daily production allocation for a well by functional location and date. Returns oil, gas, and water volumes."
          inputParameters:
            - name: functional_location
              in: body
              type: string
              description: "SAP functional location for the well."
            - name: allocation_date
              in: body
              type: string
              description: "Allocation date in YYYY-MM-DD format."
          call: sap.get-allocation
          with:
            functional_location: "{{functional_location}}"
            allocation_date: "{{allocation_date}}"
          outputParameters:
            - name: oil_bbl
              type: number
              mapping: "$.d.OilVolume"
            - name: gas_mcf
              type: number
              mapping: "$.d.GasVolume"
            - name: water_bbl
              type: number
              mapping: "$.d.WaterVolume"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://exxon-s4.sap.com/sap/opu/odata/sap/OG_PRODUCTION_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: allocations
          path: "/A_WellAllocation"
          inputParameters:
            - name: functional_location
              in: query
            - name: allocation_date
              in: query
          operations:
            - name: get-allocation
              method: GET

Retrieves the latest wellhead pressure readings from SAP for a given well, returning tubing pressure, casing pressure, and flow line pressure values.

naftiko: "0.5"
info:
  label: "SAP Wellhead Pressure Reading"
  description: "Retrieves the latest wellhead pressure readings from SAP for a given well, returning tubing pressure, casing pressure, and flow line pressure values."
  tags:
    - upstream
    - production
    - sap
capability:
  exposes:
    - type: mcp
      namespace: wellhead-pressure
      port: 8080
      tools:
        - name: get-wellhead-pressure
          description: "Look up wellhead pressure by functional location. Returns tubing, casing, and flow line pressure readings."
          inputParameters:
            - name: functional_location
              in: body
              type: string
              description: "SAP functional location for the well."
          call: sap.get-pressure-reading
          with:
            functional_location: "{{functional_location}}"
          outputParameters:
            - name: tubing_pressure_psi
              type: number
              mapping: "$.d.TubingPressure"
            - name: casing_pressure_psi
              type: number
              mapping: "$.d.CasingPressure"
            - name: flowline_pressure_psi
              type: number
              mapping: "$.d.FlowLinePressure"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://exxon-s4.sap.com/sap/opu/odata/sap/OG_WELL_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: pressure-readings
          path: "/A_WellMeasurement(FunctionalLocation='{{functional_location}}')"
          inputParameters:
            - name: functional_location
              in: path
          operations:
            - name: get-pressure-reading
              method: GET

Queries ServiceNow for environmental permits approaching renewal deadlines, generates a compliance report in Snowflake, and alerts the environmental affairs team via Teams.

naftiko: "0.5"
info:
  label: "ServiceNow Environmental Permit Tracker"
  description: "Queries ServiceNow for environmental permits approaching renewal deadlines, generates a compliance report in Snowflake, and alerts the environmental affairs team via Teams."
  tags:
    - environmental
    - compliance
    - servicenow
    - snowflake
    - msteams
capability:
  exposes:
    - type: mcp
      namespace: env-permit
      port: 8080
      tools:
        - name: track-env-permits
          description: "Given a lookahead window in days, find environmental permits nearing expiry in ServiceNow, log to Snowflake, and alert the environmental team in Teams."
          inputParameters:
            - name: days_lookahead
              in: body
              type: number
              description: "Number of days to look ahead for permit expirations."
          steps:
            - name: query-permits
              type: call
              call: servicenow.query-permits
              with:
                days_lookahead: "{{days_lookahead}}"
            - name: log-report
              type: call
              call: snowflake.insert-permit-report
              with:
                permits: "{{query-permits.records}}"
                report_date: "{{days_lookahead}}"
            - name: alert-team
              type: call
              call: msteams.send-message
              with:
                channel: "environmental-affairs"
                text: "Environmental permit alert | {{query-permits.total_count}} permits expiring within {{days_lookahead}} days | Report logged to Snowflake"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://exxon.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: permits
          path: "/table/u_environmental_permit"
          operations:
            - name: query-permits
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://exxon.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: permit-reports
          path: "/statements"
          operations:
            - name: insert-permit-report
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: channel-messages
          path: "/teams/environmental/channels/affairs/messages"
          operations:
            - name: send-message
              method: POST

Queries ServiceNow CMDB for IT assets nearing end-of-life, generates a replacement plan in Confluence, and opens procurement requisitions in SAP Ariba for critical infrastructure.

naftiko: "0.5"
info:
  label: "ServiceNow IT Asset Lifecycle Audit"
  description: "Queries ServiceNow CMDB for IT assets nearing end-of-life, generates a replacement plan in Confluence, and opens procurement requisitions in SAP Ariba for critical infrastructure."
  tags:
    - it-operations
    - servicenow
    - confluence
    - sap-ariba
capability:
  exposes:
    - type: mcp
      namespace: asset-lifecycle
      port: 8080
      tools:
        - name: audit-asset-lifecycle
          description: "Given an asset category and EOL threshold in months, find aging assets in ServiceNow, create a Confluence replacement plan, and raise Ariba requisitions."
          inputParameters:
            - name: asset_category
              in: body
              type: string
              description: "Asset category to audit (e.g., server, network, storage)."
            - name: eol_months
              in: body
              type: number
              description: "Months until end-of-life to flag assets."
          steps:
            - name: find-aging-assets
              type: call
              call: servicenow.query-assets
              with:
                category: "{{asset_category}}"
                eol_months: "{{eol_months}}"
            - name: create-replacement-plan
              type: call
              call: confluence.create-page
              with:
                space: "IT-LIFECYCLE"
                title: "Replacement Plan - {{asset_category}} - Q1 2026"
                body: "{{find-aging-assets.summary}}"
            - name: create-requisition
              type: call
              call: ariba.create-requisition
              with:
                items: "{{find-aging-assets.critical_assets}}"
                category: "{{asset_category}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://exxon.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: cmdb-assets
          path: "/table/cmdb_ci"
          operations:
            - name: query-assets
              method: GET
    - type: http
      namespace: confluence
      baseUri: "https://exxon.atlassian.net/wiki/rest/api"
      authentication:
        type: bearer
        token: "$secrets.confluence_token"
      resources:
        - name: pages
          path: "/content"
          operations:
            - name: create-page
              method: POST
    - type: http
      namespace: ariba
      baseUri: "https://exxon.ariba.com/api/procurement"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: requisitions
          path: "/requisitions"
          operations:
            - name: create-requisition
              method: POST

Retrieves the current status of a ServiceNow change request and posts a detailed summary to the IT governance Teams channel for CAB preparation.

naftiko: "0.5"
info:
  label: "ServiceNow IT Change Request Status Check"
  description: "Retrieves the current status of a ServiceNow change request and posts a detailed summary to the IT governance Teams channel for CAB preparation."
  tags:
    - itsm
    - change-management
    - servicenow
    - msteams
capability:
  exposes:
    - type: mcp
      namespace: it-governance
      port: 8080
      tools:
        - name: get-change-request-status
          description: "Given a ServiceNow change request number, return its state, approval status, scheduled window, and implementation plan, then post a summary to the IT governance Teams channel."
          inputParameters:
            - name: change_number
              in: body
              type: string
              description: "ServiceNow change request number (e.g., CHG0098765)."
          steps:
            - name: get-change
              type: call
              call: servicenow.get-change
              with:
                number: "{{change_number}}"
            - name: post-summary
              type: call
              call: msteams.send-message
              with:
                channel: "it-governance"
                text: "Change {{change_number}}: {{get-change.state}} | Approval: {{get-change.approval}} | Window: {{get-change.start_date}} to {{get-change.end_date}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://exxon.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: change-requests
          path: "/table/change_request"
          inputParameters:
            - name: number
              in: query
          operations:
            - name: get-change
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: channel-messages
          path: "/teams/it/channels/governance/messages"
          operations:
            - name: send-message
              method: POST

Initiates a Management of Change (MOC) workflow in ServiceNow for process safety modifications, routing through hazard review, engineering approval, and HSE sign-off with Teams notifications at each stage.

naftiko: "0.5"
info:
  label: "ServiceNow Management of Change Workflow"
  description: "Initiates a Management of Change (MOC) workflow in ServiceNow for process safety modifications, routing through hazard review, engineering approval, and HSE sign-off with Teams notifications at each stage."
  tags:
    - safety
    - servicenow
    - msteams
    - compliance
    - refining
capability:
  exposes:
    - type: mcp
      namespace: moc-workflow
      port: 8080
      tools:
        - name: initiate-moc
          description: "Given a change description and facility, create a MOC record in ServiceNow, trigger review workflow, and notify stakeholders via Teams."
          inputParameters:
            - name: change_description
              in: body
              type: string
              description: "Description of the proposed process change."
            - name: facility
              in: body
              type: string
              description: "Facility where the change will be implemented."
            - name: change_type
              in: body
              type: string
              description: "Type: temporary, permanent, emergency."
          steps:
            - name: create-moc
              type: call
              call: servicenow.create-moc
              with:
                description: "{{change_description}}"
                facility: "{{facility}}"
                type: "{{change_type}}"
            - name: notify-reviewers
              type: call
              call: msteams.send-message
              with:
                channel: "process-safety"
                text: "New MOC submitted | {{change_type}} | Facility: {{facility}} | MOC#: {{create-moc.number}} | Review required"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://exxon.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: moc
          path: "/table/u_management_of_change"
          operations:
            - name: create-moc
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: channel-messages
          path: "/teams/safety/channels/process/messages"
          operations:
            - name: send-message
              method: POST

When a process safety event is reported, creates a ServiceNow investigation record, assigns an investigation team from Workday, logs initial details in Snowflake, and notifies HSE leadership via Teams.

naftiko: "0.5"
info:
  label: "ServiceNow Process Safety Event Investigation"
  description: "When a process safety event is reported, creates a ServiceNow investigation record, assigns an investigation team from Workday, logs initial details in Snowflake, and notifies HSE leadership via Teams."
  tags:
    - safety
    - servicenow
    - workday
    - snowflake
    - msteams
capability:
  exposes:
    - type: mcp
      namespace: pse-investigation
      port: 8080
      tools:
        - name: initiate-pse-investigation
          description: "Given event details and severity, create a ServiceNow investigation, assign team from Workday, log to Snowflake, and alert HSE leadership."
          inputParameters:
            - name: event_description
              in: body
              type: string
              description: "Description of the process safety event."
            - name: facility
              in: body
              type: string
              description: "Facility where the event occurred."
            - name: severity
              in: body
              type: string
              description: "Event severity: tier-1, tier-2, tier-3."
          steps:
            - name: create-investigation
              type: call
              call: servicenow.create-investigation
              with:
                description: "{{event_description}}"
                facility: "{{facility}}"
                severity: "{{severity}}"
            - name: assign-team
              type: call
              call: workday.get-investigation-team
              with:
                facility: "{{facility}}"
                severity: "{{severity}}"
            - name: log-event
              type: call
              call: snowflake.insert-pse-record
              with:
                investigation_id: "{{create-investigation.sys_id}}"
                facility: "{{facility}}"
                severity: "{{severity}}"
            - name: alert-leadership
              type: call
              call: msteams.send-message
              with:
                channel: "hse-leadership"
                text: "PSE Alert | {{severity}} | Facility: {{facility}} | Investigation: {{create-investigation.number}} | Team lead: {{assign-team.lead_name}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://exxon.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: investigations
          path: "/table/u_pse_investigation"
          operations:
            - name: create-investigation
              method: POST
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: teams
          path: "/workers"
          operations:
            - name: get-investigation-team
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://exxon.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: pse-records
          path: "/statements"
          operations:
            - name: insert-pse-record
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: channel-messages
          path: "/teams/hse/channels/leadership/messages"
          operations:
            - name: send-message
              method: POST

Manages unplanned refinery unit outages by creating a ServiceNow major incident, notifying impacted stakeholders via Teams, and updating the production planning team with revised throughput estimates from SAP.

naftiko: "0.5"
info:
  label: "ServiceNow Refinery Outage Management"
  description: "Manages unplanned refinery unit outages by creating a ServiceNow major incident, notifying impacted stakeholders via Teams, and updating the production planning team with revised throughput estimates from SAP."
  tags:
    - refining
    - servicenow
    - msteams
    - sap
    - production
capability:
  exposes:
    - type: mcp
      namespace: refinery-outage
      port: 8080
      tools:
        - name: manage-refinery-outage
          description: "Given a refinery unit and outage type, create a major incident in ServiceNow, notify stakeholders in Teams, and pull revised throughput from SAP."
          inputParameters:
            - name: unit_id
              in: body
              type: string
              description: "Refinery unit identifier."
            - name: outage_type
              in: body
              type: string
              description: "Type of outage: unplanned, emergency, weather."
            - name: estimated_duration_hrs
              in: body
              type: number
              description: "Estimated outage duration in hours."
          steps:
            - name: create-major-incident
              type: call
              call: servicenow.create-major-incident
              with:
                unit_id: "{{unit_id}}"
                outage_type: "{{outage_type}}"
                duration: "{{estimated_duration_hrs}}"
            - name: get-throughput-impact
              type: call
              call: sap.get-unit-throughput
              with:
                unit_id: "{{unit_id}}"
            - name: notify-stakeholders
              type: call
              call: msteams.send-message
              with:
                channel: "refinery-management"
                text: "OUTAGE ALERT | Unit: {{unit_id}} | Type: {{outage_type}} | Est. duration: {{estimated_duration_hrs}}h | Throughput impact: {{get-throughput-impact.daily_bbl}} bbl/d | INC: {{create-major-incident.number}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://exxon.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: major-incidents
          path: "/table/incident"
          operations:
            - name: create-major-incident
              method: POST
    - type: http
      namespace: sap
      baseUri: "https://exxon-s4.sap.com/sap/opu/odata/sap/PP_PRODUCTION_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: throughput
          path: "/A_ProductionOutput"
          operations:
            - name: get-unit-throughput
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: channel-messages
          path: "/teams/refinery/channels/management/messages"
          operations:
            - name: send-message
              method: POST

Queries Snowflake for carbon capture and storage project data including CO2 injection volumes, storage capacity utilization, and monitoring well readings, then pushes to Power BI.

naftiko: "0.5"
info:
  label: "Snowflake Carbon Capture Project Dashboard"
  description: "Queries Snowflake for carbon capture and storage project data including CO2 injection volumes, storage capacity utilization, and monitoring well readings, then pushes to Power BI."
  tags:
    - environmental
    - upstream
    - snowflake
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: carbon-capture
      port: 8080
      tools:
        - name: generate-ccs-dashboard
          description: "Given a CCS project ID and date range, query Snowflake for injection and monitoring data, then push to Power BI."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "Carbon capture project identifier."
            - name: date_from
              in: body
              type: string
              description: "Start date in YYYY-MM-DD format."
          steps:
            - name: query-ccs-data
              type: call
              call: snowflake.query-ccs-metrics
              with:
                project_id: "{{project_id}}"
                date_from: "{{date_from}}"
            - name: push-dashboard
              type: call
              call: powerbi.push-rows
              with:
                dataset_id: "carbon-capture-monitoring"
                rows: "{{query-ccs-data.results}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://exxon.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: ccs-metrics
          path: "/statements"
          operations:
            - name: query-ccs-metrics
              method: POST
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/datasets/carbon-capture-monitoring/rows"
          operations:
            - name: push-rows
              method: POST

Queries Snowflake for downstream product margins by refinery and product slate, calculates crack spreads and net margins, and pushes results to Power BI for commercial decision support.

naftiko: "0.5"
info:
  label: "Snowflake Downstream Margin Analysis"
  description: "Queries Snowflake for downstream product margins by refinery and product slate, calculates crack spreads and net margins, and pushes results to Power BI for commercial decision support."
  tags:
    - downstream
    - trading
    - snowflake
    - power-bi
    - finance
capability:
  exposes:
    - type: mcp
      namespace: margin-analysis
      port: 8080
      tools:
        - name: analyze-downstream-margins
          description: "Given a refinery and date range, query Snowflake for product margins, calculate crack spreads, and push to Power BI."
          inputParameters:
            - name: refinery_code
              in: body
              type: string
              description: "Refinery code for the margin analysis."
            - name: date_from
              in: body
              type: string
              description: "Start date in YYYY-MM-DD format."
          steps:
            - name: query-margins
              type: call
              call: snowflake.query-product-margins
              with:
                refinery_code: "{{refinery_code}}"
                date_from: "{{date_from}}"
            - name: push-results
              type: call
              call: powerbi.push-rows
              with:
                dataset_id: "downstream-margins"
                rows: "{{query-margins.results}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://exxon.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: margins
          path: "/statements"
          operations:
            - name: query-product-margins
              method: POST
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/datasets/downstream-margins/rows"
          operations:
            - name: push-rows
              method: POST

Queries Snowflake for drilling cost data by well and formation, calculates cost-per-foot metrics, and pushes results to Power BI for drilling efficiency benchmarking.

naftiko: "0.5"
info:
  label: "Snowflake Drilling Cost Per Foot Analysis"
  description: "Queries Snowflake for drilling cost data by well and formation, calculates cost-per-foot metrics, and pushes results to Power BI for drilling efficiency benchmarking."
  tags:
    - upstream
    - drilling
    - snowflake
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: drilling-cost
      port: 8080
      tools:
        - name: analyze-drilling-cost
          description: "Given a basin and date range, query Snowflake for drilling costs, calculate cost-per-foot by formation, and push to Power BI."
          inputParameters:
            - name: basin
              in: body
              type: string
              description: "Basin name (e.g., Permian, Guyana)."
            - name: date_from
              in: body
              type: string
              description: "Start date in YYYY-MM-DD format."
            - name: date_to
              in: body
              type: string
              description: "End date in YYYY-MM-DD format."
          steps:
            - name: query-costs
              type: call
              call: snowflake.query-drilling-costs
              with:
                basin: "{{basin}}"
                date_from: "{{date_from}}"
                date_to: "{{date_to}}"
            - name: push-to-dashboard
              type: call
              call: powerbi.push-rows
              with:
                dataset_id: "drilling-cost-per-foot"
                rows: "{{query-costs.results}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://exxon.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: drilling-costs
          path: "/statements"
          operations:
            - name: query-drilling-costs
              method: POST
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/datasets/drilling-cost-per-foot/rows"
          operations:
            - name: push-rows
              method: POST

Queries Snowflake for greenhouse gas emissions data across upstream and refining operations, aggregates by facility, and publishes to Power BI for environmental reporting dashboards.

naftiko: "0.5"
info:
  label: "Snowflake Emissions Monitoring Report"
  description: "Queries Snowflake for greenhouse gas emissions data across upstream and refining operations, aggregates by facility, and publishes to Power BI for environmental reporting dashboards."
  tags:
    - environmental
    - reporting
    - snowflake
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: emissions-report
      port: 8080
      tools:
        - name: generate-emissions-report
          description: "Given a reporting period and facility type, query Snowflake for GHG emissions data, aggregate by facility, and push to Power BI."
          inputParameters:
            - name: period
              in: body
              type: string
              description: "Reporting period (e.g., 2026-Q1)."
            - name: facility_type
              in: body
              type: string
              description: "Facility type: upstream, refining, chemical, all."
          steps:
            - name: query-emissions
              type: call
              call: snowflake.query-emissions
              with:
                period: "{{period}}"
                facility_type: "{{facility_type}}"
            - name: push-to-dashboard
              type: call
              call: powerbi.push-rows
              with:
                dataset_id: "ghg-emissions-quarterly"
                rows: "{{query-emissions.results}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://exxon.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: emissions
          path: "/statements"
          operations:
            - name: query-emissions
              method: POST
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/datasets/ghg-emissions-quarterly/rows"
          operations:
            - name: push-rows
              method: POST

Queries Snowflake for current energy trading positions across crude, natural gas, and refined products, aggregates exposure by desk, and pushes to Power BI for risk monitoring.

naftiko: "0.5"
info:
  label: "Snowflake Energy Trading Position Report"
  description: "Queries Snowflake for current energy trading positions across crude, natural gas, and refined products, aggregates exposure by desk, and pushes to Power BI for risk monitoring."
  tags:
    - trading
    - risk-management
    - snowflake
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: trading-positions
      port: 8080
      tools:
        - name: generate-position-report
          description: "Given a trading desk and valuation date, query Snowflake for open positions, aggregate by commodity, and push to Power BI."
          inputParameters:
            - name: desk
              in: body
              type: string
              description: "Trading desk identifier (e.g., crude-americas, gas-europe)."
            - name: valuation_date
              in: body
              type: string
              description: "Valuation date in YYYY-MM-DD format."
          steps:
            - name: query-positions
              type: call
              call: snowflake.query-trading-positions
              with:
                desk: "{{desk}}"
                valuation_date: "{{valuation_date}}"
            - name: push-to-dashboard
              type: call
              call: powerbi.push-rows
              with:
                dataset_id: "trading-positions-daily"
                rows: "{{query-positions.results}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://exxon.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: positions
          path: "/statements"
          operations:
            - name: query-trading-positions
              method: POST
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/datasets/trading-positions-daily/rows"
          operations:
            - name: push-rows
              method: POST

Queries Snowflake for methane leak detection and repair (LDAR) survey results, identifies active leaks requiring remediation, and creates work orders in SAP for repair.

naftiko: "0.5"
info:
  label: "Snowflake Methane Leak Detection Report"
  description: "Queries Snowflake for methane leak detection and repair (LDAR) survey results, identifies active leaks requiring remediation, and creates work orders in SAP for repair."
  tags:
    - environmental
    - upstream
    - snowflake
    - sap
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: methane-ldar
      port: 8080
      tools:
        - name: process-ldar-results
          description: "Given a facility and survey date, query Snowflake for LDAR results and create SAP work orders for detected leaks."
          inputParameters:
            - name: facility_id
              in: body
              type: string
              description: "Facility identifier for the LDAR survey."
            - name: survey_date
              in: body
              type: string
              description: "Survey date in YYYY-MM-DD format."
          steps:
            - name: query-leaks
              type: call
              call: snowflake.query-ldar-results
              with:
                facility_id: "{{facility_id}}"
                survey_date: "{{survey_date}}"
            - name: create-repair-orders
              type: call
              call: sap.create-pm-work-orders
              with:
                leaks: "{{query-leaks.active_leaks}}"
                facility: "{{facility_id}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://exxon.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: ldar
          path: "/statements"
          operations:
            - name: query-ldar-results
              method: POST
    - type: http
      namespace: sap
      baseUri: "https://exxon-s4.sap.com/sap/opu/odata/sap/PM_ORDER_CREATE_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: work-orders
          path: "/A_MaintenanceOrder"
          operations:
            - name: create-pm-work-orders
              method: POST

Queries Snowflake for pipeline flow rate telemetry, detects statistical anomalies against baseline thresholds, and creates a ServiceNow incident for the pipeline operations team.

naftiko: "0.5"
info:
  label: "Snowflake Pipeline Flow Rate Anomaly Detector"
  description: "Queries Snowflake for pipeline flow rate telemetry, detects statistical anomalies against baseline thresholds, and creates a ServiceNow incident for the pipeline operations team."
  tags:
    - upstream
    - pipeline
    - snowflake
    - servicenow
    - safety
capability:
  exposes:
    - type: mcp
      namespace: pipeline-anomaly
      port: 8080
      tools:
        - name: detect-flow-anomaly
          description: "Given a pipeline segment ID and time window, query Snowflake for flow rate data, detect anomalies, and raise a ServiceNow incident if thresholds are breached."
          inputParameters:
            - name: pipeline_segment_id
              in: body
              type: string
              description: "Unique identifier for the pipeline segment."
            - name: hours_lookback
              in: body
              type: number
              description: "Number of hours to look back for anomaly detection."
          steps:
            - name: query-flow-data
              type: call
              call: snowflake.query-flow-rates
              with:
                pipeline_segment_id: "{{pipeline_segment_id}}"
                hours_lookback: "{{hours_lookback}}"
            - name: raise-incident
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Pipeline flow anomaly on segment {{pipeline_segment_id}}"
                description: "Anomaly detected: {{query-flow-data.anomaly_summary}}"
                urgency: "2"
                category: "pipeline_operations"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://exxon.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: flow-rates
          path: "/statements"
          operations:
            - name: query-flow-rates
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://exxon.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

Runs a refinery yield optimization query in Snowflake that compares actual versus target product yields across distillation units, returning variance metrics and improvement recommendations.

naftiko: "0.5"
info:
  label: "Snowflake Refinery Yield Optimization Report"
  description: "Runs a refinery yield optimization query in Snowflake that compares actual versus target product yields across distillation units, returning variance metrics and improvement recommendations."
  tags:
    - downstream
    - analytics
    - snowflake
    - refinery
capability:
  exposes:
    - type: mcp
      namespace: refinery-yield
      port: 8080
      tools:
        - name: get-yield-optimization-report
          description: "Generate a refinery yield optimization report comparing actual vs. target yields by distillation unit."
          inputParameters:
            - name: plant_code
              in: body
              type: string
              description: "SAP plant code for the refinery."
            - name: report_date
              in: body
              type: string
              description: "Report date in YYYY-MM-DD format."
          call: "snowflake.execute-query"
          with:
            statement: "SELECT unit_id, product_grade, actual_yield_pct, target_yield_pct, variance_pct FROM refinery_ops.yield_summary WHERE plant_code='{{plant_code}}' AND report_date='{{report_date}}'"
          outputParameters:
            - name: yield_data
              type: array
              mapping: "$.data"
            - name: row_count
              type: number
              mapping: "$.resultSetMetaData.numRows"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://exxonmobil.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST

Queries Snowflake for historical well production data, performs decline curve analysis calculations, and pushes EUR estimates to Power BI for reserve forecasting.

naftiko: "0.5"
info:
  label: "Snowflake Reservoir Decline Curve Analysis"
  description: "Queries Snowflake for historical well production data, performs decline curve analysis calculations, and pushes EUR estimates to Power BI for reserve forecasting."
  tags:
    - upstream
    - production
    - snowflake
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: decline-curve
      port: 8080
      tools:
        - name: run-decline-analysis
          description: "Given a well ID and production history window, query Snowflake for production data, calculate decline parameters, and push EUR estimates to Power BI."
          inputParameters:
            - name: well_id
              in: body
              type: string
              description: "Unique well identifier."
            - name: months_history
              in: body
              type: number
              description: "Number of months of production history to analyze."
          steps:
            - name: query-production
              type: call
              call: snowflake.query-well-production
              with:
                well_id: "{{well_id}}"
                months_history: "{{months_history}}"
            - name: push-forecasts
              type: call
              call: powerbi.push-rows
              with:
                dataset_id: "decline-curve-eur"
                rows: "{{query-production.results}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://exxon.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: production
          path: "/statements"
          operations:
            - name: query-well-production
              method: POST
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/datasets/decline-curve-eur/rows"
          operations:
            - name: push-rows
              method: POST

Queries Snowflake for drilling rig utilization data across basins, benchmarks performance against targets, and pushes results to Power BI for operational planning.

naftiko: "0.5"
info:
  label: "Snowflake Rig Utilization Benchmarking"
  description: "Queries Snowflake for drilling rig utilization data across basins, benchmarks performance against targets, and pushes results to Power BI for operational planning."
  tags:
    - upstream
    - drilling
    - snowflake
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: rig-utilization
      port: 8080
      tools:
        - name: benchmark-rig-utilization
          description: "Given a basin and quarter, query rig utilization from Snowflake and push benchmarking data to Power BI."
          inputParameters:
            - name: basin
              in: body
              type: string
              description: "Basin name for benchmarking."
            - name: quarter
              in: body
              type: string
              description: "Quarter in format YYYY-QN."
          steps:
            - name: query-utilization
              type: call
              call: snowflake.query-rig-utilization
              with:
                basin: "{{basin}}"
                quarter: "{{quarter}}"
            - name: push-benchmarks
              type: call
              call: powerbi.push-rows
              with:
                dataset_id: "rig-utilization-benchmark"
                rows: "{{query-utilization.results}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://exxon.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: rig-data
          path: "/statements"
          operations:
            - name: query-rig-utilization
              method: POST
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/datasets/rig-utilization-benchmark/rows"
          operations:
            - name: push-rows
              method: POST

Queries Snowflake for seismic survey metadata, returning survey coverage, acquisition dates, and processing status for exploration data management.

naftiko: "0.5"
info:
  label: "Snowflake Seismic Survey Data Catalog"
  description: "Queries Snowflake for seismic survey metadata, returning survey coverage, acquisition dates, and processing status for exploration data management."
  tags:
    - upstream
    - exploration
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: seismic-catalog
      port: 8080
      tools:
        - name: search-seismic-surveys
          description: "Search seismic survey catalog by basin and vintage year. Returns survey names, coverage areas, and processing status."
          inputParameters:
            - name: basin
              in: body
              type: string
              description: "Basin name for the survey search."
            - name: vintage_year
              in: body
              type: number
              description: "Acquisition year filter."
          call: snowflake.query-seismic-catalog
          with:
            basin: "{{basin}}"
            vintage_year: "{{vintage_year}}"
          outputParameters:
            - name: surveys
              type: string
              mapping: "$.data"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://exxon.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: seismic
          path: "/statements"
          operations:
            - name: query-seismic-catalog
              method: POST

Queries Snowflake for trading counterparty credit exposure data, aggregates by counterparty and commodity, and generates a risk report in Power BI for the credit risk team.

naftiko: "0.5"
info:
  label: "Snowflake Trading Counterparty Exposure Report"
  description: "Queries Snowflake for trading counterparty credit exposure data, aggregates by counterparty and commodity, and generates a risk report in Power BI for the credit risk team."
  tags:
    - trading
    - risk-management
    - snowflake
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: counterparty-exposure
      port: 8080
      tools:
        - name: generate-exposure-report
          description: "Given a valuation date and exposure threshold, query Snowflake for counterparty positions and push to Power BI."
          inputParameters:
            - name: valuation_date
              in: body
              type: string
              description: "Valuation date in YYYY-MM-DD format."
            - name: threshold_usd
              in: body
              type: number
              description: "Minimum exposure in USD to include."
          steps:
            - name: query-exposure
              type: call
              call: snowflake.query-counterparty-exposure
              with:
                valuation_date: "{{valuation_date}}"
                threshold_usd: "{{threshold_usd}}"
            - name: push-report
              type: call
              call: powerbi.push-rows
              with:
                dataset_id: "counterparty-exposure"
                rows: "{{query-exposure.results}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://exxon.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: exposure
          path: "/statements"
          operations:
            - name: query-counterparty-exposure
              method: POST
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/datasets/counterparty-exposure/rows"
          operations:
            - name: push-rows
              method: POST

Runs automated data quality checks on Snowflake upstream production data tables, logs metrics to Datadog, and creates Jira remediation tasks when thresholds are breached.

naftiko: "0.5"
info:
  label: "Snowflake Upstream Data Quality Monitor"
  description: "Runs automated data quality checks on Snowflake upstream production data tables, logs metrics to Datadog, and creates Jira remediation tasks when thresholds are breached."
  tags:
    - data-engineering
    - data-quality
    - snowflake
    - datadog
    - jira
    - oil-gas
capability:
  exposes:
    - type: mcp
      namespace: data-quality-ops
      port: 8080
      tools:
        - name: run-upstream-data-check
          description: "Given a Snowflake table name and acceptable null rate threshold, execute a row count and null check, submit a Datadog metric, and open a Jira remediation task if quality thresholds are breached."
          inputParameters:
            - name: table_name
              in: body
              type: string
              description: "Fully qualified Snowflake table name (e.g., UPSTREAM.PUBLIC.WELL_PRODUCTION)."
            - name: null_threshold
              in: body
              type: number
              description: "Maximum acceptable null rate (0.0–1.0) before raising a Jira issue."
          steps:
            - name: run-dq-query
              type: call
              call: snowflake.execute-dq-check
              with:
                table_name: "{{table_name}}"
            - name: post-metric
              type: call
              call: datadog.submit-metric
              with:
                metric: "exxon.snowflake.null_rate"
                points: "{{run-dq-query.null_rate}}"
                tags: "table:{{table_name}}"
            - name: create-remediation-task
              type: call
              call: jira.create-issue
              with:
                project_key: "DATA"
                issuetype: "Task"
                summary: "Data quality breach: {{table_name}} null_rate={{run-dq-query.null_rate}}"
                description: "Table {{table_name}} exceeded null threshold {{null_threshold}}. Actual: {{run-dq-query.null_rate}}. Row count: {{run-dq-query.row_count}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://exxon.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-dq-check
              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: metrics
          path: "/series"
          operations:
            - name: submit-metric
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://exxon.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Queries Snowflake for produced water disposal well injection volumes and pressures, checks against permit limits, and creates a ServiceNow alert if approaching regulatory thresholds.

naftiko: "0.5"
info:
  label: "Snowflake Water Disposal Well Monitoring"
  description: "Queries Snowflake for produced water disposal well injection volumes and pressures, checks against permit limits, and creates a ServiceNow alert if approaching regulatory thresholds."
  tags:
    - upstream
    - environmental
    - snowflake
    - servicenow
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: water-disposal
      port: 8080
      tools:
        - name: monitor-disposal-well
          description: "Given a disposal well ID, query injection data from Snowflake, check permit limits, and alert via ServiceNow if nearing thresholds."
          inputParameters:
            - name: well_id
              in: body
              type: string
              description: "Disposal well identifier."
          steps:
            - name: query-injection-data
              type: call
              call: snowflake.query-injection-volumes
              with:
                well_id: "{{well_id}}"
            - name: create-alert
              type: call
              call: servicenow.create-alert
              with:
                well_id: "{{well_id}}"
                current_volume: "{{query-injection-data.daily_volume}}"
                permit_limit: "{{query-injection-data.permit_limit}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://exxon.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: injection-data
          path: "/statements"
          operations:
            - name: query-injection-volumes
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://exxon.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: alerts
          path: "/table/u_environmental_alert"
          operations:
            - name: create-alert
              method: POST

Triggers a Terraform Cloud workspace run to provision or update oil-and-gas data infrastructure, and notifies the platform engineering team via Teams on completion.

naftiko: "0.5"
info:
  label: "Terraform Cloud Infrastructure Provisioning"
  description: "Triggers a Terraform Cloud workspace run to provision or update oil-and-gas data infrastructure, and notifies the platform engineering team via Teams on completion."
  tags:
    - cloud
    - infrastructure
    - terraform
    - msteams
    - devops
    - oil-gas
capability:
  exposes:
    - type: mcp
      namespace: cloud-provisioning
      port: 8080
      tools:
        - name: trigger-infra-provision
          description: "Given a Terraform Cloud workspace ID and change description, queue a new plan-and-apply run and notify the platform-engineering Teams channel with the run ID."
          inputParameters:
            - name: workspace_id
              in: body
              type: string
              description: "Terraform Cloud workspace ID (e.g., ws-XXXXXXXXX)."
            - name: change_description
              in: body
              type: string
              description: "Reason for the Terraform run (e.g., 'Add Permian Basin data subnet')."
          steps:
            - name: queue-run
              type: call
              call: terraform.create-run
              with:
                workspace_id: "{{workspace_id}}"
                message: "{{change_description}}"
            - name: notify-platform
              type: call
              call: msteams.send-message
              with:
                channel: "platform-engineering"
                text: "Terraform run queued: {{queue-run.run_id}} | Workspace: {{workspace_id}} | Change: {{change_description}}"
  consumes:
    - type: http
      namespace: terraform
      baseUri: "https://app.terraform.io/api/v2"
      authentication:
        type: bearer
        token: "$secrets.terraform_token"
      resources:
        - name: runs
          path: "/runs"
          operations:
            - name: create-run
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: channel-messages
          path: "/teams/engineering/channels/platform/messages"
          operations:
            - name: send-message
              method: POST

Provisions edge computing infrastructure for well pad SCADA systems using Terraform Cloud, registers new devices in ServiceNow CMDB, and notifies the OT team via Teams.

naftiko: "0.5"
info:
  label: "Terraform Well Pad Edge Infrastructure"
  description: "Provisions edge computing infrastructure for well pad SCADA systems using Terraform Cloud, registers new devices in ServiceNow CMDB, and notifies the OT team via Teams."
  tags:
    - upstream
    - ot
    - terraform
    - servicenow
    - msteams
capability:
  exposes:
    - type: mcp
      namespace: wellpad-infra
      port: 8080
      tools:
        - name: provision-wellpad-edge
          description: "Given a well pad location and device count, run Terraform to provision edge infra, register in ServiceNow CMDB, and notify OT team."
          inputParameters:
            - name: well_pad_id
              in: body
              type: string
              description: "Well pad identifier for the deployment."
            - name: device_count
              in: body
              type: number
              description: "Number of edge devices to provision."
          steps:
            - name: run-terraform
              type: call
              call: terraform.create-run
              with:
                workspace: "wellpad-edge-infra"
                variables: "well_pad_id={{well_pad_id}},device_count={{device_count}}"
            - name: register-devices
              type: call
              call: servicenow.create-ci
              with:
                well_pad_id: "{{well_pad_id}}"
                device_count: "{{device_count}}"
            - name: notify-ot
              type: call
              call: msteams.send-message
              with:
                channel: "ot-infrastructure"
                text: "Edge infra provisioned | Well pad: {{well_pad_id}} | Devices: {{device_count}} | Terraform run: {{run-terraform.run_id}}"
  consumes:
    - type: http
      namespace: terraform
      baseUri: "https://app.terraform.io/api/v2"
      authentication:
        type: bearer
        token: "$secrets.terraform_token"
      resources:
        - name: runs
          path: "/runs"
          operations:
            - name: create-run
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://exxon.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: ci
          path: "/table/cmdb_ci"
          operations:
            - name: create-ci
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: channel-messages
          path: "/teams/ot/channels/infrastructure/messages"
          operations:
            - name: send-message
              method: POST

When a downhole sensor reports anomalous readings, creates a SAP PM corrective maintenance work order for the well, assigns a field technician from Workday, and sends a priority alert to the operations team via Teams.

naftiko: "0.5"
info:
  label: "Well Maintenance Work Order Creation"
  description: "When a downhole sensor reports anomalous readings, creates a SAP PM corrective maintenance work order for the well, assigns a field technician from Workday, and sends a priority alert to the operations team via Teams."
  tags:
    - oil-gas
    - maintenance
    - sap
    - workday
    - msteams
    - ot
capability:
  exposes:
    - type: mcp
      namespace: well-maintenance
      port: 8080
      tools:
        - name: create-well-work-order
          description: "Given a well functional location, anomaly description, and priority level, create a SAP PM work order, look up an available field technician in Workday, and notify the production operations channel in Teams."
          inputParameters:
            - name: functional_location
              in: body
              type: string
              description: "SAP functional location for the well (e.g., PERMIAN-WELL-042)."
            - name: anomaly_description
              in: body
              type: string
              description: "Description of the sensor anomaly or failure condition."
            - name: priority
              in: body
              type: string
              description: "Work order priority: VH (very high), HI (high), ME (medium), LO (low)."
          steps:
            - name: get-technician
              type: call
              call: workday.get-available-technician
              with:
                functional_location: "{{functional_location}}"
            - name: create-work-order
              type: call
              call: sap.create-pm-work-order
              with:
                functional_location: "{{functional_location}}"
                short_text: "{{anomaly_description}}"
                priority: "{{priority}}"
                person_responsible: "{{get-technician.personnel_number}}"
            - name: notify-operations
              type: call
              call: msteams.send-message
              with:
                channel: "production-operations"
                text: "Work order {{create-work-order.order_number}} created | Priority: {{priority}} | Well: {{functional_location}} | Technician: {{get-technician.full_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: technicians
          path: "/workers"
          inputParameters:
            - name: functional_location
              in: query
          operations:
            - name: get-available-technician
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://exxon-s4.sap.com/sap/opu/odata/sap/PM_ORDER_CREATE_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: pm-work-orders
          path: "/A_MaintenanceOrder"
          operations:
            - name: create-pm-work-order
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: channel-messages
          path: "/teams/operations/channels/production/messages"
          operations:
            - name: send-message
              method: POST

Queries Workday for field workers who have not completed benefits enrollment, sends personalized reminders via Teams, and logs outreach in ServiceNow for HR tracking.

naftiko: "0.5"
info:
  label: "Workday Benefits Enrollment Reminder for Field Workers"
  description: "Queries Workday for field workers who have not completed benefits enrollment, sends personalized reminders via Teams, and logs outreach in ServiceNow for HR tracking."
  tags:
    - hr
    - workday
    - msteams
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: benefits-reminder
      port: 8080
      tools:
        - name: send-enrollment-reminders
          description: "Given an enrollment window, find field workers missing benefits enrollment in Workday, send Teams reminders, and log in ServiceNow."
          inputParameters:
            - name: enrollment_period
              in: body
              type: string
              description: "Enrollment period identifier (e.g., 2026-open-enrollment)."
          steps:
            - name: find-pending
              type: call
              call: workday.get-pending-enrollments
              with:
                period: "{{enrollment_period}}"
            - name: send-reminders
              type: call
              call: msteams.send-message
              with:
                channel: "field-hr"
                text: "Benefits enrollment reminder | {{find-pending.count}} field workers pending | Period: {{enrollment_period}}"
            - name: log-outreach
              type: call
              call: servicenow.create-hr-task
              with:
                description: "Benefits enrollment outreach for {{find-pending.count}} field workers"
                period: "{{enrollment_period}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: enrollments
          path: "/benefits/enrollments"
          operations:
            - name: get-pending-enrollments
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: channel-messages
          path: "/teams/hr/channels/field/messages"
          operations:
            - name: send-message
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://exxon.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: hr-tasks
          path: "/table/u_hr_task"
          operations:
            - name: create-hr-task
              method: POST

Verifies that field contractors in Workday have valid safety certifications, drug test results, and site access clearances before allowing well site entry, notifying supervisors of any gaps.

naftiko: "0.5"
info:
  label: "Workday Contractor Compliance Verification"
  description: "Verifies that field contractors in Workday have valid safety certifications, drug test results, and site access clearances before allowing well site entry, notifying supervisors of any gaps."
  tags:
    - safety
    - compliance
    - workday
    - msteams
    - upstream
capability:
  exposes:
    - type: mcp
      namespace: contractor-compliance
      port: 8080
      tools:
        - name: verify-contractor
          description: "Given a contractor worker ID, check safety certs, drug test, and site access in Workday. Notify supervisor via Teams if non-compliant."
          inputParameters:
            - name: worker_id
              in: body
              type: string
              description: "Workday contingent worker ID."
            - name: site_code
              in: body
              type: string
              description: "Well site code requiring access."
          steps:
            - name: check-certifications
              type: call
              call: workday.get-worker-certifications
              with:
                worker_id: "{{worker_id}}"
            - name: check-clearance
              type: call
              call: workday.get-site-access
              with:
                worker_id: "{{worker_id}}"
                site_code: "{{site_code}}"
            - name: notify-supervisor
              type: call
              call: msteams.send-message
              with:
                channel: "field-supervisors"
                text: "Contractor compliance check | Worker: {{worker_id}} | Site: {{site_code}} | Certs valid: {{check-certifications.all_valid}} | Access cleared: {{check-clearance.cleared}}"
  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"
          inputParameters:
            - name: worker_id
              in: query
          operations:
            - name: get-worker-certifications
              method: GET
        - name: site-access
          path: "/workers/site-access"
          inputParameters:
            - name: worker_id
              in: query
            - name: site_code
              in: query
          operations:
            - name: get-site-access
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: channel-messages
          path: "/teams/field/channels/supervisors/messages"
          operations:
            - name: send-message
              method: POST

Queries Workday for available field crew members with required certifications, matches them to pending SAP work orders, and posts the optimized schedule to the field operations Teams channel.

naftiko: "0.5"
info:
  label: "Workday Field Crew Scheduling Optimizer"
  description: "Queries Workday for available field crew members with required certifications, matches them to pending SAP work orders, and posts the optimized schedule to the field operations Teams channel."
  tags:
    - upstream
    - workday
    - sap
    - msteams
    - maintenance
capability:
  exposes:
    - type: mcp
      namespace: crew-scheduling
      port: 8080
      tools:
        - name: optimize-crew-schedule
          description: "Given a location and date, find available certified crew in Workday, match to SAP work orders, and post schedule to Teams."
          inputParameters:
            - name: location
              in: body
              type: string
              description: "Field location code (e.g., PERMIAN-BASIN-NORTH)."
            - name: schedule_date
              in: body
              type: string
              description: "Date to schedule in YYYY-MM-DD format."
          steps:
            - name: get-available-crew
              type: call
              call: workday.get-available-workers
              with:
                location: "{{location}}"
                date: "{{schedule_date}}"
            - name: get-pending-orders
              type: call
              call: sap.get-open-work-orders
              with:
                location: "{{location}}"
                date: "{{schedule_date}}"
            - name: post-schedule
              type: call
              call: msteams.send-message
              with:
                channel: "field-operations"
                text: "Crew Schedule {{schedule_date}} | Location: {{location}} | Available crew: {{get-available-crew.count}} | Pending WOs: {{get-pending-orders.count}}"
  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"
          operations:
            - name: get-available-workers
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://exxon-s4.sap.com/sap/opu/odata/sap/PM_ORDER_CREATE_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: work-orders
          path: "/A_MaintenanceOrder"
          operations:
            - name: get-open-work-orders
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: channel-messages
          path: "/teams/field/channels/operations/messages"
          operations:
            - name: send-message
              method: POST

Pulls headcount and hours worked data from Workday, combines with incident records from ServiceNow, calculates TRIR and DART rates, and pushes to Power BI for safety performance tracking.

naftiko: "0.5"
info:
  label: "Workday HSE Incident Rate Dashboard"
  description: "Pulls headcount and hours worked data from Workday, combines with incident records from ServiceNow, calculates TRIR and DART rates, and pushes to Power BI for safety performance tracking."
  tags:
    - safety
    - workday
    - servicenow
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: hse-rates
      port: 8080
      tools:
        - name: calculate-hse-rates
          description: "Given a business unit and period, pull Workday hours and ServiceNow incidents, calculate TRIR/DART, and push to Power BI."
          inputParameters:
            - name: business_unit
              in: body
              type: string
              description: "Business unit code (e.g., upstream, refining, chemical)."
            - name: period
              in: body
              type: string
              description: "Reporting period (e.g., 2026-Q1)."
          steps:
            - name: get-hours
              type: call
              call: workday.get-hours-worked
              with:
                business_unit: "{{business_unit}}"
                period: "{{period}}"
            - name: get-incidents
              type: call
              call: servicenow.query-hse-incidents
              with:
                business_unit: "{{business_unit}}"
                period: "{{period}}"
            - name: push-rates
              type: call
              call: powerbi.push-rows
              with:
                dataset_id: "hse-incident-rates"
                rows: "{{get-incidents.summary}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: hours
          path: "/time-tracking/hours"
          operations:
            - name: get-hours-worked
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://exxon.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"
          operations:
            - name: query-hse-incidents
              method: GET
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/datasets/hse-incident-rates/rows"
          operations:
            - name: push-rows
              method: POST

Exports active employee headcount by department and cost center from Workday, writes a snapshot to Snowflake, and triggers a Power BI workforce planning dashboard refresh.

naftiko: "0.5"
info:
  label: "Workday Payroll Headcount Snapshot"
  description: "Exports active employee headcount by department and cost center from Workday, writes a snapshot to Snowflake, and triggers a Power BI workforce planning dashboard refresh."
  tags:
    - hr
    - finance
    - workday
    - snowflake
    - power-bi
    - headcount
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: hr-reporting
      port: 8080
      tools:
        - name: snapshot-headcount
          description: "Fetch active employee headcount from Workday, write a snapshot row to Snowflake, and trigger a Power BI workforce report refresh. Use monthly for headcount and cost planning."
          inputParameters:
            - name: snapshot_date
              in: body
              type: string
              description: "Snapshot date in ISO 8601 format (YYYY-MM-DD)."
          steps:
            - name: export-workers
              type: call
              call: workday.export-workers
              with:
                status: "active"
            - name: write-snapshot
              type: call
              call: snowflake.insert-snapshot
              with:
                snapshot_date: "{{snapshot_date}}"
                records: "{{export-workers.rows}}"
            - name: refresh-report
              type: call
              call: powerbi.trigger-refresh
              with:
                dataset_id: "$secrets.powerbi_workforce_dataset_id"
  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"
          inputParameters:
            - name: status
              in: query
          operations:
            - name: export-workers
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://exxon.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: headcount-table
          path: "/statements"
          operations:
            - name: insert-snapshot
              method: POST
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: dataset-refreshes
          path: "/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: trigger-refresh
              method: POST

When a new position requisition is submitted in Workday, creates a ServiceNow approval task for the HRBP, and notifies the Talent Acquisition team via Teams.

naftiko: "0.5"
info:
  label: "Workday Position Requisition Approval Routing"
  description: "When a new position requisition is submitted in Workday, creates a ServiceNow approval task for the HRBP, and notifies the Talent Acquisition team via Teams."
  tags:
    - hr
    - recruiting
    - workday
    - servicenow
    - msteams
    - approval
capability:
  exposes:
    - type: mcp
      namespace: talent-ops
      port: 8080
      tools:
        - name: route-position-requisition
          description: "Given a Workday position requisition ID, fetch its details, create a ServiceNow approval task for the HRBP, and notify the Talent Acquisition Teams channel."
          inputParameters:
            - name: requisition_id
              in: body
              type: string
              description: "Workday position requisition ID (e.g., REQ-009876)."
          steps:
            - name: get-requisition
              type: call
              call: workday.get-position-requisition
              with:
                requisition_id: "{{requisition_id}}"
            - name: create-approval-task
              type: call
              call: servicenow.create-task
              with:
                short_description: "Position requisition: {{requisition_id}} — {{get-requisition.job_title}}"
                assignment_group: "HRBP_Team"
                description: "Department: {{get-requisition.department}}. Manager: {{get-requisition.manager_name}}"
            - name: notify-ta-team
              type: call
              call: msteams.send-message
              with:
                channel: "talent-acquisition"
                text: "New requisition: {{get-requisition.job_title}} in {{get-requisition.department}}. Approval task: {{create-approval-task.number}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: position-requisitions
          path: "/positionRequisitions/{{requisition_id}}"
          inputParameters:
            - name: requisition_id
              in: path
          operations:
            - name: get-position-requisition
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://exxon.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/task"
          operations:
            - name: create-task
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: channel-messages
          path: "/teams/hr/channels/talent-acquisition/messages"
          operations:
            - name: send-message
              method: POST

When an employee's position changes in Workday, updates their Salesforce user profile and Microsoft 365 group membership, and notifies their new manager via Teams.

naftiko: "0.5"
info:
  label: "Workday Role Change Access Propagation"
  description: "When an employee's position changes in Workday, updates their Salesforce user profile and Microsoft 365 group membership, and notifies their new manager via Teams."
  tags:
    - hr
    - identity
    - workday
    - salesforce
    - microsoft-365
    - msteams
    - role-change
capability:
  exposes:
    - type: mcp
      namespace: access-provisioning
      port: 8080
      tools:
        - name: propagate-role-change
          description: "Given a Workday employee ID and new job profile, update the Salesforce user record, adjust Microsoft 365 group membership, and notify the new manager via Teams."
          inputParameters:
            - name: workday_employee_id
              in: body
              type: string
              description: "Workday worker ID of the employee with a role change."
            - name: new_job_profile
              in: body
              type: string
              description: "New Workday job profile code or title."
          steps:
            - name: get-worker
              type: call
              call: workday.get-worker
              with:
                worker_id: "{{workday_employee_id}}"
            - name: update-sf-user
              type: call
              call: salesforce.patch-user
              with:
                email: "{{get-worker.email}}"
                Title: "{{new_job_profile}}"
                Department: "{{get-worker.department}}"
            - name: notify-manager
              type: call
              call: msteams.send-message
              with:
                recipient_upn: "{{get-worker.manager_email}}"
                text: "Role change completed for {{get-worker.full_name}}: now {{new_job_profile}}. Salesforce updated."
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: salesforce
      baseUri: "https://exxon.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: users
          path: "/sobjects/User"
          operations:
            - name: patch-user
              method: PATCH
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Checks Workday learning records for a worker to verify completion of required HSE safety training modules, and flags overdue certifications to the safety coordinator via Teams.

naftiko: "0.5"
info:
  label: "Workday Safety Training Compliance Check"
  description: "Checks Workday learning records for a worker to verify completion of required HSE safety training modules, and flags overdue certifications to the safety coordinator via Teams."
  tags:
    - safety
    - training
    - workday
    - msteams
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: safety-training
      port: 8080
      tools:
        - name: check-safety-training
          description: "Given a worker ID, verify all required HSE training modules are complete in Workday. If any are overdue, notify the safety coordinator in Teams."
          inputParameters:
            - name: worker_id
              in: body
              type: string
              description: "Workday worker ID to check training compliance for."
          steps:
            - name: get-training-status
              type: call
              call: workday.get-learning-records
              with:
                worker_id: "{{worker_id}}"
            - name: notify-overdue
              type: call
              call: msteams.send-message
              with:
                channel: "hse-compliance"
                text: "Safety training check for {{worker_id}} | Overdue modules: {{get-training-status.overdue_count}} | Details: {{get-training-status.overdue_modules}}"
  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: "/learning/records"
          inputParameters:
            - name: worker_id
              in: query
          operations:
            - name: get-learning-records
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: channel-messages
          path: "/teams/hse/channels/compliance/messages"
          operations:
            - name: send-message
              method: POST

Retrieves succession pipeline data from Workday for critical operational roles, identifies gaps, and posts a readiness summary to the HR leadership Teams channel.

naftiko: "0.5"
info:
  label: "Workday Succession Planning for Critical Roles"
  description: "Retrieves succession pipeline data from Workday for critical operational roles, identifies gaps, and posts a readiness summary to the HR leadership Teams channel."
  tags:
    - hr
    - workday
    - msteams
capability:
  exposes:
    - type: mcp
      namespace: succession-planning
      port: 8080
      tools:
        - name: review-succession-pipeline
          description: "Given a business unit, pull succession data from Workday for critical roles and post readiness summary to Teams."
          inputParameters:
            - name: business_unit
              in: body
              type: string
              description: "Business unit to review (e.g., upstream, refining)."
          steps:
            - name: get-succession-data
              type: call
              call: workday.get-succession-plans
              with:
                business_unit: "{{business_unit}}"
            - name: post-summary
              type: call
              call: msteams.send-message
              with:
                channel: "hr-leadership"
                text: "Succession Pipeline | {{business_unit}} | Critical roles: {{get-succession-data.total_roles}} | Ready now: {{get-succession-data.ready_now}} | Gaps: {{get-succession-data.gap_count}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: succession
          path: "/talent/succession-plans"
          operations:
            - name: get-succession-plans
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: channel-messages
          path: "/teams/hr/channels/leadership/messages"
          operations:
            - name: send-message
              method: POST