Bunge Capabilities

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

Sort
Expand

Generates crop yield forecasts via AI.

naftiko: "0.5"
info:
  label: "AI-Powered Crop Yield Forecast Digest"
  description: "Generates crop yield forecasts via AI."
  tags:
    - artificial-intelligence
    - agribusiness
    - microsoft-teams
    - forecasting
capability:
  exposes:
    - type: mcp
      namespace: artificial-intelligence-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "AI-Powered Crop Yield Forecast Digest - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://bunge.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Sends a trade contract document to the Anthropic Claude API for extraction of key terms (price, volume, delivery dates, incoterms) and stores the summary in Snowflake.

naftiko: "0.5"
info:
  label: "Anthropic Document Summarization for Trade Contracts"
  description: "Sends a trade contract document to the Anthropic Claude API for extraction of key terms (price, volume, delivery dates, incoterms) and stores the summary in Snowflake."
  tags:
    - ai
    - anthropic
    - supply-chain
    - snowflake
    - contracts
capability:
  exposes:
    - type: mcp
      namespace: ai-contracts
      port: 8080
      tools:
        - name: summarize-trade-contract
          description: "Given the text of a Bunge trade contract, invoke Anthropic Claude to extract key terms (commodity, price, volume, delivery date, incoterms, counterparty) and store the structured summary in Snowflake. Use for contract digitization and trade operations intake."
          inputParameters:
            - name: contract_text
              in: body
              type: string
              description: "Full text of the trade contract document."
            - name: contract_id
              in: body
              type: string
              description: "Bunge internal contract identifier."
          steps:
            - name: extract-terms
              type: call
              call: "anthropic.create-message"
              with:
                model: "claude-opus-4-5"
                max_tokens: 1024
                system: "You are a trade contract analyst. Extract key terms as JSON: commodity, price, volume, delivery_date, incoterms, counterparty."
                content: "{{contract_text}}"
            - name: store-summary
              type: call
              call: "snowflake-contracts.execute-statement"
              with:
                statement: "INSERT INTO BUNGE_DW.CONTRACTS.SUMMARIES (contract_id, extracted_terms, created_at) VALUES ('{{contract_id}}', PARSE_JSON('{{extract-terms.content}}'), CURRENT_TIMESTAMP())"
  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: snowflake-contracts
      baseUri: "https://bunge.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST

Queries AWS Cost Explorer for spend anomalies in the current billing period, logs findings to Snowflake, and sends a summary to the FinOps Teams channel.

naftiko: "0.5"
info:
  label: "AWS Cost Anomaly Detection and Alert"
  description: "Queries AWS Cost Explorer for spend anomalies in the current billing period, logs findings to Snowflake, and sends a summary to the FinOps Teams channel."
  tags:
    - cloud
    - finops
    - aws
    - snowflake
    - microsoft-teams
    - cost-management
capability:
  exposes:
    - type: mcp
      namespace: cloud-finops
      port: 8080
      tools:
        - name: detect-cost-anomalies
          description: "Query AWS Cost Explorer for spending anomalies over the trailing 7 days across all Bunge AWS accounts. Log detected anomalies to Snowflake and post a summary to the FinOps Teams channel. Use for proactive cloud cost governance."
          inputParameters:
            - name: threshold_usd
              in: body
              type: number
              description: "Minimum anomaly impact in USD to report, e.g. 500."
          steps:
            - name: get-anomalies
              type: call
              call: "aws-cost.get-anomalies"
              with:
                threshold: "{{threshold_usd}}"
            - name: log-to-snowflake
              type: call
              call: "snowflake-cost.execute-statement"
              with:
                statement: "INSERT INTO FINOPS.COST_ANOMALIES SELECT * FROM VALUES {{get-anomalies.data}}"
            - name: post-summary
              type: call
              call: "msteams-finops.send-message"
              with:
                channel: "finops-alerts"
                text: "AWS Cost Anomalies Detected: {{get-anomalies.total_impact}} USD impact across {{get-anomalies.count}} services."
  consumes:
    - type: http
      namespace: aws-cost
      baseUri: "https://ce.us-east-1.amazonaws.com"
      authentication:
        type: bearer
        token: "$secrets.aws_session_token"
      resources:
        - name: anomalies
          path: "/GetAnomalies"
          operations:
            - name: get-anomalies
              method: POST
    - type: http
      namespace: snowflake-cost
      baseUri: "https://bunge.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: msteams-finops
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Queries Azure Active Directory for user group memberships in privileged access groups, identifies stale memberships, and creates a ServiceNow task for access recertification.

naftiko: "0.5"
info:
  label: "Azure AD Access Review and Recertification"
  description: "Queries Azure Active Directory for user group memberships in privileged access groups, identifies stale memberships, and creates a ServiceNow task for access recertification."
  tags:
    - security
    - identity
    - azure-active-directory
    - servicenow
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: identity-governance
      port: 8080
      tools:
        - name: run-access-recertification
          description: "Retrieve all members of a privileged Azure AD group, identify accounts inactive for more than 90 days, and create a ServiceNow access review task listing accounts requiring recertification. Use for quarterly access reviews."
          inputParameters:
            - name: group_id
              in: body
              type: string
              description: "Azure AD group object ID to review."
            - name: inactivity_days
              in: body
              type: integer
              description: "Number of days of inactivity to flag accounts, typically 90."
          steps:
            - name: get-members
              type: call
              call: "azure-ad-review.list-group-members"
              with:
                group_id: "{{group_id}}"
            - name: create-review-task
              type: call
              call: "servicenow-access.create-incident"
              with:
                short_description: "Access recertification required for group {{group_id}}"
                description: "{{get-members.count}} members found. Accounts inactive >{{inactivity_days}} days require review."
                category: "access_review"
  consumes:
    - type: http
      namespace: azure-ad-review
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: group-members
          path: "/groups/{{group_id}}/members"
          inputParameters:
            - name: group_id
              in: path
          operations:
            - name: list-group-members
              method: GET
    - type: http
      namespace: servicenow-access
      baseUri: "https://bunge.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 access reviews.

naftiko: "0.5"
info:
  label: "Azure AD Access Review Workflow"
  description: "Triggers access reviews."
  tags:
    - security
    - azure-active-directory
    - microsoft-teams
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: security-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "Azure AD Access Review Workflow - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://bunge.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Alerts trading on price volatility.

naftiko: "0.5"
info:
  label: "Commodity Market Volatility Alert"
  description: "Alerts trading on price volatility."
  tags:
    - trading
    - bloomberg
    - microsoft-teams
    - risk-management
capability:
  exposes:
    - type: mcp
      namespace: trading-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "Commodity Market Volatility Alert - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://bunge.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Calculates mark-to-market.

naftiko: "0.5"
info:
  label: "Commodity Position Mark-to-Market"
  description: "Calculates mark-to-market."
  tags:
    - trading
    - sap
    - bloomberg
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: trading-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "Commodity Position Mark-to-Market - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://bunge.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Pulls current grain and oilseed spot prices from the Bloomberg API and stores a snapshot in Snowflake for downstream analytics and trading desk reporting.

naftiko: "0.5"
info:
  label: "Commodity Price Feed Snapshot"
  description: "Pulls current grain and oilseed spot prices from the Bloomberg API and stores a snapshot in Snowflake for downstream analytics and trading desk reporting."
  tags:
    - supply-chain
    - commodities
    - trading
    - bloomberg
    - snowflake
    - data
capability:
  exposes:
    - type: mcp
      namespace: commodities-data
      port: 8080
      tools:
        - name: snapshot-commodity-prices
          description: "Given a list of commodity ticker symbols (e.g. CBOT corn, soybean), retrieve current spot prices from Bloomberg and write a snapshot record to Snowflake. Use for daily price capture, risk management, or trading analytics."
          inputParameters:
            - name: tickers
              in: body
              type: array
              description: "List of Bloomberg commodity ticker symbols, e.g. ['C 1 Comdty', 'S 1 Comdty']."
            - name: snapshot_date
              in: body
              type: string
              description: "Date of snapshot in YYYY-MM-DD format."
          steps:
            - name: fetch-prices
              type: call
              call: "bloomberg.get-reference-data"
              with:
                identifiers: "{{tickers}}"
                fields: "PX_LAST,PX_OPEN,PX_HIGH,PX_LOW"
            - name: write-snapshot
              type: call
              call: "snowflake.insert-rows"
              with:
                table: "COMMODITIES.PRICE_SNAPSHOTS"
                data: "{{fetch-prices.data}}"
                snapshot_date: "{{snapshot_date}}"
  consumes:
    - type: http
      namespace: bloomberg
      baseUri: "https://api.bloomberg.com/eap/catalogs/bbg/datasets"
      authentication:
        type: bearer
        token: "$secrets.bloomberg_token"
      resources:
        - name: reference-data
          path: "/referenceData"
          operations:
            - name: get-reference-data
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://bunge.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: insert-rows
              method: POST

Creates SAP contracts for commodity trades.

naftiko: "0.5"
info:
  label: "Commodity Trade Confirmation Workflow"
  description: "Creates SAP contracts for commodity trades."
  tags:
    - trading
    - sap
    - microsoft-teams
    - commodities
capability:
  exposes:
    - type: mcp
      namespace: trading-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "Commodity Trade Confirmation Workflow - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://bunge.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Searches Confluence for pages matching a query.

naftiko: "0.5"
info:
  label: "Confluence Page Search"
  description: "Searches Confluence for pages matching a query."
  tags:
    - collaboration
    - confluence
    - knowledge-management
capability:
  exposes:
    - type: mcp
      namespace: collaboration-ops
      port: 8080
      tools:
        - name: get-record
          description: "Confluence Page Search - retrieve record data for operations review."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          call: primary.get-record
          with:
            record_id: "{{record_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.status"
            - name: result
              type: string
              mapping: "$.result"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: records
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-record
              method: GET

Creates incidents for anomalies.

naftiko: "0.5"
info:
  label: "Datadog Infrastructure Anomaly Alert"
  description: "Creates incidents for anomalies."
  tags:
    - observability
    - datadog
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: observability-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "Datadog Infrastructure Anomaly Alert - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://bunge.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Returns current health status of Bunge's monitored hosts and services from Datadog, flagging any hosts with unhealthy status for on-call review.

naftiko: "0.5"
info:
  label: "Datadog Infrastructure Health Check"
  description: "Returns current health status of Bunge's monitored hosts and services from Datadog, flagging any hosts with unhealthy status for on-call review."
  tags:
    - observability
    - monitoring
    - datadog
    - infrastructure
capability:
  exposes:
    - type: mcp
      namespace: observability
      port: 8080
      tools:
        - name: get-infra-health
          description: "Query Datadog for the current status of all monitored hosts and return a list of hosts with alert or no-data states. Use during incident response or daily operational health reviews."
          inputParameters:
            - name: filter_tag
              in: body
              type: string
              description: "Datadog host tag to filter by, e.g. 'env:production'."
          call: "datadog-hosts.list-hosts"
          with:
            filter: "{{filter_tag}}"
          outputParameters:
            - name: hosts
              type: array
              mapping: "$.host_list[*]"
  consumes:
    - type: http
      namespace: datadog-hosts
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: hosts
          path: "/hosts"
          inputParameters:
            - name: filter
              in: query
          operations:
            - name: list-hosts
              method: GET

Creates incidents for anomalies.

naftiko: "0.5"
info:
  label: "Datadog Log Anomaly to ServiceNow"
  description: "Creates incidents for anomalies."
  tags:
    - observability
    - datadog
    - servicenow
    - incident-management
capability:
  exposes:
    - type: mcp
      namespace: observability-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "Datadog Log Anomaly to ServiceNow - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://bunge.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Retrieves Service Level Objective compliance data from Datadog for all production services and publishes a weekly SLO report to the engineering Teams channel.

naftiko: "0.5"
info:
  label: "Datadog SLO Compliance Report"
  description: "Retrieves Service Level Objective compliance data from Datadog for all production services and publishes a weekly SLO report to the engineering Teams channel."
  tags:
    - observability
    - slo
    - datadog
    - microsoft-teams
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: slo-reporting
      port: 8080
      tools:
        - name: publish-slo-report
          description: "Retrieve all Datadog SLO compliance metrics for the trailing 7 days and post a summary report to the engineering Microsoft Teams channel showing which services are meeting or breaching their SLOs."
          inputParameters:
            - name: tag_filter
              in: body
              type: string
              description: "Datadog tag filter for SLO selection, e.g. 'env:production'."
          steps:
            - name: get-slos
              type: call
              call: "datadog-slo.list-slos"
              with:
                tags_query: "{{tag_filter}}"
            - name: post-report
              type: call
              call: "msteams-slo.send-message"
              with:
                channel: "engineering-metrics"
                text: "Weekly SLO Report: {{get-slos.compliant_count}} services meeting SLO, {{get-slos.breached_count}} breaching. Review Datadog for details."
  consumes:
    - type: http
      namespace: datadog-slo
      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_query
              in: query
          operations:
            - name: list-slos
              method: GET
    - type: http
      namespace: msteams-slo
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves the signing status of a DocuSign envelope including signer progress.

naftiko: "0.5"
info:
  label: "DocuSign Envelope Status"
  description: "Retrieves the signing status of a DocuSign envelope including signer progress."
  tags:
    - legal
    - docusign
    - contract-management
capability:
  exposes:
    - type: mcp
      namespace: legal-ops
      port: 8080
      tools:
        - name: get-record
          description: "DocuSign Envelope Status - retrieve record data for operations review."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          call: primary.get-record
          with:
            record_id: "{{record_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.status"
            - name: result
              type: string
              mapping: "$.result"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: records
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-record
              method: GET

When an employee separation is recorded in Workday, disables the Azure Active Directory account, revokes Salesforce access, and opens a ServiceNow offboarding task.

naftiko: "0.5"
info:
  label: "Employee Offboarding Workflow"
  description: "When an employee separation is recorded in Workday, disables the Azure Active Directory account, revokes Salesforce access, and opens a ServiceNow offboarding task."
  tags:
    - hr
    - offboarding
    - workday
    - azure-active-directory
    - servicenow
    - salesforce
capability:
  exposes:
    - type: mcp
      namespace: hr-offboarding
      port: 8080
      tools:
        - name: trigger-offboarding
          description: "Given a Workday employee ID and termination date, disable the Azure AD account, revoke Salesforce CRM access, and open a ServiceNow offboarding checklist ticket. Invoke when HR processes a separation event."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "Workday worker ID of the departing employee."
            - name: termination_date
              in: body
              type: string
              description: "Last day of employment in YYYY-MM-DD format."
          steps:
            - name: get-worker
              type: call
              call: "workday-lookup.get-worker"
              with:
                worker_id: "{{employee_id}}"
            - name: disable-aad
              type: call
              call: "azure-ad.disable-user"
              with:
                user_id: "{{get-worker.azure_object_id}}"
            - name: revoke-salesforce
              type: call
              call: "salesforce.deactivate-user"
              with:
                salesforce_user_id: "{{get-worker.salesforce_id}}"
            - name: open-ticket
              type: call
              call: "servicenow-offboard.create-incident"
              with:
                short_description: "Offboarding: {{get-worker.display_name}} — effective {{termination_date}}"
                category: "hr_offboarding"
  consumes:
    - type: http
      namespace: workday-lookup
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/bunge/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: azure-ad
      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: salesforce
      baseUri: "https://bunge.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: users
          path: "/sobjects/User/{{salesforce_user_id}}"
          inputParameters:
            - name: salesforce_user_id
              in: path
          operations:
            - name: deactivate-user
              method: PATCH
    - type: http
      namespace: servicenow-offboard
      baseUri: "https://bunge.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST

When a new hire is created in Workday, opens a ServiceNow onboarding ticket, provisions a SharePoint document folder, and sends a Microsoft Teams welcome message.

naftiko: "0.5"
info:
  label: "Employee Onboarding Orchestrator"
  description: "When a new hire is created in Workday, opens a ServiceNow onboarding ticket, provisions a SharePoint document folder, and sends a Microsoft Teams welcome message."
  tags:
    - hr
    - onboarding
    - workday
    - servicenow
    - sharepoint
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-onboarding
      port: 8080
      tools:
        - name: trigger-onboarding
          description: "Given a Workday employee ID and start date, orchestrate the full new-hire onboarding sequence: open a ServiceNow ticket, provision a SharePoint folder, and send a Teams welcome card. Invoke when HR confirms a new hire record is ready."
          inputParameters:
            - name: 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 YYYY-MM-DD format."
            - name: department
              in: body
              type: string
              description: "Department the new hire is joining."
          steps:
            - name: get-worker
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{employee_id}}"
            - name: create-ticket
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "New hire onboarding: {{get-worker.display_name}}"
                category: "hr_onboarding"
                assignment_group: "IT_Onboarding"
            - name: provision-folder
              type: call
              call: "sharepoint.create-folder"
              with:
                site_id: "hr-onboarding"
                folder_path: "OnboardingDocs/{{get-worker.display_name}}_{{start_date}}"
            - name: send-welcome
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{get-worker.work_email}}"
                text: "Welcome to Bunge, {{get-worker.first_name}}! Your onboarding ticket is {{create-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: "/bunge/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://bunge.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: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: drive-items
          path: "/sites/{{site_id}}/drive/root/children"
          inputParameters:
            - name: site_id
              in: path
          operations:
            - name: create-folder
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: chat-messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Creates Jira tickets.

naftiko: "0.5"
info:
  label: "GitHub Actions Build Failure Notification"
  description: "Creates Jira tickets."
  tags:
    - devops
    - github
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: devops-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "GitHub Actions Build Failure Notification - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://bunge.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

On a GitHub Actions workflow failure on a protected branch, creates a Jira bug, posts a Datadog deployment marker, and sends a Microsoft Teams alert with full context.

naftiko: "0.5"
info:
  label: "GitHub Actions CI/CD Pipeline Failure Response"
  description: "On a GitHub Actions workflow failure on a protected branch, creates a Jira bug, posts a Datadog deployment marker, and sends a Microsoft Teams alert with full context."
  tags:
    - devops
    - cicd
    - github
    - jira
    - datadog
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: devops
      port: 8080
      tools:
        - name: handle-pipeline-failure
          description: "Given a GitHub workflow run ID, repository, branch, and failed job name, create a Jira bug, post a Datadog deployment event marker, and send a Teams engineering alert. Invoke on any protected-branch CI failure."
          inputParameters:
            - name: run_id
              in: body
              type: string
              description: "GitHub Actions workflow run ID."
            - name: repository
              in: body
              type: string
              description: "GitHub repository full name, e.g. bunge/grain-trading-api."
            - name: branch
              in: body
              type: string
              description: "Branch name where the failure occurred."
            - name: failed_job
              in: body
              type: string
              description: "Name of the failed job in the workflow."
            - name: commit_sha
              in: body
              type: string
              description: "Git commit SHA that triggered the run."
          steps:
            - name: create-bug
              type: call
              call: "jira.create-issue"
              with:
                project_key: "ENG"
                issuetype: "Bug"
                summary: "[CI Failure] {{repository}} / {{branch}} — {{failed_job}}"
                description: "Run: {{run_id}} | Commit: {{commit_sha}}"
            - name: post-dd-event
              type: call
              call: "datadog-events.create-event"
              with:
                title: "CI Failure: {{repository}}"
                text: "Branch {{branch}} | Job: {{failed_job}} | Commit: {{commit_sha}}"
                tags: "env:cicd,repo:{{repository}}"
            - name: notify-engineering
              type: call
              call: "msteams-eng.send-message"
              with:
                channel: "engineering-alerts"
                text: "CI Failure: {{repository}} | Branch: {{branch}} | Job: {{failed_job}} | Jira: {{create-bug.key}}"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://bunge.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: datadog-events
      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-eng
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Checks approval before deployment.

naftiko: "0.5"
info:
  label: "GitHub Deployment Approval Gate"
  description: "Checks approval before deployment."
  tags:
    - devops
    - github
    - servicenow
    - change-management
capability:
  exposes:
    - type: mcp
      namespace: devops-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "GitHub Deployment Approval Gate - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://bunge.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Triggers a code security scan on a GitHub repository via GitHub Actions and opens a Jira security ticket for any high or critical vulnerability findings.

naftiko: "0.5"
info:
  label: "GitHub Repository Security Scan Trigger"
  description: "Triggers a code security scan on a GitHub repository via GitHub Actions and opens a Jira security ticket for any high or critical vulnerability findings."
  tags:
    - devops
    - security
    - github
    - jira
capability:
  exposes:
    - type: mcp
      namespace: devsec-ops
      port: 8080
      tools:
        - name: trigger-security-scan
          description: "Given a GitHub repository and branch, dispatch a security scan workflow via GitHub Actions. Poll for completion and create a Jira security bug for any high or critical findings. Use for on-demand or pre-release security validation."
          inputParameters:
            - name: repository
              in: body
              type: string
              description: "GitHub repository full name, e.g. bunge/logistics-api."
            - name: branch
              in: body
              type: string
              description: "Branch to scan."
          steps:
            - name: dispatch-scan
              type: call
              call: "github.dispatch-workflow"
              with:
                repo: "{{repository}}"
                workflow_id: "security-scan.yml"
                ref: "{{branch}}"
            - name: create-jira-ticket
              type: call
              call: "jira-sec.create-issue"
              with:
                project_key: "SEC"
                issuetype: "Bug"
                summary: "Security scan triggered: {{repository}}@{{branch}}"
                description: "Workflow dispatched. Run ID: {{dispatch-scan.run_id}}. Review scan results when complete."
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: workflow-dispatches
          path: "/repos/{{repo}}/actions/workflows/{{workflow_id}}/dispatches"
          inputParameters:
            - name: repo
              in: path
            - name: workflow_id
              in: path
          operations:
            - name: dispatch-workflow
              method: POST
    - type: http
      namespace: jira-sec
      baseUri: "https://bunge.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Creates Jira tickets.

naftiko: "0.5"
info:
  label: "GitHub Security Vulnerability Triage"
  description: "Creates Jira tickets."
  tags:
    - security
    - github
    - jira
    - vulnerability-management
capability:
  exposes:
    - type: mcp
      namespace: security-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "GitHub Security Vulnerability Triage - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://bunge.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Monitors grain elevator capacity.

naftiko: "0.5"
info:
  label: "Grain Elevator Capacity Monitor"
  description: "Monitors grain elevator capacity."
  tags:
    - supply-chain
    - iot
    - microsoft-teams
    - agribusiness
capability:
  exposes:
    - type: mcp
      namespace: supply-chain-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "Grain Elevator Capacity Monitor - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://bunge.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Creates incidents for shipment delays.

naftiko: "0.5"
info:
  label: "Grain Shipment Delay Escalation"
  description: "Creates incidents for shipment delays."
  tags:
    - logistics
    - servicenow
    - microsoft-teams
    - agribusiness
capability:
  exposes:
    - type: mcp
      namespace: logistics-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "Grain Shipment Delay Escalation - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://bunge.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Looks up the current status and estimated arrival of a Bunge grain shipment by bill of lading number via the SAP Transportation Management API.

naftiko: "0.5"
info:
  label: "Grain Shipment Tracking Lookup"
  description: "Looks up the current status and estimated arrival of a Bunge grain shipment by bill of lading number via the SAP Transportation Management API."
  tags:
    - supply-chain
    - logistics
    - sap
    - shipment-tracking
capability:
  exposes:
    - type: mcp
      namespace: logistics
      port: 8080
      tools:
        - name: get-shipment-status
          description: "Given a bill of lading number, return the current shipment status, carrier name, origin port, destination port, and estimated arrival date from SAP TM. Use for supply chain visibility, customer inquiries, or trade finance documentation."
          inputParameters:
            - name: bill_of_lading
              in: body
              type: string
              description: "Bill of lading number issued for the shipment."
          call: "sap-tm.get-shipment"
          with:
            bill_of_lading: "{{bill_of_lading}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.d.TransportationStatus"
            - name: carrier
              type: string
              mapping: "$.d.CarrierName"
            - name: eta
              type: string
              mapping: "$.d.PlannedArrivalDate"
            - name: origin
              type: string
              mapping: "$.d.DepartureLocation"
            - name: destination
              type: string
              mapping: "$.d.DestinationLocation"
  consumes:
    - type: http
      namespace: sap-tm
      baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/TM_FREIGHT_ORDER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: freight-orders
          path: "/FreightOrder('{{bill_of_lading}}')"
          inputParameters:
            - name: bill_of_lading
              in: path
          operations:
            - name: get-shipment
              method: GET

Queries ungroomed Jira tickets older than 30 days in a project, uses Anthropic to suggest priority and acceptance criteria, and updates each ticket with the AI-generated suggestions.

naftiko: "0.5"
info:
  label: "Jira Backlog Grooming Ticket Triage"
  description: "Queries ungroomed Jira tickets older than 30 days in a project, uses Anthropic to suggest priority and acceptance criteria, and updates each ticket with the AI-generated suggestions."
  tags:
    - devops
    - jira
    - ai
    - anthropic
    - agile
capability:
  exposes:
    - type: mcp
      namespace: backlog-ops
      port: 8080
      tools:
        - name: triage-backlog-tickets
          description: "Retrieve all ungroomed Jira tickets older than 30 days for a project, invoke Anthropic Claude to suggest priority classification and draft acceptance criteria for each, and update the Jira tickets with the suggestions. Use during sprint planning preparation."
          inputParameters:
            - name: project_key
              in: body
              type: string
              description: "Jira project key to triage, e.g. BUNGE-OPS."
            - name: max_tickets
              in: body
              type: integer
              description: "Maximum number of backlog tickets to process in one run."
          steps:
            - name: list-backlog
              type: call
              call: "jira-backlog.search-issues"
              with:
                jql: "project={{project_key}} AND status=Backlog AND created<=-30d ORDER BY created ASC"
                max_results: "{{max_tickets}}"
            - name: suggest-priorities
              type: call
              call: "anthropic-triage.create-message"
              with:
                model: "claude-opus-4-5"
                content: "Review these Jira ticket summaries and suggest priority (P1-P4) and 2-3 acceptance criteria for each: {{list-backlog.summaries}}"
            - name: update-tickets
              type: call
              call: "jira-update.bulk-update"
              with:
                issues: "{{list-backlog.issue_keys}}"
                comment: "AI Triage Suggestions: {{suggest-priorities.content}}"
  consumes:
    - type: http
      namespace: jira-backlog
      baseUri: "https://bunge.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issue-search
          path: "/issue/picker"
          inputParameters:
            - name: jql
              in: query
            - name: max_results
              in: query
          operations:
            - name: search-issues
              method: GET
    - type: http
      namespace: anthropic-triage
      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: jira-update
      baseUri: "https://bunge.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue/{{issue_key}}"
          inputParameters:
            - name: issue_key
              in: path
          operations:
            - name: bulk-update
              method: PUT

Queries completed Jira sprints for a project, calculates velocity metrics, and publishes a sprint summary to the engineering Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Jira Sprint Velocity Report"
  description: "Queries completed Jira sprints for a project, calculates velocity metrics, and publishes a sprint summary to the engineering Microsoft Teams channel."
  tags:
    - devops
    - jira
    - reporting
    - microsoft-teams
    - agile
capability:
  exposes:
    - type: mcp
      namespace: devops-reporting
      port: 8080
      tools:
        - name: publish-sprint-velocity
          description: "Retrieve the last N completed sprints for a Jira project, calculate average velocity (story points delivered), and post a sprint report to the engineering Teams channel. Use for retrospectives or program reporting."
          inputParameters:
            - name: project_key
              in: body
              type: string
              description: "Jira project key, e.g. BUNGE-TRADE."
            - name: sprint_count
              in: body
              type: integer
              description: "Number of completed sprints to include in the velocity calculation."
          steps:
            - name: get-sprints
              type: call
              call: "jira-sprints.list-sprints"
              with:
                project_key: "{{project_key}}"
                max_results: "{{sprint_count}}"
            - name: post-report
              type: call
              call: "msteams-dev.send-message"
              with:
                channel: "engineering-team"
                text: "Sprint Velocity Report for {{project_key}}: Avg {{get-sprints.avg_velocity}} pts/sprint over {{sprint_count}} sprints."
  consumes:
    - type: http
      namespace: jira-sprints
      baseUri: "https://bunge.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: sprints
          path: "/board/{{board_id}}/sprint"
          inputParameters:
            - name: board_id
              in: path
          operations:
            - name: list-sprints
              method: GET
    - type: http
      namespace: msteams-dev
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Pulls open Bunge requisitions from Workday Recruiting and matches them against LinkedIn Talent Solutions candidate pools, publishing a weekly digest to the HR Teams channel.

naftiko: "0.5"
info:
  label: "LinkedIn Talent Pipeline Digest"
  description: "Pulls open Bunge requisitions from Workday Recruiting and matches them against LinkedIn Talent Solutions candidate pools, publishing a weekly digest to the HR Teams channel."
  tags:
    - hr
    - recruiting
    - workday
    - linkedin
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: talent-acquisition
      port: 8080
      tools:
        - name: digest-talent-pipeline
          description: "Retrieve open job requisitions from Workday Recruiting, query LinkedIn Talent Solutions for matching candidate counts per role, and post a weekly talent pipeline digest to the HR Microsoft Teams channel."
          inputParameters:
            - name: week_ending
              in: body
              type: string
              description: "Week ending date in YYYY-MM-DD format for the digest."
          steps:
            - name: get-requisitions
              type: call
              call: "workday-recruit.list-requisitions"
              with:
                status: "Open"
            - name: get-linkedin-pools
              type: call
              call: "linkedin.search-candidates"
              with:
                job_titles: "{{get-requisitions.titles}}"
            - name: post-digest
              type: call
              call: "msteams-hr.send-message"
              with:
                channel: "hr-talent"
                text: "Talent Pipeline Digest (week of {{week_ending}}): {{get-requisitions.count}} open reqs | {{get-linkedin-pools.candidate_count}} LinkedIn candidates matched."
  consumes:
    - type: http
      namespace: workday-recruit
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: job-requisitions
          path: "/bunge/jobRequisitions"
          operations:
            - name: list-requisitions
              method: GET
    - type: http
      namespace: linkedin
      baseUri: "https://api.linkedin.com/v2"
      authentication:
        type: bearer
        token: "$secrets.linkedin_token"
      resources:
        - name: talent-search
          path: "/talentSearch"
          operations:
            - name: search-candidates
              method: POST
    - type: http
      namespace: msteams-hr
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Monitors environmental compliance.

naftiko: "0.5"
info:
  label: "Manufacturing Environmental Compliance Monitor"
  description: "Monitors environmental compliance."
  tags:
    - manufacturing
    - compliance
    - microsoft-teams
    - environmental
capability:
  exposes:
    - type: mcp
      namespace: manufacturing-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "Manufacturing Environmental Compliance Monitor - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://bunge.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Given a supplier name, retrieves recent risk signals from Salesforce and SAP, sends the data to OpenAI for narrative risk summarization, and posts the result to the procurement Teams channel.

naftiko: "0.5"
info:
  label: "OpenAI-Assisted Supplier Risk Summarization"
  description: "Given a supplier name, retrieves recent risk signals from Salesforce and SAP, sends the data to OpenAI for narrative risk summarization, and posts the result to the procurement Teams channel."
  tags:
    - ai
    - openai
    - procurement
    - salesforce
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: ai-procurement
      port: 8080
      tools:
        - name: summarize-supplier-risk
          description: "Given a supplier name and Salesforce account ID, retrieve recent service issues from ServiceNow and open POs from SAP, then invoke OpenAI to produce a 200-word supplier risk narrative. Post to the procurement Teams channel. Use for supplier quarterly business reviews."
          inputParameters:
            - name: supplier_name
              in: body
              type: string
              description: "Legal name of the supplier."
            - name: account_id
              in: body
              type: string
              description: "Salesforce account ID for the supplier."
          steps:
            - name: get-sf-account
              type: call
              call: "salesforce-supplier.get-account"
              with:
                account_id: "{{account_id}}"
            - name: get-open-pos
              type: call
              call: "sap-supplier.get-po-list"
              with:
                supplier_name: "{{supplier_name}}"
            - name: generate-summary
              type: call
              call: "openai.create-completion"
              with:
                model: "gpt-4o"
                prompt: "Summarize supplier risk for {{supplier_name}}. Open POs: {{get-open-pos.count}}. Salesforce risk rating: {{get-sf-account.risk_rating}}. Recent issues: {{get-sf-account.recent_issues}}."
            - name: post-to-teams
              type: call
              call: "msteams-purch.send-message"
              with:
                channel: "procurement-ops"
                text: "Supplier Risk Summary — {{supplier_name}}: {{generate-summary.text}}"
  consumes:
    - type: http
      namespace: salesforce-supplier
      baseUri: "https://bunge.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-supplier
      baseUri: "https://bunge-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"
          inputParameters:
            - name: supplier_name
              in: query
          operations:
            - name: get-po-list
              method: GET
    - type: http
      namespace: openai
      baseUri: "https://api.openai.com/v1"
      authentication:
        type: bearer
        token: "$secrets.openai_api_key"
      resources:
        - name: completions
          path: "/chat/completions"
          operations:
            - name: create-completion
              method: POST
    - type: http
      namespace: msteams-purch
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves the current firewall security policies from Palo Alto Networks, flags any rules with 'any' source or destination, and logs findings to ServiceNow for review.

naftiko: "0.5"
info:
  label: "Palo Alto Networks Firewall Policy Audit"
  description: "Retrieves the current firewall security policies from Palo Alto Networks, flags any rules with 'any' source or destination, and logs findings to ServiceNow for review."
  tags:
    - security
    - identity
    - palo-alto-networks
    - servicenow
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: security-ops
      port: 8080
      tools:
        - name: audit-firewall-policies
          description: "Retrieve all firewall security policies from Palo Alto Networks, identify overly permissive rules (any source/destination), and create a ServiceNow change request for remediation review. Use for quarterly security compliance audits."
          inputParameters:
            - name: firewall_hostname
              in: body
              type: string
              description: "Hostname of the Palo Alto Networks firewall to audit."
          steps:
            - name: get-policies
              type: call
              call: "paloalto.get-security-policies"
              with:
                hostname: "{{firewall_hostname}}"
            - name: create-change
              type: call
              call: "servicenow-sec.create-change"
              with:
                short_description: "Firewall policy audit findings: {{firewall_hostname}}"
                description: "Overly permissive rules found during audit. Total policies reviewed: {{get-policies.count}}"
                category: "security_audit"
  consumes:
    - type: http
      namespace: paloalto
      baseUri: "https://{{hostname}}/restapi/v10.1"
      authentication:
        type: apikey
        key: "X-PAN-KEY"
        value: "$secrets.paloalto_api_key"
        placement: header
      resources:
        - name: security-policies
          path: "/Objects/SecurityRules"
          operations:
            - name: get-security-policies
              method: GET
    - type: http
      namespace: servicenow-sec
      baseUri: "https://bunge.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: change-requests
          path: "/table/change_request"
          operations:
            - name: create-change
              method: POST

Returns the current headcount grouped by department and cost center from Workday, enabling real-time workforce planning and cost analysis.

naftiko: "0.5"
info:
  label: "Payroll Headcount Snapshot"
  description: "Returns the current headcount grouped by department and cost center from Workday, enabling real-time workforce planning and cost analysis."
  tags:
    - hr
    - payroll
    - headcount
    - workday
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: hr-reporting
      port: 8080
      tools:
        - name: get-headcount-snapshot
          description: "Returns a list of active Bunge employees grouped by department and cost center from Workday. Use for workforce planning, budget forecasting, or cost center reporting."
          call: "workday-hcm.headcount-export"
          outputParameters:
            - name: employees
              type: array
              mapping: "$.data[*]"
  consumes:
    - type: http
      namespace: workday-hcm
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: worker-export
          path: "/bunge/workers"
          operations:
            - name: headcount-export
              method: GET

Checks the latest Power BI dataset refresh status, returning completion time and status.

naftiko: "0.5"
info:
  label: "Power BI Dataset Refresh Status"
  description: "Checks the latest Power BI dataset refresh status, returning completion time and status."
  tags:
    - analytics
    - power-bi
    - monitoring
capability:
  exposes:
    - type: mcp
      namespace: analytics-ops
      port: 8080
      tools:
        - name: get-record
          description: "Power BI Dataset Refresh Status - retrieve record data for operations review."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          call: primary.get-record
          with:
            record_id: "{{record_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.status"
            - name: result
              type: string
              mapping: "$.result"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: records
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-record
              method: GET

Triggers a Power BI dataset refresh for the executive KPI dashboard and notifies stakeholders via Microsoft Teams when the refresh is complete.

naftiko: "0.5"
info:
  label: "Power BI Executive Dashboard Refresh Trigger"
  description: "Triggers a Power BI dataset refresh for the executive KPI dashboard and notifies stakeholders via Microsoft Teams when the refresh is complete."
  tags:
    - data
    - analytics
    - power-bi
    - reporting
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: exec-reporting
      port: 8080
      tools:
        - name: refresh-executive-dashboard
          description: "Trigger a dataset refresh on the Bunge executive KPI Power BI dashboard and notify the leadership Teams channel upon completion. Use before board meetings or executive reviews."
          inputParameters:
            - name: notify_channel
              in: body
              type: string
              description: "Teams channel name to notify on completion, e.g. 'executive-team'."
          steps:
            - name: trigger-refresh
              type: call
              call: "powerbi-refresh.trigger-refresh"
              with:
                dataset_id: "$secrets.powerbi_exec_dataset_id"
            - name: notify-leadership
              type: call
              call: "msteams-exec.send-message"
              with:
                channel: "{{notify_channel}}"
                text: "Executive KPI Dashboard refresh initiated. Status: {{trigger-refresh.status}}. Dashboard will be updated shortly."
  consumes:
    - type: http
      namespace: powerbi-refresh
      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
    - type: http
      namespace: msteams-exec
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Refreshes executive dashboard.

naftiko: "0.5"
info:
  label: "Power BI Executive Dashboard Refresh"
  description: "Refreshes executive dashboard."
  tags:
    - analytics
    - power-bi
    - microsoft-teams
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: analytics-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "Power BI Executive Dashboard Refresh - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://bunge.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Refreshes supply chain KPIs.

naftiko: "0.5"
info:
  label: "Power BI Supply Chain Dashboard Refresh"
  description: "Refreshes supply chain KPIs."
  tags:
    - analytics
    - power-bi
    - microsoft-teams
    - supply-chain
capability:
  exposes:
    - type: mcp
      namespace: analytics-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "Power BI Supply Chain Dashboard Refresh - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://bunge.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Posts health score digest.

naftiko: "0.5"
info:
  label: "Salesforce Account Health Score Digest"
  description: "Posts health score digest."
  tags:
    - sales
    - salesforce
    - microsoft-teams
    - customer-success
capability:
  exposes:
    - type: mcp
      namespace: sales-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "Salesforce Account Health Score Digest - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://bunge.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Queries Snowflake for customer trading volume metrics, calculates an account health score, and updates the Salesforce account record for use by the sales team.

naftiko: "0.5"
info:
  label: "Salesforce Account Health Score Refresh"
  description: "Queries Snowflake for customer trading volume metrics, calculates an account health score, and updates the Salesforce account record for use by the sales team."
  tags:
    - crm
    - sales
    - salesforce
    - snowflake
    - analytics
capability:
  exposes:
    - type: mcp
      namespace: crm-analytics
      port: 8080
      tools:
        - name: refresh-account-health-score
          description: "Given a Salesforce account ID, query Snowflake for the customer's trailing 90-day trading volume and contract fulfillment rate, compute a health score (0–100), and update the Salesforce account record. Use for account review cycles or churn risk identification."
          inputParameters:
            - name: account_id
              in: body
              type: string
              description: "Salesforce account ID (18-character)."
            - name: customer_id
              in: body
              type: string
              description: "Bunge internal customer ID for Snowflake lookup."
          steps:
            - name: get-trading-metrics
              type: call
              call: "snowflake-crm.execute-statement"
              with:
                statement: "SELECT SUM(volume_mt) as total_volume, AVG(fulfillment_rate) as avg_fulfillment FROM BUNGE_DW.SALES.CUSTOMER_METRICS WHERE customer_id='{{customer_id}}' AND trade_date >= DATEADD(day,-90,CURRENT_DATE())"
            - name: update-account
              type: call
              call: "salesforce-acct.update-account"
              with:
                account_id: "{{account_id}}"
                health_score: "{{get-trading-metrics.health_score}}"
                last_score_date: "{{get-trading-metrics.as_of_date}}"
  consumes:
    - type: http
      namespace: snowflake-crm
      baseUri: "https://bunge.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: salesforce-acct
      baseUri: "https://bunge.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: accounts
          path: "/sobjects/Account/{{account_id}}"
          inputParameters:
            - name: account_id
              in: path
          operations:
            - name: update-account
              method: PATCH

Retrieves a Salesforce support case by number, returning status, priority, and account name.

naftiko: "0.5"
info:
  label: "Salesforce Case Lookup"
  description: "Retrieves a Salesforce support case by number, returning status, priority, and account name."
  tags:
    - customer-service
    - salesforce
    - crm
capability:
  exposes:
    - type: mcp
      namespace: customer-service-ops
      port: 8080
      tools:
        - name: get-record
          description: "Salesforce Case Lookup - retrieve record data for operations review."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          call: primary.get-record
          with:
            record_id: "{{record_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.status"
            - name: result
              type: string
              mapping: "$.result"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: records
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-record
              method: GET

Routes complaints for resolution.

naftiko: "0.5"
info:
  label: "Salesforce Customer Complaint Workflow"
  description: "Routes complaints for resolution."
  tags:
    - customer-service
    - salesforce
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: customer-service-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "Salesforce Customer Complaint Workflow - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://bunge.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Triggers credit reviews.

naftiko: "0.5"
info:
  label: "Salesforce Customer Credit Review"
  description: "Triggers credit reviews."
  tags:
    - sales
    - salesforce
    - microsoft-teams
    - credit-management
capability:
  exposes:
    - type: mcp
      namespace: sales-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "Salesforce Customer Credit Review - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://bunge.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

When a new Salesforce lead is created, enriches it with ZoomInfo firmographic data and routes it to the correct regional sales queue based on geography.

naftiko: "0.5"
info:
  label: "Salesforce Lead Enrichment and Routing"
  description: "When a new Salesforce lead is created, enriches it with ZoomInfo firmographic data and routes it to the correct regional sales queue based on geography."
  tags:
    - crm
    - sales
    - salesforce
    - zoominfo
    - lead-management
capability:
  exposes:
    - type: mcp
      namespace: crm-sales
      port: 8080
      tools:
        - name: enrich-and-route-lead
          description: "Given a Salesforce lead ID, fetch ZoomInfo firmographic data (company size, industry, revenue), update the lead record, and assign it to the correct regional sales queue. Use when a new inbound lead requires qualification and routing."
          inputParameters:
            - name: lead_id
              in: body
              type: string
              description: "Salesforce lead record ID (18-character)."
          steps:
            - name: get-lead
              type: call
              call: "salesforce-read.get-lead"
              with:
                lead_id: "{{lead_id}}"
            - name: enrich-firmographic
              type: call
              call: "zoominfo.search-company"
              with:
                company_name: "{{get-lead.Company}}"
                country: "{{get-lead.Country}}"
            - name: update-lead
              type: call
              call: "salesforce-write.update-lead"
              with:
                lead_id: "{{lead_id}}"
                annual_revenue: "{{enrich-firmographic.revenue}}"
                number_of_employees: "{{enrich-firmographic.employee_count}}"
                industry: "{{enrich-firmographic.industry}}"
                owner_queue: "{{enrich-firmographic.region}}"
  consumes:
    - type: http
      namespace: salesforce-read
      baseUri: "https://bunge.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: leads
          path: "/sobjects/Lead/{{lead_id}}"
          inputParameters:
            - name: lead_id
              in: path
          operations:
            - name: get-lead
              method: GET
    - type: http
      namespace: zoominfo
      baseUri: "https://api.zoominfo.com/search"
      authentication:
        type: bearer
        token: "$secrets.zoominfo_token"
      resources:
        - name: company-search
          path: "/company"
          operations:
            - name: search-company
              method: POST
    - type: http
      namespace: salesforce-write
      baseUri: "https://bunge.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: leads-update
          path: "/sobjects/Lead/{{lead_id}}"
          inputParameters:
            - name: lead_id
              in: path
          operations:
            - name: update-lead
              method: PATCH

Creates SAP customer from Salesforce.

naftiko: "0.5"
info:
  label: "Salesforce New Account to SAP Customer"
  description: "Creates SAP customer from Salesforce."
  tags:
    - sales
    - salesforce
    - sap
    - sync
capability:
  exposes:
    - type: mcp
      namespace: sales-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "Salesforce New Account to SAP Customer - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://bunge.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Generates a weekly pipeline digest from Salesforce, summarizing open opportunities by stage and region, and posts the report to a Microsoft Teams sales channel.

naftiko: "0.5"
info:
  label: "Salesforce Opportunity Pipeline Digest"
  description: "Generates a weekly pipeline digest from Salesforce, summarizing open opportunities by stage and region, and posts the report to a Microsoft Teams sales channel."
  tags:
    - crm
    - sales
    - salesforce
    - microsoft-teams
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: sales-reporting
      port: 8080
      tools:
        - name: digest-pipeline
          description: "Query Salesforce for all open opportunities grouped by stage and region, then post a structured weekly pipeline summary to the Microsoft Teams sales channel. Use for weekly sales reviews or executive briefings."
          inputParameters:
            - name: fiscal_quarter
              in: body
              type: string
              description: "Fiscal quarter to filter by, e.g. Q2-2026."
          steps:
            - name: query-opportunities
              type: call
              call: "salesforce-opp.query-opportunities"
              with:
                quarter: "{{fiscal_quarter}}"
            - name: post-digest
              type: call
              call: "msteams-sales.send-message"
              with:
                channel: "sales-leadership"
                text: "Pipeline Digest {{fiscal_quarter}}: {{query-opportunities.summary}}"
  consumes:
    - type: http
      namespace: salesforce-opp
      baseUri: "https://bunge.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opportunities
          path: "/query"
          operations:
            - name: query-opportunities
              method: GET
    - type: http
      namespace: msteams-sales
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Creates SAP contracts from won opportunities.

naftiko: "0.5"
info:
  label: "Salesforce Opportunity to SAP Contract"
  description: "Creates SAP contracts from won opportunities."
  tags:
    - sales
    - salesforce
    - sap
    - sync
capability:
  exposes:
    - type: mcp
      namespace: sales-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "Salesforce Opportunity to SAP Contract - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://bunge.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Pushes pipeline to Power BI.

naftiko: "0.5"
info:
  label: "Salesforce Quarterly Pipeline to Power BI"
  description: "Pushes pipeline to Power BI."
  tags:
    - sales
    - salesforce
    - power-bi
    - analytics
capability:
  exposes:
    - type: mcp
      namespace: sales-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "Salesforce Quarterly Pipeline to Power BI - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://bunge.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Pushes win-loss to Power BI.

naftiko: "0.5"
info:
  label: "Salesforce Win-Loss Analysis Report"
  description: "Pushes win-loss to Power BI."
  tags:
    - sales
    - salesforce
    - power-bi
    - analytics
capability:
  exposes:
    - type: mcp
      namespace: sales-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "Salesforce Win-Loss Analysis Report - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://bunge.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Creates tasks for expiring contracts.

naftiko: "0.5"
info:
  label: "SAP Ariba Contract Renewal Alert"
  description: "Creates tasks for expiring contracts."
  tags:
    - procurement
    - sap-ariba
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: procurement-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "SAP Ariba Contract Renewal Alert - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://bunge.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Routes match exceptions.

naftiko: "0.5"
info:
  label: "SAP Ariba Invoice Matching Exception"
  description: "Routes match exceptions."
  tags:
    - procurement
    - sap-ariba
    - microsoft-teams
    - accounts-payable
capability:
  exposes:
    - type: mcp
      namespace: procurement-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "SAP Ariba Invoice Matching Exception - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://bunge.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Submits a new purchase requisition in SAP Ariba, retrieves its approval status, and notifies the requestor via Microsoft Teams when approved or rejected.

naftiko: "0.5"
info:
  label: "SAP Ariba Purchase Requisition Approval"
  description: "Submits a new purchase requisition in SAP Ariba, retrieves its approval status, and notifies the requestor via Microsoft Teams when approved or rejected."
  tags:
    - procurement
    - sap-ariba
    - approval
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: procurement
      port: 8080
      tools:
        - name: submit-purchase-requisition
          description: "Given requisition details (commodity, quantity, unit price, supplier), create a purchase requisition in SAP Ariba and notify the requestor via Teams of the submission and initial approval status. Use for automated procurement intake."
          inputParameters:
            - name: commodity
              in: body
              type: string
              description: "Commodity or material being procured, e.g. Soybean Oil."
            - name: quantity
              in: body
              type: number
              description: "Quantity to procure."
            - name: unit_price
              in: body
              type: number
              description: "Unit price in USD."
            - name: supplier_id
              in: body
              type: string
              description: "SAP Ariba supplier ID."
            - name: requestor_upn
              in: body
              type: string
              description: "UPN of the employee submitting the requisition."
          steps:
            - name: create-pr
              type: call
              call: "ariba.create-requisition"
              with:
                commodity: "{{commodity}}"
                quantity: "{{quantity}}"
                unit_price: "{{unit_price}}"
                supplier_id: "{{supplier_id}}"
            - name: notify-requestor
              type: call
              call: "msteams-proc.send-message"
              with:
                recipient_upn: "{{requestor_upn}}"
                text: "Your purchase requisition for {{commodity}} has been submitted. Ariba PR ID: {{create-pr.requisition_id}} | Status: {{create-pr.status}}"
  consumes:
    - type: http
      namespace: ariba
      baseUri: "https://openapi.ariba.com/api/purchase-requisitions-buying/v1"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: requisitions
          path: "/requisitions"
          operations:
            - name: create-requisition
              method: POST
    - type: http
      namespace: msteams-proc
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail-send
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Posts supplier performance.

naftiko: "0.5"
info:
  label: "SAP Ariba Supplier Performance Review"
  description: "Posts supplier performance."
  tags:
    - procurement
    - sap-ariba
    - microsoft-teams
    - supplier-management
capability:
  exposes:
    - type: mcp
      namespace: procurement-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "SAP Ariba Supplier Performance Review - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://bunge.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Audits expenses.

naftiko: "0.5"
info:
  label: "SAP Concur Expense Compliance Audit"
  description: "Audits expenses."
  tags:
    - travel
    - sap-concur
    - microsoft-teams
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: travel-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "SAP Concur Expense Compliance Audit - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://bunge.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Retrieves pending expense reports from SAP Concur for a given cost center, validates against Bunge travel policy thresholds, and approves or flags for manual review via Teams notification.

naftiko: "0.5"
info:
  label: "SAP Concur Expense Report Approval"
  description: "Retrieves pending expense reports from SAP Concur for a given cost center, validates against Bunge travel policy thresholds, and approves or flags for manual review via Teams notification."
  tags:
    - finance
    - expense-management
    - sap-concur
    - microsoft-teams
    - approval
capability:
  exposes:
    - type: mcp
      namespace: finance-expenses
      port: 8080
      tools:
        - name: process-expense-approvals
          description: "Retrieve pending expense reports in SAP Concur for a cost center, auto-approve those within policy, and flag out-of-policy reports to the finance manager in Teams. Use for automated expense workflow management."
          inputParameters:
            - name: cost_center
              in: body
              type: string
              description: "Bunge cost center code to filter pending expense reports."
            - name: policy_limit_usd
              in: body
              type: number
              description: "Per-report USD threshold for auto-approval."
            - name: finance_manager_upn
              in: body
              type: string
              description: "UPN of the finance manager to notify for out-of-policy reports."
          steps:
            - name: get-reports
              type: call
              call: "concur.list-expense-reports"
              with:
                cost_center: "{{cost_center}}"
                status: "PENDING"
            - name: notify-manager
              type: call
              call: "msteams-finance.send-message"
              with:
                recipient_upn: "{{finance_manager_upn}}"
                text: "Expense Reports Pending for cost center {{cost_center}}: {{get-reports.count}} reports. Policy limit: ${{policy_limit_usd}}. Please review out-of-policy items."
  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: cost_center
              in: query
            - name: status
              in: query
          operations:
            - name: list-expense-reports
              method: GET
    - type: http
      namespace: msteams-finance
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail-send
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Checks travel policy compliance.

naftiko: "0.5"
info:
  label: "SAP Concur Travel Booking Compliance"
  description: "Checks travel policy compliance."
  tags:
    - travel
    - sap-concur
    - microsoft-teams
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: travel-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "SAP Concur Travel Booking Compliance - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://bunge.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

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

naftiko: "0.5"
info:
  label: "SAP Cost Center Budget Check"
  description: "Retrieves budget vs actual spend for a SAP cost center, returning planned budget and variance."
  tags:
    - finance
    - sap
    - erp
    - budgeting
capability:
  exposes:
    - type: mcp
      namespace: finance-ops
      port: 8080
      tools:
        - name: get-record
          description: "SAP Cost Center Budget Check - retrieve record data for operations review."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          call: primary.get-record
          with:
            record_id: "{{record_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.status"
            - name: result
              type: string
              mapping: "$.result"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: records
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-record
              method: GET

Posts demand forecasts.

naftiko: "0.5"
info:
  label: "SAP Demand Planning Forecast Digest"
  description: "Posts demand forecasts."
  tags:
    - supply-chain
    - sap
    - microsoft-teams
    - forecasting
capability:
  exposes:
    - type: mcp
      namespace: supply-chain-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "SAP Demand Planning Forecast Digest - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://bunge.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Posts close readiness.

naftiko: "0.5"
info:
  label: "SAP Financial Close Readiness Check"
  description: "Posts close readiness."
  tags:
    - finance
    - sap
    - microsoft-teams
    - accounting
capability:
  exposes:
    - type: mcp
      namespace: finance-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "SAP Financial Close Readiness Check - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://bunge.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Checks whether a SAP financial posting period is open or closed.

naftiko: "0.5"
info:
  label: "SAP Financial Posting Period Check"
  description: "Checks whether a SAP financial posting period is open or closed."
  tags:
    - finance
    - sap
    - erp
    - accounting
capability:
  exposes:
    - type: mcp
      namespace: finance-ops
      port: 8080
      tools:
        - name: get-record
          description: "SAP Financial Posting Period Check - retrieve record data for operations review."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          call: primary.get-record
          with:
            record_id: "{{record_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.status"
            - name: result
              type: string
              mapping: "$.result"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: records
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-record
              method: GET

Creates audit tasks.

naftiko: "0.5"
info:
  label: "SAP Goods Movement Reversal Alert"
  description: "Creates audit tasks."
  tags:
    - supply-chain
    - sap
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: supply-chain-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "SAP Goods Movement Reversal Alert - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://bunge.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Posts a goods receipt against a SAP purchase order, confirming delivery and updating inventory records.

naftiko: "0.5"
info:
  label: "SAP Goods Receipt Posting"
  description: "Posts a goods receipt against a SAP purchase order, confirming delivery and updating inventory records."
  tags:
    - supply-chain
    - sap
    - erp
    - inventory
capability:
  exposes:
    - type: mcp
      namespace: supply-chain-ops
      port: 8080
      tools:
        - name: get-record
          description: "SAP Goods Receipt Posting - retrieve record data for operations review."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          call: primary.get-record
          with:
            record_id: "{{record_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.status"
            - name: result
              type: string
              mapping: "$.result"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: records
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-record
              method: GET

Creates purchase requisitions.

naftiko: "0.5"
info:
  label: "SAP Inventory Reorder Point Alert"
  description: "Creates purchase requisitions."
  tags:
    - supply-chain
    - sap
    - microsoft-teams
    - inventory
capability:
  exposes:
    - type: mcp
      namespace: supply-chain-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "SAP Inventory Reorder Point Alert - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://bunge.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Retrieves invoice payment status from SAP including approval state and payment date.

naftiko: "0.5"
info:
  label: "SAP Invoice Payment Status"
  description: "Retrieves invoice payment status from SAP including approval state and payment date."
  tags:
    - finance
    - sap
    - erp
    - accounts-payable
capability:
  exposes:
    - type: mcp
      namespace: finance-ops
      port: 8080
      tools:
        - name: get-record
          description: "SAP Invoice Payment Status - retrieve record data for operations review."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          call: primary.get-record
          with:
            record_id: "{{record_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.status"
            - name: result
              type: string
              mapping: "$.result"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: records
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-record
              method: GET

Receives an incoming vendor invoice, validates it against the SAP purchase order, posts the invoice in SAP, and notifies the AP team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "SAP Invoice Processing Workflow"
  description: "Receives an incoming vendor invoice, validates it against the SAP purchase order, posts the invoice in SAP, and notifies the AP team via Microsoft Teams."
  tags:
    - finance
    - erp
    - accounts-payable
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: erp-finance
      port: 8080
      tools:
        - name: process-vendor-invoice
          description: "Given a vendor invoice number, PO number, and invoice amount, validate the invoice against the SAP PO and post it to SAP S/4HANA. Notifies the AP team in Microsoft Teams on success or failure. Use for automated invoice processing."
          inputParameters:
            - name: invoice_number
              in: body
              type: string
              description: "Vendor invoice number as it appears on the document."
            - name: po_number
              in: body
              type: string
              description: "Associated SAP purchase order number."
            - name: invoice_amount
              in: body
              type: number
              description: "Invoice total amount in the vendor's currency."
            - name: currency
              in: body
              type: string
              description: "Three-letter ISO currency code, e.g. USD."
          steps:
            - name: validate-po
              type: call
              call: "sap-po.get-po"
              with:
                po_number: "{{po_number}}"
            - name: post-invoice
              type: call
              call: "sap-fi.post-invoice"
              with:
                po_number: "{{po_number}}"
                invoice_number: "{{invoice_number}}"
                amount: "{{invoice_amount}}"
                currency: "{{currency}}"
            - name: notify-ap
              type: call
              call: "msteams-ap.send-message"
              with:
                channel: "ap-team"
                text: "Invoice {{invoice_number}} posted for PO {{po_number}} — Amount: {{invoice_amount}} {{currency}} | SAP Doc: {{post-invoice.document_number}}"
  consumes:
    - type: http
      namespace: sap-po
      baseUri: "https://bunge-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
    - type: http
      namespace: sap-fi
      baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_SUPPLIERINVOICE_PROCESS_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: supplier-invoices
          path: "/A_SupplierInvoice"
          operations:
            - name: post-invoice
              method: POST
    - type: http
      namespace: msteams-ap
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Triggers an MRP planning run in SAP S/4HANA for a given plant and material group, retrieves planned order recommendations, and posts a summary to the supply chain Teams channel.

naftiko: "0.5"
info:
  label: "SAP Material Requirements Planning Run"
  description: "Triggers an MRP planning run in SAP S/4HANA for a given plant and material group, retrieves planned order recommendations, and posts a summary to the supply chain Teams channel."
  tags:
    - supply-chain
    - erp
    - sap
    - planning
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: supply-planning
      port: 8080
      tools:
        - name: run-mrp-plan
          description: "Trigger an SAP S/4HANA MRP planning run for a specified plant and material group, retrieve the resulting planned orders, and post a summary count and key shortfalls to the supply chain Teams channel. Use for weekly supply planning cycles."
          inputParameters:
            - name: plant_code
              in: body
              type: string
              description: "SAP plant code to run MRP for, e.g. BU01."
            - name: material_group
              in: body
              type: string
              description: "SAP material group code, e.g. OILSEEDS."
          steps:
            - name: trigger-mrp
              type: call
              call: "sap-mrp.run-mrp"
              with:
                plant: "{{plant_code}}"
                material_group: "{{material_group}}"
            - name: get-planned-orders
              type: call
              call: "sap-planned.list-planned-orders"
              with:
                plant: "{{plant_code}}"
                mrp_run_id: "{{trigger-mrp.run_id}}"
            - name: notify-supply-chain
              type: call
              call: "msteams-sc.send-message"
              with:
                channel: "supply-chain-ops"
                text: "MRP Run Complete: Plant {{plant_code}} | {{get-planned-orders.count}} planned orders generated | {{get-planned-orders.shortfall_count}} shortfalls identified."
  consumes:
    - type: http
      namespace: sap-mrp
      baseUri: "https://bunge-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-runs
          path: "/MRPMaterialParameters"
          operations:
            - name: run-mrp
              method: POST
    - type: http
      namespace: sap-planned
      baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_PLANNED_ORDERS_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: planned-orders
          path: "/PlannedOrder"
          inputParameters:
            - name: plant
              in: query
          operations:
            - name: list-planned-orders
              method: GET
    - type: http
      namespace: msteams-sc
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Runs the Bunge month-end close checklist against SAP S/4HANA, verifying that all required journal entries and reconciliations are complete, and posts a status summary to the Finance Teams channel.

naftiko: "0.5"
info:
  label: "SAP Period-End Financial Close Checklist"
  description: "Runs the Bunge month-end close checklist against SAP S/4HANA, verifying that all required journal entries and reconciliations are complete, and posts a status summary to the Finance Teams channel."
  tags:
    - finance
    - erp
    - sap
    - period-close
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: finance-close
      port: 8080
      tools:
        - name: run-period-close-check
          description: "Query SAP S/4HANA for the status of all required period-end close tasks (journal entries, intercompany reconciliations, accruals) for a given fiscal period. Post a completion status summary to the Finance Teams channel. Use at month-end or quarter-end."
          inputParameters:
            - name: fiscal_year
              in: body
              type: string
              description: "SAP fiscal year, e.g. 2026."
            - name: fiscal_period
              in: body
              type: string
              description: "SAP fiscal period (01-12)."
          steps:
            - name: get-close-status
              type: call
              call: "sap-close.get-period-status"
              with:
                fiscal_year: "{{fiscal_year}}"
                fiscal_period: "{{fiscal_period}}"
            - name: post-status
              type: call
              call: "msteams-close.send-message"
              with:
                channel: "finance-close"
                text: "Period Close Status FY{{fiscal_year}}/P{{fiscal_period}}: {{get-close-status.complete_count}} complete, {{get-close-status.pending_count}} pending."
  consumes:
    - type: http
      namespace: sap-close
      baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/FAM_PERIOD_CLOSE_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: period-status
          path: "/PeriodCloseItems"
          inputParameters:
            - name: fiscal_year
              in: query
            - name: fiscal_period
              in: query
          operations:
            - name: get-period-status
              method: GET
    - type: http
      namespace: msteams-close
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Creates Jira tickets for failed batches.

naftiko: "0.5"
info:
  label: "SAP Production Batch Quality Check"
  description: "Creates Jira tickets for failed batches."
  tags:
    - manufacturing
    - sap
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: manufacturing-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "SAP Production Batch Quality Check - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://bunge.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Retrieves the status of a SAP production order including planned quantity and manufacturing status.

naftiko: "0.5"
info:
  label: "SAP Production Order Status"
  description: "Retrieves the status of a SAP production order including planned quantity and manufacturing status."
  tags:
    - manufacturing
    - sap
    - erp
    - production
capability:
  exposes:
    - type: mcp
      namespace: manufacturing-ops
      port: 8080
      tools:
        - name: get-record
          description: "SAP Production Order Status - retrieve record data for operations review."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          call: primary.get-record
          with:
            record_id: "{{record_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.status"
            - name: result
              type: string
              mapping: "$.result"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: records
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-record
              method: GET

Posts production variance.

naftiko: "0.5"
info:
  label: "SAP Production Variance Report"
  description: "Posts production variance."
  tags:
    - manufacturing
    - sap
    - microsoft-teams
    - production
capability:
  exposes:
    - type: mcp
      namespace: manufacturing-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "SAP Production Variance Report - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://bunge.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Looks up a Bunge SAP S/4HANA purchase order by number and returns header status, vendor details, total value, and open line items.

naftiko: "0.5"
info:
  label: "SAP Purchase Order Lookup"
  description: "Looks up a Bunge SAP S/4HANA purchase order by number and returns header status, vendor details, total value, and open line items."
  tags:
    - finance
    - erp
    - procurement
    - sap
capability:
  exposes:
    - type: mcp
      namespace: erp
      port: 8080
      tools:
        - name: get-purchase-order
          description: "Given a SAP purchase order number, retrieve the PO header status, vendor name, total value, and currency from Bunge's SAP S/4HANA system. Use for procurement tracking, AP verification, or invoice matching."
          inputParameters:
            - name: po_number
              in: body
              type: string
              description: "SAP purchase order number, e.g. 4500012345."
          call: "sap-s4.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-s4
      baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/MM_PUR_PO_MAINT_V2_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: purchase-orders
          path: "/A_PurchaseOrder('{{po_number}}')"
          inputParameters:
            - name: po_number
              in: path
          operations:
            - name: get-po
              method: GET

Retrieves a quality inspection lot from SAP QM and returns the inspection result and defect count.

naftiko: "0.5"
info:
  label: "SAP Quality Inspection Result"
  description: "Retrieves a quality inspection lot from SAP QM and returns the inspection result and defect count."
  tags:
    - manufacturing
    - sap
    - erp
    - quality
capability:
  exposes:
    - type: mcp
      namespace: manufacturing-ops
      port: 8080
      tools:
        - name: get-record
          description: "SAP Quality Inspection Result - retrieve record data for operations review."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          call: primary.get-record
          with:
            record_id: "{{record_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.status"
            - name: result
              type: string
              mapping: "$.result"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: records
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-record
              method: GET

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

naftiko: "0.5"
info:
  label: "SAP Transport Request Status"
  description: "Retrieves the status of a SAP transport request including release status, target system, and owner."
  tags:
    - devops
    - sap
    - erp
    - transport-management
capability:
  exposes:
    - type: mcp
      namespace: devops-ops
      port: 8080
      tools:
        - name: get-record
          description: "SAP Transport Request Status - retrieve record data for operations review."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          call: primary.get-record
          with:
            record_id: "{{record_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.status"
            - name: result
              type: string
              mapping: "$.result"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: records
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-record
              method: GET

Retrieves vendor master data from SAP S/4HANA by vendor ID, returning contact details, payment terms, and bank account information for AP processing.

naftiko: "0.5"
info:
  label: "SAP Vendor Master Data Lookup"
  description: "Retrieves vendor master data from SAP S/4HANA by vendor ID, returning contact details, payment terms, and bank account information for AP processing."
  tags:
    - finance
    - erp
    - sap
    - vendor-management
capability:
  exposes:
    - type: mcp
      namespace: vendor-master
      port: 8080
      tools:
        - name: get-vendor-master
          description: "Given a SAP vendor ID, retrieve the vendor's master data including company name, address, payment terms, and bank details from Bunge's SAP S/4HANA system. Use for AP processing, vendor validation, or onboarding verification."
          inputParameters:
            - name: vendor_id
              in: body
              type: string
              description: "SAP vendor account number, e.g. 100012345."
          call: "sap-vendor.get-vendor"
          with:
            vendor_id: "{{vendor_id}}"
          outputParameters:
            - name: company_name
              type: string
              mapping: "$.d.SupplierName"
            - name: payment_terms
              type: string
              mapping: "$.d.PaymentTerms"
            - name: country
              type: string
              mapping: "$.d.Country"
  consumes:
    - type: http
      namespace: sap-vendor
      baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: suppliers
          path: "/A_Supplier('{{vendor_id}}')"
          inputParameters:
            - name: vendor_id
              in: path
          operations:
            - name: get-vendor
              method: GET

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

naftiko: "0.5"
info:
  label: "SAP Vendor Payment Run Status"
  description: "Checks the status of a SAP vendor payment run, returning processed count and total amount."
  tags:
    - finance
    - sap
    - erp
    - accounts-payable
capability:
  exposes:
    - type: mcp
      namespace: finance-ops
      port: 8080
      tools:
        - name: get-record
          description: "SAP Vendor Payment Run Status - retrieve record data for operations review."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          call: primary.get-record
          with:
            record_id: "{{record_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.status"
            - name: result
              type: string
              mapping: "$.result"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: records
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-record
              method: GET

Generates vendor scorecards.

naftiko: "0.5"
info:
  label: "SAP Vendor Scorecard Generation"
  description: "Generates vendor scorecards."
  tags:
    - procurement
    - sap
    - microsoft-teams
    - supplier-management
capability:
  exposes:
    - type: mcp
      namespace: procurement-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "SAP Vendor Scorecard Generation - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://bunge.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Triggers cycle count workflows.

naftiko: "0.5"
info:
  label: "SAP Warehouse Inventory Cycle Count"
  description: "Triggers cycle count workflows."
  tags:
    - supply-chain
    - sap
    - microsoft-teams
    - inventory
capability:
  exposes:
    - type: mcp
      namespace: supply-chain-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "SAP Warehouse Inventory Cycle Count - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://bunge.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Creates a ServiceNow change request for a planned infrastructure change, assigns approvers, and notifies stakeholders via Microsoft Teams.

naftiko: "0.5"
info:
  label: "ServiceNow Change Management Approval"
  description: "Creates a ServiceNow change request for a planned infrastructure change, assigns approvers, and notifies stakeholders via Microsoft Teams."
  tags:
    - itsm
    - change-management
    - servicenow
    - microsoft-teams
    - approval
capability:
  exposes:
    - type: mcp
      namespace: change-mgmt
      port: 8080
      tools:
        - name: open-change-request
          description: "Given change details (title, description, risk level, scheduled window), create a ServiceNow change request and notify the change advisory board channel in Teams. Use for planned infrastructure, deployment, or configuration changes."
          inputParameters:
            - name: change_title
              in: body
              type: string
              description: "Short title describing the change."
            - name: change_description
              in: body
              type: string
              description: "Full description of the change, including rollback plan."
            - name: risk_level
              in: body
              type: string
              description: "Risk classification: low, medium, or high."
            - name: scheduled_start
              in: body
              type: string
              description: "Planned start datetime in ISO 8601 format."
          steps:
            - name: create-change
              type: call
              call: "servicenow-chg.create-change"
              with:
                short_description: "{{change_title}}"
                description: "{{change_description}}"
                risk: "{{risk_level}}"
                planned_start: "{{scheduled_start}}"
            - name: notify-cab
              type: call
              call: "msteams-cab.send-message"
              with:
                channel: "change-advisory-board"
                text: "New Change Request: {{change_title}} | Risk: {{risk_level}} | Scheduled: {{scheduled_start}} | CHG: {{create-change.number}}"
  consumes:
    - type: http
      namespace: servicenow-chg
      baseUri: "https://bunge.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: change-requests
          path: "/table/change_request"
          operations:
            - name: create-change
              method: POST
    - type: http
      namespace: msteams-cab
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

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

naftiko: "0.5"
info:
  label: "ServiceNow Change Request Status"
  description: "Retrieves a ServiceNow change request and returns its approval status and risk level."
  tags:
    - it-ops
    - servicenow
    - change-management
capability:
  exposes:
    - type: mcp
      namespace: it-ops-ops
      port: 8080
      tools:
        - name: get-record
          description: "ServiceNow Change Request Status - retrieve record data for operations review."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          call: primary.get-record
          with:
            record_id: "{{record_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.status"
            - name: result
              type: string
              mapping: "$.result"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: records
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-record
              method: GET

Retrieves a ServiceNow CMDB configuration item by asset tag.

naftiko: "0.5"
info:
  label: "ServiceNow CMDB Asset Lookup"
  description: "Retrieves a ServiceNow CMDB configuration item by asset tag."
  tags:
    - it-ops
    - servicenow
    - asset-management
capability:
  exposes:
    - type: mcp
      namespace: it-ops-ops
      port: 8080
      tools:
        - name: get-record
          description: "ServiceNow CMDB Asset Lookup - retrieve record data for operations review."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          call: primary.get-record
          with:
            record_id: "{{record_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.status"
            - name: result
              type: string
              mapping: "$.result"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: records
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-record
              method: GET

When a P1 or P2 incident is raised in ServiceNow, enriches it with Datadog alert context, assigns it to the on-call engineer, and posts an alert to Microsoft Teams.

naftiko: "0.5"
info:
  label: "ServiceNow Incident Triage and Assignment"
  description: "When a P1 or P2 incident is raised in ServiceNow, enriches it with Datadog alert context, assigns it to the on-call engineer, and posts an alert to Microsoft Teams."
  tags:
    - itsm
    - incident-response
    - servicenow
    - datadog
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: itsm-ops
      port: 8080
      tools:
        - name: handle-critical-incident
          description: "Given a ServiceNow incident number and Datadog alert ID, fetch alert details, update the incident with root-cause context, assign to the on-call engineer, and send a Teams alert. Use for P1/P2 incident triage."
          inputParameters:
            - name: incident_number
              in: body
              type: string
              description: "ServiceNow incident number, e.g. INC0012345."
            - name: datadog_alert_id
              in: body
              type: string
              description: "Datadog monitor alert ID that triggered the incident."
          steps:
            - name: get-alert
              type: call
              call: "datadog.get-alert"
              with:
                alert_id: "{{datadog_alert_id}}"
            - name: update-incident
              type: call
              call: "servicenow-update.update-incident"
              with:
                number: "{{incident_number}}"
                work_notes: "Datadog alert: {{get-alert.name}} | Severity: {{get-alert.overall_state}} | Query: {{get-alert.query}}"
            - name: notify-oncall
              type: call
              call: "msteams-ops.send-message"
              with:
                channel: "it-operations"
                text: "P1 Incident {{incident_number}}: {{get-alert.name}} — assigned to on-call. Datadog alert {{datadog_alert_id}}."
  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-alert
              method: GET
    - type: http
      namespace: servicenow-update
      baseUri: "https://bunge.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident/{{number}}"
          inputParameters:
            - name: number
              in: path
          operations:
            - name: update-incident
              method: PATCH
    - type: http
      namespace: msteams-ops
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Searches the ServiceNow knowledge base for articles matching a query.

naftiko: "0.5"
info:
  label: "ServiceNow Knowledge Article Search"
  description: "Searches the ServiceNow knowledge base for articles matching a query."
  tags:
    - it-ops
    - servicenow
    - knowledge-management
capability:
  exposes:
    - type: mcp
      namespace: it-ops-ops
      port: 8080
      tools:
        - name: get-record
          description: "ServiceNow Knowledge Article Search - retrieve record data for operations review."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          call: primary.get-record
          with:
            record_id: "{{record_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.status"
            - name: result
              type: string
              mapping: "$.result"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: records
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-record
              method: GET

Creates Teams bridge for P1.

naftiko: "0.5"
info:
  label: "ServiceNow Major Incident Bridge"
  description: "Creates Teams bridge for P1."
  tags:
    - it-ops
    - servicenow
    - microsoft-teams
    - incident-management
capability:
  exposes:
    - type: mcp
      namespace: it-ops-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "ServiceNow Major Incident Bridge - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://bunge.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Creates investigation tickets.

naftiko: "0.5"
info:
  label: "ServiceNow Problem Management Workflow"
  description: "Creates investigation tickets."
  tags:
    - it-ops
    - servicenow
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: it-ops-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "ServiceNow Problem Management Workflow - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://bunge.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Escalates SLA breaches.

naftiko: "0.5"
info:
  label: "ServiceNow SLA Breach Escalation"
  description: "Escalates SLA breaches."
  tags:
    - it-ops
    - servicenow
    - microsoft-teams
    - sla-management
capability:
  exposes:
    - type: mcp
      namespace: it-ops-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "ServiceNow SLA Breach Escalation - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://bunge.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Searches a SharePoint site for documents matching a keyword.

naftiko: "0.5"
info:
  label: "SharePoint Document Search"
  description: "Searches a SharePoint site for documents matching a keyword."
  tags:
    - collaboration
    - sharepoint
    - document-management
capability:
  exposes:
    - type: mcp
      namespace: collaboration-ops
      port: 8080
      tools:
        - name: get-record
          description: "SharePoint Document Search - retrieve record data for operations review."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          call: primary.get-record
          with:
            record_id: "{{record_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.status"
            - name: result
              type: string
              mapping: "$.result"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: records
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-record
              method: GET

Triggers a Snowflake refresh of the grain trading analytics view and pushes updated data to a Power BI dataset for executive dashboards.

naftiko: "0.5"
info:
  label: "Snowflake BI Refresh and Power BI Publish"
  description: "Triggers a Snowflake refresh of the grain trading analytics view and pushes updated data to a Power BI dataset for executive dashboards."
  tags:
    - data
    - analytics
    - snowflake
    - power-bi
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: bi-reporting
      port: 8080
      tools:
        - name: refresh-trading-dashboard
          description: "Execute the Snowflake grain trading analytics view refresh and push updated aggregates to the Power BI executive dashboard dataset. Use before board reporting cycles or on-demand for executive requests."
          inputParameters:
            - name: report_date
              in: body
              type: string
              description: "Reporting date in YYYY-MM-DD format."
          steps:
            - name: refresh-view
              type: call
              call: "snowflake-bi.execute-statement"
              with:
                statement: "CALL BUNGE_DW.ANALYTICS.REFRESH_TRADING_VIEW('{{report_date}}')"
            - name: push-dataset
              type: call
              call: "powerbi-exec.push-rows"
              with:
                dataset_id: "$secrets.powerbi_trading_dataset_id"
                table: "TradingMetrics"
                rows: "{{refresh-view.data}}"
  consumes:
    - type: http
      namespace: snowflake-bi
      baseUri: "https://bunge.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: powerbi-exec
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: dataset-rows
          path: "/datasets/{{dataset_id}}/tables/{{table}}/rows"
          inputParameters:
            - name: dataset_id
              in: path
            - name: table
              in: path
          operations:
            - name: push-rows
              method: POST

Runs a data quality validation query against a Snowflake table and publishes results to a Power BI dataset, alerting via Teams if row counts or null rates exceed thresholds.

naftiko: "0.5"
info:
  label: "Snowflake Data Pipeline Quality Check"
  description: "Runs a data quality validation query against a Snowflake table and publishes results to a Power BI dataset, alerting via Teams if row counts or null rates exceed thresholds."
  tags:
    - data
    - analytics
    - snowflake
    - power-bi
    - data-quality
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: data-quality
      port: 8080
      tools:
        - name: run-pipeline-quality-check
          description: "Given a Snowflake table name and quality threshold parameters, run a row-count and null-rate check. Push results to a Power BI streaming dataset and alert Teams if thresholds are breached. Use for daily ETL validation."
          inputParameters:
            - name: table_name
              in: body
              type: string
              description: "Fully qualified Snowflake table name, e.g. BUNGE_DW.GRAINS.PRICE_HISTORY."
            - name: max_null_rate
              in: body
              type: number
              description: "Maximum acceptable null rate (0.0–1.0) for key columns."
            - name: min_row_count
              in: body
              type: integer
              description: "Minimum expected row count in the table."
          steps:
            - name: run-quality-sql
              type: call
              call: "snowflake-dq.execute-statement"
              with:
                statement: "SELECT COUNT(*) as row_count, SUM(CASE WHEN key_col IS NULL THEN 1 ELSE 0 END)/COUNT(*) as null_rate FROM {{table_name}}"
            - name: push-to-powerbi
              type: call
              call: "powerbi.push-rows"
              with:
                dataset_id: "$secrets.powerbi_dq_dataset_id"
                table: "QualityResults"
                rows: "{{run-quality-sql.data}}"
            - name: alert-if-breach
              type: call
              call: "msteams-data.send-message"
              with:
                channel: "data-engineering"
                text: "DQ Check {{table_name}}: rows={{run-quality-sql.row_count}}, null_rate={{run-quality-sql.null_rate}}"
  consumes:
    - type: http
      namespace: snowflake-dq
      baseUri: "https://bunge.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              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/{{dataset_id}}/tables/{{table}}/rows"
          inputParameters:
            - name: dataset_id
              in: path
            - name: table
              in: path
          operations:
            - name: push-rows
              method: POST
    - type: http
      namespace: msteams-data
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Creates Jira tickets for ETL failures.

naftiko: "0.5"
info:
  label: "Snowflake ETL Pipeline Failure Handler"
  description: "Creates Jira tickets for ETL failures."
  tags:
    - data-engineering
    - snowflake
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: data-engineering-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "Snowflake ETL Pipeline Failure Handler - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://bunge.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Aggregates ESG data.

naftiko: "0.5"
info:
  label: "Sustainability Reporting Data Aggregation"
  description: "Aggregates ESG data."
  tags:
    - compliance
    - sustainability
    - microsoft-teams
    - agribusiness
capability:
  exposes:
    - type: mcp
      namespace: compliance-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "Sustainability Reporting Data Aggregation - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://bunge.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Summarizes contracts via AI.

naftiko: "0.5"
info:
  label: "Trade Contract Document Summarization"
  description: "Summarizes contracts via AI."
  tags:
    - artificial-intelligence
    - legal
    - microsoft-teams
    - agribusiness
capability:
  exposes:
    - type: mcp
      namespace: artificial-intelligence-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "Trade Contract Document Summarization - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://bunge.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Queries Workday for employees who have not completed open enrollment by the deadline and sends personalized reminder messages via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Workday Benefits Enrollment Reminder"
  description: "Queries Workday for employees who have not completed open enrollment by the deadline and sends personalized reminder messages via Microsoft Teams."
  tags:
    - hr
    - benefits
    - workday
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-benefits
      port: 8080
      tools:
        - name: send-enrollment-reminders
          description: "Retrieve all Bunge employees from Workday who have not yet completed open enrollment for the current benefit plan year, and send each a personalized Teams reminder message. Use in the final week of the open enrollment window."
          inputParameters:
            - name: enrollment_deadline
              in: body
              type: string
              description: "Open enrollment deadline date in YYYY-MM-DD format."
            - name: plan_year
              in: body
              type: string
              description: "Benefit plan year, e.g. 2026."
          steps:
            - name: get-pending-enrollments
              type: call
              call: "workday-ben.list-pending-enrollments"
              with:
                plan_year: "{{plan_year}}"
                status: "Not_Started"
            - name: send-reminders
              type: call
              call: "msteams-ben.send-message"
              with:
                channel: "hr-announcements"
                text: "Benefits Open Enrollment Reminder: {{get-pending-enrollments.count}} employees have not yet enrolled. Deadline: {{enrollment_deadline}}. Please log into Workday to complete your elections."
  consumes:
    - type: http
      namespace: workday-ben
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: benefit-enrollments
          path: "/bunge/benefitElections"
          inputParameters:
            - name: plan_year
              in: query
            - name: status
              in: query
          operations:
            - name: list-pending-enrollments
              method: GET
    - type: http
      namespace: msteams-ben
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Updates access on transfers.

naftiko: "0.5"
info:
  label: "Workday Employee Transfer Provisioning"
  description: "Updates access on transfers."
  tags:
    - hr
    - workday
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "Workday Employee Transfer Provisioning - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://bunge.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Posts headcount variance.

naftiko: "0.5"
info:
  label: "Workday Headcount Variance Report"
  description: "Posts headcount variance."
  tags:
    - hr
    - workday
    - microsoft-teams
    - workforce-planning
capability:
  exposes:
    - type: mcp
      namespace: hr-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "Workday Headcount Variance Report - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://bunge.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

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

naftiko: "0.5"
info:
  label: "Workday Job Requisition Status"
  description: "Retrieves a Workday job requisition by ID and returns approval status, hiring manager, and target start date."
  tags:
    - hr
    - recruiting
    - workday
capability:
  exposes:
    - type: mcp
      namespace: hr-ops
      port: 8080
      tools:
        - name: get-record
          description: "Workday Job Requisition Status - retrieve record data for operations review."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          call: primary.get-record
          with:
            record_id: "{{record_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.status"
            - name: result
              type: string
              mapping: "$.result"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: records
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-record
              method: GET

Posts learning digest.

naftiko: "0.5"
info:
  label: "Workday Learning Completion Digest"
  description: "Posts learning digest."
  tags:
    - hr
    - workday
    - microsoft-teams
    - learning
capability:
  exposes:
    - type: mcp
      namespace: hr-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "Workday Learning Completion Digest - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://bunge.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Creates IT equipment requests for new hires.

naftiko: "0.5"
info:
  label: "Workday New Hire IT Equipment Provisioning"
  description: "Creates IT equipment requests for new hires."
  tags:
    - hr
    - workday
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "Workday New Hire IT Equipment Provisioning - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://bunge.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

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

naftiko: "0.5"
info:
  label: "Workday Org Chart Lookup"
  description: "Retrieves the organizational hierarchy for a Workday worker, returning manager and direct reports count."
  tags:
    - hr
    - workday
    - organization
capability:
  exposes:
    - type: mcp
      namespace: hr-ops
      port: 8080
      tools:
        - name: get-record
          description: "Workday Org Chart Lookup - retrieve record data for operations review."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          call: primary.get-record
          with:
            record_id: "{{record_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.status"
            - name: result
              type: string
              mapping: "$.result"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: records
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-record
              method: GET

Launches review cycle.

naftiko: "0.5"
info:
  label: "Workday Performance Review Kickoff"
  description: "Launches review cycle."
  tags:
    - hr
    - workday
    - microsoft-teams
    - performance-management
capability:
  exposes:
    - type: mcp
      namespace: hr-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "Workday Performance Review Kickoff - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://bunge.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

When an employee's role changes in Workday, updates their Salesforce profile permissions and notifies their new manager via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Workday Role Change Provisioning"
  description: "When an employee's role changes in Workday, updates their Salesforce profile permissions and notifies their new manager via Microsoft Teams."
  tags:
    - hr
    - role-management
    - workday
    - salesforce
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-provisioning
      port: 8080
      tools:
        - name: sync-role-change
          description: "Given a Workday worker ID and new role details, update the employee's Salesforce profile to match their new role permissions and notify the new manager via Teams. Use when an employee is promoted or transferred."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "Workday worker ID."
            - name: new_role
              in: body
              type: string
              description: "New job title or role name."
            - name: new_manager_upn
              in: body
              type: string
              description: "UPN of the employee's new manager."
          steps:
            - name: get-worker
              type: call
              call: "workday-role.get-worker"
              with:
                worker_id: "{{employee_id}}"
            - name: update-sf-profile
              type: call
              call: "salesforce-role.update-user"
              with:
                user_id: "{{get-worker.salesforce_id}}"
                profile: "{{new_role}}"
            - name: notify-manager
              type: call
              call: "msteams-mgr.send-message"
              with:
                recipient_upn: "{{new_manager_upn}}"
                text: "{{get-worker.display_name}} has been added to your team as {{new_role}}. Their Salesforce access has been updated."
  consumes:
    - type: http
      namespace: workday-role
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/bunge/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: salesforce-role
      baseUri: "https://bunge.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: users
          path: "/sobjects/User/{{user_id}}"
          inputParameters:
            - name: user_id
              in: path
          operations:
            - name: update-user
              method: PATCH
    - type: http
      namespace: msteams-mgr
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail-send
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Revokes access on termination.

naftiko: "0.5"
info:
  label: "Workday Termination Access Revocation"
  description: "Revokes access on termination."
  tags:
    - hr
    - security
    - workday
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: hr-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "Workday Termination Access Revocation - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://bunge.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Deactivates badges on termination.

naftiko: "0.5"
info:
  label: "Workday Termination Badge Deactivation"
  description: "Deactivates badges on termination."
  tags:
    - hr
    - security
    - workday
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-ops
      port: 8080
      tools:
        - name: execute-workflow
          description: "Workday Termination Badge Deactivation - orchestrate multi-step workflow across services."
          inputParameters:
            - name: record_id
              in: body
              type: string
              description: "The primary record identifier."
          steps:
            - name: get-data
              type: call
              call: primary.get-data
              with:
                record_id: "{{record_id}}"
            - name: process-result
              type: call
              call: secondary.process
              with:
                data: "{{get-data.result}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_ops_channel_id"
                text: "Processed {{record_id}} | Result: {{process-result.status}}"
  consumes:
    - type: http
      namespace: primary
      baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: data
          path: "/records/{{record_id}}"
          inputParameters:
            - name: record_id
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: secondary
      baseUri: "https://bunge.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: process
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST